FPGA基础 -- Verilog 访问寄存器数组的指定位示例_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) 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]};
总结
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]}