Verilog HDL基礎教程之:數據類型和運算符
6.移位運算符
:(左移位運算符)
>>:(右移位運算符)
其使用方法如下:
a >> n;
a n;
a代表要進行移位的操作數,n代表要移幾位。這兩種移位運算都用0來填補移出的空位。下面舉例說明:
module shift;
reg [3:0] start, result;
initial begin
start = 1; //start在初始時刻設為值0001
result = (start2); //移位后,start的值0100,然后賦給result
end
endmodule
從上面的例子可以看出,start在移過兩位以后,用0來填補空出的位。進行移位運算時應注意移位前后變量的位數,下面舉例說明。
4’b10011 = 5’b10010; //左移1位后用0填補低位
4’b10012 = 6’b100100; //左移2位后用00填補低位
16 = 32’b1000000; //左移6位后用000000填補低位
4’b1001>>1 = 4’b0100; //右移1位后,低1位丟失,高1位用0填補
4’b1001>>4 = 4’b0000; //右移4位后,低4位丟失,高4位用0填補
7.位拼接運算符(Concatation)
在Verilog HDL語言有一個特殊的運算符:位拼接運算符{}。用這個運算符可以把兩個或多個信號的某些位拼接起來進行運算操作。其使用方法如下:
{信號1的某幾位,信號2的某幾位,..,..,信號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。
8.縮減運算符(reduction operator)
縮減運算符是單目運算符,也有與、或、非運算。其與、或、非運算規則類似于位運算符的與、或、非運算規則,但其運算過程不同。位運算是對操作數的相應位進行與、或、非運算,操作數是幾位數,則運算結果也是幾位數。而縮減運算則不同,縮減運算是對單個操作數進行與、或、非遞推運算,最后的運算結果是一位的二進制數。
縮減運算的具體運算過程如下。
(1)先將操作數的第一位與第二位進行與、或、非運算。
(2)將運算結果與第三位進行與、或、非運算,依次類推,直至最后一位。
例如:
reg [3:0] B;
reg C;
C = B;
相當于:
C =( ( B[0]B[1] ) B[2] ) B[3];
由于縮減運算的與、或、非運算規則類似于位運算符與、或、非運算規則,這里不再詳細講述,可參照位運算符的運算規則介紹。
9.優先級別
各種運算符的優先級別關系如表9所示。
表9 運算符優先級別表
運 算 符 | 優 先 級 別 |
! ~ * / % + - >> = > >= == != === !== ^ ^~ | || ? : | 高 低 |
評論