クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

論理ゲートと真理値表

このレッスンのあとで: 真理値表を読んで、その表を作るゲートを書ける。

50分のレッスンコマンド6件デジタル設計のラボ:Verilog、VHDL、yosys を 1 台の専用 Ubuntu VM で

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つのゲートの真理値表

abANDORXORNAND
000001
010111
100111
111100

学生が入力するセルは、このプレビューでは空白です。

シミュレーターが表を出す

本物のチップを作る前に、シミュレーターで回路を動かします。ラボの Icarus Verilog では、iverilog が回路を読み込んで準備し、vvp が動かします。

回路に入力を与えて出力を表示するのが、テストベンチです。下のファイルは、4通りの入力を順に与え、4つのゲートの出力を1行ずつ表示します。

4つのゲートを試すファイル

コード: c
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行で書く

コード: c
// 警報は、ドアが開いていて、鍵が回っていないときだけ鳴る。
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つ要ります。

このラボとソースについて: デジタル設計のラボ:Verilog、VHDL、yosys を 1 台の専用 Ubuntu VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。