我正在研究在逻辑门级实现一个4位BitSet函数,以便它可以用结构Verilog编写 - 我已经在别处寻找这个问题的答案,但只能找到C / C ++资源,它在更高的层次上运作,对我来说几乎没有任何意义。
我的界面的输入是一个4位数 x ,一个两位数索引,包含要在 x中设置或清除的索引,包含值 x [index] 的一位数值应设置为(1或0分别设置或清除),并且一个4位输出 y ,这是 x 的最终结果。
据我所知,在x中设置一个值遵循逻辑y | = 1< < X 并且清除x中的值遵循y& = 1< < x,这样如果 value 等于1,则通过OR门发送它,其值已经在 x 的索引中,将导致1,如果 value 等于0,通过AND门发送,其值已经在 x 的索引中,这将导致0。这对我来说很有意义。
如果我从4位数 x 开始,我也可以通过1到4 DEMUX模块(除了基本的逻辑门之外)我可以使用MUX,DEMUX,幅度比较器和二进制加法器来获得各个位。
我不确定的是如何从四个单独的位中选择其中一个来基于存储在 index 中的值仅使用基本逻辑门来修改它们。我可以从哪个想法或指示开始?我是否正确地思考这个问题?
答案 0 :(得分:0)
我认为你正在寻找像这样的东西
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