在逻辑门级别设置位

Bitset at the logic-gate level

我正在研究在逻辑门级别实现一个 4 位 BitSet 函数,以便它可以用结构 Verilog 编写——我已经在别处寻找这个问题的答案,但只能找到 C/C++ 资源,这些资源在更高层次上运行,对我来说大多无益。

我的接口的输入是一个 4 位数字 x,一个两位数 index,包含索引在 x 中设置或清除,一位数 value,包含值 x[index]应设置为(1 或 0 分别设置或清除),以及 4 位输出 y,这是 x[=33= 的最终结果].

据我了解,在 x 中设置值遵循逻辑 y |= 1 < < x 并在 y &= 1 < < x 之后清除 x 中的值,这样如果 value 等于 1,则通过 OR 门发送它,其值已经在 [= 的索引中20=]x 将导致 1,如果 value 等于 0,则通过与门发送它,其值已经在 [=20 的索引中=]x 将导致 0。这对我来说很有意义。

如果我从一个 4 位数字 x 开始,我可能会通过 1 到 4 DEMUX 块(除了基本逻辑门,我有 MUX、DEMUX、幅度比较器和二进制加法器供我使用)以获得各个位。

我不确定的是,如何仅使用基本逻辑门,根据 index 中存储的值,从四个独立的位中选择其中一个进行修改。有什么想法或建议可以让我开始吗?我的思考方式正确吗?

我想你正在寻找这样的东西

reg [3:0] x;
reg [3:0] y;
reg [1:0] index;

// wont work in synthesis
x[index] = 0;

在 Verilog 中,您可以使用 [Bit_Number] 单独访问每一位 但是在您的情况下,索引不是恒定的,最终会在合成过程中失败。您可以做的是编写一个 if else 来检查索引并更改正确的索引,以便

if (index == 1) // change bit one
    x[1] = 1'b0; // value to assign is zero here
else if(index == 2)
    x[2] 1'b0;

旁注:

你也可以赋值

// Here x gets the bit 1 and bit 0 of y concatenated with the value of index 
x = {y[1:0],index};

所以假设

y = 4'b1011;
index = 2'b00;
x =  {y[1:0],index} = 1100