Verilog HDL——运算符
1.1 邏輯運算符
在Verilog HDL語言中有三種邏輯運算符:
1)&&邏輯與;
2)|| 邏輯或;
3)! 邏輯非。
“&&”和“||”是雙目運算符,它要求要有兩個操作數,如(a>b)&&(b<c),(a<b)||(b<c)?!?#xff01;”是單目運算符,只要求一個操作數,如!(a>b)。表1.1為邏輯運算表,他表示a和b的值為不同的組合時,各種邏輯運算所得到的值。
| a | b | !a | !b | a&&b | a||b | 
| 真 | 真 | 假 | 假 | 真 | 真 | 
| 真 | 假 | 假 | 真 | 假 | 真 | 
| 假 | 真 | 真 | 假 | 假 | 真 | 
| 假 | 假 | 真 | 真 | 假 | 假 | 
邏輯運算符中“&&”和“||”的優先級低于關系運算符,“!”高于算術運算符。見下例子中
(a<b)&&(x<y),可以直接寫成:a<b && x<y;
? (a==b) || (x==y),可直接寫成:a==b || x==y
? (!a) || (a>b),可寫成:!a || a>b
為了提高程序的可讀性,明確表達各運算符間的優先級關系,建議使用括號。
1.2 關系運算符
關系運算符共有以下四種:
1) a<b,讀作a小于b
2)a>b ,讀作a大于b
3) a<=b,讀作a小于等于b
4)a>=b,讀作a大于等于b
在進行關系運算時,聲明的關系是假的,則返回值是0,如果聲明的關系是真的,則返回值是1;如果某個操作數的值不定,則關系是模糊的,返回值是不定值。
所有的關系運算符有著相同的優先級別,關系運算符的優先級別低于算術運算符的優先級。見下例:
a<size-1? ? ? ? //這種表達方式等同于下面這種表達方式
a<(size-1)
size-(1<a)????????//這種表達方式等同于下面這種表達方式
size-1<a
從上面的例子可以看出,這種兩種不同的運算符的優先級別,當表達式size-(1<a)進行運算時,關系表達式先進行運算,然后返回值為0或者1被size 減去,而當表達式size-1<a進行運算時,size先被減去1,然后再進行同a的比較。
1.3 等式運算符
在Verilog HDL語言中存在4種等式運算符:
1)== (等于)
2)!= (不等于)
3)=== (等于)
4)!== (不等于)
這四個運算符都是雙目運算符,它要求有兩個操作數“==”和”!=”又稱為邏輯等式運算符,其結果由兩個操作數的值決定。由于操作數中某些位可能是不定值x和高阻值z,結果可能為不定值x。而“===”和“!==”運算符則不同,它在對操作數進行比較時對某些位的不定值x和高阻值z也進行比較,兩個操作數完全一致,其結果才是1,否則為0.“===“和”!==“運算符常用于case表達式的判別,所以又稱為”case等式運算符“。這4種等式運算符的優先級別是相同的。表1.2列出”==“和”===“的真值表,幫助理解二者之間的區別。
下面舉一個例子說明”==”和“===“的區別:
if(A==1'BX) $display(“Aisx”); (當A等于x時,這個語句不執行) if(A===1'bx) $display("Aisx"); (當A等于x時,這個語句執行)| === | 0 | 1 | x | z | == | 0 | 1 | x | z | 
| 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | x | x | 
| 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | x | x | 
| x | 0 | 0 | 1 | 0 | x | x | x | x | x | 
| z | 0 | 0 | 0 | 1 | z | x | x | x | x | 
1.4 移位運算符
在Verilog HDL語言中有兩種移位運算符:“<<”(左移位運算符)和“>>”*(右移位運算符)。其使用方法如下:
a>>n 或a<<n
a代表要進行移位的操作數,n代表要移動幾位。這兩種移位運算都用0來填補移出的空位。下面舉例說明:
module shift; reg [3:0] start,result;initial;beginstart =1;result = (start<<2);end endmodule從這一例子中可以看出來,start在移位過兩位后,用0填補空出來的位。
進行移位運算時應注意移位前后變量的位數。下面將給出一個例子:
4'b1001<<1 = 5'b10010;? ? ? ? 4'b1001<<2 = 6'b100100
1<<6 = 32'b1000000? ? ? ? ? ? ? 4'b1001>>1 = 4'b0100
4'b1001 >>4 = 4'b0000? ? //這里詳細的說明了前后移位的位數,所以是0000
1.5?位拼接運算符
在Verilog HDL語言中有一個特殊的運算符,位拼接運算符(Concatation){}。這個運算符可以把兩個或多個信號的某些位拼接起來進行運算操作。其使用方法如下:
{信號1的某幾位,信號2的某幾位,信號3的某幾位,...,...信號n的某幾位}
即把某些信號的某些詳細位詳細的列出來,中間用逗號隔開,最后用大括號括起來表示個整體信號。見下例子:
{a,b[3:0],w,3'b101}
也可以寫成{a,b[3]],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
在位拼接表達式中不允許存在沒有指明位數的信號,這是因為在計算機中拼接信號位寬的大小時必須知道其中每個信號的位寬。
位拼接可以用重復法來簡化表達式。見下例:
{4{w}}? ? ? ? //這等同于{w,w,w,w}
位拼接還可以用嵌套的方式來表達。見下例:
{b,3{a,b}}? ? ? ? /這等同于{b,a,b,a,b,a,b}
用于表示重復的表達式,如上例中的4和3,必須是常數表達式。
1.6?縮減運算符
縮減運算符(reduction operator)是單目運算符,也有與、或、非運算。其與、或、非運算規則類似于位運算符的與、或、非運算規則,但其運算過程不同。位運算是對操作數的相應位進行與、或、非運算,操作數是幾位數,其運算結果也是幾位數。而縮減運算符則不同,縮減運算是對單個操作數進行與、或、非遞推運算,最后的運算結果是1位的二進制數??s減運算的具體運算過程是這樣的:第一步先將操作數的第一位與第二位進行與、或、非運算;第二步將運算結果與第三位進行與、或、非運算,依此類推,直至最后一位。例如:
reg [3:0] B;
reg C;
????????C=&B
相當于C=((B[0]&B[1])&B[2])&B[3])
由于縮減運算的與、或、非運算規則類似于位運算的與、或、非運算規則,這里不再詳細的講述。
1.7 優先級別
下面對各種運算符的優先級別關系做一總結,如表1.3所列
| ! ~ * / % +? ?- <<? ? ?>> ==? ? ? ? !=? ? ? ? ===? ? ? ? !== & ^? ? ? ? ^~ | && || ?: | 最高優先級 | | | | | | | 最低優先級 | 
1.8 關鍵字
在Verilog HDL中,所有的關鍵字是事先定義好的,用來組織語言結構。關鍵字使用小寫字母定義的,因此在編寫源程序中要注意關鍵字的書寫,以避免出錯,下面是Verilog HDL中是使用的關鍵字。
always,and,assign,begin,buf,bufif0,case,casex,casez,cmos.deassign,default,defparam,disable,edge,end,endcase,endmodule,endfunction,endprimitive,endspecify,endtable,endtask,event,else,for,forever,fork.function,highz0,highz1,if,initial,inout等,詳情可參照網上詳細資料。
總結
以上是生活随笔為你收集整理的Verilog HDL——运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 人工智能改变教学方式
- 下一篇: NUC官方的驱动更新和安装 直接官网
