7

この 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

ありがとう。

4

3 に答える 3

12

ブラケットを使用してビットを選択できます。

for (i = 7; i >= 0; i = i - 1)
begin
    if(W[i]) Y = i[2:0];
end

iしかし、整数であると宣言されている場合は必要ありません。ただし、多くのビットがY自動的に収まり、LSB のみが必要でした。

于 2010-10-17T00:57:43.757 に答える
2

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

これにより、コードの読者にとって優先順位がより明確になります。

于 2010-10-18T03:07:32.147 に答える
0

「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

お役に立てれば...

于 2012-11-11T07:02:20.087 に答える