FPGA/CPLD应用技术(Verilog语言版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 运算符及表达式

知识分部网络

2.4.1 运算符

运算符就是完成某种特定运算的符号,Verilog HDL提供了丰富的运算符。按照运算功能来划分,运算符分为以下几种类型:

① 算术运算符;

② 关系运算符;

③ 等式运算符;

④ 逻辑运算符;

⑤ 位运算符;

⑥ 缩位运算符;

⑦ 移位运算符;

⑧ 条件运算符;

⑨ 位拼接运算符。

按照运算符所带的操作数个数来划分,运算符分为3类,分别为:

① 单目运算符(unary operators):运算符只带有一个操作数。

② 双目运算符(binary operators):运算符带有两个操作数。

③ 三目运算符(ternary operators):运算符带有三个操作数。

下面按照功能分类对Verilog HDL语言中的运算符分别进行介绍。

1.算术运算符

在Verilog HDL语言中,算术运算符也称为二进制运算符。如表2.2所示,列出了Verilog的算术运算符。

表2.2 算术运算符

加法运算符“+”可以是双目运算符,用法为:操作数1+操作数2,如:a+b;也可以作为单目运算符,即正值运算符,用法如:+1、+b。

减法运算符“-” 也与加法运算符一样,可以是双目运算符,用法为:操作数1-操作数2,如:a-b;也可以作为单目运算符,即负值运算符,用法如:-1、-b。

乘法运算符“*”、除法运算符“/”和求余运算符“%”都属于双目运算符。用法为:操作数1*操作数2、操作数1/操作数2、操作数1%操作数2,如:a*b、a/b、a%b。

使用除法运算符进行整数除法运算时,结果值要略去小数部分只取整数部分。例如,“5/2”的值为2,“10/3”的值为3。

求余运算符也称为模运算符,要求“%”的两侧均为整数。在运算符左侧的运算数为被除数,右侧的运算数为除数,运算结果是两数相除后所得的余数,并且结果的符号位采用模运算式里第一个操作数的符号位,如:“10%3”的值为1,“10%5”的值为0,“-10%3”的值为-1。

2.逻辑运算符

逻辑运算符用于求条件式的逻辑值。在Verilog HDL语言中有3种逻辑运算符,如表2.3所示。

逻辑与“&&”和逻辑或“||”都是双目运算符,要求有两个操作数。

逻辑与的用法:操作数1 && 操作数2。当两个操作数都为真时,运算的结果才为真。如果任何一个操作数为假,则运算的结果为假。

逻辑或的用法:操作数1 || 操作数2。当两个操作数中有一个为真时,运算的结果就为真。只有当两个操作数都为假时,则运算的结果才为假。

逻辑非“!”只有一个操作数,用法:!操作数。运算结果值是对操作数取反。如果操作数的值为真,进行逻辑非运算后的结果为假;当操作数的值为假时,逻辑非运算的结果则为真。

表2.4列出的是逻辑运算的真值表。

表2.3 逻辑运算符

表2.4 逻辑运算真值表

3.关系运算符

关系运算符用来比较变量的值或常数的值。在Verilog HDL语言中有4种关系运算符,如表2.5所示。

小提示

操作符“<=”还可用于表示信号的一种非阻塞赋值操作,非阻塞赋值在电路建模中的使用方法请参看第3.4.3节。

在进行关系运算时,如果声明的关系结果为假,则运算的结果为0;如果声明的关系结果为真,则运算的结果为1。例如:

14<25的关系是正确的,则运算的结果为1;

0>=10的关系是不成立的,则运算的结果为0。

如果两个操作数长度不同,那么长度较短的操作数在最重要的位方向(左方)添0补齐。例如,′b1000>=′b01110等价于:′b01000>=′b01110结果为假(0)。

4.位运算符

位运算符的作用是将两个操作数按对应位分别进行逻辑运算。Verilog 中共有5种位运算符,如表2.6所示。

表2.5 关系运算符

表2.6 位运算符

按位运算的真值表如表2.7所示。

表2.7 按位运算的真值表

例如,若A=8′b11001010、B=8′b00001111,则有:

A=8′b00110101
A&B=8′b00001010
A|B=8′b11001111
A^B=8′b11000101

小提示

两个不同长度的数据进行位运算时,会自动地将两个操作数在右端对齐,位数少的操作数会在高位用0补齐。

5.等式运算符

Verilog中的4种等式运算符如表2.8所示。

表2.8 等式运算符

4种等式运算符都是双目运算符,得到的结果是1位的逻辑值,如果结果为1,说明声明的关系为真;如果结果为0,说明声明的关系为假。

等式运算符(==)和全等运算符(===)的区别是:对于“==”,参与比较的两个操作数必须逐位相等,其相等比较的结果才为1,如果某些位是不定态或高阻值,其相等比较得到的结果是不定值;而全等比较(===)则是对这些不定态或高阻值的位也进行比较,两个操作数必须完全一致,其结果才是1,否则结果是0。例如,两个操作数:A=8′b1100010x、B=8′b1100010x,则“A==B”的运算结果为不定值x,而“A===B”的运算结果则为1。

相等运算和全等运算的真值表分别如表2.9、表2.10所示。

表2.9 相等运算真值表

表2.10 全等运算真值表

6.缩位运算符

表2.11 缩位运算符

缩位运算符的运算法则与位运算符一样,但二者的运算过程不同。位运算是对两个操作数的相应位进行逻辑运算,操作数是几位数,则运算结果也是几位数;缩位运算则是对单个操作数进行逻辑递推运算,最后的运算结果只有1位二进制数。缩位运算共有6种方式,如表2.11所示。

缩位运算的具体运算过程是:首先将操作数的第1位与第2位进行逻辑运算,再将这个运算结果与第3位进行逻辑运算,以此类推,直至最后1位。如果变量A=8′10010001,对其进行缩位运算的示例如下:

&A=0;     //只有A的所有位都为1时,缩位与运算的结果才为1
|A=1;     //只有A的所有位都为0时,缩位或运算的结果才为0
^A=1;

7.移位运算符

Verilog的移位运算符有两个:左移“<<”和右移“>>”,其用法为:

A<<n 或 A>>n

表示将操作数A左移或右移n位,移出的位用0来补充。

如果变量A=4′b1101,则移位运算“A>>2”将A右移2位,并用0添补移出的位后,A=4′b0011。

如果变量A=4′b1010,则移位运算“A<<2”将A左移2位,并用0添补移出的位后,A=4′b1000。

8.条件运算符

条件运算符只有一个,即“? :”,其格式和用法与C语言中的条件运算符一样,其一般形式如下:

条件?表达式1:表达式2

条件运算符的作用就是根据所设置的“条件”选择使用表达式的值。当“条件”成立时,条件运算的结果选取的是表达式1的值;当“条件”不成立时,条件运算的结果选取的是表达式2的值。

数据选择电路的Verilog建模常常使用条件运算符,具体使用方法参见2.3.2节。

小提示

条件运算符中的“条件”可以是逻辑表达式、关系表达式等任何一个合法的表达式,当“条件”表达式的值为1时,表示条件成立;当“条件”表达式的值为0时,表示条件不成立。例如,在任务4的2选1数据选择器模块mux2_1_ex4.v中,语句:

assign F=(S==1′b0)?P0,P1;//条件为关系表达式(S==0)形式。当S=0时,条件成立,
                          //输出端F=P0;S=1,条件不成立,输出端F=P1

也可以写为:

assign F=S?P1,P0;  //条件直接取选择端信号S的状态值。S状态为1,条件成立,
                   //输出端F=P1;S状态为0,条件不成立,输出端F=P0

9.位拼接运算符

在Verilog中,可以用一个特殊的位拼接运算符“{ }”,将两个或多个信号的某些位拼接起来。

位拼接运算符的使用形式如下:

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

例如,下面一小段程序是在加法运算时,将和、进位输出拼接在一起使用:

output[3:0] sum;                //sun代表和
output cout;                      //cout为进位输出
input[3:0] ina,inb;             //ina,inb为两个加数
input cin;                        //cin为进位输入
assign  {cout,sum}=ina+inb+cin;   //将和进位输出拼接在一起

位拼接可以嵌套使用,还可以用重复法来简化书写,如:

{3{a,b}}等同于{{a,b},{a,b},{a,b}},也等同于{a,b,a,b,a,b}.

2.4.2 表达式

与C语言一样,Verilog中的表达式是由运算符及运算对象(操作数)组成的、具有特定含义的式子。

下面列出了一些表达式的例子:

a>=b        //关系表达式,判断a是否不小于b
A||B         //逻辑表达式,将A与B进行逻辑或运算
SEL==0       //等式表达式,判断SEL是否等于0
SEL?B:A      //条件表达式