Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1270478
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: 嵌入式

2010-08-04 10:47:15

在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
阅读(17699) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~