连续赋值
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 37 课,共 90 课。
在硬件中,连接是连接电路中两个点的实体导线。导线接好后,连接就是永久的,并且始终处于活动状态。如果一端发生变化,另一端会立即变化。
在 Verilog 中,我们需要一种方式来模拟这种行为。我们想把一个值传递到导线上,并让它一直保持连接。这个过程称为连续赋值。
连续赋值使用 assign 关键字,在导线和表达式之间建立永久连接。导线会持续获取表达式的值,就像实体导线一样。
可以把它想成焊接一根导线,而不是只写入一次值。
语法
assign wire_name = expression;| 部分 | 含义 |
|---|---|
assign | 用于开始连续赋值的关键字 |
wire_name | 被驱动的 wire(不能是 reg) |
expression | 驱动 wire 的值 |
简单示例
wire out;
assign out = a & b;这表示:out 始终等于 a AND b。每当 a 或 b 发生变化时,out 会立即变化。
它的工作原理
与存储值的 reg 不同,使用连续赋值的 wire 会不断更新:
module continuous_demo;
reg a, b;
wire c;
assign c = a & b; // c 始终等于 a 与 b 的逻辑与结果
initial begin
a = 0; b = 0;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=0
a = 1;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=0(1&0=0)
b = 1;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=1(1&1=1)
$finish;
end
endmodule输出:
a=0, b=0, c=0
a=1, b=0, c=0
a=1, b=1, c=1每次 a 或 b 发生变化时,c 都会自动更新。
多个连续赋值
你可以在模块中使用多个连续赋值:
module multiple_assign (
input a, b, c,
output x, y
);
assign x = a & b;
assign y = x | c; // y 依赖于 x
endmodule所有赋值都会持续并行运行。
常见用途
连续赋值用于:
- 简单的组合逻辑(AND、OR、XOR)
- 连接导线
- 创建三态缓冲器
- 通过组合表达式驱动输出
挑战
要做什么:
- 添加缺失的连续赋值,使
z等于x AND y。
亲手试试
module continuous_challenge (
input x,
input y,
output z
);
// TODO:补上缺少的连续赋值语句,让 z 等于 x 与 y 的逻辑与结果。
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器