简述
区别于逻辑运算的逻辑与(&&)和逻辑或(||),Verilog编程语言中位运算:按位与(&)和按位或(|)的用途反而更广一些,因为通常是将需要逻辑与或的两个数据量组合成一个信号,就可以一定程度上避免数据依赖,同时也便于信号观测。
不同信号间的 按位与(&)按位或(|)
不同信号间的位运算比较灵活,没必要两边保持同样的位数,一般低位的未定义位会自动补0,例如一个8位的信号和一个1位信号按位与,即只会改变前者的最低位信号。
reg [7:0] GPIO_SW_W_delay = { 8{1'b0} } ;
always @ ( posedge CLK )
begin
if ( count_enable )
GPIO_SW_W_delay <= ( GPIO_SW_W_delay << 1 ) | GPIO_SW_W;
end
位运算所得出的信号值可以是多位数,而不是逻辑运算的布尔值。
自身位运算
位运算还有一个比较通用的用法是放在信号前做自身位运算,同上那个例子:
下面展示一些 内联代码片
。
if (& GPIO_SW_N_delay)
;
else if (| GPIO_SW_N_delay)
;
分别表示当GPIO_SW_N_delay全1和非0的情况。
总结
当你们看多了Verilog工程就会发现逻辑运算中很少有两个信号之间的&&和||(一般都是==常参0或者1),这样的好处在于使用一个额外的临时信号来释放这两个可能会被别的代码段用到的信号,从而减少数据依赖,在某些时序电路中还可以避免竞争冒险,类似于用了一个锁存器。