Verilog HDL——运算符

1.1 逻辑运算符

在Verilog HDL语言中有三种逻辑运算符:

1)&&逻辑与;

2)|| 逻辑或;

3)! 逻辑非。

“&&”和“||”是双目运算符,它要求要有两个操作数,如(a>b)&&(b<c),(a<b)||(b<c)。“!”是单目运算符,只要求一个操作数,如!(a>b)。表1.1为逻辑运算表,他表示a和b的值为不同的组合时,各种逻辑运算所得到的值。

ab!a!ba&&ba||b

逻辑运算符中“&&”和“||”的优先级低于关系运算符,“!”高于算术运算符。见下例子中

(a<b)&&(x<y),可以直接写成:a<b && x<y;

  (a==b) || (x==y),可直接写成:a==b || x==y

  (!a) || (a>b),可写成:!a || a>b

为了提高程序的可读性,明确表达各运算符间的优先级关系,建议使用括号。

1.2 关系运算符

关系运算符共有以下四种:

1) a<b,读作a小于b

2)a>b ,读作a大于b

3) a<=b,读作a小于等于b

4)a>=b,读作a大于等于b

在进行关系运算时,声明的关系是假的,则返回值是0,如果声明的关系是真的,则返回值是1;如果某个操作数的值不定,则关系是模糊的,返回值是不定值。

所有的关系运算符有着相同的优先级别,关系运算符的优先级别低于算术运算符的优先级。见下例:

a<size-1        //这种表达方式等同于下面这种表达方式

a<(size-1)

size-(1<a)        //这种表达方式等同于下面这种表达方式

size-1<a

从上面的例子可以看出,这种两种不同的运算符的优先级别,当表达式size-(1<a)进行运算时,关系表达式先进行运算,然后返回值为0或者1被size 减去,而当表达式size-1<a进行运算时,size先被减去1,然后再进行同a的比较。

1.3 等式运算符

在Verilog HDL语言中存在4种等式运算符:

1)== (等于)

2)!= (不等于)

3)=== (等于)

4)!== (不等于)

这四个运算符都是双目运算符,它要求有两个操作数“==”和”!=”又称为逻辑等式运算符,其结果由两个操作数的值决定。由于操作数中某些位可能是不定值x和高阻值z,结果可能为不定值x。而“===”和“!==”运算符则不同,它在对操作数进行比较时对某些位的不定值x和高阻值z也进行比较,两个操作数完全一致,其结果才是1,否则为0.“===“和”!==“运算符常用于case表达式的判别,所以又称为”case等式运算符“。这4种等式运算符的优先级别是相同的。表1.2列出”==“和”===“的真值表,帮助理解二者之间的区别。

下面举一个例子说明”==”和“===“的区别:

if(A==1'BX) $display(“Aisx”); (当A等于x时,这个语句不执行)
if(A===1'bx)  $display("Aisx");   (当A等于x时,这个语句执行)
===01xz==01xz
01000010xx
10100101xx
x0010xxxxx
z0001zxxxx

1.4 移位运算符

在Verilog HDL语言中有两种移位运算符:“<<”(左移位运算符)和“>>”*(右移位运算符)。其使用方法如下:

a>>n 或a<<n

a代表要进行移位的操作数,n代表要移动几位。这两种移位运算都用0来填补移出的空位。下面举例说明:

module shift;
reg [3:0] start,result;
    initial;
    begin
    start =1;
    result = (start<<2);
    end
endmodule

从这一例子中可以看出来,start在移位过两位后,用0填补空出来的位。

进行移位运算时应注意移位前后变量的位数。下面将给出一个例子:

4'b1001<<1 = 5'b10010;        4'b1001<<2 = 6'b100100

1<<6 = 32'b1000000              4'b1001>>1 = 4'b0100

4'b1001 >>4 = 4'b0000    //这里详细的说明了前后移位的位数,所以是0000

1.5 位拼接运算符

在Verilog HDL语言中有一个特殊的运算符,位拼接运算符(Concatation){}。这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作。其使用方法如下:

{信号1的某几位,信号2的某几位,信号3的某几位,...,...信号n的某几位}

即把某些信号的某些详细位详细的列出来,中间用逗号隔开,最后用大括号括起来表示个整体信号。见下例子:

{a,b[3:0],w,3'b101}

也可以写成{a,b[3]],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}

在位拼接表达式中不允许存在没有指明位数的信号,这是因为在计算机中拼接信号位宽的大小时必须知道其中每个信号的位宽。

位拼接可以用重复法来简化表达式。见下例:

{4{w}}        //这等同于{w,w,w,w}

位拼接还可以用嵌套的方式来表达。见下例:

{b,3{a,b}}        /这等同于{b,a,b,a,b,a,b}

用于表示重复的表达式,如上例中的4和3,必须是常数表达式。

1.6 缩减运算符

缩减运算符(reduction operator)是单目运算符,也有与、或、非运算。其与、或、非运算规则类似于位运算符的与、或、非运算规则,但其运算过程不同。位运算是对操作数的相应位进行与、或、非运算,操作数是几位数,其运算结果也是几位数。而缩减运算符则不同,缩减运算是对单个操作数进行与、或、非递推运算,最后的运算结果是1位的二进制数。缩减运算的具体运算过程是这样的:第一步先将操作数的第一位与第二位进行与、或、非运算;第二步将运算结果与第三位进行与、或、非运算,依此类推,直至最后一位。例如:

reg [3:0] B;

reg C;

        C=&B

相当于C=((B[0]&B[1])&B[2])&B[3])

由于缩减运算的与、或、非运算规则类似于位运算的与、或、非运算规则,这里不再详细的讲述。

1.7 优先级别

下面对各种运算符的优先级别关系做一总结,如表1.3所列

优先级别

! ~

* / %

+   -

<<     >>

==        !=        ===        !==

&

^        ^~

|

&&

||

?:

最高优先级

|

|

|

|

|

|

|

最低优先级

1.8 关键字

在Verilog HDL中,所有的关键字是事先定义好的,用来组织语言结构。关键字使用小写字母定义的,因此在编写源程序中要注意关键字的书写,以避免出错,下面是Verilog HDL中是使用的关键字。

always,and,assign,begin,buf,bufif0,case,casex,casez,cmos.deassign,default,defparam,disable,edge,end,endcase,endmodule,endfunction,endprimitive,endspecify,endtable,endtask,event,else,for,forever,fork.function,highz0,highz1,if,initial,inout等,详情可参照网上详细资料。

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值