Verilog HDL基础教程之:数据类型和运算符
2.位运算符
Verilog HDL作为一种硬件描述语言是针对硬件电路而言的。在硬件电路中信号有4种状态值1、0、x和z。在电路中信号进行与或非时,反映在Verilog HDL中则是相应的操作数的位运算。Verilog HDL提供了以下5种位运算符。
~ :(取反)
:(按位与)
| :(按位或)
^ :(按位异或)
^~:(按位同或(异或非))
说明:
位运算符中除了~是单目运算符以外,均为二目运算符,即要求运算符两侧各有一个操作数。
位运算符中的二目运算符要求对两个操作数的相应位进行运算操作。
下面对各运算符分别进行介绍。
“取反”运算符~
~是一个单目运算符,用来对一个操作数进行按位取反运算。如表2所示为单目运算符~的运算规则表。
表2 ~ 运算规则表
~运算 | |
操 作 数 | 结 果 |
1 | 0 |
0 | 1 |
x | x |
举例说明:
rega='b1010; //rega的初值为'b1010
rega=~rega; //rega的值进行取反运算后变为'b0101
“按位与”运算符
按位与运算就是将两个操作数的相应位进行与运算,其运算规则如表3所示。
表3 运算规则表
运算 | |||
操作数1 操作数2 | 0 | 1 | x |
0 | 0 | 0 | 0 |
1 | 0 | 1 | x |
x | 0 | x | x |
“按位或”运算符 |
按位或运算就是将两个操作数的相应位进行或运算,其运算规则如表4所示。
表4 | 运算规则表
| 运算 | |||
操作数1 操作数2 | 0 | 1 | x |
0 | 0 | 1 | x |
1 | 1 | 1 | 1 |
x | x | 1 | x |
“按位异或”运算符^(也称之为XOR运算符)
按位异或运算就是将两个操作数的相应位进行异或运算,其运算规则如表5所示。
表5 ^ 运算规则表
^ 运算 | |||
操作数1 操作数2 | 0 | 1 | x |
0 | 0 | 1 | x |
1 | 1 | 0 | x |
x | x | x | x |
“按位同或”运算符^~
按位同或运算就是将两个操作数的相应位先进行异或运算再进行非运算,其运算规则如表6所示。
表6 ^~ 运算规则表
^~ 运算 | |||
操作数1 操作数2 | 0 | 1 | x |
0 | 1 | 0 | x |
1 | 0 | 1 | x |
x | x | x | x |
不同长度的数据进行位运算
两个长度不同的数据进行位运算时,系统会自动将两者按右端对齐。位数少的操作数会在相应的高位用0填满,以使两个操作数按位进行操作。
3.逻辑运算符
在Verilog HDL语言中存在3种逻辑运算符。
:(逻辑与)
||:(逻辑或)
! :(逻辑非)
“”和“||”是二目运算符,它要求有两个操作数,如(a>b)(b>c),(a
表7 逻辑运算真值表
操 作 数 | 逻辑运算及结果 | ||||
a | b | !a | !b | ab | a||b |
真 | 真 | 假 | 假 | 真 | 真 |
真 | 假 | 假 | 真 | 假 | 真 |
假 | 真 | 真 | 假 | 假 | 真 |
假 | 假 | 真 | 真 | 假 | 假 |
逻辑运算符中“”和“||”的优先级别低于关系运算符,“!”的优先级别高于算术运算符,例如。
(a>b)(x>y) 可写成: a>b x>y
(a==b)||(x==y) 可写成: a==b || x==y
(!a)||(a>b) 可写成: !a || a>b
为了提高程序的可读性,明确表达各运算符间的优先关系,建议使用括号。
4.关系运算符
关系运算符共有以下4种。
a b:(a小于b)
a > b:(a大于b)
a = b:(a小于或等于b)
a >= b:(a大于或等于b)
在进行关系运算时,如果声明的关系是假的(flase),则返回值是0;如果声明的关系是真的(true),则返回值是1;如果某个操作数的值不定,则关系是模糊的,返回值是不定值。
所有的关系运算符有着相同的优先级别。关系运算符的优先级别低于算术运算符的优先级别,例如。
a size-1 //这种表达方式等同于下面一行的表达方式
a (size-1)
size - (1 a) //这种表达方式不等同于下面一行的表达方式
size - 1 a
从上面的例子可以看出这两种不同运算符的优先级别。当表达式size -(1
5.等式运算符
在Verilog HDL语言中存在4种等式运算符。
= =:(等于)
!= :(不等于)
= = =:(等于)
!= =:(不等于)
这4个运算符都是二目运算符,它要求有两个操作数。“= =”和“!=”又称为逻辑等式运算符,其结果由两个操作数的值决定。由于操作数中某些位可能是不定值x和高阻值z,结果可能为不定值x。
“= = =”和“!= =”运算符则不同,它在对操作数进行比较时,对某些位的不定值x和高阻值z也进行比较。两个操作数必需完全一致,其结果才是1,否则为0。“= = =”和“!= =”运算符常用于case表达式的判别,所以又称为“case等式运算符”。
这4个等式运算符的优先级别是相同的。下面画出“= =”与“= = =”的真值表,帮助理解两者间的区别。
表8 等式运算符真值表
= = = 运算 | ||||
操作数1 操作数2 | 0 | 1 | x | z |
0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
x | 0 | 0 | 1 | 0 |
z | 0 | 0 | 0 | 1 |
= = 运算 | ||||
操作数1 操作数2 | 0 | 1 | x | z |
0 | 1 | 0 | x | x |
1 | 0 | 1 | x | x |
x | x | x | x | x |
z | x | x | x | x |
下面举一个例子说明“= =”与“= = =”的区别。
if(A==1’bx) $display( AisX ); //当A等于X时,这个语句不执行
if(A===1’bx) $display( AisX ); //当A等于X时,这个语句执行
评论