根据地址访问寄存器

时间:2016-03-21 11:16:00

标签: verilog

根据寄存器的地址,有没有人知道 verilog 代码从寄存器列表中选择单个寄存器。

例如

+------+--------------+---------+
| Name | Offset_value | Address |
+------+--------------+---------+
| Reg1 |           01 | 0x00    |
| Reg2 |           00 | 0x04    |
| Reg3 |           00 | 0x08    |
| Reg4 |           00 | 0x0C    |
+------+--------------+---------+

如果我将地址设为0x08,那么我可以从Reg3读取/写入,依此类推。 每个寄存器都是32位。

2 个答案:

答案 0 :(得分:0)

根据您的描述,您有多个基于写地址要更新的触发器或寄存器。

always @(posedge clk) begin
  case ( address )
    8'h00 : Reg1 <= data;
    8'h04 : Reg2 <= data;
  endcase
end

但是,如果您想使用内存结构而不是REG1 / 2/3

reg [7:0] Reg_dat [0:254]; //255 8bit locations
always @(posedge clk) begin
  Reg_dat[address] <= data;
end

答案 1 :(得分:0)

正如@Morgan建议的那样,你可以使用基于翻牌的内存制作reg bank,

reg [7:0] Reg_dat [0:254]; //255 8bit locations
always @(posedge clk) begin
  Reg_dat[write_reg_address] <= wr_reg;
end

要编写特定的reg,您必须提供write_reg_address和要在寄存器中写入的值。

为了读取特定的寄存器值,您必须只提供read_reg_address并且它给出该特定寄存器的值。

assign read_reg = Reg_dat[read_reg_address];