向量
本课属于 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 挑战
下面的模块需要向量声明。
要做什么:
- 将每个输入和输出都改为 8 位向量。
亲手试试
module vector_example(
input a, // 改为 8 位向量 [7:0]
input b, // 改为 8 位向量 [7:0]
output c // 改为 8 位向量 [7:0]
);
assign c = a & b;
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器