Menu
CoddyTech

向量

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

向量是多位的 wire 或 reg。向量让你可以处理数据总线,而不是单个位。它是将多个位组合在一起的集合。

注意:向量不是一种独立的数据类型。它只是多位版本的 wire 或 reg。

wire single;        // 单个位
wire [7:0] bus;     // 8 位向量(从第 7 位到第 0 位)

要声明一个向量,可以使用语法 [MSB:LSB],其中 MSB 是最高有效位,LSB 是最低有效位。

wire [3:0] a;       // 4 位 wire 向量
reg [7:0] data;     // 8 位 reg 向量
wire [15:0] addr;   // 16 位 wire 向量

访问位

访问向量中的单个位或切片时,位位置(索引)使用十进制数,赋值使用二进制值(0 或 1)。

这是因为,位的位置是一个位置(类似地址),自然会用十进制数表示,而存储在该位中的值只能是 0 或 1:这是一个二进制选择。

例如,data[0] 表示“第 0 位”,而 = 1 表示“将其设为高电平”。给单个位赋值 75 这样的十进制数并不会存储 75,Verilog 会静默地只保留它的最低位,所以一定要明确写 0 或 1。

reg [7:0] data;

data = 170;  
data[0] = 1;             // 将 LSB 设置为 1
data[7] = 0;             // 将 MSB 设置为 0
data[3:1] = 3'b101;      // Set bits 3,2,1 to 101 (binary remains)

位顺序

位的顺序很重要:

wire [3:0] a;     // a[3] 是最高有效位(MSB),a[0] 是最低有效位(LSB)
wire [0:3] b;     // b[0] 是最高有效位(MSB),b[3] 是最低有效位(LSB),这种写法不太常见

大多数设计师使用 [MSB:LSB] 格式,MSB 在左侧。

赋值

reg [3:0] a;

a = 10;       
a = 5;         
a = 3;        

向量切片

你可以访问一段位:

reg [15:0] word;

word[15:8] = 255;        // 给高位字节赋值(8'hFF = 255)
word[7:0]  = 0;          // 给低位字节赋值(8'h00 = 0)
word[3:1]  = 3'b101;     // Assign a slice 
challenge icon

挑战

下面的模块需要向量声明。 

要做什么: 

  1. 将每个输入和输出都改为 8 位向量。

亲手试试

module vector_example(
  input a,          // 改为 8 位向量 [7:0]
  input b,          // 改为 8 位向量 [7:0]
  output c          // 改为 8 位向量 [7:0]
);
  
  assign c = a & b;
  
endmodule
quiz icon自我测试

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

基础知识中的所有课

自己练习: Verilog 在线编译器