Menu Close

Verilog 中not ~ !的区别

在Verilog语法中分为逻辑运算符位运算符等。虽然表面上看意思差不多,但各个运算符的用法并不相同,产生的结果也不一样。下文我们将针对这两种运算符进行详细讲解,并以实例及仿真结果帮助读者快速深入的理解。

  1. 运算符!是逻辑运算符

 

例:测试运算符在变量或表达式中存在’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,

%title插图%num

图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都是例化名,当然也可以用其它名称替代。

门级电路的语法结构如下,使用门级电路秒数与普通数字电路设计几乎相同,这里不在累述。

  1. and nand or nor xor xnor [instance name] (out, in1, …, inN);

 // [] is optional and | is selection   

  1. buf not [instance name] (out1, out2, …, outn,  in);  
  2. bufif0 bufif1 notif0 notif1 [instance name] (output A, input B,  input control );
  3. pullup pulldown [instance name] (output A);   
Posted in FPGA, Verilog, 文章

2 Comments

  1. wangff

    老师, 文章中的这句话似乎有点问题–“如果a是向量,如a[3:0],则等效为!(a[3:0]==0);” ,这句话中的“如a[3:0]”是不是应该写成“如 !a[3:0]”呢?

    • tzhuang

      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是不等效。
      更详细的介绍,请看对应的视频。

发表评论

相关链接