Logic 逻辑门级位集

Logic 逻辑门级位集,logic,bit-manipulation,verilog,bitset,Logic,Bit Manipulation,Verilog,Bitset,我正在研究在逻辑门级别实现一个4位的位集函数,这样它就可以用结构化的Verilog编写——我已经在其他地方寻找了这个问题的答案,但只能找到C/C++资源,它们在更高的级别上运行,对我来说大部分都是不熟悉的 我的接口的输入是一个4位数字x,一个两位数字索引,包含要在x中设置或清除的索引,一个一位数字值,包含值x[索引]应该设置为(1或0分别设置或清除),以及一个4位输出y,这是x的最终结果 据我所知,在x中设置值遵循逻辑y |=1

我正在研究在逻辑门级别实现一个4位的位集函数,这样它就可以用结构化的Verilog编写——我已经在其他地方寻找了这个问题的答案,但只能找到C/C++资源,它们在更高的级别上运行,对我来说大部分都是不熟悉的

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

据我所知,在x中设置值遵循逻辑y |=1< 如果我从一个4位数字x开始,我可能会将它通过一个1到4的解复用块(除了基本逻辑门之外,我有MUX、解复用器、幅度比较器和二进制加法器供我使用)来获得各个位,这也是有意义的


我不确定的是,如何从四个独立的位中选择一个位,根据索引中存储的值仅使用基本逻辑门进行修改。有什么想法或建议让我开始吗?我这样想对吗?

我想你在找这样的东西

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

但这会被认为是结构级别的verilog吗?我一直被告知if/else语句属于行为类,结构设计可以通过仅使用门块(and、or、not等)的分层设计来表示。如果您使用合成工具,他们会为您将其转换为门,因此您无需担心。如果您真的想使用门,只需使用一个带有select行的Mux作为索引,因为case语句、if else和三元运算符就是这样合成的。