6.移位运算符
在Verilog HDL中有两种移位运算符。
:(左移位运算符)
>>:(右移位运算符)
其使用方法如下:
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 运算符优先级别表运 算 符优 先 级 别
! ~
* / %
+ -
>>
= > >=
== != === !==
^ ^~
|
||
? :高
低