- 今天在看师兄的代码的时候发现了如下的代码
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
data <= 14'b0;
else if (state == CNV)
if ((|bit_cnt[4:1]) && (~&bit_cnt[4:1]) && time_cnt[0])
data <= {data[12:0],miso};
else
data <= data;
end
对第二个if else循环中的&、|有疑问,明明这两个在verilog中都是双目运算符,为什么在这里只有一侧有操作数,后来在其他博主那里看到,原来这样的用法叫做“一元约简运算符”。
1.一元约简运算符解释
这种运算符和位运算符的符号是一模一样的,但是仍然能够正常阅读而不产生歧义,一元约简运算符是将后面的多位操作数依次进行位运算。
2.例子
|4'b1010 //1 | 0 | 1 | 0 即为1.
|4'b0010 //0 | 0 | 1 | 0 即为1.
|4'b1000 //1 | 0 | 0 | 0 即为1.
&4'b1010 //1 & 0 & 1 & 0 即为0.
&4'b0010 //0 & 0 & 1 & 0 即为0.
&4'b1000 //1 & 0 & 0 & 0 即为0.
3.图一代码解释
|bit_cnt[4:1] 代表从bit_cnt的第4位开始,依次进行或运算至第1位,得出最终结果。
~&bit_cnt[4:1] 代表从bit_cnt的第4位开始,依次进行与运算至第1位,然后再进行取反运算得出最终结果。