Menu Close

Verilog 关系运算符

Verilog中关系运算符有>, 大于;>= ,大于等于;< ,小于;<=,小于等于。还有四个等式运算符==,!=,===,!==也可并入关系运算符。但由于他们有些特殊性,特别是===及!==对X,Z的比较运算结果,有独特的规则,而且运算优先级也不同,因此我们把等式运算符分开讨论。

由关系运算符组成的表达式,其结果是二值0,1;或TRUE ,FALSE;该值可以在赋值语句中赋给其它变量,也可以用在判断语句中,如 if语句, case语句, 选择语句中 “?”。还可以利用逻辑运算符将不同的运算结果组成更复杂的表达式。

例:

module test
(
    input  [3:0] a,
    input  [3:0] b,
 
    output [3:0] c,
    output [3:0] d,
    output       e, f, g
);
 
assign c = a > b;
assign d = a <= b;
assign e = a > b;
assign f = a <= b;
assign g = a < b;
 
 
endmodule

 

Testbench 程序如下:

`timescale 10ns/1ns
 
module tb
(
 
);
 
reg  [3:0]  ta, tb;
 
wire [3:0]  tc, td;
wire        te, tf, tg;
 
initial 
begin
    #10
    ta = 4'b1101;
    tb = 4'b0101;
    #20
 
    ta = 4'b0000;
    tb = 4'b1000;
    #20
 
    ta = 4'b1111;
    tb = 4'b1111;
end
 
 
test test_inst
(
    .a (ta),
    .b (tb),
    .c (tc),
    .d (td),
    .e (te),
    .f (tf),
    .g (tg)
);
 
endmodule

 

Modelsim的仿真结果如图1,

图1

从modelsim的仿真波形可以看出,两个向量(vector)型变量如a[3:0],b[3:0]比较时,其结果是1bit的逻辑值0,1或true ,false二值逻辑,虽然可以赋值给向量型变量或端口,只是利用位扩展的方式实现的,如上例中c,d在比较结果为真时,只有最低位为1,其它位都为零,如图1中tc==4’b0000或4‘b0001。

如果在关系运算符中包含有Z,X值,结果会如何?

在关系运算中,无论1,0,Z,X任何值,在与 值Z或X运算时,其结果皆为X。

例:设a,b两个wire型变量,y =  a > b结果如下:

 

表1:

关系运算符    “>”     y = a > b;
a b y
0 0 0
0 1 0
1 0 1
1 1 0

表2

关系运算符 “>”      y = a > b;
a b y
1 Z/X X
1 Z/X X
1 Z/X X
1 Z/X X

表3

关系运算符 “>”    y = a > b;
a b y
0 Z/X X
0 Z/X X
0 Z/X X
0 Z/X X

其它>=,<,<=的比较结果与上面的> 在有Z或X参与运算时一样,其结果都是X;

在向量的关系运算中,只要比较的两个变量中有一个含有X或Z,其结果都为X;

例:

module test
(
    input  [3:0] a,
    input  [3:0] b,
 
    output [3:0] c,
    output [3:0] d, 
    output       e, f, g,
    output       h
);
 
 
assign c = a > b;
assign d = a <= b;
assign e = a > b;
assign f = a <= b;
assign g = a > b;
assign h = a[0] > b[0];
 
endmodule

 

Testbench

`timescale 10ns/1ns
 
module tb
(
 
);
 
reg  [3:0] ta, tb;
 
wire [3:0] tc, td;
 
wire       te, tf, tg;
wire       th;
 
initial 
begin
    #10
    ta = 4'b1101;
    tb = 4'b0101;
    #20
 
    ta = 4'b0000;
    tb = 4'b1001;
    #20
 
    ta = 4'b1111;
    tb = 4'b1111;
    #20
 
    tb = 4'b1110;
    #20
 
    tb = 4'b111x;
    #20
 
    tb = 4'b111z;
    #20
 
    ta = 4'b1110;
    #20
 
    tb = 4'b111x;
end
 
 
test test_inst
(
    .a (ta),
    .b (tb),
 
    .c (tc),
    .d (td),
    .e (te),
    .f (tf),
    .g (tg),
    .h (th)
);
 
 
endmodule

 

Modelsim 的仿真结果如图2:

图2

从上面的波形可以证实上面的分析结果。

 

对应视频:

Posted in FPGA, FPGA 教材教案, Verilog, Verilog

1 Comment

  1. wangff

    学习本篇文章后有几点收获,1、在关系运算中,无论1,0,Z,X任何值,在与 值Z或X运算时,其结果皆为X;2、在向量的关系运算中,只要比较的两个变量中有一个含有X或Z,其结果都为X;3、两个向量型变量比较时,其结果是1bit的逻辑值0,1或true ,false二值逻辑;

    文章对X、Z的情况做了全面论证,学习后感觉对关系运算符有了更深入的理解。

发表回复

相关链接