RegMap.sv 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. module RegMap #(
  2. parameter AXI_DATA_WIDTH = 64,
  3. parameter SPI_NUM = 7
  4. )(
  5. input Clk_i,
  6. input RstN_i,
  7. input [AXI_DATA_WIDTH-1:0] WrData_i,
  8. input [AXI_DATA_WIDTH-1:0] WrAddr_i,
  9. input [AXI_DATA_WIDTH-1:0] RdAddr_i,
  10. input Val_i,
  11. output reg [AXI_DATA_WIDTH-1:0] Spi0CtrlReg_o,
  12. output reg [AXI_DATA_WIDTH-1:0] Spi0ClkReg_o,
  13. output reg [AXI_DATA_WIDTH-1:0] Spi0CsDelayReg_o,
  14. output reg [AXI_DATA_WIDTH-1:0] Spi0CsCtrlReg_o,
  15. output reg [AXI_DATA_WIDTH-1:0] Spi0TxRxFifoCtrlReg_o,
  16. output reg [AXI_DATA_WIDTH - 1 : 0] SpiCtrlReg_o [SPI_NUM-1 : 0],
  17. output reg [AXI_DATA_WIDTH - 1 : 0] SpiClkReg_o [SPI_NUM-1 : 0],
  18. output reg [AXI_DATA_WIDTH - 1 : 0] SpiCsDelayReg_o [SPI_NUM-1 : 0],
  19. output reg [AXI_DATA_WIDTH - 1 : 0] SpiCsCtrlReg_o [SPI_NUM-1 : 0],
  20. output reg [AXI_DATA_WIDTH - 1 : 0] SpiTxRxFifoCtrlReg_o [SPI_NUM-1 : 0],
  21. output reg [AXI_DATA_WIDTH-1:0] Spi1CtrlReg_o,
  22. output reg [AXI_DATA_WIDTH-1:0] Spi1ClkReg_o,
  23. output reg [AXI_DATA_WIDTH-1:0] Spi1CsDelayReg_o,
  24. output reg [AXI_DATA_WIDTH-1:0] Spi1CsCtrlReg_o,
  25. output reg [AXI_DATA_WIDTH-1:0] Spi1TxRxFifoCtrlReg_o,
  26. output reg [AXI_DATA_WIDTH-1:0] Spi2CtrlReg_o,
  27. output reg [AXI_DATA_WIDTH-1:0] Spi2ClkReg_o,
  28. output reg [AXI_DATA_WIDTH-1:0] Spi2CsDelayReg_o,
  29. output reg [AXI_DATA_WIDTH-1:0] Spi2CsCtrlReg_o,
  30. output reg [AXI_DATA_WIDTH-1:0] Spi2TxRxFifoCtrlReg_o,
  31. output reg [AXI_DATA_WIDTH-1:0] Spi3CtrlReg_o,
  32. output reg [AXI_DATA_WIDTH-1:0] Spi3ClkReg_o,
  33. output reg [AXI_DATA_WIDTH-1:0] Spi3CsDelayReg_o,
  34. output reg [AXI_DATA_WIDTH-1:0] Spi3CsCtrlReg_o,
  35. output reg [AXI_DATA_WIDTH-1:0] Spi3TxRxFifoCtrlReg_o,
  36. output reg [AXI_DATA_WIDTH-1:0] Spi4CtrlReg_o,
  37. output reg [AXI_DATA_WIDTH-1:0] Spi4ClkReg_o,
  38. output reg [AXI_DATA_WIDTH-1:0] Spi4CsDelayReg_o,
  39. output reg [AXI_DATA_WIDTH-1:0] Spi4CsCtrlReg_o,
  40. output reg [AXI_DATA_WIDTH-1:0] Spi4TxRxFifoCtrlReg_o,
  41. output reg [AXI_DATA_WIDTH-1:0] Spi5CtrlReg_o,
  42. output reg [AXI_DATA_WIDTH-1:0] Spi5ClkReg_o,
  43. output reg [AXI_DATA_WIDTH-1:0] Spi5CsDelayReg_o,
  44. output reg [AXI_DATA_WIDTH-1:0] Spi5CsCtrlReg_o,
  45. output reg [AXI_DATA_WIDTH-1:0] Spi5TxRxFifoCtrlReg_o,
  46. output reg [AXI_DATA_WIDTH-1:0] Spi6CtrlReg_o,
  47. output reg [AXI_DATA_WIDTH-1:0] Spi6ClkReg_o,
  48. output reg [AXI_DATA_WIDTH-1:0] Spi6CsDelayReg_o,
  49. output reg [AXI_DATA_WIDTH-1:0] Spi6CsCtrlReg_o,
  50. output reg [AXI_DATA_WIDTH-1:0] Spi6TxRxFifoCtrlReg_o,
  51. output reg [AXI_DATA_WIDTH-1:0] SpiTxRxEnReg_o,
  52. output reg [AXI_DATA_WIDTH-1:0] SpiTxRxSetReg_o,
  53. output reg [AXI_DATA_WIDTH-1:0] SpiTxRxClearReg_o,
  54. output reg [AXI_DATA_WIDTH - 1 : 0 ] AnsDataReg_o
  55. );
  56. //================================================================================
  57. // LOCALPARAMS
  58. //================================================================================
  59. /* Spi 0 */
  60. localparam [AXI_DATA_WIDTH-1:0] SPI0_BASE_ADDR = 64'h0000000000001000;
  61. localparam [AXI_DATA_WIDTH-1:0] SPI0_CTRL_ADDR = SPI0_BASE_ADDR + 64'h0000;
  62. localparam [AXI_DATA_WIDTH-1:0] SPI0_CLK_ADDR = SPI0_BASE_ADDR + 64'h0008;
  63. localparam [AXI_DATA_WIDTH-1:0] SPI0_CS_DELAY_ADDR = SPI0_BASE_ADDR + 64'h0010;
  64. localparam [AXI_DATA_WIDTH-1:0] SPI0_CS_CTRL_ADDR = SPI0_BASE_ADDR + 64'h0018;
  65. localparam [AXI_DATA_WIDTH-1:0] SPI0_TX_RX_FIFO_CTRL_ADDR = SPI0_BASE_ADDR + 64'h0020;
  66. /* Spi 1 */
  67. localparam [AXI_DATA_WIDTH-1:0] SPI1_BASE_ADDR = 64'h0000000000002000;
  68. localparam [AXI_DATA_WIDTH-1:0] SPI1_CTRL_ADDR = SPI1_BASE_ADDR + 64'h0000;
  69. localparam [AXI_DATA_WIDTH-1:0] SPI1_CLK_ADDR = SPI1_BASE_ADDR + 64'h0008;
  70. localparam [AXI_DATA_WIDTH-1:0] SPI1_CS_DELAY_ADDR = SPI1_BASE_ADDR + 64'h0010;
  71. localparam [AXI_DATA_WIDTH-1:0] SPI1_CS_CTRL_ADDR = SPI1_BASE_ADDR + 64'h0018;
  72. localparam [AXI_DATA_WIDTH-1:0] SPI1_TX_RX_FIFO_CTRL_ADDR = SPI1_BASE_ADDR + 64'h0020;
  73. /* Spi 2 */
  74. localparam [AXI_DATA_WIDTH-1:0] SPI2_BASE_ADDR = 64'h0000000000003000;
  75. localparam [AXI_DATA_WIDTH-1:0] SPI2_CTRL_ADDR = SPI2_BASE_ADDR + 64'h0000;
  76. localparam [AXI_DATA_WIDTH-1:0] SPI2_CLK_ADDR = SPI2_BASE_ADDR + 64'h0008;
  77. localparam [AXI_DATA_WIDTH-1:0] SPI2_CS_DELAY_ADDR = SPI2_BASE_ADDR + 64'h0010;
  78. localparam [AXI_DATA_WIDTH-1:0] SPI2_CS_CTRL_ADDR = SPI2_BASE_ADDR + 64'h0018;
  79. localparam [AXI_DATA_WIDTH-1:0] SPI2_TX_RX_FIFO_CTRL_ADDR = SPI2_BASE_ADDR + 64'h0020;
  80. /* Spi 3 */
  81. localparam [AXI_DATA_WIDTH-1:0] SPI3_BASE_ADDR = 64'h0000000000004000;
  82. localparam [AXI_DATA_WIDTH-1:0] SPI3_CTRL_ADDR = SPI3_BASE_ADDR + 64'h0000;
  83. localparam [AXI_DATA_WIDTH-1:0] SPI3_CLK_ADDR = SPI3_BASE_ADDR + 64'h0008;
  84. localparam [AXI_DATA_WIDTH-1:0] SPI3_CS_DELAY_ADDR = SPI3_BASE_ADDR + 64'h0010;
  85. localparam [AXI_DATA_WIDTH-1:0] SPI3_CS_CTRL_ADDR = SPI3_BASE_ADDR + 64'h0018;
  86. localparam [AXI_DATA_WIDTH-1:0] SPI3_TX_RX_FIFO_CTRL_ADDR = SPI3_BASE_ADDR + 64'h0020;
  87. /* Spi 4 */
  88. localparam [AXI_DATA_WIDTH-1:0] SPI4_BASE_ADDR = 64'h0000000000005000;
  89. localparam [AXI_DATA_WIDTH-1:0] SPI4_CTRL_ADDR = SPI4_BASE_ADDR + 64'h0000;
  90. localparam [AXI_DATA_WIDTH-1:0] SPI4_CLK_ADDR = SPI4_BASE_ADDR + 64'h0008;
  91. localparam [AXI_DATA_WIDTH-1:0] SPI4_CS_DELAY_ADDR = SPI4_BASE_ADDR + 64'h0010;
  92. localparam [AXI_DATA_WIDTH-1:0] SPI4_CS_CTRL_ADDR = SPI4_BASE_ADDR + 64'h0018;
  93. localparam [AXI_DATA_WIDTH-1:0] SPI4_TX_RX_FIFO_CTRL_ADDR = SPI4_BASE_ADDR + 64'h0020;
  94. /* Spi 5 */
  95. localparam [AXI_DATA_WIDTH-1:0] SPI5_BASE_ADDR = 64'h0000000000006000;
  96. localparam [AXI_DATA_WIDTH-1:0] SPI5_CTRL_ADDR = SPI5_BASE_ADDR + 64'h0000;
  97. localparam [AXI_DATA_WIDTH-1:0] SPI5_CLK_ADDR = SPI5_BASE_ADDR + 64'h0008;
  98. localparam [AXI_DATA_WIDTH-1:0] SPI5_CS_DELAY_ADDR = SPI5_BASE_ADDR + 64'h0010;
  99. localparam [AXI_DATA_WIDTH-1:0] SPI5_CS_CTRL_ADDR = SPI5_BASE_ADDR + 64'h0018;
  100. localparam [AXI_DATA_WIDTH-1:0] SPI5_TX_RX_FIFO_CTRL_ADDR = SPI5_BASE_ADDR + 64'h0020;
  101. /* Spi 6 */
  102. localparam [AXI_DATA_WIDTH-1:0] SPI6_BASE_ADDR = 64'h0000000000007000;
  103. localparam [AXI_DATA_WIDTH-1:0] SPI6_CTRL_ADDR = SPI6_BASE_ADDR + 64'h0000;
  104. localparam [AXI_DATA_WIDTH-1:0] SPI6_CLK_ADDR = SPI6_BASE_ADDR + 64'h0008;
  105. localparam [AXI_DATA_WIDTH-1:0] SPI6_CS_DELAY_ADDR = SPI6_BASE_ADDR + 64'h0010;
  106. localparam [AXI_DATA_WIDTH-1:0] SPI6_CS_CTRL_ADDR = SPI6_BASE_ADDR + 64'h0018;
  107. localparam [AXI_DATA_WIDTH-1:0] SPI6_TX_RX_FIFO_CTRL_ADDR = SPI6_BASE_ADDR + 64'h0020;
  108. /* Common */
  109. localparam [AXI_DATA_WIDTH-1:0] SPI_TX_RX_EN_ADDR = SPI6_BASE_ADDR + 64'h0100;
  110. localparam [AXI_DATA_WIDTH-1:0] SPI_TX_RX_SET_REG_ADDR = SPI6_BASE_ADDR + 64'h0108;
  111. localparam [AXI_DATA_WIDTH-1:0] SPI_TX_RX_CLEAR_REG_ADDR = SPI6_BASE_ADDR + 64'h0110;
  112. localparam [AXI_DATA_WIDTH-1:0] SPI_TX_RX_FLAGS_REG_ADDR = SPI6_BASE_ADDR + 64'h0118;
  113. localparam [AXI_DATA_WIDTH-1:0] GPIO_CTRL_ADDR = SPI6_BASE_ADDR + 64'h0120;
  114. //================================================================================
  115. // CODING
  116. //================================================================================
  117. always_ff @(posedge Clk_i) begin
  118. if (!RstN_i) begin
  119. for (int i = 0; i < SPI_NUM; i++) begin
  120. SpiCtrlReg_o[i] <= {AXI_DATA_WIDTH{1'b0}};
  121. SpiClkReg_o[i] <= {AXI_DATA_WIDTH{1'b0}};
  122. SpiCsDelayReg_o[i] <= {AXI_DATA_WIDTH{1'b0}};
  123. SpiCsCtrlReg_o[i] <= {AXI_DATA_WIDTH{1'b0}};
  124. SpiTxRxFifoCtrlReg_o[i] <= {AXI_DATA_WIDTH{1'b0}};
  125. end
  126. SpiTxRxEnReg_o <= {AXI_DATA_WIDTH{1'b0}};
  127. SpiTxRxSetReg_o <= {AXI_DATA_WIDTH{1'b0}};
  128. SpiTxRxClearReg_o <= {AXI_DATA_WIDTH{1'b0}};
  129. end
  130. else begin
  131. if (Val_i) begin
  132. for (int i = 0; i < SPI_NUM; i++) begin
  133. if (WrAddr_i == (SPI0_CTRL_ADDR + i*64'h1000)) begin
  134. SpiCtrlReg_o[i] <= WrData_i;
  135. end
  136. else if (WrAddr_i == (SPI0_CLK_ADDR + i*64'h1000)) begin
  137. SpiClkReg_o[i] <= WrData_i;
  138. end
  139. else if (WrAddr_i == (SPI0_CS_DELAY_ADDR + i*64'h1000)) begin
  140. SpiCsDelayReg_o[i] <= WrData_i;
  141. end
  142. else if (WrAddr_i == (SPI0_CS_CTRL_ADDR + i*64'h1000)) begin
  143. SpiCsCtrlReg_o[i] <= WrData_i;
  144. end
  145. else if (WrAddr_i == (SPI0_TX_RX_FIFO_CTRL_ADDR + i*64'h1000)) begin
  146. SpiTxRxFifoCtrlReg_o[i] <= WrData_i;
  147. end
  148. end
  149. /* Other Registers */
  150. if (WrAddr_i == SPI_TX_RX_EN_ADDR) begin
  151. SpiTxRxEnReg_o <= WrData_i;
  152. end
  153. else if (WrAddr_i == SPI_TX_RX_SET_REG_ADDR) begin
  154. SpiTxRxSetReg_o <= WrData_i;
  155. end
  156. else if (WrAddr_i == SPI_TX_RX_CLEAR_REG_ADDR) begin
  157. SpiTxRxClearReg_o <= WrData_i;
  158. end
  159. end
  160. end
  161. end
  162. /* Read Registers */
  163. // always @(*) begin
  164. // if (!RstN_i) begin
  165. // AnsDataReg_o = {AXI_DATA_WIDTH{1'b0}};
  166. // end
  167. // else begin
  168. // case (RdAddr_i)
  169. // SPI0_CTRL_ADDR: begin
  170. // AnsDataReg_o = Spi0CtrlReg_o;
  171. // end
  172. // SPI0_CLK_ADDR: begin
  173. // AnsDataReg_o = Spi0ClkReg_o;
  174. // end
  175. // SPI0_CS_DELAY_ADDR: begin
  176. // AnsDataReg_o = Spi0CsDelayReg_o;
  177. // end
  178. // SPI0_CS_CTRL_ADDR: begin
  179. // AnsDataReg_o = Spi0CsCtrlReg_o;
  180. // end
  181. // SPI0_TX_RX_FIFO_CTRL_ADDR: begin
  182. // AnsDataReg_o = Spi0TxRxFifoCtrlReg_o;
  183. // end
  184. // SPI1_CTRL_ADDR: begin
  185. // AnsDataReg_o = Spi1CtrlReg_o;
  186. // end
  187. // SPI1_CLK_ADDR: begin
  188. // AnsDataReg_o = Spi1ClkReg_o;
  189. // end
  190. // SPI1_CS_DELAY_ADDR: begin
  191. // AnsDataReg_o = Spi1CsDelayReg_o;
  192. // end
  193. // SPI1_CS_CTRL_ADDR: begin
  194. // AnsDataReg_o = Spi1CsCtrlReg_o;
  195. // end
  196. // SPI1_TX_RX_FIFO_CTRL_ADDR: begin
  197. // AnsDataReg_o = Spi1TxRxFifoCtrlReg_o;
  198. // end
  199. // SPI2_CTRL_ADDR: begin
  200. // AnsDataReg_o = Spi2CtrlReg_o;
  201. // end
  202. // SPI2_CLK_ADDR: begin
  203. // AnsDataReg_o = Spi2ClkReg_o;
  204. // end
  205. // SPI2_CS_DELAY_ADDR: begin
  206. // AnsDataReg_o = Spi2CsDelayReg_o;
  207. // end
  208. // SPI2_CS_CTRL_ADDR: begin
  209. // AnsDataReg_o = Spi2CsCtrlReg_o;
  210. // end
  211. // SPI2_TX_RX_FIFO_CTRL_ADDR: begin
  212. // AnsDataReg_o = Spi2TxRxFifoCtrlReg_o;
  213. // end
  214. // SPI3_CTRL_ADDR: begin
  215. // AnsDataReg_o = Spi3CtrlReg_o;
  216. // end
  217. // SPI3_CLK_ADDR: begin
  218. // AnsDataReg_o = Spi3ClkReg_o;
  219. // end
  220. // SPI3_CS_DELAY_ADDR: begin
  221. // AnsDataReg_o = Spi3CsDelayReg_o;
  222. // end
  223. // SPI3_CS_CTRL_ADDR: begin
  224. // AnsDataReg_o = Spi3CsCtrlReg_o;
  225. // end
  226. // SPI3_TX_RX_FIFO_CTRL_ADDR: begin
  227. // AnsDataReg_o = Spi3TxRxFifoCtrlReg_o;
  228. // end
  229. // SPI4_CTRL_ADDR: begin
  230. // AnsDataReg_o = Spi4CtrlReg_o;
  231. // end
  232. // SPI4_CLK_ADDR: begin
  233. // AnsDataReg_o = Spi4ClkReg_o;
  234. // end
  235. // SPI4_CS_DELAY_ADDR: begin
  236. // AnsDataReg_o = Spi4CsDelayReg_o;
  237. // end
  238. // SPI4_CS_CTRL_ADDR: begin
  239. // AnsDataReg_o = Spi4CsCtrlReg_o;
  240. // end
  241. // SPI4_TX_RX_FIFO_CTRL_ADDR: begin
  242. // AnsDataReg_o = Spi4TxRxFifoCtrlReg_o;
  243. // end
  244. // SPI5_CTRL_ADDR: begin
  245. // AnsDataReg_o = Spi5CtrlReg_o;
  246. // end
  247. // SPI5_CLK_ADDR: begin
  248. // AnsDataReg_o = Spi5ClkReg_o;
  249. // end
  250. // SPI5_CS_DELAY_ADDR: begin
  251. // AnsDataReg_o = Spi5CsDelayReg_o;
  252. // end
  253. // SPI5_CS_CTRL_ADDR: begin
  254. // AnsDataReg_o = Spi5CsCtrlReg_o;
  255. // end
  256. // SPI5_TX_RX_FIFO_CTRL_ADDR: begin
  257. // AnsDataReg_o = Spi5TxRxFifoCtrlReg_o;
  258. // end
  259. // SPI6_CTRL_ADDR: begin
  260. // AnsDataReg_o = Spi6CtrlReg_o;
  261. // end
  262. // SPI6_CLK_ADDR: begin
  263. // AnsDataReg_o = Spi6ClkReg_o;
  264. // end
  265. // SPI6_CS_DELAY_ADDR: begin
  266. // AnsDataReg_o = Spi6CsDelayReg_o;
  267. // end
  268. // SPI6_CS_CTRL_ADDR: begin
  269. // AnsDataReg_o = Spi6CsCtrlReg_o;
  270. // end
  271. // SPI6_TX_RX_FIFO_CTRL_ADDR: begin
  272. // AnsDataReg_o = Spi6TxRxFifoCtrlReg_o;
  273. // end
  274. // SPI_TX_RX_EN_ADDR: begin
  275. // AnsDataReg_o = SpiTxRxEnReg_o;
  276. // end
  277. // SPI_TX_RX_SET_REG_ADDR: begin
  278. // AnsDataReg_o = SpiTxRxSetReg_o;
  279. // end
  280. // SPI_TX_RX_CLEAR_REG_ADDR: begin
  281. // AnsDataReg_o = SpiTxRxClearReg_o;
  282. // end
  283. // default: begin
  284. // AnsDataReg_o = {AXI_DATA_WIDTH{1'b0}};
  285. // end
  286. // endcase
  287. // end
  288. // end
  289. always_comb begin
  290. if (!RstN_i) begin
  291. AnsDataReg_o = {AXI_DATA_WIDTH{1'b0}};
  292. end
  293. else begin
  294. for (int i = 0; i < SPI_NUM; i++) begin
  295. if (RdAddr_i == (SPI0_CTRL_ADDR + i*64'h1000)) begin
  296. AnsDataReg_o = SpiCtrlReg_o[i];
  297. end
  298. else if (RdAddr_i == (SPI0_CLK_ADDR + i*64'h1000)) begin
  299. AnsDataReg_o = SpiClkReg_o[i];
  300. end
  301. else if (RdAddr_i == (SPI0_CS_DELAY_ADDR + i*64'h1000)) begin
  302. AnsDataReg_o = SpiCsDelayReg_o[i];
  303. end
  304. else if (RdAddr_i == (SPI0_CS_CTRL_ADDR + i*64'h1000)) begin
  305. AnsDataReg_o = SpiCsCtrlReg_o[i];
  306. end
  307. else if (RdAddr_i == (SPI0_TX_RX_FIFO_CTRL_ADDR + i*64'h1000)) begin
  308. AnsDataReg_o = SpiTxRxFifoCtrlReg_o[i];
  309. end
  310. end
  311. /* Other Registers */
  312. if (RdAddr_i == SPI_TX_RX_EN_ADDR) begin
  313. AnsDataReg_o = SpiTxRxEnReg_o;
  314. end
  315. else if (RdAddr_i == SPI_TX_RX_SET_REG_ADDR) begin
  316. AnsDataReg_o = SpiTxRxSetReg_o;
  317. end
  318. else if (RdAddr_i == SPI_TX_RX_CLEAR_REG_ADDR) begin
  319. AnsDataReg_o = SpiTxRxClearReg_o;
  320. end
  321. else begin
  322. AnsDataReg_o = {AXI_DATA_WIDTH{1'b0}};
  323. end
  324. end
  325. end
  326. endmodule