FPGA基础 -- Verilog 访问寄存器数组的指定位示例
涉及 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) begindata_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) beginsingle_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) beginreg_array[idx][pos] <= 1'b1;
end
四、访问某个寄存器的多个连续 bit
你可以这样写:
reg [3:0] idx;
always @(posedge clk) beginnibble <= 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]} |