SpiSubSystem.v 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. output Mosi1_o,
  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. //================================================================================
  66. // CODING
  67. //================================================================================
  68. InitRst InitRst_inst
  69. (
  70. .clk_i(SpiClk_i),
  71. .signal_o(initRst)
  72. );
  73. Sync1bit #(
  74. .WIDTH(1),
  75. .STAGES(STAGES)
  76. ) Sync1bit_inst (
  77. .ClkFast_i(Clk123_i),
  78. .ClkSlow_i(SpiClk_i),
  79. .TxEn_i(TxEn_i),
  80. .TxEn_o(spiTxEnSync)
  81. );
  82. DataFifoWrapper #(
  83. .STAGES(STAGES)
  84. ) DataFifoWrapper
  85. (
  86. .WrClk_i(Clk123_i),
  87. .RdClk_i(SpiClk_i),
  88. .FifoRxRst_i(FifoRxRst_i),
  89. .FifoTxRst_i(FifoTxRst_i),
  90. .FifoRxRstRdPtr_i(FifoRxRstRdPtr_i),
  91. .FifoTxRstWrPtr_i(FifoTxRstWrPtr_i),
  92. .SmcAre_i(SmcAre_i),
  93. .SmcAwe_i(SmcAwe_i),
  94. .SmcAddr_i(SmcAddr_i),
  95. .ToFifoVal_i(ToFifoVal_i),
  96. .ToFifoRxData_i(dataToRxFifo),
  97. .ToFifoRxWriteVal_i(valToRxR),
  98. .ToFifoTxReadVal_i(valToTxFifoRead),
  99. .ToFifoData_i(ToFifoData_i),
  100. .TxFifoCtrlReg_o(TxFifoCtrlReg_o),
  101. .RxFifoCtrlReg_o(RxFifoCtrlReg_o),
  102. .EmptyFlagTx_o(emptyFlagTx),
  103. .DataFromRxFifo_o(DataFromRxFifo_o),
  104. .ToSpiData_o(toSpiData)
  105. );
  106. SPIm SPIm_inst (
  107. .Clk_i(SpiClk_i),
  108. .Start_i(spiTxEnSync),
  109. .Rst_i(initRst | SpiMode_i | !SpiEn_i),
  110. .EmptyFlag_i(emptyFlagTx),
  111. .SpiData_i(toSpiData),
  112. .WidthSel_i(WidthSel_i),
  113. .PulsePol_i(PulsePol_i),
  114. .ClockPhase_i(ClockPhase_i),
  115. .EndianSel_i(EndianSel_i),
  116. .Lag_i(Lag_i),
  117. .Lead_i(Lead_i),
  118. .Stop_i(Stop_i),
  119. .SelSt_i(SelSt_i),
  120. .Sck_o(sckR),
  121. .Ss_o(ssR),
  122. .Mosi0_o(mosi0R),
  123. .Val_o(valToTxR)
  124. );
  125. SPIs SPIs_inst (
  126. .Clk_i(SpiClk_i),
  127. .Rst_i(initRst | SpiMode_i),
  128. .Sck_i(sckR),
  129. .Ss_i(ssR),
  130. .Mosi0_i(Mosi1_io),
  131. .WidthSel_i(WidthSel_i),
  132. .EndianSel_i(EndianSel_i),
  133. .SelSt_i(SelSt_i),
  134. .DataToRxFifo_o(dataToRxFifo),
  135. .Val_o(valToRxR)
  136. );
  137. QuadSPIm QuadSPIm_inst (
  138. .Clk_i(SpiClk_i),
  139. .Start_i(spiTxEnSync),
  140. .Rst_i(initRst | !SpiMode_i | !SpiEn_i),
  141. .EmptyFlag_i(emptyFlagTx),
  142. .SpiData_i(toSpiData),
  143. .WidthSel_i(WidthSel_i),
  144. .PulsePol_i(PulsePol_i),
  145. .ClockPhase_i(ClockPhase_i),
  146. .EndianSel_i(EndianSel_i),
  147. .Lag_i(Lag_i),
  148. .Lead_i(Lead_i),
  149. .Stop_i(Stop_i),
  150. .SelSt_i(SelSt_i),
  151. .Sck_o(sckQ),
  152. .Ss_o(ssQ),
  153. .Mosi0_o(mosi0Q),
  154. .Mosi1_o(Mosi1_o),
  155. .Mosi2_o(Mosi2_o),
  156. .Mosi3_o(Mosi3_o),
  157. .Val_o(valToTxQ)
  158. );
  159. SpiLinesMuxer SpiLinesMuxer (
  160. .SsR_i(ssR),
  161. .SsQ_i(ssQ),
  162. .SckR_i(sckR),
  163. .SckQ_i(sckQ),
  164. .Mosi0R_i(mosi0R),
  165. .Mosi0Q_i(mosi0Q),
  166. .ChipSelFpga_i(ChipSelFpga_i),
  167. .ChipSelFlash_i(ChipSelFlash_i),
  168. .Assel_i(Assel_i),
  169. .SpiMode_i(SpiMode_i),
  170. .Ss_o(Ss_o),
  171. .SsFlash_o(SsFlash_o),
  172. .Sck_o(Sck_o),
  173. .Mosi0_o(Mosi0_o)
  174. );
  175. endmodule