継続的代入
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=1a または 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)
- ワイヤ同士の接続
- トライステート・バッファの作成
- 組合せ論理式からの出力の駆動
チャレンジ
やること:
zがx 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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。