Menu
CoddyTech

连续赋值

本课属于 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)
  • 连接导线
  • 创建三态缓冲器
  • 通过组合表达式驱动输出
challenge icon

挑战

要做什么:

  1. 添加缺失的连续赋值,使 z 等于 x AND y。

亲手试试

module continuous_challenge (
  input x,
  input y,
  output z
);
  
  // TODO:补上缺少的连续赋值语句,让 z 等于 x 与 y 的逻辑与结果。
  

endmodule
quiz icon自我测试

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

基础知识中的所有课

自己练习: Verilog 在线编译器