EpSubsystem.sv 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. module EpSubSystem #(
  2. parameter AXI_DATA_WIDTH = 64,
  3. parameter SPI_NUM = 1,
  4. parameter AXI_ID_WIDTH = 4,
  5. parameter STAGES = 3,
  6. parameter [3:0] ISTEMPRD = 4'b0001,
  7. parameter [3:0] ISPOWERRST = 4'b0001,
  8. parameter FIFO_TX1_ADDR = 64'h0000000000001028,
  9. parameter FIFO_TX2_ADDR = 64'h0000000000002028,
  10. parameter FIFO_TX3_ADDR = 64'h0000000000003028,
  11. parameter FIFO_TX4_ADDR = 64'h0000000000004028,
  12. parameter FIFO_TX5_ADDR = 64'h0000000000005028,
  13. parameter FIFO_TX6_ADDR = 64'h0000000000006028,
  14. parameter FIFO_TX7_ADDR = 64'h0000000000007028,
  15. parameter FIFO_1_READ_ADDR = 64'h0000_0000_0000_1030,
  16. parameter FIFO_2_READ_ADDR = 64'h0000_0000_0000_2030,
  17. parameter FIFO_3_READ_ADDR = 64'h0000_0000_0000_3030,
  18. parameter FIFO_4_READ_ADDR = 64'h0000_0000_0000_4030,
  19. parameter FIFO_5_READ_ADDR = 64'h0000_0000_0000_5030,
  20. parameter FIFO_6_READ_ADDR = 64'h0000_0000_0000_6030,
  21. parameter FIFO_7_READ_ADDR = 64'h0000_0000_0000_7030
  22. )
  23. (
  24. AxiMMBus.master Bus,
  25. /* Ld */
  26. input [SPI_NUM-1:0] Ld_i,
  27. output [SPI_NUM-1:0] Mosi0_o,
  28. inout [SPI_NUM-1:0] Mosi1_io, //inout: when RSPI mode, input; when QSPI mode output;
  29. output [SPI_NUM-1:0] Mosi2_o,
  30. output [SPI_NUM-1:0] Mosi3_o,
  31. output [SPI_NUM-1:0] Ss_o,
  32. output [SPI_NUM-1:0] SsFlash_o,
  33. output [SPI_NUM-1:0] Sck_o,
  34. output [SPI_NUM-1:0] SpiRst_o,
  35. output [SPI_NUM-1:0] SpiDir_o,
  36. output LD_o
  37. );
  38. //================================================================================
  39. // REG/WIRE
  40. //================================================================================
  41. /* SPI0 */
  42. wire [AXI_DATA_WIDTH-1:0] spi0Ctrl;
  43. wire [AXI_DATA_WIDTH-1:0] spi0Clk;
  44. wire [AXI_DATA_WIDTH-1:0] spi0CsDelay;
  45. wire [AXI_DATA_WIDTH-1:0] spi0CsCtrl;
  46. wire [AXI_DATA_WIDTH-1:0] spi0TxRxFifoCtrl;
  47. /* SPI1 */
  48. wire [AXI_DATA_WIDTH-1:0] spi1Ctrl;
  49. wire [AXI_DATA_WIDTH-1:0] spi1Clk;
  50. wire [AXI_DATA_WIDTH-1:0] spi1CsDelay;
  51. wire [AXI_DATA_WIDTH-1:0] spi1CsCtrl;
  52. wire [AXI_DATA_WIDTH-1:0] spi1TxRxFifoCtrl;
  53. /* SPI2 */
  54. wire [AXI_DATA_WIDTH-1:0] spi2Ctrl;
  55. wire [AXI_DATA_WIDTH-1:0] spi2Clk;
  56. wire [AXI_DATA_WIDTH-1:0] spi2CsDelay;
  57. wire [AXI_DATA_WIDTH-1:0] spi2CsCtrl;
  58. wire [AXI_DATA_WIDTH-1:0] spi2TxRxFifoCtrl;
  59. /* SPI3 */
  60. wire [AXI_DATA_WIDTH-1:0] spi3Ctrl;
  61. wire [AXI_DATA_WIDTH-1:0] spi3Clk;
  62. wire [AXI_DATA_WIDTH-1:0] spi3CsDelay;
  63. wire [AXI_DATA_WIDTH-1:0] spi3CsCtrl;
  64. wire [AXI_DATA_WIDTH-1:0] spi3TxRxFifoCtrl;
  65. /* SPI4 */
  66. wire [AXI_DATA_WIDTH-1:0] spi4Ctrl;
  67. wire [AXI_DATA_WIDTH-1:0] spi4Clk;
  68. wire [AXI_DATA_WIDTH-1:0] spi4CsDelay;
  69. wire [AXI_DATA_WIDTH-1:0] spi4CsCtrl;
  70. wire [AXI_DATA_WIDTH-1:0] spi4TxRxFifoCtrl;
  71. /* SPI5 */
  72. wire [AXI_DATA_WIDTH-1:0] spi5Ctrl;
  73. wire [AXI_DATA_WIDTH-1:0] spi5Clk;
  74. wire [AXI_DATA_WIDTH-1:0] spi5CsDelay;
  75. wire [AXI_DATA_WIDTH-1:0] spi5CsCtrl;
  76. wire [AXI_DATA_WIDTH-1:0] spi5TxRxFifoCtrl;
  77. /* SPI6 */
  78. wire [AXI_DATA_WIDTH-1:0] spi6Ctrl;
  79. wire [AXI_DATA_WIDTH-1:0] spi6Clk;
  80. wire [AXI_DATA_WIDTH-1:0] spi6CsDelay;
  81. wire [AXI_DATA_WIDTH-1:0] spi6CsCtrl;
  82. wire [AXI_DATA_WIDTH-1:0] spi6TxRxFifoCtrl;
  83. /* Spi settings arrays */
  84. wire [AXI_DATA_WIDTH - 1 : 0] spiCtrlArray [SPI_NUM-1:0];
  85. wire [AXI_DATA_WIDTH - 1 : 0] spiClkArray [SPI_NUM-1:0];
  86. wire [AXI_DATA_WIDTH - 1 : 0] spiCsDelayArray [SPI_NUM-1:0];
  87. wire [AXI_DATA_WIDTH - 1 : 0] spiCsCtrlArray [SPI_NUM-1:0];
  88. wire [AXI_DATA_WIDTH - 1 : 0] spiTxRxFifoCtrlArray [SPI_NUM-1:0];
  89. /* Common Regs */
  90. wire [AXI_DATA_WIDTH-1:0] spiTxRxEnReg;
  91. wire [AXI_DATA_WIDTH-1:0] dataFromRegMap;
  92. /* Synced Regs */
  93. wire [AXI_DATA_WIDTH-1:0] spiCtrlRR [SPI_NUM-1:0];
  94. wire [AXI_DATA_WIDTH-1:0] spiCsDelayRR [SPI_NUM-1:0];
  95. wire [AXI_DATA_WIDTH-1:0] spiCsCtrlRR [SPI_NUM-1:0];
  96. wire [AXI_DATA_WIDTH-1:0] spiTxRxFifoCtrlRR [SPI_NUM-1:0];
  97. /* AXI-Slave */
  98. wire [AXI_DATA_WIDTH-1:0] rdDataToAxiSlave;
  99. wire [AXI_DATA_WIDTH-1:0] rdAddr;
  100. wire [AXI_DATA_WIDTH-1:0] wrDataFromAxiSlave;
  101. wire [AXI_DATA_WIDTH-1:0] wrAddrFromAxiSlave;
  102. wire valFromAxiSlave;
  103. wire valToRdFifo;
  104. /* Input Mux */
  105. wire [AXI_DATA_WIDTH-1:0] toFifoData;
  106. wire [SPI_NUM-1:0] toFifoVal;
  107. wire [AXI_DATA_WIDTH-1:0] toRegMapData;
  108. wire [AXI_DATA_WIDTH-1:0] dataBus;
  109. wire [SPI_NUM:0] dataBusVal;
  110. wire toRegMapVal;
  111. wire [AXI_DATA_WIDTH-1:0] toRegMapAddr;
  112. /* Clock Manager */
  113. wire [7:0] baudRate [SPI_NUM-1:0];
  114. wire [SPI_NUM-1:0] spiClkBus;
  115. /* SpiSettings */
  116. wire [1:0] widthSel [SPI_NUM-1:0];
  117. wire [SPI_NUM-1:0] spiEn;
  118. wire [SPI_NUM-1:0] spiMode;
  119. wire [SPI_NUM-1:0] clockPol;
  120. wire [SPI_NUM-1:0] clockPhase;
  121. wire [SPI_NUM-1:0] endianSel;
  122. wire [SPI_NUM-1:0] selSt;
  123. wire [SPI_NUM-1:0] assel;
  124. wire [5:0] stopDelay [SPI_NUM-1:0];
  125. wire [SPI_NUM-1:0] lead;
  126. wire [SPI_NUM-1:0] lag;
  127. wire [SPI_NUM-1:0] fifoTxRst;
  128. wire [SPI_NUM-1:0] fifoRxRst;
  129. wire [SPI_NUM-1:0] txEn;
  130. wire [SPI_NUM-1:0] chipSelFpga;
  131. wire [SPI_NUM-1:0] chipSelFlash;
  132. wire [SPI_NUM-1:0] fifoRxRstRdPtr;
  133. wire [SPI_NUM-1:0] fifoTxRstWrPtr;
  134. /* CDC LD */
  135. wire [SPI_NUM-1:0] ldReg;
  136. /* Output Mux */
  137. wire [AXI_DATA_WIDTH - 1 : 0] dataFromRxFifo [SPI_NUM-1:0];
  138. //================================================================================
  139. // ASSIGNMENTS
  140. //================================================================================
  141. genvar j;
  142. generate
  143. for (j = 0; j < SPI_NUM; j = j +1) begin : Assignments
  144. assign fifoRxRstRdPtr[j] = spiTxRxFifoCtrlArray[j][32];
  145. assign fifoTxRstWrPtr[j] = spiTxRxFifoCtrlArray[j][0];
  146. end
  147. endgenerate
  148. //================================================================================
  149. // CODING
  150. //================================================================================
  151. AxiMMBus #(.AXI_DATA_WIDTH(AXI_DATA_WIDTH)) AxiBus();
  152. AxiSlave #(
  153. .AXI_DATA_WIDTH(AXI_DATA_WIDTH)
  154. ) axi_slave (
  155. .Bus(Bus),
  156. .RdData_i(rdDataToAxiSlave),
  157. .Val_o (valFromAxiSlave),
  158. .ValToRdFifo_o(valToRdFifo),
  159. .Data_o (wrDataFromAxiSlave),
  160. .RdAddr_o (rdAddr),
  161. .Addr_o (wrAddrFromAxiSlave)
  162. );
  163. /* Input Mux */
  164. InputMux #(
  165. .AXI_DATA_WIDTH (AXI_DATA_WIDTH),
  166. .SPI_NUM (SPI_NUM),
  167. .FIFO_TX1_ADDR (FIFO_TX1_ADDR),
  168. .FIFO_TX2_ADDR (FIFO_TX2_ADDR),
  169. .FIFO_TX3_ADDR (FIFO_TX3_ADDR),
  170. .FIFO_TX4_ADDR (FIFO_TX4_ADDR),
  171. .FIFO_TX5_ADDR (FIFO_TX5_ADDR),
  172. .FIFO_TX6_ADDR (FIFO_TX6_ADDR),
  173. .FIFO_TX7_ADDR (FIFO_TX7_ADDR)
  174. ) InputMux (
  175. .Clk_i(s_axi_aclk),
  176. .RstN_i(s_axi_aresetn),
  177. .Val_i(valFromAxiSlave),
  178. .Addr_i(wrAddrFromAxiSlave),
  179. .Data_i(wrDataFromAxiSlave),
  180. .ToRegMapAddr_o(toRegMapAddr),
  181. .Val_o(dataBusVal),
  182. .Data_o(dataBus)
  183. );
  184. /* Register Map */
  185. RegMap #(
  186. .AXI_DATA_WIDTH (AXI_DATA_WIDTH),
  187. .SPI_NUM (SPI_NUM)
  188. ) RegMap (
  189. .Clk_i(s_axi_aclk),
  190. .RstN_i(s_axi_aresetn),
  191. .WrData_i(dataBus),
  192. .WrAddr_i(toRegMapAddr),
  193. .RdAddr_i(rdAddr),
  194. .Val_i(dataBusVal[SPI_NUM]),
  195. .SpiCtrlReg_o(spiCtrlArray),
  196. .SpiClkReg_o(spiClkArray),
  197. .SpiCsDelayReg_o(spiCsDelayArray),
  198. .SpiCsCtrlReg_o(spiCsCtrlArray),
  199. .SpiTxRxFifoCtrlReg_o(spiTxRxFifoCtrlArray),
  200. .SpiTxRxEnReg_o(spiTxRxEnReg),
  201. .AnsDataReg_o(dataFromRegMap)
  202. );
  203. /* Clock Manager */
  204. ClkManager #(
  205. .SPI_NUM (SPI_NUM),
  206. .STAGES (STAGES)
  207. ) ClkManager
  208. (
  209. .Clk_i(s_axi_aclk),
  210. .Rst_i(~s_axi_aresetn),
  211. .BaudRate_i (baudRate),
  212. .SpiClk_o(spiClkBus),
  213. .SubSystSyncRst_o(spiSubSysRst)
  214. );
  215. /* CDC Block */
  216. CDC #(
  217. .WIDTH (AXI_DATA_WIDTH),
  218. .STAGES (STAGES),
  219. .SPI_NUM (SPI_NUM)
  220. ) synchronizer
  221. (
  222. .ClkFast_i (s_axi_aclk),
  223. .ClkSlow_i (spiClkBus),
  224. .SpiCtrlReg_i (spiCtrlArray),
  225. .SpiCsCtrlReg_i (spiCsCtrlArray),
  226. .SpiCsDelayReg_i (spiCsDelayArray),
  227. .SpiTxRxFifoCtrlReg_i (spiTxRxFifoCtrlArray),
  228. .SpiCtrlReg_o (spiCtrlRR),
  229. .SpiCsCtrlReg_o (spiCsCtrlRR),
  230. .SpiCsDelayReg_o (spiCsDelayRR),
  231. .SpiTxRxFifoCtrlReg_o (spiTxRxFifoCtrlRR)
  232. );
  233. /* Spi Settings Block */
  234. SpiSettings #(
  235. .AXI_DATA_WIDTH(AXI_DATA_WIDTH),
  236. .SPI_NUM(SPI_NUM)
  237. ) spiSettings (
  238. .SpiCtrlReg_i(spiCtrlRR),
  239. .SpiCsDelayReg_i(spiCsDelayRR),
  240. .SpiClkReg_i(spiClkArray),
  241. .SpiCsCtrlReg_i(spiCsCtrlRR),
  242. .SpiTxRxFifoCtrlReg_i(spiTxRxFifoCtrlRR),
  243. .SpiTxRxEnReg_i(spiTxRxEnReg),
  244. .WidthSel_o(widthSel),
  245. .SpiEn_o(spiEn),
  246. .SpiMode_o(spiMode),
  247. .ClockPol_o(clockPol),
  248. .ClockPhase_o(clockPhase),
  249. .EndianSel_o(endianSel),
  250. .SelSt_o(selSt),
  251. .Assel(assel),
  252. .StopDelay_o(stopDelay),
  253. .Lead_o(lead),
  254. .Lag_o(lag),
  255. .BaudRate_o(baudRate),
  256. .SpiRst_o(SpiRst_o),
  257. .FifoRxRst_o(fifoRxRst),
  258. .FifoTxRst_o(fifoTxRst),
  259. .ChipSelFpga_o(chipSelFpga),
  260. .ChipSelFlash_o(chipSelFlash),
  261. .SpiDir_o(SpiDir_o),
  262. .TxEn_o(txEn)
  263. );
  264. /* Generate block */
  265. genvar i;
  266. generate
  267. for (i = 0; i < SPI_NUM; i = i + 1) begin : SpiSubSystem
  268. SpiSubSystem #(
  269. .STAGES (STAGES),
  270. .CMD_REG_WIDTH (AXI_DATA_WIDTH),
  271. .ADDR_REG_WIDTH (AXI_DATA_WIDTH),
  272. .WIDTH (1),
  273. .FIFO_NUM (SPI_NUM),
  274. .ISTEMPRD (ISTEMPRD[i]),
  275. .ISPOWERRST (ISPOWERRST[i])
  276. ) SpiSubSystem (
  277. .Clk_i(s_axi_aclk),
  278. .SpiClk_i(spiClkBus[i]),
  279. .Rst_i(spiSubSysRst),
  280. .TxEn_i(txEn[i]),
  281. .FifoRxRst_i(fifoRxRst[i]),
  282. .FifoTxRst_i(fifoTxRst[i]),
  283. .FifoRxRstRdPtr_i(fifoRxRstRdPtr[i]),
  284. .FifoTxRstWrPtr_i(fifoTxRstWrPtr[i]),
  285. .ToFifoVal_i(dataBusVal[i]),
  286. .ToRstMemVal_i(dataBusVal[i]),
  287. .ToFifoData_i(dataBus),
  288. .WidthSel_i(widthSel[i]),
  289. .PulsePol_i(clockPol[i]),
  290. .ClockPhase_i(clockPhase[i]),
  291. .EndianSel_i(endianSel[i]),
  292. .Lag_i(lag[i]),
  293. .Lead_i(lead[i]),
  294. .SelSt_i(selSt[i]),
  295. .Stop_i(stopDelay[i]),
  296. .Assel_i(assel[i]),
  297. .ChipSelFpga_i(chipSelFpga[i]),
  298. .ChipSelFlash_i(chipSelFlash[i]),
  299. .SpiMode_i(spiMode[i]),
  300. .SpiEn_i(spiEn[i]),
  301. .TxFifoCtrlReg_o(),
  302. .RxFifoCtrlReg_o(),
  303. .DataFromRxFifo_o(dataFromRxFifo[i]),
  304. .Sck_o(Sck_o[i]),
  305. .Ss_o(Ss_o[i]),
  306. .SsFlash_o(SsFlash_o[i]),
  307. .Mosi0_o(Mosi0_o[i]),
  308. .Mosi1_io(Mosi1_io[i]),
  309. .Mosi2_o(Mosi2_o[i]),
  310. .Mosi3_o(Mosi3_o[i]),
  311. .Ctrl_i(),
  312. .TempData_o()
  313. );
  314. xpm_cdc_single #(
  315. .DEST_SYNC_FF (3),
  316. .INIT_SYNC_FF (0),
  317. .SIM_ASSERT_CHK (0),
  318. .SRC_INPUT_REG (1)
  319. )
  320. xpm_cdc_single_inst(
  321. .dest_out (ldReg[i]),
  322. .dest_clk (s_axi_aclk),
  323. .src_clk (spiClkBus[i]),
  324. .src_in (Ld_i[i])
  325. );
  326. end
  327. endgenerate
  328. /* Output Mux */
  329. OutputMux #(
  330. .AXI_DATA_WIDTH (AXI_DATA_WIDTH),
  331. .SPI_NUM (SPI_NUM),
  332. .FIFO_1_READ_ADDR (FIFO_1_READ_ADDR),
  333. .FIFO_2_READ_ADDR (FIFO_2_READ_ADDR),
  334. .FIFO_3_READ_ADDR (FIFO_3_READ_ADDR),
  335. .FIFO_4_READ_ADDR (FIFO_4_READ_ADDR),
  336. .FIFO_5_READ_ADDR (FIFO_5_READ_ADDR),
  337. .FIFO_6_READ_ADDR (FIFO_6_READ_ADDR),
  338. .FIFO_7_READ_ADDR (FIFO_7_READ_ADDR)
  339. ) OutputMux (
  340. .Clk_i(s_axi_aclk),
  341. .RstN_i(s_axi_aresetn),
  342. .DataFromRxFifo_i(dataFromRxFifo),
  343. .DataFromRegMap_i(dataFromRegMap),
  344. .Addr_i(rdAddr),
  345. .AnsData_o(rdDataToAxiSlave)
  346. );
  347. endmodule