Verilog语言具备多样的运算符,根据功能划分,主要有:算术运算符、逻辑运算符、位运算符、关系运算符、等式运算符、缩减运算符、移位运算符、指数运算符、条件运算符以及位拼接运算符。若根据运算符所带操作数的数量来分类,可分为三类:
· 单目运算符:运算符只包含一个操作数
· 双目运算符:运算符可包含两个操作数
· 三目运算符:运算符可包含三个操作数
算术运算符
常见的算术运算符有:
这些算术运算符均为双目运算符。符号+、-、*、/分别代表加、减、乘、除四则运算,%是求模运算符,也称为求余运算符,如9%3的结果为0,9%4的结果为1,9%5的结果为4。
逻辑运算符
例如A的非表示为!A;A和B的与表示为A&BandA和B的或表示为A||B。在逻辑运算符的运算中,若操作数是一位,则逻辑运算的真值表如下所示:
如果操作数不止一位,则应将操作数作为一个整体来对待,即如果操作数全是0,则相当于逻辑0,但只要某一位是1,则操作数就应该整体视为逻辑1。
逻辑运算符的操作结果是1位的,要么是逻辑1,要么是逻辑0。
例如:若A=4'b0000;B=4'b0101;C=4'b0011;D=4'b0000;则有:
位运算符
位运算符,即对两个操作数按对应位分别进行逻辑运算。位运算包括:
按位与、按位或、按位异或的真值表如下所示:
例如:若A = 5'b11001;B=5'b10101;则有:
需要注意的是:两个不同长度的数据在进行位运算时,会自动将两个操作数按右端对齐,位数少的操作数会在高位用0补齐。
关系运算符
注:其中,“<=”操作符也用于表示信号的一种赋值操作。
在进行关系运算时,如果声明的关系是假,则返回值是0,如果声明的关系是真,则返回值是1;如果某个操作数的值不定,则关系的结果是模糊的,返回值是不定值。
等式运算符
等式运算符有4种,分别为:
这4种运算符都是双目运算符,得到的结果是1位的逻辑值。如果得到1,说明声明的关系为真;如果得到0,说明声明关系为假。
相等运算符(==)和全等运算符(===)的区别是:参与比较的两个操作数必须逐位相等,其相等比较的结果才是1,如果某些位是不定态或高阻值,其相等比较得到的结果是不定值;而全等比较(===)则是对这些不定态或高阻值的位也进行比较,两个操作数必须完全一致,其结果才是1,否则结果是0。
相等运算符(==)和全等运算符(===)的真值表如下所示:
例如:如果寄存器变量a=5'b11x01,b=5'b11x01,则“a==b”得到的结果为不定值x,而“a===b”得到的结果为1。
缩减运算符
缩减运算符是单目运算符,它包括:
缩减运算符与位运算符的逻辑运算法则一样,但缩减运算符是对三个操作数进行与、或、非递推运算的,它放在操作数前面。缩减运算符将一个矢量缩减为一个标量。例如:
再例如,若A=5'b11001,则:
移位运算符
Verilog-1995的移位运算符只有两个——左移和右移。其中用法为A>>n或A<
例如:若A=5'b11001,则:
Verilog-1995中没有指数运算符。但是,移位操作符可用于支持部分指数操作。例如,若A=8'b0000_0100,则二进制的A^3可以使用移位操作实现。
在Verilog-2001中增加了算术移位操作符“>>>”和“<<<”,对于有符号数,执行算术移位操作时,将符号位填补移出的位,以保持数值的符号。例如,如果定义有符号二进制数A=8'sb10100011,则执行逻辑右移和算术右移后的结果如下:
指数运算符
Verilog-2001标准中增加了指数运算符“**”,执行指数运算,一般更多使用的是底为2的指数运算,如2^n。例如:
条件运算符
?:
这是一个三目运算符,对三个操作数进行运算,其定义同C语言中的定义一样,方式如下:
即:
信号 = 条件?表达式1:表达式2;
当条件成立时,信号取表达式1的值,反之,取表达式2的值。
例如,对2选1MUX可用条件运算符描述为:
或者
位拼接运算符
{}
该运算符将两个或多个信号的某些位拼接起来。使用如下:
例如,在进行加法运算时,可将进位与和拼接在一起使用:
位拼接可用来进行符号位扩展,例如:
位拼接可以嵌套使用,还可以用复制法来简化书写,例如:
位拼接可以用来进行移位操作,例如:
假如a的位宽是8位,则可以用位拼接运算符来进行移位操作,实现上面的运算:
运算符的优先级
运算符的优先级如表所示。对不同的综合开发工具,在执行这些优先级时可能有微小的差别,因此在书写程序时建议用括号()来控制运算的优先级,这样也能有效地避免错误,同时增加程序的可读性。
温馨提示:答案为网友推荐,仅供参考