You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.4 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. module zutils_register16 #(
  2. parameter REG_START_ADD = 0,
  3. parameter REG0_INIT = 0,
  4. parameter REG1_INIT = 0,
  5. parameter REG2_INIT = 0,
  6. parameter REG3_INIT = 0,
  7. parameter REG4_INIT = 0,
  8. parameter REG5_INIT = 0,
  9. parameter REG6_INIT = 0,
  10. parameter REG7_INIT = 0,
  11. parameter REG8_INIT = 0,
  12. parameter REG9_INIT = 0,
  13. parameter REGA_INIT = 0,
  14. parameter REGB_INIT = 0,
  15. parameter REGC_INIT = 0,
  16. parameter REGD_INIT = 0,
  17. parameter REGE_INIT = 0,
  18. parameter REGF_INIT = 0
  19. ) (
  20. input clk, //clock input
  21. input rst_n, //asynchronous reset input, low active
  22. //regbus interface
  23. input [31:0] addr,
  24. input [31:0] wr_data,
  25. input wr_en,
  26. output [31:0] rd_data, //received serial data
  27. output [31:0] reg0,
  28. output [31:0] reg1,
  29. output [31:0] reg2,
  30. output [31:0] reg3,
  31. output [31:0] reg4,
  32. output [31:0] reg5,
  33. output [31:0] reg6,
  34. output [31:0] reg7,
  35. output [31:0] reg8,
  36. output [31:0] reg9,
  37. output [31:0] regA,
  38. output [31:0] regB,
  39. output [31:0] regC,
  40. output [31:0] regD,
  41. output [31:0] regE,
  42. output [31:0] regF
  43. );
  44. parameter REG_END_ADD = REG_START_ADD + 16 - 1; //寄存器结束地址
  45. reg [31:0] data[0:15] = 0;
  46. assign reg0 = data[0];
  47. assign reg1 = data[1];
  48. assign reg2 = data[2];
  49. assign reg3 = data[3];
  50. assign reg4 = data[4];
  51. assign reg5 = data[5];
  52. assign reg6 = data[6];
  53. assign reg7 = data[7];
  54. assign reg8 = data[8];
  55. assign reg9 = data[9];
  56. assign regA = data[10];
  57. assign regB = data[11];
  58. assign regC = data[12];
  59. assign regD = data[13];
  60. assign regE = data[14];
  61. assign regF = data[15];
  62. integer i;
  63. always @(posedge clk or negedge rst_n) begin
  64. if (!rst_n) begin
  65. data[0] <= REG0_INIT;
  66. data[1] <= REG1_INIT;
  67. data[2] <= REG2_INIT;
  68. data[3] <= REG3_INIT;
  69. data[4] <= REG4_INIT;
  70. data[5] <= REG5_INIT;
  71. data[6] <= REG6_INIT;
  72. data[7] <= REG7_INIT;
  73. data[8] <= REG8_INIT;
  74. data[9] <= REG9_INIT;
  75. data[10] <= REGA_INIT;
  76. data[11] <= REGB_INIT;
  77. data[12] <= REGC_INIT;
  78. data[13] <= REGD_INIT;
  79. data[14] <= REGE_INIT;
  80. data[15] <= REGF_INIT;
  81. end else begin
  82. if (wr_en && addr >= REG_START_ADD && addr <= REG_END_ADD)
  83. data[addr-REG_START_ADD] <= wr_data;
  84. end
  85. end
  86. assign rd_data = (addr >= REG_START_ADD && addr <= REG_END_ADD) ? data[addr-REG_START_ADD] : 31'b0;
  87. endmodule