SpiSubSystem.v 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. )
  28. (
  29. input Clk123_i,
  30. input SpiClk_i,
  31. input TxEn_i,
  32. input FifoRxRst_i,
  33. input FifoTxRst_i,
  34. input FifoRxRstRdPtr_i,
  35. input FifoTxRstWrPtr_i,
  36. input SmcAre_i,
  37. input SmcAwe_i,
  38. input [ADDR_REG_WIDTH-1:0] SmcAddr_i,
  39. input ToFifoVal_i,
  40. input [CMD_REG_WIDTH-1:0] ToFifoData_i,
  41. input [1:0] WidthSel_i,
  42. input PulsePol_i,
  43. input ClockPhase_i,
  44. input EndianSel_i,
  45. input Lag_i,
  46. input Lead_i,
  47. input SelSt_i,
  48. input [5:0] Stop_i,
  49. input Assel_i,
  50. input ChipSelFpga_i,
  51. input ChipSelFlash_i,
  52. input SpiMode_i,
  53. input SpiEn_i,
  54. output [CMD_REG_WIDTH-1:0] TxFifoCtrlReg_o,
  55. output [CMD_REG_WIDTH-1:0] RxFifoCtrlReg_o,
  56. output [CMD_REG_WIDTH-1:0] DataFromRxFifo_o,
  57. output Sck_o,
  58. output Ss_o,
  59. output SsFlash_o,
  60. output Mosi0_o,
  61. inout Mosi1_io,
  62. output Mosi2_o,
  63. output Mosi3_o
  64. );
  65. //================================================================================
  66. // REG/WIRE
  67. //================================================================================
  68. wire [CMD_REG_WIDTH-1:0] toSpiData;
  69. wire emptyFlagTx;
  70. wire initRst;
  71. wire sckR;
  72. wire ssR;
  73. wire mosi0R;
  74. wire valToTxR;
  75. wire valToRxR;
  76. wire sckQ;
  77. wire ssQ;
  78. wire mosi0Q;
  79. wire valToTxQ;
  80. wire valToTxFifoRead;
  81. wire valToRxFifoWrite;
  82. wire [CMD_REG_WIDTH-1:0] dataToRxFifo;
  83. //================================================================================
  84. // ASSIGNMENTS
  85. //================================================================================
  86. assign valToTxFifoRead = (SpiMode_i) ? valToTxQ : valToTxR;
  87. assign Mosi1_io = (SpiMode_i) ? mosi1_o : 1'bz;
  88. //================================================================================
  89. // CODING
  90. //================================================================================
  91. InitRst InitRst_inst
  92. (
  93. .clk_i (SpiClk_i),
  94. .signal_o (initRst)
  95. );
  96. Sync1bit #(
  97. .WIDTH (1),
  98. .STAGES (STAGES)
  99. ) Sync1bit_inst
  100. (
  101. .ClkFast_i (Clk123_i),
  102. .ClkSlow_i (SpiClk_i),
  103. .TxEn_i (TxEn_i),
  104. .TxEn_o (spiTxEnSync)
  105. );
  106. DataFifoWrapper #(
  107. .CMD_REG_WIDTH (CMD_REG_WIDTH),
  108. .ADDR_REG_WIDTH (ADDR_REG_WIDTH),
  109. .STAGES (STAGES),
  110. .FIFO_NUM (FIFO_NUM)
  111. ) DataFifoWrapper
  112. (
  113. .WrClk_i (Clk123_i),
  114. .RdClk_i (SpiClk_i),
  115. .FifoRxRst_i (FifoRxRst_i),
  116. .FifoTxRst_i (FifoTxRst_i),
  117. .FifoRxRstRdPtr_i (FifoRxRstRdPtr_i),
  118. .FifoTxRstWrPtr_i (FifoTxRstWrPtr_i),
  119. .SmcAre_i (SmcAre_i),
  120. .SmcAwe_i (SmcAwe_i),
  121. .SmcAddr_i (SmcAddr_i),
  122. .ToFifoVal_i (ToFifoVal_i),
  123. .ToFifoRxData_i (dataToRxFifo),
  124. .ToFifoRxWriteVal_i (valToRxR),
  125. .ToFifoTxReadVal_i (valToTxFifoRead),
  126. .ToFifoData_i (ToFifoData_i),
  127. .TxFifoCtrlReg_o (TxFifoCtrlReg_o),
  128. .RxFifoCtrlReg_o (RxFifoCtrlReg_o),
  129. .EmptyFlagTx_o (emptyFlagTx),
  130. .DataFromRxFifo_o (DataFromRxFifo_o),
  131. .ToSpiData_o (toSpiData)
  132. );
  133. SPIm SPIm_inst (
  134. .Clk_i (SpiClk_i),
  135. .Start_i (spiTxEnSync),
  136. .Rst_i (initRst | SpiMode_i | !SpiEn_i),
  137. .EmptyFlag_i (emptyFlagTx),
  138. .SpiData_i (toSpiData),
  139. .WidthSel_i (WidthSel_i),
  140. .PulsePol_i (PulsePol_i),
  141. .ClockPhase_i (ClockPhase_i),
  142. .EndianSel_i (EndianSel_i),
  143. .Lag_i (Lag_i),
  144. .Lead_i (Lead_i),
  145. .Stop_i (Stop_i),
  146. .SelSt_i (SelSt_i),
  147. .Sck_o (sckR),
  148. .Ss_o (ssR),
  149. .Mosi0_o (mosi0R),
  150. .Val_o (valToTxR)
  151. );
  152. SPIs SPIs_inst (
  153. .Clk_i (SpiClk_i),
  154. .Rst_i (initRst | SpiMode_i),
  155. .Sck_i (sckR),
  156. .Ss_i (ssR),
  157. .Mosi0_i (Mosi1_io),
  158. .WidthSel_i (WidthSel_i),
  159. .EndianSel_i (EndianSel_i),
  160. .SelSt_i (SelSt_i),
  161. .DataToRxFifo_o (dataToRxFifo),
  162. .Val_o (valToRxR)
  163. );
  164. QuadSPIm QuadSPIm_inst (
  165. .Clk_i (SpiClk_i),
  166. .Start_i (spiTxEnSync),
  167. .Rst_i (initRst | !SpiMode_i | !SpiEn_i),
  168. .EmptyFlag_i (emptyFlagTx),
  169. .SpiData_i (toSpiData),
  170. .WidthSel_i (WidthSel_i),
  171. .PulsePol_i (PulsePol_i),
  172. .ClockPhase_i (ClockPhase_i),
  173. .EndianSel_i (EndianSel_i),
  174. .Lag_i (Lag_i),
  175. .Lead_i (Lead_i),
  176. .Stop_i (Stop_i),
  177. .SelSt_i (SelSt_i),
  178. .Sck_o (sckQ),
  179. .Ss_o (ssQ),
  180. .Mosi0_o (mosi0Q),
  181. .Mosi1_o (mosi1_o),
  182. .Mosi2_o (Mosi2_o),
  183. .Mosi3_o (Mosi3_o),
  184. .Val_o (valToTxQ)
  185. );
  186. SpiLinesMuxer SpiLinesMuxer (
  187. .SsR_i (ssR),
  188. .SsQ_i (ssQ),
  189. .SckR_i (sckR),
  190. .SckQ_i (sckQ),
  191. .Mosi0R_i (mosi0R),
  192. .Mosi0Q_i (mosi0Q),
  193. .ChipSelFpga_i (ChipSelFpga_i),
  194. .ChipSelFlash_i (ChipSelFlash_i),
  195. .Assel_i (Assel_i),
  196. .SpiMode_i (SpiMode_i),
  197. .Ss_o (Ss_o),
  198. .SsFlash_o (SsFlash_o),
  199. .Sck_o (Sck_o),
  200. .Mosi0_o (Mosi0_o)
  201. );
  202. endmodule