RegMap.v 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. module RegMap #(
  2. parameter CmdRegWidth = 32,
  3. parameter AddrRegWidth = 12
  4. )
  5. (
  6. input [CmdRegWidth/2-1:0] Data_i,
  7. input [AddrRegWidth-1:0] Addr_i,
  8. input Clk_i,
  9. input Rst_i,
  10. input wrEn_i,
  11. input rdEn_i,
  12. input [1:0] BE_i,
  13. output [CmdRegWidth/2-1:0] AnsDataReg_o,
  14. output Led_o
  15. );
  16. //================================================================================
  17. // REG/WIRE
  18. //================================================================================
  19. (* dont_touch = "TRUE" *)reg [CmdRegWidth-1:0] LedReg;
  20. (* dont_touch = "TRUE" *)reg [CmdRegWidth/2-1:0] debugReg1;
  21. (* dont_touch = "TRUE" *)reg [CmdRegWidth/2-1:0] debugReg2;
  22. (* dont_touch = "TRUE" *)reg [CmdRegWidth/2-1:0] ansReg;
  23. //================================================================================
  24. // ASSIGNMENTS
  25. //================================================================================
  26. assign Led_o = LedReg[0];
  27. assign AnsDataReg_o = ansReg;
  28. //================================================================================
  29. // LOCALPARAMS
  30. //================================================================================
  31. localparam LedAddr = 12'h00;
  32. localparam LedAddrS = 12'h02;
  33. localparam DebugAddr1 = 12'h04;
  34. localparam DebugAddr2 = 12'h06;
  35. //================================================================================
  36. always @(posedge Clk_i) begin
  37. if (Rst_i) begin
  38. LedReg <= 0;
  39. debugReg1 <= 0;
  40. debugReg2 <= 0;
  41. end
  42. else begin
  43. if (!wrEn_i) begin
  44. case (BE_i)
  45. 0 : begin
  46. case (Addr_i)
  47. LedAddr : begin
  48. LedReg[15:0] <= Data_i;
  49. end
  50. LedAddrS : begin
  51. LedReg[31:16] <= Data_i;
  52. end
  53. DebugAddr1 : begin
  54. debugReg1 <= Data_i;
  55. end
  56. DebugAddr2 : begin
  57. debugReg2 <= Data_i;
  58. end
  59. endcase
  60. end
  61. 1 : begin
  62. case (Addr_i)
  63. LedAddr : begin
  64. LedReg[15:0] <= Data_i[15:8];
  65. end
  66. LedAddrS : begin
  67. LedReg[31:16] <= Data_i[15:8];
  68. end
  69. DebugAddr1 : begin
  70. debugReg1[15:8] <= Data_i[15:8];
  71. end
  72. DebugAddr2 : begin
  73. debugReg2[15:8] <= Data_i[15:8];
  74. end
  75. endcase
  76. end
  77. 2 : begin
  78. case (Addr_i)
  79. LedAddr : begin
  80. LedReg[15:0] <= Data_i[7:0];
  81. end
  82. LedAddrS : begin
  83. LedReg[31:16] <= Data_i[7:0];
  84. end
  85. DebugAddr1 : begin
  86. debugReg1[7:0] <= Data_i[7:0];
  87. end
  88. DebugAddr2 : begin
  89. debugReg2[7:0] <= Data_i[7:0];
  90. end
  91. endcase
  92. end
  93. endcase
  94. end
  95. end
  96. end
  97. // always @(*) begin
  98. // if (Rst_i) begin
  99. // ansReg = 0;
  100. // end
  101. // else begin
  102. // if (rdEn_i) begin
  103. // case (Addr_i)
  104. // LedAddrS : begin
  105. // ansReg = LedReg;
  106. // end
  107. // DebugAddr1 : begin
  108. // ansReg = debugReg1;
  109. // end
  110. // DebugAddr2 : begin
  111. // ansReg = debugReg2;
  112. // end
  113. // endcase
  114. // end
  115. // else begin
  116. // ansReg = 0;
  117. // end
  118. // end
  119. // end
  120. always @(*) begin
  121. if (Rst_i) begin
  122. ansReg = 0;
  123. end
  124. else begin
  125. if (!rdEn_i) begin
  126. case(BE_i)
  127. 0 : begin
  128. case (Addr_i)
  129. LedAddr : begin
  130. ansReg = LedReg[15:0];
  131. end
  132. LedAddrS : begin
  133. ansReg = LedReg[31:16];
  134. end
  135. DebugAddr1 : begin
  136. ansReg = debugReg1;
  137. end
  138. DebugAddr2 : begin
  139. ansReg = debugReg2;
  140. end
  141. endcase
  142. end
  143. 1 : begin
  144. case (Addr_i)
  145. LedAddr : begin
  146. ansReg = LedReg[15:8];
  147. end
  148. LedAddrS : begin
  149. ansReg = LedReg[31:24];
  150. end
  151. DebugAddr1 : begin
  152. ansReg = debugReg1[15:8];
  153. end
  154. DebugAddr2 : begin
  155. ansReg = debugReg2[15:8];
  156. end
  157. endcase
  158. end
  159. 2 : begin
  160. case (Addr_i)
  161. LedAddr : begin
  162. ansReg = LedReg[7:0];
  163. end
  164. LedAddrS : begin
  165. ansReg = LedReg[23:16];
  166. end
  167. DebugAddr1 : begin
  168. ansReg = debugReg1[7:0];
  169. end
  170. DebugAddr2 : begin
  171. ansReg = debugReg2[7:0];
  172. end
  173. endcase
  174. end
  175. endcase
  176. end
  177. else begin
  178. ansReg = 0;
  179. end
  180. end
  181. end
  182. endmodule