逻辑运算符是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 表示不确定。
一些特殊的用法:
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,否则为零。
例:
`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 位运算符及 运算符|与运算符|| 区别,以及!与~的区别
本节内容主要介绍逻辑运算符的含义及基本用法,其它的用法将会在以后的时序电路开发中经过大量的实例练习逐渐掌握。
对应视频:

老师,我有个疑问,您上面讲解到if(!a)等效为if(!(a==1`b1)),这有问题吧,不是应该等效if(!(a==1`b0))或者if((!a)==1`b1)吗?就像if(!rst_n)等效为if((!rst_n)==1`b1)一样。
if(!a)等效于if((!a)==1`b1),这个是对的,if(!a)也等效于if((!a)==1`b1)。然而if(!a)不等于if(!(a==1`b0))。
举例说明,如果a = 1’b1,那么if(!a)不满足,if((!a)==1`b1)不满足,if((!a)==1`b1)也是不满足的。if(!(a==1`b0))是满足的。
总的来说,if条件句成立的条件是里面的条件为真。那么把每条语句括号内的语句拿出来分析,即判断过程可以简化为判断 !a,!(a==1’b1),!(a==1’b0)和(!a)==1’b1是不是为真。如果还是不确定,可以用仿真来验证结果。
学习本篇文章后有几点收获,1、逻辑运算符包括:逻辑与( &&)、逻辑或(||)、逻辑非(!);2、!对向量的求非,是指向量的值为零,则求非后的结果为1,否则为零;3、逻辑运算结果也会有X值存在的情况;4、逻辑操作符的计算结果是一个 1bit 的值,0 表示假,1 表示真,x 表示不确定。
文章逻辑非常清晰,而且针对每一种逻辑运算符列举了测试实例,结合仿真图形可以很清晰的看到其中的区别!