在Verilog HDL中,异或操作符^是一个双目运算符,但其可以进行单目运算,例如b=^a,这里a是一个位宽为n的reg型变量,起初看到这样的例子因为有错误,但是通过quartusII软件可以编译综合通过,从生成的RTL电路来看,是将变量a的每一位输入到一个多输入异或门,从而得到变量b,也就是变量b仅仅一位就足够了。也就是说,^a操作就是将a中的每一位按位逐一进行异或,例如a=4'b1010,则b=1^0^1^0=0,由此可以判断a中为1的位数是奇数还是偶数,是一个便捷的操作。再仔细看书中的例子,的确是用在奇偶校验中,因此记住这个用法,会对以后的硬件描述工作带来很大的方便。
一元约简运算符
约简运算符是单目运算符,也有与、或、非运算。其与、或、非运算规则类似于位运算符的与、或、非运算规则,但其运算过程不同。位运算是对操作数的相应位进行与、或、非运算,操作数是几位数则运算结果也是几位数。而约简运算则不同,约简运算是对单个操作数进行与、或、非递推运算,最后的运算结果是1位的二进制数。约简运算的具体运算过程是:1°先将操作数的第1位与第2位进行与、或、非运算;2°将运算结果与第3位进行与、或、非运算,依次类推,直至最后一位。
例如:
reg [3:0] B;
reg C;
C = &B;
相当于:
C = ( (B[0]&B[1]) & B[2] ) & B[3];
一完整的模块举例如下:
module reduction(a, out1, out2, out3, out4, out5, out6);
input [3:0] a;
output out1, out2, out3, out4, out5, out6;
reg out1, out2, out3, out4, out5, out6;
always @ (a)
begin
out1 = & a; //与约简运算
out2 = | a; //或约简运算
out3 = ~& a; //与非约简运算
out4 = ~| a; //或非约简运算
out5 = ^ a; //异或约简运算
out6 = ~^ a; //同或约简运算
end
endmodule
阅读(17901) | 评论(0) | 转发(0) |