如何在Verilog中通过位图选择打包数组?

时间:2017-06-19 23:44:02

标签: verilog

假设我们有一个

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

wire      [15:0]  bitmap

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

bitmap == 16'b1101, 

然后

Output = {412'h0, vector[3],vector[2],vector[0]}.

你怎么能在Verilog中做适当的时间?

提前致谢!

1 个答案:

答案 0 :(得分:1)

考虑到输出的总大小是512位(32位向量* 16位位图逻辑和单热编码)编写verilog代码的方法之一,使得输出为“{vector [15],向量[14],....,向量[1],向量[0]}“通过从每个始终块写入16位具有32位输出逻辑的块,使得这些始终块应通过位图控制其输出逻辑/单热编码。

下面给出了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