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時,這個語句執行
評論