SpiSubSystem.v 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Company: TAIR
  3. // Engineer:
  4. //
  5. // Create Date: 10/30/2023 11:24:31 AM
  6. // Design Name:
  7. // Module Name: SpiSubSystem
  8. // Project Name: S5443_V3_FPGA3
  9. // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
  10. // Tool Versions:
  11. // Description: This is wrapper that encapsulates FIFO's, Spi modules and
  12. // modules that multiplex Spi output lines
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 1.0 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module SpiSubSystem #(
  22. parameter STAGES = 3,
  23. parameter CMD_REG_WIDTH = 32,
  24. parameter ADDR_REG_WIDTH = 12,
  25. parameter WIDTH = 1,
  26. parameter FIFO_NUM = 7,
  27. parameter ISTEMPRD = 1,
  28. parameter ISPOWERRST = 1
  29. )
  30. (
  31. input Clk_i,
  32. input SpiClk_i,
  33. input Rst_i,
  34. input TxEn_i,
  35. input FifoRxRst_i,
  36. input FifoTxRst_i,
  37. input FifoRxRstRdPtr_i,
  38. input FifoTxRstWrPtr_i,
  39. input ToFifoVal_i,
  40. input ToRstMemVal_i,
  41. input [CMD_REG_WIDTH-1:0] ToFifoData_i,
  42. input [1:0] WidthSel_i,
  43. input PulsePol_i,
  44. input ClockPhase_i,
  45. input EndianSel_i,
  46. input Lag_i,
  47. input Lead_i,
  48. input SelSt_i,
  49. input [5:0] Stop_i,
  50. input Assel_i,
  51. input [FIFO_NUM-1:0] ChipSelFpga_i,
  52. input [FIFO_NUM-1:0] ChipSelFlash_i,
  53. input SpiMode_i,
  54. input SpiEn_i,
  55. output [CMD_REG_WIDTH-1:0] TxFifoCtrlReg_o,
  56. output [CMD_REG_WIDTH-1:0] RxFifoCtrlReg_o,
  57. output [CMD_REG_WIDTH-1:0] DataFromRxFifo_o,
  58. output Sck_o,
  59. output Ss_o,
  60. output SsFlash_o,
  61. output Mosi0_o,
  62. inout Mosi1_io,
  63. output Mosi2_o,
  64. output Mosi3_o,
  65. input Ctrl_i,
  66. output [31:0] TempData_o
  67. );
  68. //================================================================================
  69. // REG/WIRE
  70. //================================================================================
  71. wire [CMD_REG_WIDTH-1:0] toSpiData;
  72. wire [CMD_REG_WIDTH-1:0] toSpiDataR;
  73. wire emptyFlagTx;
  74. wire sckR;
  75. wire ssR;
  76. wire mosi0R;
  77. wire valToTxR;
  78. wire valToRxR;
  79. wire sckQ;
  80. wire ssQ;
  81. wire mosi0Q;
  82. wire valToTxQ;
  83. wire valToTxFifoRead;
  84. wire valToRxFifoWrite;
  85. wire [CMD_REG_WIDTH-1:0] dataToRxFifo;
  86. wire [31:0] tempData;
  87. reg [31:0] tempDataReg;
  88. wire [31:0] powRstData;
  89. wire mosi1_o;
  90. //================================================================================
  91. // ASSIGNMENTS
  92. //================================================================================
  93. assign valToTxFifoRead = (SpiMode_i) ? valToTxQ : valToTxR;
  94. assign Mosi1_io = (SpiMode_i) ? mosi1_o : 1'bz;
  95. assign TempData_o = tempData;
  96. //================================================================================
  97. // CODING
  98. //================================================================================
  99. InitRst InitRst_inst
  100. (
  101. .clk_i (SpiClk_i),
  102. .signal_o (Rst_i)
  103. );
  104. Sync1bit #(
  105. .WIDTH (1),
  106. .STAGES (STAGES)
  107. ) Sync1bit_inst
  108. (
  109. .ClkFast_i (Clk_i),
  110. .ClkSlow_i (SpiClk_i),
  111. .TxEn_i (TxEn_i),
  112. .TxEn_o (spiTxEnSync)
  113. );
  114. DataFifoWrapper #(
  115. .CMD_REG_WIDTH (CMD_REG_WIDTH),
  116. .ADDR_REG_WIDTH (ADDR_REG_WIDTH),
  117. .STAGES (STAGES),
  118. .FIFO_NUM (FIFO_NUM)
  119. ) DataFifoWrapper
  120. (
  121. .WrClk_i (Clk_i),
  122. .RdClk_i (SpiClk_i),
  123. .FifoRxRst_i (FifoRxRst_i),
  124. .FifoTxRst_i (FifoTxRst_i),
  125. .FifoRxRstRdPtr_i (FifoRxRstRdPtr_i),
  126. .FifoTxRstWrPtr_i (FifoTxRstWrPtr_i),
  127. .ToFifoVal_i (ToFifoVal_i),
  128. .ToFifoRxData_i (dataToRxFifo),
  129. .ToFifoRxWriteVal_i (valToRxR),
  130. .ToFifoTxReadVal_i (valToTxFifoRead),
  131. .ToFifoData_i (ToFifoData_i),
  132. .TxFifoCtrlReg_o (TxFifoCtrlReg_o),
  133. .RxFifoCtrlReg_o (RxFifoCtrlReg_o),
  134. .EmptyFlagTx_o (emptyFlagTx),
  135. .DataFromRxFifo_o (DataFromRxFifo_o),
  136. .ToSpiData_o (toSpiData)
  137. );
  138. //------------------------------------------------
  139. //Generating needed amount of calculating channels
  140. generate
  141. if (ISTEMPRD) begin : TempRdSpi
  142. SPIs TempRdSpi
  143. (
  144. .Clk_i (SpiClk_i),
  145. .Rst_i (Rst_i | SpiMode_i),
  146. .Sck_i (sckR),
  147. .Ss_i (ssR),
  148. .Mosi0_i (Mosi1_io),
  149. .WidthSel_i (WidthSel_i),
  150. .EndianSel_i (EndianSel_i),
  151. .SelSt_i (SelSt_i),
  152. .DataToRxFifo_o (tempData),
  153. .Val_o (tempVal)
  154. );
  155. always @(posedge Clk_i) begin
  156. if (Rst_i) begin
  157. tempDataReg <= 32'd0;
  158. end else begin
  159. if (tempVal) begin
  160. tempDataReg <= tempData;
  161. end
  162. end
  163. end
  164. end
  165. endgenerate
  166. generate
  167. if (ISPOWERRST) begin : PowRstMem
  168. PowRstMemWrapper PowRstMemWrapper(
  169. .Clk_i(Clk_i),
  170. .Rst_i(Rst_i),
  171. .WrReq_i(ToRstMemVal_i),
  172. .Data_i(ToFifoData_i),
  173. .RdReq_i(),
  174. .Data_o(powRstData),
  175. .DataVal_o()
  176. );
  177. SpiDataMuxer SpiDataMuxer(
  178. .Clk_i (Clk_i),
  179. .Rst_i (Rst_i),
  180. .Ctrl_i (Ctrl_i),
  181. .PowRstData_i (powRstData),
  182. .RegularData_i (toSpiData),
  183. .Data_o (toSpiDataR)
  184. );
  185. SPIm SPIm (
  186. .Clk_i (SpiClk_i),
  187. .Start_i (spiTxEnSync),
  188. .Rst_i (Rst_i | SpiMode_i | !SpiEn_i),
  189. .EmptyFlag_i (emptyFlagTx),
  190. .SpiData_i (toSpiDataR),
  191. .WidthSel_i (WidthSel_i),
  192. .PulsePol_i (PulsePol_i),
  193. .ClockPhase_i (ClockPhase_i),
  194. .EndianSel_i (EndianSel_i),
  195. .Lag_i (Lag_i),
  196. .Lead_i (Lead_i),
  197. .Stop_i (Stop_i),
  198. .SelSt_i (SelSt_i),
  199. .Sck_o (sckR),
  200. .Ss_o (ssR),
  201. .Mosi0_o (mosi0R),
  202. .Val_o (valToTxR)
  203. );
  204. SPIs SPIs (
  205. .Clk_i (SpiClk_i),
  206. .Rst_i (Rst_i | SpiMode_i),
  207. .Sck_i (sckR),
  208. .Ss_i (ssR),
  209. .Mosi0_i (Mosi1_io),
  210. .WidthSel_i (WidthSel_i),
  211. .EndianSel_i (EndianSel_i),
  212. .SelSt_i (SelSt_i),
  213. .DataToRxFifo_o (dataToRxFifo),
  214. .Val_o (valToRxR)
  215. );
  216. QuadSPIm QuadSPIm (
  217. .Clk_i (SpiClk_i),
  218. .Start_i (spiTxEnSync),
  219. .Rst_i (Rst_i | !SpiMode_i | !SpiEn_i),
  220. .EmptyFlag_i (emptyFlagTx),
  221. .SpiData_i (toSpiDataR),
  222. .WidthSel_i (WidthSel_i),
  223. .PulsePol_i (PulsePol_i),
  224. .ClockPhase_i (ClockPhase_i),
  225. .EndianSel_i (EndianSel_i),
  226. .Lag_i (Lag_i),
  227. .Lead_i (Lead_i),
  228. .Stop_i (Stop_i),
  229. .SelSt_i (SelSt_i),
  230. .Sck_o (sckQ),
  231. .Ss_o (ssQ),
  232. .Mosi0_o (mosi0Q),
  233. .Mosi1_o (mosi1_o),
  234. .Mosi2_o (Mosi2_o),
  235. .Mosi3_o (Mosi3_o),
  236. .Val_o (valToTxQ)
  237. );
  238. SpiLinesMuxer SpiLinesMuxer (
  239. .SsR_i (ssR),
  240. .SsQ_i (ssQ),
  241. .SckR_i (sckR),
  242. .SckQ_i (sckQ),
  243. .Mosi0R_i (mosi0R),
  244. .Mosi0Q_i (mosi0Q),
  245. .ChipSelFpga_i (ChipSelFpga_i),
  246. .ChipSelFlash_i (ChipSelFlash_i),
  247. .Assel_i (Assel_i),
  248. .SpiMode_i (SpiMode_i),
  249. .Ss_o (Ss_o),
  250. .SsFlash_o (SsFlash_o),
  251. .Sck_o (Sck_o),
  252. .Mosi0_o (Mosi0_o)
  253. );
  254. end else begin
  255. SPIm SPIm (
  256. .Clk_i (SpiClk_i),
  257. .Start_i (spiTxEnSync),
  258. .Rst_i (Rst_i | SpiMode_i | !SpiEn_i),
  259. .EmptyFlag_i (emptyFlagTx),
  260. .SpiData_i (toSpiData),
  261. .WidthSel_i (WidthSel_i),
  262. .PulsePol_i (PulsePol_i),
  263. .ClockPhase_i (ClockPhase_i),
  264. .EndianSel_i (EndianSel_i),
  265. .Lag_i (Lag_i),
  266. .Lead_i (Lead_i),
  267. .Stop_i (Stop_i),
  268. .SelSt_i (SelSt_i),
  269. .Sck_o (sckR),
  270. .Ss_o (ssR),
  271. .Mosi0_o (mosi0R),
  272. .Val_o (valToTxR)
  273. );
  274. SPIs SPIs (
  275. .Clk_i (SpiClk_i),
  276. .Rst_i (Rst_i | SpiMode_i),
  277. .Sck_i (sckR),
  278. .Ss_i (ssR),
  279. .Mosi0_i (Mosi1_io),
  280. .WidthSel_i (WidthSel_i),
  281. .EndianSel_i (EndianSel_i),
  282. .SelSt_i (SelSt_i),
  283. .DataToRxFifo_o (dataToRxFifo),
  284. .Val_o (valToRxR)
  285. );
  286. QuadSPIm QuadSPIm (
  287. .Clk_i (SpiClk_i),
  288. .Start_i (spiTxEnSync),
  289. .Rst_i (Rst_i | !SpiMode_i | !SpiEn_i),
  290. .EmptyFlag_i (emptyFlagTx),
  291. .SpiData_i (toSpiData),
  292. .WidthSel_i (WidthSel_i),
  293. .PulsePol_i (PulsePol_i),
  294. .ClockPhase_i (ClockPhase_i),
  295. .EndianSel_i (EndianSel_i),
  296. .Lag_i (Lag_i),
  297. .Lead_i (Lead_i),
  298. .Stop_i (Stop_i),
  299. .SelSt_i (SelSt_i),
  300. .Sck_o (sckQ),
  301. .Ss_o (ssQ),
  302. .Mosi0_o (mosi0Q),
  303. .Mosi1_o (mosi1_o),
  304. .Mosi2_o (Mosi2_o),
  305. .Mosi3_o (Mosi3_o),
  306. .Val_o (valToTxQ)
  307. );
  308. SpiLinesMuxer SpiLinesMuxer (
  309. .SsR_i (ssR),
  310. .SsQ_i (ssQ),
  311. .SckR_i (sckR),
  312. .SckQ_i (sckQ),
  313. .Mosi0R_i (mosi0R),
  314. .Mosi0Q_i (mosi0Q),
  315. .ChipSelFpga_i (ChipSelFpga_i),
  316. .ChipSelFlash_i (ChipSelFlash_i),
  317. .Assel_i (Assel_i),
  318. .SpiMode_i (SpiMode_i),
  319. .Ss_o (Ss_o),
  320. .SsFlash_o (SsFlash_o),
  321. .Sck_o (Sck_o),
  322. .Mosi0_o (Mosi0_o)
  323. );
  324. end
  325. endgenerate
  326. endmodule