FPGA基础 -- Verilog 访问寄存器数组的指定位示例

发布于:2025-07-23 ⋅ 阅读:(14) ⋅ 点赞:(0)

涉及 Verilog 中的多维寄存器数组的访问 技巧。我们以如下定义为例展开讲解:

reg [7:0] reg_array [0:15];  // 定义了16个8位寄存器

一、访问指定偏移寄存器

这里的 reg_array 是一个 16 组、每组 8bit 的一维数组,数组下标范围为 0~15。访问其中第 i 个寄存器,只需要使用:

reg_array[i]

示例:

reg [3:0] index;
always @(posedge clk) begin
    data_out <= reg_array[index];  // 访问 reg_array[index] 的整个 8 位数据
end

二、访问 指定寄存器的某一位

reg_array[i] 是一个 8-bit 的向量,因此你可以像访问普通向量一样访问某一位:

reg_array[i][bit_pos]
  • i:寄存器编号(偏移)
  • bit_pos:位编号(0~7)

示例:

reg [3:0] index;
reg [2:0] bit_sel;
always @(posedge clk) begin
    single_bit <= reg_array[index][bit_sel];  // 访问 reg_array[index] 的 bit_sel 位
end

三、修改某一寄存器的某一位

如果你想置位某一位,比如将第 5 个寄存器的第 3 位置为 1,可以写:

reg_array[5][3] <= 1'b1;

如果你要用变量控制,写法如下:

reg [3:0] idx;
reg [2:0] pos;
always @(posedge clk) begin
    reg_array[idx][pos] <= 1'b1;
end

四、访问某个寄存器的多个连续 bit

你可以这样写:

reg [3:0] idx;
always @(posedge clk) begin
    nibble <= reg_array[idx][7:4];  // 访问 reg_array[idx] 的高 4 位
end

也支持组合切片赋值:

reg_array[idx][3:0] <= 4'b1010;

五、组合使用:同时访问多位多个寄存器

例如你要拼接两个寄存器的高4位:

wire [7:0] combined = {reg_array[3][7:4], reg_array[4][7:4]};

总结

类型 Verilog 语法 示例
访问某个寄存器 reg_array[i] reg_array[3]
访问某寄存器某一位 reg_array[i][j] reg_array[3][2]
访问某寄存器某一段位 reg_array[i][MSB:LSB] reg_array[3][7:4]
动态访问位 reg_array[i][bit_sel] reg_array[idx][pos]
组合访问多个寄存器的位 {reg_array[i][3:0], reg_array[j][3:0]} {reg_array[3][3:0], reg_array[4][3:0]}

网站公告

今日签到

点亮在社区的每一天
去签到