Menu
Coddy logo textTech

継続的代入

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

ハードウェアにおける接続(connection)とは、回路内の2点を結ぶ物理的な電線(ワイヤ)のことです。一度ワイヤが配置されると、その接続は永久的で常に有効となります。片方の端が変化すると、もう片方の端も即座に変化します。

Verilogでは、この動作をモデル化する方法が必要です。値をwireに渡し、永久に接続された状態を維持したいと考えます。これを行うプロセスは、continuous assignment(連続退避/継続的代入)と呼ばれます。

連続代入 (Continuous assignment) は、assign キーワードを使用して wireexpression の間に永続的な接続を作成します。wire は、物理的な電線と同じように、expression の値を継続的に取得します。

一度値を書き込むというよりは、wire(配線)をハンダ付けするイメージで考えてみてください。

構文

assign wire_name = expression;
項目意味
assigncontinuous assignment を開始するキーワード
wire_name駆動される wire(reg にはできません)
expressionwire を駆動する値

簡単な例

wire out;
assign out = a & b;

これは次のことを意味します:outalways equala AND b となります。a または b が変更されるたびに、out は即座に変化します。

動作の仕組み

値を保持する reg とは異なり、continuous assignment を持つ wirecontinuously update されます:

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 は自動的に更新されます。

Multiple Assignments

モジュール内には、複数の `continuous` `assignment` を含めることができます:

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

すべての assignment は並列に、continuously 実行されます。

一般的な用途

continuous assign(連続退避/継続的代入)は以下のような用途で使用されます:

  • 単純な組み合わせ論理(AND、OR、XOR)
  • wire 同士の接続
  • トライステートバッファの作成
  • 組み合わせ論理 expression からの output の駆動
challenge icon

チャレンジ

作業手順:

  1. zx AND y と等しくする不足している continuous assignment(継続的代入)文を Add してください。

自分で試してみよう

module continuous_challenge (
  input x,
  input y,
  output z
);
  
  // TODO: z を x AND y と等しくする不足している連続代入を追加してください
  

endmodule
quiz icon腕試し

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

基礎のすべてのレッスン