如何对相同的值/变量执行按位“或”运算?

问题描述 投票:0回答:2

我试图理解同一变量本身发生的按位运算。 假设我有 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)到底是如何发生的,然后会发生逻辑与操作?

this is related to given code snippets

我只是想知道在同一个变量中如何进行按位运算。

特别是这个-

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.

bit-manipulation verilog bitwise-operators bitwise-and bitwise-or
2个回答
0
投票

第一个问题的答案是 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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.