継続的代入
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 37/90。
ハードウェアにおける接続(connection)とは、回路内の2点を結ぶ物理的な電線(ワイヤ)のことです。一度ワイヤが配置されると、その接続は永久的で常に有効となります。片方の端が変化すると、もう片方の端も即座に変化します。
Verilogでは、この動作をモデル化する方法が必要です。値をwireに渡し、永久に接続された状態を維持したいと考えます。これを行うプロセスは、continuous assignment(連続退避/継続的代入)と呼ばれます。
連続代入 (Continuous assignment) は、assign キーワードを使用して wire と expression の間に永続的な接続を作成します。wire は、物理的な電線と同じように、expression の値を継続的に取得します。
一度値を書き込むというよりは、wire(配線)をハンダ付けするイメージで考えてみてください。
構文
assign wire_name = expression;| 項目 | 意味 |
|---|---|
assign | continuous assignment を開始するキーワード |
wire_name | 駆動される wire(reg にはできません) |
expression | wire を駆動する値 |
簡単な例
wire out;
assign out = a & b;これは次のことを意味します:out は always equal に a AND b となります。a または b が変更されるたびに、out は即座に変化します。
動作の仕組み
値を保持する reg とは異なり、continuous assignment を持つ wire は continuously 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=1a または 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の駆動
チャレンジ
作業手順:
zをx AND yと等しくする不足している continuous assignment(継続的代入)文を Add してください。
自分で試してみよう
module continuous_challenge (
input x,
input y,
output z
);
// TODO: z を x AND y と等しくする不足している連続代入を追加してください
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。