如何在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