0と1だけで決まる回路
論理ゲートは、0と1を入れて0か1を出す、デジタル回路の一番小さな部品です。ゲートの動きは真理値表という小さな表で書けるので、回路を作る前に、起こりうる結果をすべて確かめられます。
たとえば、ドアが開いていて、鍵が回っていないときだけ鳴る警報は、1つの式で書けます。
このレッスンのゴール
メモ
真理値表を読んで、その表を作るゲートを書ける。
重要な言葉
| ことば | いみ |
|---|---|
| 論理ゲート | 0と1を入れて、0か1を出す部品 |
| 真理値表 | 入力の組み合わせごとに、出力を並べた表 |
| AND | 入力がすべて1のときだけ、1を出すゲート |
| XOR | 入力が違うときだけ、1を出すゲート |
| モジュール | 入力と出力を持つ、1つの回路 |
| テストベンチ | 回路に入力を与え、出力を表示するモジュール |
学生が入力するセルは、このプレビューでは空白です。
ゲートは入力から出力を決める
論理ゲートは、入力の値を見て、出力を決めます。入力が2つなら、組み合わせは4通りしかありません。
その4行を並べたものが真理値表です。ゲートの名前は、表の形で覚えます。AND は両方が1のとき1、OR は少なくとも1つが1のとき1、XOR は2つが違うとき1です。
4つのゲートの真理値表
| a | b | AND | OR | XOR | NAND |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 | 0 |
学生が入力するセルは、このプレビューでは空白です。
シミュレーターが表を出す
本物のチップを作る前に、シミュレーターで回路を動かします。ラボの Icarus Verilog では、iverilog が回路を読み込んで準備し、vvp が動かします。
回路に入力を与えて出力を表示するのが、テストベンチです。下のファイルは、4通りの入力を順に与え、4つのゲートの出力を1行ずつ表示します。
4つのゲートを試すファイル
module gates_tb;
reg a, b;
integer i;
initial for (i = 0; i < 4; i = i + 1) begin
{a, b} = i;
#1 $display("%b %b | and=%b or=%b xor=%b nand=%b",
a, b, a & b, a | b, a ^ b, ~(a & b));
end
endmodule
テストベンチを書く
printf 'module gates_tb;\n reg a, b;\n integer i;\n initial for (i = 0; i < 4; i = i + 1) begin\n {a, b} = i;\n #1 $display("%%b %%b | and=%%b or=%%b xor=%%b nand=%%b", a, b, a & b, a | b, a ^ b, ~(a & b));\n end\nendmodule\n' > /tmp/gates_tb.vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
準備する
iverilog -o /tmp/gates /tmp/gates_tb.vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
動かして表を見る
vvp /tmp/gatesここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
日常のルールを式に直す
警報のルールを、ゲートで書いてみましょう。「ドアが開いている」と「鍵が回っていない」の両方が成り立つときだけ、鳴ります。
「鍵が回っていない」は、鍵の反転です。Verilog では ~key と書きます。2つを AND でつなぐと、door & ~key になります。
警報を1行で書く
// 警報は、ドアが開いていて、鍵が回っていないときだけ鳴る。
assign alarm = door & ~key;
警報の表を作る
printf 'module lock_tb;\n reg door, key;\n wire alarm;\n assign alarm = door & ~key;\n integer i;\n initial begin\n $display("door key | alarm");\n for (i = 0; i < 4; i = i + 1) begin\n {door, key} = i;\n #1 $display(" %%b %%b | %%b", door, key, alarm);\n end\n end\nendmodule\n' > /tmp/lock_tb.vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
警報を準備する
iverilog -o /tmp/lock /tmp/lock_tb.vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
警報の表を見る
vvp /tmp/lockここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
日常の「または」と同じで、OR は「どちらか1つ」だと思いがちです。しかし OR は、両方が1のときも1を出します。「ちょうど1つだけ」のときに1を出すのは XOR です。表の最後の行で見分けましょう。
さらに挑戦: 3入力の表
課題が通ったら、入力を3つに増やしましょう。表は2×2×2で8行になります。
まず、3つの入力がすべて1のときだけ1を出す AND の表を紙に書きます。次に、truth_table を3入力に直せるか、考えてみましょう。ループがもう1つ要ります。