Verilog 基于位掩码选择一系列导线

Verilog 基于位掩码选择一系列导线,verilog,Verilog,我有一个热线,我想用它来选择一系列的电线。例如,如果我的选择线是0001,我想选择一些_线[2:0],如果是0010,我想选择一些_线[5:3],如果是0100,我想选择一些_线[8:6],等等。目前,我用一个巨大的case语句来做这件事,但是如果我想参数化模块,这不会扩展。有没有更简洁的方法可以做到这一点?桶形移位器可以有效地合成,因此有必要将任何解决方案与基线进行比较,将选择器转换回二进制编码并使用移位。 例如,类似于: shift = 0; for(i=0;i<N;i=i+1) be

我有一个热线,我想用它来选择一系列的电线。例如,如果我的选择线是0001,我想选择一些_线[2:0],如果是0010,我想选择一些_线[5:3],如果是0100,我想选择一些_线[8:6],等等。目前,我用一个巨大的case语句来做这件事,但是如果我想参数化模块,这不会扩展。有没有更简洁的方法可以做到这一点?

桶形移位器可以有效地合成,因此有必要将任何解决方案与基线进行比较,将选择器转换回二进制编码并使用移位。 例如,类似于:

shift = 0;
for(i=0;i<N;i=i+1)
begin
  if (selector[i])
  begin
     shift = i;
  end
end 

shifted_wire = some_wire >> shift;
output = shifted_wire[2:0];
或者,您可以使用for循环通过以下方式独立计算每个位:

for(i=0;i<N;i=i+1)
begin
   output[i] = | ((some_wire>>i) & selector);
end

桶形移位器可以有效地合成,因此可能值得将任何解决方案与基线进行比较,在基线中将选择器转换回二进制编码并使用移位。 例如,类似于:

shift = 0;
for(i=0;i<N;i=i+1)
begin
  if (selector[i])
  begin
     shift = i;
  end
end 

shifted_wire = some_wire >> shift;
output = shifted_wire[2:0];
或者,您可以使用for循环通过以下方式独立计算每个位:

for(i=0;i<N;i=i+1)
begin
   output[i] = | ((some_wire>>i) & selector);
end

这种for语句在verilog中有效吗?我想这取决于你想对N使用什么。只要N的计算结果是常数或参数,合成就应该工作,但我相信如果你试图对N使用reg或wire,它就会失败。酷,我不知道你能做到这一点。我还没有试过,但进一步的谷歌搜索表明你可以。谢谢这种for语句在verilog中有效吗?我想这取决于你想对N使用什么。只要N的计算结果是常数或参数,合成就应该工作,但我相信如果你试图对N使用reg或wire,它就会失败。酷,我不知道你能做到这一点。我还没有试过,但进一步的谷歌搜索表明你可以。谢谢