Menu
CoddyTech

数组

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 10 课,共 90 课。

数组可以让你在一个变量中存储多个值。你可以通过索引访问数组中的每个元素。

注意:数组不是一种独立的数据类型。它是由 wire、reg、integer 或 real 类型组成的集合。

声明数组

语法: <data_type> <name> [<size>];

reg [7:0] memory [0:255];   // 256 字节的内存(每字节 8 位)
reg data [0:7];              // 8 个单比特寄存器
wire [3:0] bus [0:3];       // 4 条总线,每条宽 4 位
integer counters [0:9];      // 10 个整数

方括号 [ ] 中的数字表示数组大小,不是位宽。

访问数组元素

reg [7:0] memory [0:3];
memory[0] = 165;        // 十进制数 165
memory[1] = 90;         // 十进制数 90
memory[2] = memory[0] + memory[1];
$display("%d", memory[2]);  // 输出:255

数组在测试平台中非常有用,可以用来存储测试数据。

多维数组

你可以创建具有多个维度的数组:

reg [7:0] matrix [0:3][0:3];   // 由 8 位值组成的 4x4 数组
matrix[0][0] = 255;            // 8'hFF = 十进制的 255
matrix[2][1] = 85;             // 8'h55 = 十进制的 85

数组与向量

 向量数组
定义多位的 wire 或 reg多个值的集合
语法[MSB:LSB][size]
示例reg [7:0] data;reg [7:0] mem [0:255];
访问data[3](第 3 位)mem[3](第 3 个元素)

向量是一个包含多个位的值。
数组是多个值,每个值都有自己的位。

重要说明

  • reg 数组是可综合的:综合工具会根据 reg [7:0] mem [0:255]; 这样的数组构建 RAM 和寄存器文件等存储器。
  • 数组也用于测试平台中,用来存储测试数据。
challenge icon

挑战

补全下面的代码,创建一个用于存储 4 个测试值的数组。

要做什么: 

  1. 声明一个名为 test_data 的数组
    1. 使用 reg 数据类型(因为它会在测试平台中存储值)
    2. 每个元素应为 8 位宽([7:0])
    3. 数组应有 4 个元素([0:3])

亲手试试

module arrays;
  
  // 声明一个名为 test_data 的数组
  // 它应有 4 个元素,每个元素宽 8 位
  // 使用 reg 数据类型(因为它能在测试平台中存储值)

  
  integer i;
  
  initial begin
    test_data[0] = 170;   
    test_data[1] = 240;    
    test_data[2] = 204;    
    test_data[3] = 15;   
    
    for (i = 0; i < 4; i = i + 1) begin
      $display("test_data[%0d] = %b", i, test_data[i]);
    end
    $finish;
  end
  
endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器