我试图理解同一变量本身发生的按位运算。 假设我有 2 个变量 x,它是 4 位 reg 类型, 如果我写
w_out<=(|x); you can take value of x as 15
w_out 的值是多少?.
我的下一个疑问与我的第一个问题的扩展有关:-
我给出了一些项目代码来理解,当我分析verilog代码时,我陷入了困境。 我给你一个代码片段,你可以更好地查看它。
if(crc_flag)
begin
modem_fifo_in_data <= {crc_calc,16'd0}.
modem_wren <= 1;
end
else
begin
modem_fifo_in_data <= dout_120M_r02;
**modem_wren <= (|dout_valid_120M_r02) && rden_120M_r04**;
end
我无法理解代码中的粗体部分:-
modem_wren <= (|dout_valid_120M_r02) && rden_120M_r04
这里,dout_valid_120M_r02是4位reg类型数据, rden_120M_r04 是 1 位 reg 类型数据。
现在操作(|dout_valid_120M_r02)到底是如何发生的,然后会发生逻辑与操作?
我只是想知道在同一个变量中如何进行按位运算。
特别是这个-
modem_wren <= (|dout_valid_120M_r02) && rden_120M_r04
我们如何执行按位运算 modem_wren_new <= (|dout_valid_120M_r02) you can take any 4-bit value like 15, its upto you.
第一个问题的答案是 w_out 的值为 1'b1。
操作 (|something) 相当于将“something”的所有位进行“或”运算:
(|something) <==> something[0] | something[1] | something [2] | ...
所以基本上,示例中的操作是检查“x”的任何位是否设置为 1'b1。
顺便说一句,这也可以与其他运算符一起执行,例如 XOR 和 AND:
(^something) <==> something[0] ^ something[1] ^ something [2] ^ ...
(&something) <==> something[0] & something[1] & something [2] & ...
现在,我相信这也回答了你的第二个问题。 下一行:
modem_wren <= (|dout_valid_120M_r02) && rden_120M_r04
表示下一个逻辑:
“
dout_valid_120M_r02
和rden_120M_r04==1'b1
中是否有任何位设置为1'b1?如果有,请将modem_wren
设置为1'b1。否则,将其设置为1'b0”。
请注意,“
dout_valid_120M_r02
中是否有任何位设置为 1'b1”的答案是 1 位(布尔)答案。
要么有一个位设置为 1'b1,要么没有。
因此,这个方程中发生的情况是,您对
dout_valid_120M_r02
的所有位进行“或”运算,得到一个位,然后将其与 rden_120M_r04
进行“与”操作。
让我们做一个实际的例子来强调这个行为。假设:
dout_valid_120M_r02==4'b0100;
rden_120M_r04==1'b0;
然后:
(|dout_valid_120M_r02) == (|4'b0100) == 1'b0 | 1'b1 | 1'b0 | 1'b0 == 1'b1
最后:
(|dout_valid_120M_r02) && rden_120M_r04 == 1'b1 && 1'b0 == 1'b0
w_out<=(|x);
这意味着如果信号 w_out
的任何位是 1
,则 x
将是 1
。
按位或,顾名思义,对右侧信号的所有位执行逻辑或运算。例如,如果:
reg [3:0] x; //x is a 4-bit signal
assign w_out = |x; // equivalent of w_out = x[3] || x[2] || x[1] x[0];
第二部分:
modem_wren <= (|dout_valid_120M_r02) && rden_120M_r04
,modem_wren
并且 1
的任意位是 rden_120M_r04 = 1'b1
时,dout_valid_120M_r02
将是 1
。