RegMap.sv 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. module RegMap #(
  2. parameter AXI_DATA_WIDTH = 64,
  3. parameter [AXI_DATA_WIDTH-1:0] SPI_BASE_ADDR = 64'h1000,
  4. parameter [AXI_DATA_WIDTH-1:0] SPI6_BASE_ADDR = 64'h6000
  5. )(
  6. input Clk_i,
  7. input RstN_i,
  8. input [AXI_DATA_WIDTH-1:0] WrData_i,
  9. input [AXI_DATA_WIDTH-1:0] WrAddr_i,
  10. input [AXI_DATA_WIDTH-1:0] RdAddr_i,
  11. input Val_i,
  12. output reg [AXI_DATA_WIDTH - 1 : 0] SpiCtrlReg_o,
  13. output reg [AXI_DATA_WIDTH - 1 : 0] SpiClkReg_o,
  14. output reg [AXI_DATA_WIDTH - 1 : 0] SpiCsDelayReg_o,
  15. output reg [AXI_DATA_WIDTH - 1 : 0] SpiCsCtrlReg_o,
  16. output reg [AXI_DATA_WIDTH - 1 : 0] SpiTxRxFifoCtrlReg_o,
  17. output reg [AXI_DATA_WIDTH - 1 : 0 ] AnsDataReg_o
  18. );
  19. //================================================================================
  20. // LOCALPARAMS
  21. //================================================================================
  22. /* Spi 0 */
  23. localparam [AXI_DATA_WIDTH-1:0] SPI_CTRL_ADDR = SPI_BASE_ADDR + 64'h0000;
  24. localparam [AXI_DATA_WIDTH-1:0] SPI_CLK_ADDR = SPI_BASE_ADDR + 64'h0008;
  25. localparam [AXI_DATA_WIDTH-1:0] SPI_CS_DELAY_ADDR = SPI_BASE_ADDR + 64'h0010;
  26. localparam [AXI_DATA_WIDTH-1:0] SPI_CS_CTRL_ADDR = SPI_BASE_ADDR + 64'h0018;
  27. localparam [AXI_DATA_WIDTH-1:0] SPI_TX_RX_FIFO_CTRL_ADDR = SPI_BASE_ADDR + 64'h0020;
  28. //================================================================================
  29. // CODING
  30. //================================================================================
  31. always_ff @(posedge Clk_i) begin
  32. if (!RstN_i) begin
  33. SpiCtrlReg_o <= {AXI_DATA_WIDTH{1'b0}};
  34. SpiClkReg_o <= {AXI_DATA_WIDTH{1'b0}};
  35. SpiCsDelayReg_o <= {AXI_DATA_WIDTH{1'b0}};
  36. SpiCsCtrlReg_o <= {AXI_DATA_WIDTH{1'b0}};
  37. SpiTxRxFifoCtrlReg_o <= {AXI_DATA_WIDTH{1'b0}};
  38. end
  39. else begin
  40. if (Val_i) begin
  41. if (WrAddr_i == (SPI_CTRL_ADDR)) begin
  42. SpiCtrlReg_o <= WrData_i;
  43. end
  44. else if (WrAddr_i == (SPI_CLK_ADDR)) begin
  45. SpiClkReg_o <= WrData_i;
  46. end
  47. else if (WrAddr_i == (SPI_CS_DELAY_ADDR)) begin
  48. SpiCsDelayReg_o <= WrData_i;
  49. end
  50. else if (WrAddr_i == (SPI_CS_CTRL_ADDR)) begin
  51. SpiCsCtrlReg_o <= WrData_i;
  52. end
  53. else if (WrAddr_i == (SPI_TX_RX_FIFO_CTRL_ADDR)) begin
  54. SpiTxRxFifoCtrlReg_o <= WrData_i;
  55. end
  56. end
  57. end
  58. end
  59. always_comb begin
  60. if (!RstN_i) begin
  61. AnsDataReg_o = {AXI_DATA_WIDTH{1'b0}};
  62. end
  63. else begin
  64. if (RdAddr_i == (SPI_CTRL_ADDR)) begin
  65. AnsDataReg_o = SpiCtrlReg_o;
  66. end
  67. else if (RdAddr_i == (SPI_CLK_ADDR)) begin
  68. AnsDataReg_o = SpiClkReg_o;
  69. end
  70. else if (RdAddr_i == (SPI_CS_DELAY_ADDR)) begin
  71. AnsDataReg_o = SpiCsDelayReg_o;
  72. end
  73. else if (RdAddr_i == (SPI_CS_CTRL_ADDR)) begin
  74. AnsDataReg_o = SpiCsCtrlReg_o;
  75. end
  76. else if (RdAddr_i == (SPI_TX_RX_FIFO_CTRL_ADDR)) begin
  77. AnsDataReg_o = SpiTxRxFifoCtrlReg_o;
  78. end
  79. else begin
  80. AnsDataReg_o = {AXI_DATA_WIDTH{1'b0}};
  81. end
  82. end
  83. end
  84. endmodule