在Verilog语法中分为逻辑运算符,位运算符等。虽然表面上看意思差不多,但各个运算符的用法并不相同,产生的结果也不一样。下文我们将针对这两种运算符进行详细讲解,并以实例及仿真结果帮助读者快速深入的理解。
-
运算符!是逻辑运算符,
例:测试运算符在变量或表达式中存在’x’时的返回值。
实体文件如下:
module test_not ( input [3:0] a,b, output [3:0] c,d,e, output [3:0] kk, output reg [3:0] f,g ); assign c = (a==b); if(a) g = 1'b1; else g = 1'b0; end endmodule
仿真程序如下:
module tb; reg [3:0] a, b; wire [3:0] c, d, e, f, g; wire [3:0] kk; initial begin a=0; b=0; #10 endmodule
方真波形如图1,
图1
结果分析:
(1)比较运算(关系或等式),只要有’X’参与,结果为’X’.
(2) !a的结果可以看出,如果a的值,明确的为4’b0000,那么!a结果为1’b1。a的值明确的不为0, 那么!a结果为1’b0。如果各种组合当中, a 的值可能出现4’b0000 时也可以出现非4’b0000 时(4’b0001,4’b0010等),那么这种情况下 !a 的结果为1’bx;
(3) ?运算符引起 ‘X’的传递
(4)if语句阻止’X’的传递。详细分析见” if “语句的描述。
2. 运算符~是位运算符,
其含义是对运算的变量按位求反。
如果运算的变量是1位位宽的,”~”运算的结果与”!”运算结果相同;
而对向量则是完全不同的。如!a[3:0],其结果是一位的,如果a[3:0]==0,其计算结果为1’b1。如果a[3:0]!=0,则结果为1’b0;而~a[3:0]的结果为 {~a[3],~a[2],~a[1],~a[0]},是4位位宽的,可见结果完全不同。
其中 i0, i1, i2, i3, i4都是例化名,当然也可以用其它名称替代。
门级电路的语法结构如下,使用门级电路秒数与普通数字电路设计几乎相同,这里不在累述。
- and | nand | or | nor | xor | xnor [instance name] (out, in1, …, inN);
// [] is optional and | is selection
- buf | not [instance name] (out1, out2, …, outn, in);
- bufif0 | bufif1 | notif0 | notif1 [instance name] (output A, input B, input control );
- pullup | pulldown [instance name] (output A);
老师, 文章中的这句话似乎有点问题–“如果a是向量,如a[3:0],则等效为!(a[3:0]==0);” ,这句话中的“如a[3:0]”是不是应该写成“如 !a[3:0]”呢?
wangff,
谢谢提出问题,文章中可能写的过于简略,根据你提出的问题做了修正,修正的内容如下:
如果a是向量,如a[3:0],则!a[3:0]等效为!(a[3:0]==0);解释如下:
如果a[3:0]==0, 则!a[3:0]返回的结果为真(true)或1’b1;
如果a[3:0]!=0,如a[3:0]==1或a[3:0]==4’b1111或a[3:0]==4’bXZ11等值,则!a[3:0]返回结果为假(false)或1’b0。
注意,考虑到Verilog中有‘X,’Z’等数值,!a[3:0]与 a[3:0]!=0是不等效。
更详细的介绍,请看对应的视频。