EpSubsystem.sv 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. module EpSubSystem #(
  2. parameter AXI_DATA_WIDTH = 64,
  3. parameter SPI_NUM = 2,
  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 [AXI_DATA_WIDTH-1:0] SPI_BASE_ADDR = 64'h0000_0000_0000_1000,
  9. parameter [AXI_DATA_WIDTH-1:0] RST_MEM_BASE_ADDR = 64'h0000_0000_0000_9000,
  10. parameter [AXI_DATA_WIDTH-1:0] FIFO_TX_ADDR_OFFSET = 64'h0000_0000_0000_0028,
  11. parameter [AXI_DATA_WIDTH-1:0] FIFO_READ_ADDR_OFFSET = 64'h0000_0000_0000_0030,
  12. parameter [AXI_DATA_WIDTH-1:0] FIFO_1_READ_ADDR = 64'h0000_0000_0000_1030,
  13. parameter [AXI_DATA_WIDTH-1:0] FIFO_2_READ_ADDR = 64'h0000_0000_0000_2030,
  14. parameter [AXI_DATA_WIDTH-1:0] FIFO_3_READ_ADDR = 64'h0000_0000_0000_3030,
  15. parameter [AXI_DATA_WIDTH-1:0] FIFO_4_READ_ADDR = 64'h0000_0000_0000_4030,
  16. parameter [AXI_DATA_WIDTH-1:0] FIFO_5_READ_ADDR = 64'h0000_0000_0000_5030,
  17. parameter [AXI_DATA_WIDTH-1:0] FIFO_6_READ_ADDR = 64'h0000_0000_0000_6030,
  18. parameter [AXI_DATA_WIDTH-1:0] FIFO_7_READ_ADDR = 64'h0000_0000_0000_7030
  19. )
  20. (
  21. AxiMMBus.master Bus,
  22. /* Ld */
  23. input [SPI_NUM-1:0] ArbSpiStart_i,
  24. input [SPI_NUM-1:0] ArbSpiRst_i,
  25. input [SPI_NUM-1:0] ArbPowRstEn_i,
  26. output [SPI_NUM-1:0] Mosi0_o,
  27. inout [SPI_NUM-1:0] Mosi1_io, //inout: when RSPI mode, input; when QSPI mode output;
  28. output [SPI_NUM-1:0] Mosi2_o,
  29. output [SPI_NUM-1:0] Mosi3_o,
  30. output [SPI_NUM-1:0] Ss_o,
  31. output [SPI_NUM-1:0] SsFlash_o,
  32. output [SPI_NUM-1:0] Sck_o,
  33. output [SPI_NUM-1:0] SpiRst_o,
  34. output [SPI_NUM-1:0] SpiDir_o,
  35. output LD_o
  36. );
  37. //================================================================================
  38. // REG/WIRE
  39. //================================================================================
  40. /* Common Regs */
  41. wire [AXI_DATA_WIDTH-1:0] spiTxRxEnReg;
  42. wire [AXI_DATA_WIDTH-1:0] dataFromRegMap;
  43. /* AXI-Slave */
  44. wire [AXI_DATA_WIDTH-1:0] rdDataToAxiSlave;
  45. wire [AXI_DATA_WIDTH-1:0] rdAddrFromAxiSlave;
  46. wire [AXI_DATA_WIDTH-1:0] wrDataFromAxiSlave;
  47. wire [AXI_DATA_WIDTH-1:0] wrAddrFromAxiSlave;
  48. wire valFromAxiSlave;
  49. wire valToRdFifo;
  50. /* Input Mux */
  51. wire [AXI_DATA_WIDTH-1:0] toFifoData;
  52. wire [SPI_NUM-1:0] toFifoVal;
  53. wire [AXI_DATA_WIDTH-1:0] toRegMapData;
  54. wire [AXI_DATA_WIDTH-1:0] dataBus;
  55. wire [SPI_NUM:0] dataBusVal;
  56. wire toRegMapVal;
  57. wire [AXI_DATA_WIDTH-1:0] toRegMapAddr;
  58. /* Clock Manager */
  59. wire [7:0] baudRate [SPI_NUM-1:0];
  60. wire [SPI_NUM-1:0] spiClkBus;
  61. /* CDC LD */
  62. wire [SPI_NUM-1:0] ldReg;
  63. /* Output Mux */
  64. wire [AXI_DATA_WIDTH - 1 : 0] dataFromRxFifo [SPI_NUM-1:0];
  65. //================================================================================
  66. // ASSIGNMENTS
  67. //================================================================================
  68. //================================================================================
  69. // CODING
  70. //================================================================================
  71. AxiMMBus #(.AXI_DATA_WIDTH(AXI_DATA_WIDTH)) AxiBus();
  72. AxiSlave #(
  73. .AXI_DATA_WIDTH(AXI_DATA_WIDTH)
  74. ) axi_slave (
  75. .Bus(Bus),
  76. .RdData_i(rdDataToAxiSlave),
  77. .Val_o (valFromAxiSlave),
  78. .ValToRdFifo_o(valToRdFifo),
  79. .Data_o (wrDataFromAxiSlave),
  80. .RdAddr_o (rdAddrFromAxiSlave),
  81. .Addr_o (wrAddrFromAxiSlave)
  82. );
  83. ClkManager #(
  84. .SPI_NUM (SPI_NUM),
  85. .STAGES (STAGES)
  86. ) ClkManager
  87. (
  88. .Clk_i(s_axi_aclk),
  89. .RstN_i(~s_axi_aresetn),
  90. .WrData_i(wrDataFromAxiSlave),
  91. .WrAddr_i(wrAddrFromAxiSlave),
  92. .Val_i(valFromAxiSlave),
  93. .SpiClk_o(spiClkBus),
  94. .SubSystSyncRst_o(spiSubSysRst)
  95. );
  96. genvar i;
  97. generate
  98. for (i = 0; i < SPI_NUM; i = i + 1) begin : SpiSubSystem
  99. SpiSubSystem #(
  100. .STAGES (STAGES),
  101. .AXI_DATA_WIDTH (AXI_DATA_WIDTH),
  102. .CMD_REG_WIDTH (AXI_DATA_WIDTH),
  103. .ADDR_REG_WIDTH (AXI_DATA_WIDTH),
  104. .WIDTH (1),
  105. .ISTEMPRD (ISTEMPRD[i]),
  106. .ISPOWERRST (ISPOWERRST[i]),
  107. .SPI_BASE_ADDR (SPI_BASE_ADDR*i+64'h1000),
  108. .RST_MEM_BASE_ADDR (RST_MEM_BASE_ADDR*i)
  109. ) SpiSubSystem (
  110. .Clk_i(s_axi_aclk),
  111. .SpiClk_i(spiClkBus[i]),
  112. .Rst_i(spiSubSysRst|ArbSpiRst_i[i]),
  113. .WrData_i(wrDataFromAxiSlave),
  114. .WrAddr_i(wrAddrFromAxiSlave),
  115. .RdAddr_i(rdAddrFromAxiSlave),
  116. .Val_i(valFromAxiSlave),
  117. .PowRstEn_i(ArbPowRstEn_i[i]),
  118. .TxEn_i(ArbSpiStart_i[i]),
  119. .RdData_o(dataFromRxFifo[i]),
  120. .Sck_o(Sck_o[i]),
  121. .Ss_o(Ss_o[i]),
  122. .SsFlash_o(SsFlash_o[i]),
  123. .Mosi0_o(Mosi0_o[i]),
  124. .Mosi1_io(Mosi1_io[i]),
  125. .Mosi2_o(Mosi2_o[i]),
  126. .Mosi3_o(Mosi3_o[i])
  127. );
  128. end
  129. endgenerate
  130. /* Output Mux */
  131. OutputMux
  132. #(
  133. .AXI_DATA_WIDTH (AXI_DATA_WIDTH),
  134. .SPI_NUM (SPI_NUM),
  135. .FIFO_1_READ_ADDR (FIFO_1_READ_ADDR),
  136. .FIFO_2_READ_ADDR (FIFO_2_READ_ADDR),
  137. .FIFO_3_READ_ADDR (FIFO_3_READ_ADDR),
  138. .FIFO_4_READ_ADDR (FIFO_4_READ_ADDR),
  139. .FIFO_5_READ_ADDR (FIFO_5_READ_ADDR),
  140. .FIFO_6_READ_ADDR (FIFO_6_READ_ADDR),
  141. .FIFO_7_READ_ADDR (FIFO_7_READ_ADDR)
  142. )
  143. OutputMux (
  144. .Clk_i(s_axi_aclk),
  145. .RstN_i(s_axi_aresetn),
  146. .DataFromRxFifo_i(dataFromRxFifo),
  147. .DataFromRegMap_i(dataFromRegMap),
  148. .Addr_i(rdAddrFromAxiSlave),
  149. .AnsData_o(rdDataToAxiSlave)
  150. );
  151. endmodule