如何在Verilog中通过位图选择打包阵列?

如何在Verilog中通过位图选择打包阵列?,verilog,Verilog,我们应该有一个 wire [31:0] vector [15:0] 和 位图是一个单热选择器。如果 bitmap == 16'b1101, 然后 您如何在Verilog中使用合适的时间来实现这一点 提前谢谢 考虑到输出的总大小是512位(32位向量*16位位图逻辑,一次热编码),编写verilog代码的方法之一,这样您可以得到输出为“{vector[15],vector[14],..,vector[1],vector[0]}”通过使用32位输出逻辑从每个always块写入1

我们应该有一个

wire      [31:0]  vector  [15:0] 

位图是一个单热选择器。如果

bitmap == 16'b1101, 
然后

您如何在Verilog中使用合适的时间来实现这一点


提前谢谢

考虑到输出的总大小是512位(32位向量*16位位图逻辑,一次热编码),编写verilog代码的方法之一,这样您可以得到输出为“{vector[15],vector[14],..,vector[1],vector[0]}”通过使用32位输出逻辑从每个always块写入16个always块,使这些always块的输出通过位图逻辑/一个热编码进行控制

下面给出了4个此类始终块的示例:

always @ ( * ) begin
  if (reset) begin
    output_0  = 0;
  end
  else if (bitmap[0]) begin
    output_0  = vector[0];
  end
  else  begin
    output_0  = output_0;
  end
end

always @ ( * ) begin
  if (reset) begin
    output_1  = 0;
  end
  else if (bitmap[1]) begin
    output_1  = vector[1];
  end
  else  begin
    output_1  = output_1;
  end
end

always @ ( * ) begin
  if (reset) begin
    output_2  = 0;
  end
  else if (bitmap[2]) begin
    output_2  = vector[2];
  end
  else  begin
    output_2  = output_2;
  end
end

always @ ( * ) begin
  if (reset) begin
    output_3  = 0;
  end
  else if (bitmap[3]) begin
    output_3  = vector[3];
  end
  else  begin
    output_3  = output_3;
  end
end
对于通过位图给出的16个热编码,总共写入16个这样的块,然后通过'assign'语句和wire声明写入输出,如下所示:

wire [511:0] Main_output;

assign Main_output = {output_15, output_14, output_13, output_12, output_11, output_10, output_9, output_8,
                      output_7, output_6, output_5, output_4, output_3, output_2, output_1, output_0};
在时钟周期获得输出的另一种方法是使用如下的always块和寄存器声明:

reg [511:0]  Main_output;

always @ (posedge clock)
   begin
      Main_output <= {output_15, output_14, output_13, output_12, output_11, output_10, output_9, output_8,
                          output_7, output_6, output_5, output_4, output_3, output_2, output_1, output_0};
   end
reg[511:0]主输出;
始终@(posedge时钟)
开始

主输出您能澄清关于“计时”和“一个热”选择器的陈述吗?
16'b0000\u 0000\u 1101
当然不是一个热选择。那么输出的宽度是多少?@dave_59感谢您的回复,这里的一个热表示位图中的每个1选择要打包的相应输出。如果位图为1011,则第0、第1和第3个向量将被压缩,并且所有MSB都应为0。在这种情况下,应该有512-3*32=412'h0@Serge感谢您的回复,计时意味着代码在合成后不应该有明显的计时冲突。非常感谢您的回复。在我的例子中,如果位图[n]=0,则相应的输出\u n不应为0。但应该放弃。例如:位图==16'b1101,输出={412'h0,向量[3],向量[2],向量[0]}。请参见位图为0的位图没有间隙
wire [511:0] Main_output;

assign Main_output = {output_15, output_14, output_13, output_12, output_11, output_10, output_9, output_8,
                      output_7, output_6, output_5, output_4, output_3, output_2, output_1, output_0};
reg [511:0]  Main_output;

always @ (posedge clock)
   begin
      Main_output <= {output_15, output_14, output_13, output_12, output_11, output_10, output_9, output_8,
                          output_7, output_6, output_5, output_4, output_3, output_2, output_1, output_0};
   end