module RegMap #( parameter CmdRegWidth = 32, parameter AddrRegWidth = 12 ) ( input [CmdRegWidth/2-1:0] Data_i, input [AddrRegWidth-1:0] Addr_i, input Clk_i, input Rst_i, input wrEn_i, input rdEn_i, input [1:0] BE_i, output [CmdRegWidth/2-1:0] AnsDataReg_o, output Led_o ); //================================================================================ // REG/WIRE //================================================================================ (* dont_touch = "TRUE" *)reg [CmdRegWidth-1:0] LedReg; (* dont_touch = "TRUE" *)reg [CmdRegWidth/2-1:0] debugReg1; (* dont_touch = "TRUE" *)reg [CmdRegWidth/2-1:0] debugReg2; (* dont_touch = "TRUE" *)reg [CmdRegWidth/2-1:0] ansReg; //================================================================================ // ASSIGNMENTS //================================================================================ assign Led_o = LedReg[0]; assign AnsDataReg_o = ansReg; //================================================================================ // LOCALPARAMS //================================================================================ localparam LedAddr = 12'h00; localparam LedAddrS = 12'h02; localparam DebugAddr1 = 12'h04; localparam DebugAddr2 = 12'h06; //================================================================================ always @(posedge Clk_i) begin if (Rst_i) begin LedReg <= 0; debugReg1 <= 0; debugReg2 <= 0; end else begin if (!wrEn_i) begin case (BE_i) 0 : begin case (Addr_i) LedAddr : begin LedReg[15:0] <= Data_i; end LedAddrS : begin LedReg[31:16] <= Data_i; end DebugAddr1 : begin debugReg1 <= Data_i; end DebugAddr2 : begin debugReg2 <= Data_i; end endcase end 1 : begin case (Addr_i) LedAddr : begin LedReg[15:0] <= Data_i[15:8]; end LedAddrS : begin LedReg[31:16] <= Data_i[15:8]; end DebugAddr1 : begin debugReg1[15:8] <= Data_i[15:8]; end DebugAddr2 : begin debugReg2[15:8] <= Data_i[15:8]; end endcase end 2 : begin case (Addr_i) LedAddr : begin LedReg[15:0] <= Data_i[7:0]; end LedAddrS : begin LedReg[31:16] <= Data_i[7:0]; end DebugAddr1 : begin debugReg1[7:0] <= Data_i[7:0]; end DebugAddr2 : begin debugReg2[7:0] <= Data_i[7:0]; end endcase end endcase end end end // always @(*) begin // if (Rst_i) begin // ansReg = 0; // end // else begin // if (rdEn_i) begin // case (Addr_i) // LedAddrS : begin // ansReg = LedReg; // end // DebugAddr1 : begin // ansReg = debugReg1; // end // DebugAddr2 : begin // ansReg = debugReg2; // end // endcase // end // else begin // ansReg = 0; // end // end // end always @(*) begin if (Rst_i) begin ansReg = 0; end else begin if (!rdEn_i) begin case(BE_i) 0 : begin case (Addr_i) LedAddr : begin ansReg = LedReg[15:0]; end LedAddrS : begin ansReg = LedReg[31:16]; end DebugAddr1 : begin ansReg = debugReg1; end DebugAddr2 : begin ansReg = debugReg2; end endcase end 1 : begin case (Addr_i) LedAddr : begin ansReg = LedReg[15:8]; end LedAddrS : begin ansReg = LedReg[31:24]; end DebugAddr1 : begin ansReg = debugReg1[15:8]; end DebugAddr2 : begin ansReg = debugReg2[15:8]; end endcase end 2 : begin case (Addr_i) LedAddr : begin ansReg = LedReg[7:0]; end LedAddrS : begin ansReg = LedReg[23:16]; end DebugAddr1 : begin ansReg = debugReg1[7:0]; end DebugAddr2 : begin ansReg = debugReg2[7:0]; end endcase end endcase end else begin ansReg = 0; end end end endmodule