购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5 Verilog HDL的运算符

使用Verilog HDL运算符可以完成基本的运算,运算符按照功能可以分为如下类型:算术运算符、逻辑运算符、关系运算符、等式运算符、位运算符、缩减运算符、移位运算符、拼接运算符、条件运算符。下面分别对这些运算符进行介绍。

2.5.1 算术运算符和逻辑运算符

(1)算数运算符

常用的算术运算符主要包括加、减、乘、除和模除(模除运算也叫取余运算),如表 2.4所示。

表 2.4 算术运算符

在进行整数的除法运算时,结果只保留整数部分;而进行模除运算时,结果的符号位与第一个操作数的符号相同。例如:-10%3 = -1,10%-3 = 1。

在进行算术运算时,若某个操作数有不确定的值x,则运算结果也为不确定值x。

Verilog HDL实现乘/除比较浪费组合逻辑资源,尤其是除法。通常 2 的指数次幂的乘/除法使用移位运算符来完成运算;非 2 的指数次幂的乘/除法一般是调用现成的IP。

(2)逻辑运算符

逻辑运算符是连接多个关系表达式用的,可实现更加复杂的判断,一般不单独使用,需要配合具体语句来实现完整的含义,通常用于条件判断词句中,如表 2.5 所示。

表 2.5 逻辑运算符

通常而言,逻辑运算的结果要么为真(1),要么为假(0)。特例是若有一个输入为未知x,那么结果也是x。例如:4' b0010&&4' b1001 = 1,4' b1010&&4' b0000 = 0。

2.5.2 关系运算符和等式运算符

(1)关系运算符

关系运算符主要用于条件判断语句,如表 2.6 所示。

表 2.6 关系运算符

在进行关系运算符时,如果声明的关系是假的,则返回值是 0;如果声明的关系是真的,则返回值是 1;若某操作数为不确定值x,则返回值也为x。

关系运算符之间具有相同的优先级,但都低于算术运算符。例如:cnt< = delay-1 与cnt< =(delay-1)是相同的。

(2)等式运算符

等式运算符一般也用于条件判断语句,如表 2.7 所示。

表 2.7 等式运算符

“= =”和“!= ”称为逻辑等式运算符,其结果可能为 1 或 0 或x,两个操作数必须逐位相等,结果才为 1;若某些位为x或z,则结果为x。

“= = =”和“!= =”常用于case表达式的判别,又称作case等式运算符。其结果只能是 1或 0。若两个操作数的相应位完全一致(如同是 1,或同是 0,或同是x,或同是z),则结果为 1;否则为 0。

2.5.3 位运算符和缩减运算符

(1)位运算符

位运算符是一类最基本的运算符,对应于数字逻辑中的与、或、非门、异或及同或等逻辑门。常用的位运算符如表 2.8 所示。

表 2.8 位运算符

位运算符的与(&)、或(| )、非(~)与逻辑运算符的逻辑与(&&)、逻辑或(| | )、逻辑非(!)使用时候容易混淆,逻辑运算符一般用于条件判断,位运算符一般用于信号赋值。

按位运算要求对两个操作数的相应位逐位进行运算,不同长度的数据进行位运算时,位少的操作数会在相应的高位补 0,位运算结果与位数高的操作数位数相同。例如:~(1001&101)= 1110。

(2)缩减运算符

表 2.9 给出了Verilog HDL的缩减运算符,其运算规则与位运算相似,但功能不同。缩减运算是对操作数的每一位逐位运算,最终结果为一位二进制数。

表 2.9 缩减运算符

缩减运算符运算规则示例:reg[3:0]a; b =&a等效于b =((a[0]&a[1])&a[2])&a[3];b =~| a等效于b =~(((a[0]| a[1])| a[2])| a[3])。例如:&4' bx111 = x,&4' bz111 = x,~&4' bx001 = 1,~|4' bz001 = 0。

2.5.4 移位运算符和拼接运算符

(1)移位运算符

移位运算符包括左移位运算符和右移位运算符,这两种移位运算符都用 0 来填补移出的空位,如表 2.10 所示。

如果移出的数不包含 1,那么左移相当于乘以 2;但不管有没有 1 被移出,右移总能得到除以 2 的结果。比如:a = 4' b0110,执行a<<1 后,a = 4' b1100,即 6×2 = 12;再次执行a<<1 后,a = 4' b1000,因为有 1 溢出,所以结果不是 12 的 2 倍。若a = 4' b0110,执行a>>1 后,得到a = 4' b0011,再次执行a>>1,得到a = 4' b0001,符合右移 1 位相当于除以 2 的规律。

表 2.10 移位运算符

若a是一个 5 位的寄存器,那么a = 4' b1001<<1,得到a = 5' b10010。但若a是一个 4 位的寄存器,执行a = 4' b1001<<1,得到a = 4' b0010。

(2)拼接运算符

Verilog HDL中有一个特殊的运算符是C语言中没有的,就是位拼接运算符。用这个运算符可以把两个或多个信号的某些位拼接起来进行运算操作,如表 2.11 所示。

表 2.11 拼接运算符

例如:

值得注意的是,在位拼接表达式中,不允许存在没有指明位数的信号,若未指明,则默认为 32 位的二进制数。

2.5.5 条件运算符

条件运算符“?”很像C语言里的“?”运算符。它实现的是组合逻辑电路,或者说就是多路复用器,其功能等同于always中的if-else语句,如表 2.12 所示。

表 2.12 条件运算符

例如:

表示当sel = 1 时,c = a;当sel = 0 时,c = b。该语句描述了一个 2 选 1 数据选择器的功能,与采用以下if-else语句描述的功能一致。

还可以运用条件运算符描述更为复杂的逻辑电路功能,例如:

该语句描述了一个 4 选 1 数据选择器功能。

2.5.6 运算符的优先级

由于表达式可能由多种运算构成,不同的运算顺序可能得出不同的结果。当表达式中含有多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。表 2.13 中,优先级从上到下依次递减,“!”和“~”具有最高优先级,条件运算符“?”的优先级最低,同一行的优先级相同。

为提高程序的可读性,建议使用括号“( )”来控制运算的优先级。

例如,(a>b)&&(b>c)与a>b&&b>c虽然在功能上是相同的,但前者看起来更加清楚直观,且不容易出错。建议在Verilog HDL编程中多使用“( )”,养成良好的编程习惯。

表 2.13 运算符的优先级 pBrrUf4OQuMG3j7MsAAvUDIBKTg+eX7dm9iT2n+gf6ma8ynAONY2hBCXQyDQEe7e

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开