SpiSubSystem.v 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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 SpiMode_i,
  28. input SpiEn_i,
  29. output [CmdRegWidth-1:0] TxFifoCtrlReg_o,
  30. output [CmdRegWidth-1:0] RxFifoCtrlReg_o,
  31. output [CmdRegWidth-1:0] DataFromRxFifo_o,
  32. output Sck_o,
  33. output Ss_o,
  34. output Mosi0_o,
  35. output Mosi1_o,
  36. output Mosi2_o,
  37. output Mosi3_o
  38. );
  39. //================================================================================
  40. // REG/WIRE
  41. //================================================================================
  42. wire [CmdRegWidth-1:0] toSpiData;
  43. wire emptyFlagTx;
  44. wire initRst;
  45. wire sckR;
  46. wire ssR;
  47. wire mosi0R;
  48. wire valToTxR;
  49. wire valToRxR;
  50. wire sckQ;
  51. wire ssQ;
  52. wire mosi0Q;
  53. wire valToTxQ;
  54. wire valToTxFifoRead;
  55. wire valToRxFifoWrite;
  56. //================================================================================
  57. // ASSIGNMENTS
  58. //================================================================================
  59. assign Sck_o = (SpiMode_i) ? sckQ : sckR;
  60. assign Mosi0_o = (SpiMode_i) ? mosi0Q : mosi0R;
  61. assign Ss_o = (SpiMode_i) ? ssQ : ssR;
  62. assign valToTxFifoRead = (SpiMode_i) ? valToTxQ : valToTxR;
  63. //================================================================================
  64. // CODING
  65. //================================================================================
  66. InitRst InitRst_inst
  67. (
  68. .clk_i(SpiClk_i),
  69. .signal_o(initRst)
  70. );
  71. Sync1bit #(
  72. .WIDTH(1),
  73. .STAGES(STAGES)
  74. ) Sync1bit_inst (
  75. .ClkFast_i(Clk123_i),
  76. .ClkSlow_i(SpiClk_i),
  77. .TxEn_i(TxEn_i),
  78. .TxEn_o(spiTxEnSync)
  79. );
  80. DataFifoWrapper #(
  81. .STAGES(STAGES)
  82. ) DataFifoWrapper
  83. (
  84. .WrClk_i(Clk123_i),
  85. .RdClk_i(SpiClk_i),
  86. .FifoRxRst_i(FifoRxRst_i),
  87. .FifoTxRst_i(FifoTxRst_i),
  88. .FifoRxRstRdPtr_i(FifoRxRstRdPtr_i),
  89. .FifoTxRstWrPtr_i(FifoTxRstWrPtr_i),
  90. .SmcAre_i(SmcAre_i),
  91. .SmcAwe_i(SmcAwe_i),
  92. .SmcAddr_i(SmcAddr_i),
  93. .ToFifoVal_i(ToFifoVal_i),
  94. .ToFifoRxData_i(dataToRxFifo),
  95. .ToFifoRxWriteVal_i(valToRxR),
  96. .ToFifoTxReadVal_i(valToTxFifoRead),
  97. .ToFifoData_i(ToFifoData_i),
  98. .TxFifoCtrlReg_o(TxFifoCtrlReg_o),
  99. .RxFifoCtrlReg_o(RxFifoCtrlReg_o),
  100. .EmptyFlagTx_o(emptyFlagTx),
  101. .DataFromRxFifo_o(DataFromRxFifo_o),
  102. .ToSpiData_o(toSpiData)
  103. );
  104. SPIm SPIm_inst (
  105. .Clk_i(SpiClk_i),
  106. .Start_i(spiTxEnSync),
  107. .Rst_i(initRst | SpiMode_i | !SpiEn_i),
  108. .EmptyFlag_i(emptyFlagTx),
  109. .SpiData_i(toSpiData),
  110. .WidthSel_i(WidthSel_i),
  111. .PulsePol_i(PulsePol_i),
  112. .ClockPhase_i(ClockPhase_i),
  113. .EndianSel_i(EndianSel_i),
  114. .Lag_i(Lag_i),
  115. .Lead_i(Lead_i),
  116. .Stop_i(Stop_i),
  117. .SelSt_i(SelSt_i),
  118. .Sck_o(sckR),
  119. .Ss_o(ssR),
  120. .Mosi0_o(mosi0R),
  121. .Val_o(valToTxR)
  122. );
  123. SPIs SPIs_inst (
  124. .Clk_i(SpiClk_i),
  125. .Rst_i(initRst | SpiMode_i),
  126. .Sck_i(sckR),
  127. .Ss_i(ssR),
  128. .Mosi0_i(Mosi1_io),
  129. .WidthSel_i(WidthSel_i),
  130. .EndianSel_i(EndianSel_i),
  131. .SelSt_i(SelSt_i),
  132. .DataToRxFifo_o(dataToRxFifo),
  133. .Val_o(valToRxR)
  134. );
  135. QuadSPIm QuadSPIm_inst (
  136. .Clk_i(SpiClk_i),
  137. .Start_i(spiTxEnSync),
  138. .Rst_i(initRst | !SpiMode_i | !SpiEn_i),
  139. .EmptyFlag_i(emptyFlagTx),
  140. .SpiData_i(toSpiData),
  141. .WidthSel_i(WidthSel_i),
  142. .PulsePol_i(PulsePol_i),
  143. .ClockPhase_i(ClockPhase_i),
  144. .EndianSel_i(EndianSel_i),
  145. .Lag_i(Lag_i),
  146. .Lead_i(Lead_i),
  147. .Stop_i(Stop_i),
  148. .SelSt_i(SelSt_i),
  149. .Sck_o(sckQ),
  150. .Ss_o(ssQ),
  151. .Mosi0_o(mosi0_q),
  152. .Mosi1_o(Mosi1_o),
  153. .Mosi2_o(Mosi2_o),
  154. .Mosi3_o(Mosi3_o),
  155. .Val_o(valToTxQ)
  156. );
  157. endmodule