Menu
Coddy logo textTech

継続的代入

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 37/90。

ハードウェアにおいて、接続とは回路内の2つの地点を結ぶ物理的な配線のことです。一度配線が配置されると、その接続は永続的で常にアクティブになります。一端が変化すれば、もう一端も即座に変化します。

Verilogでは、この動作をモデル化する方法が必要です。値をワイヤに渡し、それを永続的に接続したままにしたいと考えています。これを行うプロセスは、継続的代入(continuous assignment)と呼ばれます。

継続的代入は、assignキーワードを使用して、wireと式の間に永続的な接続を作成します。wireは、物理的なワイヤと同じように、常に式の値を取ります。

一度だけ値を書き込むのではなく、ワイヤーをはんだ付けするようなものだと考えてください。

構文

assign wire_name = expression;
項目意味
assign継続的代入を開始するキーワード
wire_name駆動されるワイヤ(regは不可)
expressionワイヤを駆動する値

簡単な例

wire out;
assign out = a & b;

これは次のことを意味します:out は常に a AND b と等しくなります。a または b が変化すると、out は即座に変化します。

仕組み

値を保持する reg とは異なり、継続的代入(continuous assignment)を伴う wire は常に更新されます:

module continuous_demo;
  reg a, b;
  wire c;
  
  assign c = a & b;   // cは常にa AND bに従います
  
  initial begin
    a = 0; b = 0;
    #10 $display("a=%d, b=%d, c=%d", a, b, c);  // c=0
    
    a = 1;
    #10 $display("a=%d, b=%d, c=%d", a, b, c);  // c=0 (1&0=0)
    
    b = 1;
    #10 $display("a=%d, b=%d, c=%d", a, b, c);  // c=1 (1&1=1)
    
    $finish;
  end
endmodule

出力:

a=0, b=0, c=0
a=1, b=0, c=0
a=1, b=1, c=1

a または b が変化するたびに、c は自動的に更新されます。

複数の代入

モジュール内には、複数の継続的代入(continuous assignment)を記述できます。

module multiple_assign (
  input a, b, c,
  output x, y
);
  assign x = a & b;
  assign y = x | c;   // yはxに依存します
endmodule

すべての代入は、継続的に並列で実行されます。

一般的な用途

継続的代入は、以下の用途で使用されます:

  • 単純な組合せ論理(AND、OR、XOR)
  • ワイヤ同士の接続
  • トライステート・バッファの作成
  • 組合せ論理式からの出力の駆動
challenge icon

チャレンジ

やること:

  1. zx AND y と等しくなるように、不足している継続的代入(continuous assignment)を追加してください。

チートシート

継続的代入は、assignキーワードを使用して、ワイヤと式の間に永続的な接続を作成します:

assign wire_name = expression;

ワイヤは常に式の値を反映します。入力が変化すると、出力は即座に更新されます:

wire out;
assign out = a & b; // outは常にa AND bと等しくなります

複数の代入は並列に実行されます:

assign x = a & b;
assign y = x | c; // yはxに依存し、すべてが継続的に更新されます

重要なルール:assignによって駆動できるのはwireのみ(regは不可)です。

自分で試してみよう

module continuous_challenge (
  input x,
  input y,
  output z
);
  
  // TODO: z が x AND y と等しくなるように、不足している継続的代入を追加してください
  

endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン