SpiSubSystem.v 4.4 KB

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