假设我们有一个
wire [31:0] vector [15:0]
和
wire [15:0] bitmap
位图是一个热选择器。如果
bitmap == 16'b1101,
然后
Output = {412'h0, vector[3],vector[2],vector[0]}.
你怎么能在Verilog中做适当的时间?
提前致谢!
答案 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