想使用在另一个向量范围内传递的输入来提取相应的值
例如,请参见下面的Verilog代码。
但是问题是:我无法将变量(输入)传递到另一个变量的范围内。但这必须这样做。 还有其他功能可以执行具有类似功能的代码吗?实际上,我的问题与这段代码的语法更正有关,还有可用于执行类似功能的选项。
module foo(input1, input2, output1)
input [3:0] input1;
input [3:0] input2;
output reg [3:0] output1;
always@(*) begin
output1 <= input2[3:3-input1[1:0]];
end
endmodule
答案 0 :(得分:2)
如果要从向量中切出一个切片,则必须在RHS和LHS上以不相等的大小进行处理。这样的解决方案:
always @( * )
case (input1)
2'b00 : output1 = input2[3];
2'b01 : output1 = input2[3:2];
2'b10 : output1 = input2[3:1];
2'b11 : output1 = input2[3:0];
endcase
我发现这有点草率。以下是相同的,但是RHS和LHS上的向量大小相等:
always @( * )
case (input1)
2'b00 : output1 = {3'b000,input2[3] };
2'b01 : output1 = { 2'b00,input2[3:2]};
2'b10 : output1 = { 1'b0,input2[3:1]};
2'b11 : output1 = input2[3:0];
endcase
您突然提到一个8位输入。我假设您的意思是input2为8位宽。但这仅要求input1的最大长度为3位。因此,上面的解决方案将是原来的两倍,但仍然可行。
为您着想,这里是8位索引的版本,需要256位向量。 :-)有点难以理解,但也适用于您只需要MS X位的特定情况。
module foo(
input [ 7:0] input1,
input [255:0] input2,
output [255:0] output1
);
wire [7:0] shift_right = 255-input;
assign output1 = input2 >> shift_right ;
endmodule