この Verilog コードに問題があります。Y = 3'di
基本的に、それは私に声明をさせません。基本的に、私Y
は等しくしたいi
。問題はi
. では、Verilog でこれを行う方法はありますか? また、W
は 8 ビットの入力 (つまりW[7:0]
) です。
for (i = 7; i >= 0; i = i - 1)
begin
if(W[i]) Y=3'di;
end
ありがとう。
この Verilog コードに問題があります。Y = 3'di
基本的に、それは私に声明をさせません。基本的に、私Y
は等しくしたいi
。問題はi
. では、Verilog でこれを行う方法はありますか? また、W
は 8 ビットの入力 (つまりW[7:0]
) です。
for (i = 7; i >= 0; i = i - 1)
begin
if(W[i]) Y=3'di;
end
ありがとう。
ブラケットを使用してビットを選択できます。
for (i = 7; i >= 0; i = i - 1)
begin
if(W[i]) Y = i[2:0];
end
i
しかし、整数であると宣言されている場合は必要ありません。ただし、多くのビットがY
自動的に収まり、LSB のみが必要でした。
case
ここでステートメントを使用したい場合があります。
case (1'b1)
W[0]: Y=3'd0;
W[1]: Y=3'd1;
W[2]: Y=3'd2;
W[3]: Y=3'd3;
W[4]: Y=3'd4;
W[5]: Y=3'd5;
W[6]: Y=3'd6;
W[7]: Y=3'd7;
default: Y=3'd0; // to avoid inferring a latch when W==8'd0
endcase
これにより、コードの読者にとって優先順位がより明確になります。
「for ループ」ルーチンを実行するには、ステート マシンを使用する方がよいことがわかりました。このようなもの:
module yourthing(clk, W, i, Y)
input clk;
input [7:0] W;
output [2:0] Y;
reg [2:0] i;
always@(posedge clk) begin
if(reset) begin
i = 3'd7;
Y = 3'd0;
end
else begin
case(i)
3'd7 : begin
if(W[i]) Y = i;
i = 3'd6;
end
3'd6 : begin
if(W[i]) Y = i;
i = 3'd5;
end
3'd5 : begin
if(W[i]) Y = i;
i = 3'd4;
end
3'd4 : begin
if(W[i]) Y = i;
i = 3'd3;
end
3'd3 : begin
if(W[i]) Y = i;
i = 3'd2;
end
3'd2 : begin
if(W[i]) Y = i;
i = 3'd1;
end
3'd1 : begin
if(W[i]) Y = i;
i = 3'd0;
end
3'd0 : begin
if(W[i]) Y = i;
i = 3'd7;
end
endcase
end
endmodule
お役に立てれば...