逻辑运算符是Verilog语法中连接关系表达式,等式表达式等形成更复杂逻辑的运算符。逻辑运算符有&&,||,!三种。由于关系运算的结果包含0,1,x三种结果,因此考虑逻辑运算的时候应考虑运算变量或关系表达式的值为X的情况。同时逻辑运算结果也会有X值存在。
-
逻辑与: &&
一般连接两个关系表达式或等式表达式,形成较为复杂的逻辑与关系。如:e>f && c<d。
逻辑与运算如下表:
| 变量 | 结果 | |
| a | b | y |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
| 0 | x | 0 |
| 1 | x | x |
| x | 0 | 0 |
| x | 1 | x |
| x | x | x |
2. 逻辑或: ||
一般连接两个关系运算符,形成较为复杂的逻辑或关系。如:e>f || c<d。
| 变量 | 结果 | |
| a | b | y |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
| 0 | x | x |
| 1 | x | 1 |
| x | 0 | x |
| x | 1 | 1 |
| x | x | x |
3. 逻辑非: !
将关系运算或等式运算的结果取反。
| 变量 | 结果 |
| a | y |
| 0 | 1 |
| 1 | 0 |
| x | x |
逻辑操作符的计算结果是一个 1bit 的值,0 表示假,1 表示真,x 表示不确定。
一些特殊的用法:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
module logic_test ( input a, input b, output reg c, output reg d, output reg e ); always@(*) begin if(a&&b) c <= 1'b1; else c <= 1'b0; if(a||b) d <= 1'b1; else d <= 1'b0; if(!a) e <= 1'b1; else e <= 1'b0; end endmodule |
在上面的代码中 if(a&&b) 实际是一种缩略的写法,可以替代if( a==1’b1 && b==1’b1 );if(a||b)等效为if( a==1’b1 || b==1’b1 ); If(!a)等效为if(!(a==1’b1));
逻辑运算符在向量方面的应用也有类似的用法,如if(!a[3:0])的含义是if(a[3:0] == 0)。
!对向量的求非,是指向量的值为零,则求非后的结果为1,否则为零。
例:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
`timescale 1 ns/1 ps module tb ( ); reg [3:0] ta, tb; wire [3:0] tc ,td; wire [3:0] te; assign tc = !ta; assign td = ta && tb; assign te = ta || tb; initial begin ta = 4'b0000; tb = 4'b0000; #2 tb = 4'b0001; #2 ta = 4'b0010; #2 tb = 4'b01x0; #2 ta = 4'b0x10; tb = 4'b1x00; #2 ta = 4'bz110; tb = 4'bz001; #20 tb = 4'b0111; tb = 4'bz1x0; #20 tb = 4'b1111; tb = 4'b0110; end endmodule |
Modelsim 的仿真波形如下:
在波形图中可以看出,ta[3:0]的值为4’b0x10时,tc=!ta 得到tc的值为零,原因是4’b0x10不为0,因此取反后逻辑值为单bit的1’b0; 赋值后由于位扩展,结果tc==4’b0000; 其它的结果请读者自行分析。
在与、或、非的运算符中,还有一类位运算符,&,|,~与逻辑运算符非常类似,但含义却不相同。细节请参见 Verilog 位运算符及 运算符|与运算符|| 区别,以及!与~的区别
本节内容主要介绍逻辑运算符的含义及基本用法,其它的用法将会在以后的时序电路开发中经过大量的实例练习逐渐掌握。
对应视频:
