用assign持续赋值语句描述组合逻辑

组合逻辑电路的输出只和当前的输入状态有关,和电路以前的状态无关;如果输入值变化,输出值就可能跟着改变。

assign语句

持续赋值(Continuous Assignment)语句的关键字是assign,其形式是:

assign <变量> = <表达式>;

赋值符号左边的输出变量必须是wire型,右边表达式中的输入变量类型没有限制。当输入变量变化时,表达式立即重新计算结果,并将结果赋给输出变量;也就是说,输入对输出的赋值是持续不断的,这也就是“持续”的含义。

例 1. 用持续赋值语句描述与非逻辑
module NAndGate
(
  input A,
  input B,
  output C
);

assign C = ~(A & B);

endmodule

隐含的持续赋值语句

持续赋值可以作为wire型变量说明的一部分,例如:

wire a;
assign a = b;

可以合并为:

wire a = b;

多路选择器

例 2. 用持续赋值语句描述二选一多路选择器
module MUX2to1
(
  input A,
  input B,
  input Select,
  output Y
);

assign Y = (Select) ? B : A;

endmodule

这里使用了条件运算符,和C语言的语法规则是一样的。当Sel为1,Y=B;否则,Y=A。

三态缓冲器

例 3. 三态缓冲器的逻辑描述
module Buffer
(
  output Out,
  input In,
  input Enable
);

assign Out = Enable ? In : 1'bz;

endmodule

三态缓冲器的描述看起来和多路器有些相似,只是用高阻态代替了另一个输入。多路器和三态门的用途也有相似之处,都是为了将多个信号输出连接到一个信号上。在输出到外部总线时应该使用三态门。

例 4. 双向三态缓冲器
module BiBuffer
(
  inout A, B,
  input En, A2B
);

assign B = (En && A2B) ? A : 'bz;
assign A = (En && !A2B) ? B : 'bz;

endmodule

在这个例子中,有两个assign语句。注意,不要受软件编程语言的影响,认为这两个语句是顺序“执行”的。Verilog是硬件描述语言,这两个语句是并发的,两个语句描述的硬件电路是同时工作的。比如En变化时,A和B同时被重新计算。