1

ブロック内で使用if-elseしてforループしたい。alwaysそれらif-elseを何度も実行したくないので、常にどちらかに接続したくありませんposedge clkまたはnegedge clk

一度だけ実行してほしい。シミュレーションするだけでなく、Spartan Board にも合成したいと考えています。

always @ (**what I should add here**)
    begin
    if(condition)

    else

    end
4

2 に答える 2

3

使用できるようになったシミュレーションで何かを実行するにはinitial、これは合成可能ではありません。

reg x;

initial begin
  if(condition) begin
    x = 1'b0 ;
  end
  else begin
    x = 1'b1 ;
  end
end

一般的な質問に答えるためにalways @(**what I should add here**)ほとんどの最新のVerilogシミュレーターでは、*右側の引数が選択ロジックの条件を変更したときに、ブロックをトリガーします(常に終了し始めます)。

always @* begin
  if(condition)
    x =  y ;
  else
    x = ~y ;
end

古いシミュレーターでは、トリガーする必要のある変数をリストにリストする必要があります。always @(condition, y)

選択されている変数が1つしかない場合は、ワイヤタイプに割り当てる方がよい場合がありますが、これは「1回実行」に限定することはできませんが、質問から適切な選択になります。FPGAへの適合性についてはよくわかりませんが

wire [3:0] x ; //4 bit wire
//(condition) ? value if true : value if false ;
assign x = (condition) ? 4'b1010 : 4'b0100 ;
于 2012-07-01T08:50:32.360 に答える
1
module oneShot(in, out, enable, reset);
    input in;
    input enable;
    input reset;
    output reg out;

    reg once_only;
    always @ (posedge enable) begin
          if (reset) begin
                once_only <= 0;
          end              
          else if (once_only == 0) begin
                out <= calc_out; // or whatever processing you want
                once_only <= 1;
          end
    end

    always @(*) begin
          // calculate ouput here always
          calc_out = 1 +  7 +100+ in;
    end
endmodule

これらの if ステートメントを 1 回だけ計算することはできません。それはハードウェアであり、常に計算されます。ただし、一度計算した後は出力を安定させることができます。問題を解決するハードウェアを説明するのではなく、ソフトウェア関数を作成してハードウェアに入れようとしています。この方法でまともなデザインが得られるとは思えません。確かに、いくつかの小さなピースを作成して合成することはできますが (最終的には)、完全なデザインは??

于 2012-07-02T02:45:14.313 に答える