> 技术文档 > FPGA基础 -- Verilog 访问寄存器数组的指定位示例_verilog数组读取具体位

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]};

总结

类型 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]}