Verilog HDL基础之:数据类型和运算符
,用来对一个操作数进行按位取反运算。如表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),(ab)||(bc)。“!”是单目运算符,只要求一个操作数,如!(a>b)。如表7所示为逻辑运算的真值表。它表示当a和b的值为不同的组合时,各种逻辑运算所得到的值。
表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 -(1a)进行运算时,关系表达式先被运算,然后返回结果值0或1被size减去。而当表达式 size -1a 进行运算时,size先被减去1,然后再同a相比。
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时,这个语句执行
6.移位运算符
在Verilog HDL中有两种移位运算符。
:(左移位运算符)
>>:(右移位运算符)
其使用方法如下:
a >> n;
a n;
a代表要进行移位的操作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。下面举例说
VerilogHDL 华清远见 数据类型 运算符 网络类型变量 相关文章:
- Verilog门电平模型化(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(06-06)
- VHDL:中文版Verilog HDL简明教程:第2章 HDL指南(06-06)
- VHDL:中文版Verilog HDL简明教程:第1章 简介(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(续)(06-06)
- 基于Verilog应用(06-06)