用assign持续赋值语句描述组合逻辑
组合逻辑电路的输出只和当前的输入状态有关,和电路以前的状态无关;如果输入值变化,输出值就可能跟着改变。
assign语句
持续赋值(Continuous Assignment)语句的关键字是assign,其形式是:
assign <变量> = <表达式>;
赋值符号左边的输出变量必须是wire型,右边表达式中的输入变量类型没有限制。当输入变量变化时,表达式立即重新计算结果,并将结果赋给输出变量;也就是说,输入对输出的赋值是持续不断的,这也就是“持续”的含义。
例 1. 用持续赋值语句描述与非逻辑
module NAndGate ( input A, input B, output C ); assign C = ~(A & B); endmodule
多路选择器
例 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同时被重新计算。