1. カルノー図法
カルノー図法は、1953年にベル研のモーリス・カルノーによって考案された、作図によって論理式を簡単化する手法です。前年(1952年)にヴェイチが考案したヴェイチ図を改良したもので、変数の少ない積和形の論理式の簡単化によく用いられます。原理的には6変数程度まで使えるとされますが、変数が増えるとマス目が指数的に増えて扱いにくくなるため、一般には4変数までの論理式の簡単化に用います。
1.1. 2変数のカルノー図
前章の問題【1】
を例に説明します。どの式でも真理値を求めればカルノー図を作れます。積和形なら、各積項が1になるマスを順に記入する方法が便利です。この例はすでに積和形になっています。 次に、2変数のカルノー図は \(x\) と \(y\) の値の組合せで \(2\times 2\) のマス目を書き、2変数の値
\((x,y)=(0,0),(0,1),(1,0),(1,1)\)
に対応させます(下図参照)。
論理式 \(x + \bar x\cdot y + x\cdot\bar y\) の左側の項から順に考えることにします。
-
\(x\) の項は、\(x=1\) であれば \(y\) の値によらず1になりますので、\(y\) は 0 でも 1 でもよい、つまり \(x=x\cdot(y+\bar y)\) ですから、左図の茶色で囲まれた部分 \((x,y)=(1,\mathbf0),(1,\mathbf1)\) の2マスに1を書きます。
-
\(\bar x\cdot y=1\) になるのは \((x,y)=(0,1)\) のときのみですから、左図の緑色で囲まれたマスに1を書きます。
-
\(x\cdot\bar y=1\) になるのは \((x,y)=(1,0)\) のときのみですから、左図の青色で囲まれたマスに1を書きます(実際には、すでに1が書かれているので、変化なしです)。
ここまで作図ができたら、4マスのうち3マスに1が書かれた状態になっています(左図)。説明のために左図には3つの項に対応する囲み枠を3つ書いていますが、実際にはこの時点で囲みは書きません。
次の工程が重要です。
-
すべての1を覆うようにできるだけ大きな\(2^n\)個のマスを含んだ矩形の枠を描きます(右図)。つまり、枠に含まれるマスの数は、1,2,4,8,…でなくてはなりません。
-
このとき枠は1の書かれていないマスには立ち入らないようにして、かつ四角(角を丸めて描いてもよい)で1を囲むように描かなくてはなりません。つまり、「』」のように曲がった枠で囲んではいけません。この条件のもとで、枠の数が最小になるように囲んでください。
すると、すべての1を囲むには、右図のように少なくとも緑と茶の2つの枠が必要になります。また、\((x,y)=(1,1)\) の部分で緑と茶の枠が重なりますが、これは、ちょうど\(2^n\)個のマスを含む枠で、かつ、できるだけ大きく囲むという決まりがあるためです。
後は、囲んだ2つの枠を解釈して積和形の論理式に戻すだけです。茶色の枠は、\(x=1\) で \(y\) は0,1どちらの値もとるので、項 \(x\) を表しています。また、緑の枠も同様に項 \(y\) を表していますので、積和形論理式の形に戻すと、
が得られました。
1.2. 3変数のカルノー図
前章の問題【2】
3変数の場合の例として前章の問題【2】を用いてカルノー図を描いてみましょう。
を例に説明します。この例もすでに積和形です。 3変数のカルノー図は \((x,y)\) の値の組と \(z\) の値の組合せで \(4\times 2\) のマス目を書き、3変数の値
に対応させます(下図参照)。このカルノー図で重要なのは、\(xy\) の値の並べ方です。順序が 00, 01, 11, 10 になっていることに注意してください。隣接するセルの2進法の表現が1ビットだけ異なるように並べることが重要です。もし、01の次に10がくると、1桁目と2桁目両者ともに値が異なってしまいます(1桁目は1→0、2桁目は0→1)。このような並べ方にならないようにします。隣接する2進法の表現が1ビット(1桁)だけ異なるようになっていれば、順序は 11, 01, 00, 10 でも問題ありません。
|
【グレイコード】 隣り合う符号が必ず1ビットだけ異なるこのような並べ方をグレイコード(交番二進符号)とよびます。カルノー図でマス目をこの順に並べるのは、隣接マスが1変数だけ違う(=1つの項にまとめられる)ようにするためです。グレイコードは現実の機器でも使われています。たとえば回転角を読み取るロータリーエンコーダでは、通常の2進法だと複数桁が同時に切り替わる瞬間に誤読(たとえば 0111→1000 で一瞬 1111 と読む)が起こりえますが、1桁ずつしか変化しないグレイコードを使えばこの誤りを避けられます。 |
先ほどと同じように、論理式 \(x\cdot y + \bar x\cdot z + y\cdot z\) の左側の項から順に考えます。まず、マス目は縦4行横2列で、行は \(x\) と \(y\) に対応させ、列は \(z\) に対応させます。(他にもたとえば、横長のマス目にして、縦2行、横4列とし、行は \(x\) に、列は \(y\) と \(z\) に対応させても構いません。)
-
\(x\cdot y=1\) となるのは、\(xy=11\) で、かつ \(z\) は 0 でも 1 でもよいので、左図の青色で囲まれた部分 \((xy,z)=(11,\mathbf0),(11,\mathbf1)\) の2マスに1を書きます。
-
\(\bar x\cdot z=1\) となるのは、\(x=0\) かつ \(z=1\) で、\(y\) は 0でも1でもよいので、左図の緑色で囲まれた部分 \((xy,z)=(0\mathbf0,1),(0\mathbf1,1)\) の2マスに1を書きます。
-
\(y\cdot z=1\) となるのは、\(y=1\) かつ \(z=1\) で、\(x\) は 0でも1でもよいので、左図の茶色で囲まれた部分 \((xy,z)=(\mathbf01,1),(\mathbf11,1)\) の2マスに1を書きます。
すると、すべての1を囲むには、右図のように緑と青の2つの枠だけで十分です。 つまり、\(yz\) の項が不要であることがただちにわかります。よって、
が得られました。
カルノー図の端と端はつながっている
ところで、上記の問題と似た以下の積和形論理式を簡単化する問題を考えてみましょう。
この積和形論理式からカルノー図を作成すると、右図のようになります。注意を要するのは、カルノー図の上下はつながっているということです(ゲームのパックマンのように端と端がつながっています)。一番上の行の \(xy=00\) と一番下の行の \(xy=10\) は1ビット(1桁)だけ異なります。このような部分はつながっているのです。
よって、緑色の枠で囲んだ部分は、上端と下端がつながっていることから、1つの枠として囲むことができるのです。このことを忘れずに作図する必要があります。また、左右もつながっているのですが、この場合は2列のみなので、青色の枠のように内側方向に枠を描くだけでよいということになります。
この結果より、上の例と同様に緑と青の枠だけで、1をすべて覆えるので
が、得られます。
4変数の場合は、行に \(xy\)、列に \(zw\) をそれぞれグレイコード順に割り当てた \(4\times 4\) のマス目になります。4変数のカルノー図でも同様に、上下の端どうし、左右の端どうしがつながっています。下図のように、4隅の4マスも巻き付きによって1つのグループとして囲むことができます。
この4隅のグループは \(\bar y\cdot\bar w\) を表します。
3変数のもう1つの例
次の論理式でカルノー図を描いてみましょう。
左図に上の積和形論理式をカルノー図に図示しました。右図は、できるだけ大きな\(2^n\)個のマス目を囲む枠で、1を覆った図です(この場合は4個のマス目を囲む青色と緑色の枠が2つ作れます)。
右図より、ただちに
が得られます。
論理関数の簡単化問題、すなわち、論理関数を表す積和形論理式の中で、もっとも積項数が少なく、かつリテラル数が最小であるような論理式を求める問題は、回路設計上非常に重要です。ここでは積項数を優先し、同じ積項数ならリテラル数を減らす、という基準を使います。実際の回路では遅延や一時的な出力の乱れも考えるため、式の最小化がそのまま最良の回路になるとは限りません。この簡単化問題はコンピューターで自動化できるのでしょうか。実は、変数が増加するに従ってコンピューターでも手に負えないほど計算量が増加してゆく問題であることが知られています。実用的には本当に最小の論理関数を求める必要はなく、最小に近い論理回路が構成できればよいため、近似的に関数を最小化する様々なアルゴリズムが開発されています。
2. 論理ゲートの関数的完全性
前章で \(n\) 変数の論理関数の総数は \(2^{2^n}\)個あることを学びました。しかし、同じ関数を表す論理式や論理回路は無数に考えられますので、簡単化して、できれば最小の論理ゲートで回路を組むことを考えるわけです。論理回路では \(n\)変数というのは、\(n\)入力の論理回路と言い換えてもかまいません。ところで、\(n\)入力の論理回路で、\(2^{2^n}\)個の論理関数はすべて作れるのでしょうか。この問題は、論理ゲートまたはブール演算子の関数的完全性の問題として知られています。前章で学んだとおり、どんな真理値表からも積和標準形が作れるので、ANDゲート、ORゲート、NOTゲートの3種類があれば、すべての論理関数を構成できます。
実は、関数的完全性のためには、ORゲートまたはANDゲートのいずれかは不要で、{AND, NOT} または {OR, NOT} の組合せだけで、あらゆる論理関数を表現できます。{AND, OR, NOT} の関数的完全性を前提として、このことを示してみましょう。
2.1. ANDゲートとNOTゲートの関数的完全性
ANDゲートとNOTゲートからORゲートが構成できることを示します。
つまり、以下の論理回路でORゲートが構成できます。
ORゲートとNOTゲートの関数的完全性については、同様に示せますので省略します。
2.2. NANDゲートの関数的完全性
実際の回路設計ではNANDゲートとよばれる論理ゲートのみを使った回路設計がよくみられます。これは、NANDゲートが技術的には比較的容易に構成可能であること、および、NANDゲートのみで関数的完全性が成り立つことによります。NANDゲートに対応する二項論理演算子を \(\uparrow\) で表し、論理ゲートは右図の記号で表すことにします。NANDゲートとは次のような論理式で定義される論理ゲートです。
NANDゲートの真理値表を下記に示します。
| \(x\) | \(y\) | \(x\uparrow y\) |
|---|---|---|
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
これは、論理積の結果を反転させた関数です。
さて、NANDゲートのみでNOTゲート、ANDゲート、ORゲートがすべて実現できることを示して、NANDゲートのみで、すべての論理関数を構成できることを示しましょう。
NOTゲート
1入力のNOTゲート(単項演算子のNOT演算子)を、2入力のNAND(二項演算子のNAND演算子)でどのように表すか、戸惑うかもしれませんが、冪等律で入力を複製してやればよいだけです。
ANDゲート
ANDゲートの出力にNOTゲートをつけたものがNANDゲートですから、右図のようになります。
ORゲート
ORゲートは、復元律とド・モルガンの法則からNANDゲートのみに変換できます。
以上より、NANDゲートだけあれば、あらゆる論理関数が表現できることを示せました。
|
【NANDだけでできている】 NANDが1種類あれば何でも作れるという性質は、設計上たいへん都合がよく、実際の集積回路に活かされています。デジタル回路の入門で最初に登場する標準ICのひとつ「7400」は、1パッケージに2入力NANDゲートが4個入っただけの部品です。原理的にはこの7400を多数つなげるだけで、加算器でもCPUでも組めることになります。半導体の製造でもNAND(やNOR)は構造が単純で作りやすく、配線も揃えやすいため、現代のLSI設計でも好まれます。大容量のフラッシュメモリに「NAND型」という種類があるのも、記憶素子をNANDゲートと同じ形につないでいることに由来します。 |
3. 組合せ回路の設計
組合せ論理回路とは、現在の入力の値だけで出力が一意に(一通りに)決まり、過去の入力(内部状態)には依存しない論理回路のことです。単に組合せ回路とも呼びます。これまで扱ってきた論理回路はすべて組合せ回路です。
では、組合せ回路ではない論理回路とは、どのような回路でしょう。それは、状態をもつ論理回路のことです。たとえば、自動販売機に10円をいれると、10円が状態として記憶されます。次に10円を入れると20円が状態として記憶されます。このように記憶をもつ仕組みがないと、10円を何度入れても、10円としか認識されない困った事になってしまいます。状態を持つ回路を順序回路とよび、次回の授業で学びます。
これまでは1出力の組合せ回路のみを扱ってきましたが、複数出力の論理回路の構成も同様の方法で構成できます。たとえば、3入力、2出力の論理回路を構成したければ、\(f_1(x,y,z)\)、\(f_2(x,y,z)\) と共通の入力 \(x,y,z\) を持つ2つの論理回路を構成してやればよいだけです。実際に回路設計をするときには、無駄のないように \(f_1\) と \(f_2\) でできるだけ回路を共有して効率的に回路を構成します。
3.1. 2入力データセレクタ
まず、2入力データセレクタを論理回路で構成してみましょう。下図がセレクタの図です。この回路は、2つのデータ \(d_0\) と \(d_1\) を入力として受け取ります。そして、セレクタ \(s\) の値に応じて \(d_0\) と \(d_1\) のどちらを \(y\) に出力するか決定します。つまり、\(s=0\) のとき \(y=d_0\)、\(s=1\) のとき \(y=d_1\) となります。この回路は複数回線の通信データを1回線にまとめるときによく用いられますので、回線多重化回路(マルチプレクサ)ともよばれます。
下の表に2入力データセレクタの動作を真理値表として示しました。 \(s=0\) のとき \(y=d_0\)、\(s=1\) のとき \(y=d_1\) となるように、あらゆる入力の組合せを記述していることを確認してください。
| \(s\) | \(d_0\) | \(d_1\) | \(y\) | 最小項(\(y=1\)) |
|---|---|---|---|---|
0 |
0 |
0 |
0 |
|
0 |
0 |
1 |
0 |
|
0 |
1 |
0 |
1 |
\(\bar s\cdot d_0 \cdot\bar d_1 \) |
0 |
1 |
1 |
1 |
\(\bar s\cdot d_0 \cdot d_1 \) |
1 |
0 |
0 |
0 |
|
1 |
0 |
1 |
1 |
\(s\cdot\bar d_0 \cdot d_1 \) |
1 |
1 |
0 |
0 |
|
1 |
1 |
1 |
1 |
\(s\cdot d_0 \cdot d_1 \) |
カルノー図をつかってこの回路を設計してみましょう。 まず、積和標準形によって出力 \(y\) を記述します。\(y=1\) に対応する最小項を求め、その和をとることにより、次のように積和標準形が得られます。
次に、カルノー図を作成します。左下図のように、最小項に対応するマス目に1を書きます。そして、右下図のように、1の書かれたマス目のみを \(2^n\) 個の単位でできるだけ大きく囲む枠を描きます。
こうして、1を覆った2つの枠に対応する積項を求め、論理和で接続することにより次式を得ます。
よって、2入力セレクタの論理回路は次のようになります。
|
前章で学んだとおり、すべての変数のリテラルを1つずつ含む積項を最小項とよびます。最小項が1となる入力は1通りだけなので、カルノー図では必ずマス目1つ分に対応します。 |
3.2. 半加算器
2進法の数の足し算をする回路を組合せ回路で設計します。まず、1ビットの数 \(x\) と \(y\) の足し算について考えます。すると、計算は次の表のようになります。
| \(x\) | \(y\) | 和 \(s\) | 桁上げ \(c\) |
|---|---|---|---|
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
和 \(s\) については論理和ではないことに注意してください。2進法の加算として \(1+1=10\) となるので、和は \(s=0\)、桁上げは \(c=1\) となります。(和の記号として \(s\) を使うのは和の英語 sum から、桁上げの記号として \(c\) を使うのは桁上げの英語 carry からです。)
この論理回路は2入力、2出力ですので、\(f_1(x,y)=s\) と、\(f_2(x,y)=c\) の2つの論理関数から回路を設計することになります。まず、簡単な桁上げの方から見てみましょう。桁上げの \(f_2(x,y)=c\) は真理値表からANDゲートそのものであることがわかります。
次に、和の \(f_1(x,y)=s\) は、 入力 \(x\) と \(y\) のどちらか1つが1のときのみ、出力 \(s\) が1となるような回路です。この回路はXORゲートとして様々な場面で用いられます。XORは exclusive or の省略形で、日本語では排他的論理和といいます。
よって、半加算器はXORゲートを用いると左下図のようになります。また、半加算器を右下図のように表現することにします。
3.3. 全加算器
前節の半加算器は、このままでは複数桁の2進法の数の足し算には使えません。なぜなら、上位の桁では下位の桁からの桁上りを考慮する必要があるからです。つまり、下位からの桁上げ \(c_{\text{in}}\) と上位への桁上げ \(c_{\text{out}}\) の2つの桁上げを考慮する必要があります。これは3つの1ビットの数 \(x\)、\(y\)、\(c_{\text{in}}\) を足す加算器と考えればよいので、真理値表は次のようになります。
| \(c_{\text{in}}\) | \(x\) | \(y\) | 和 \(s\) | \(c_{\text{out}}\) |
|---|---|---|---|---|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
詳細な計算は省きますが、2つの半加算器を2段繋げば、3つの1ビットの数の和が求められることは明らかでしょう。ここでは、\((x+y)+c_{\text{in}}\) の順に足し合わせています。上位への桁上げ \(c_{\text{out}}\) は、2つの半加算器のいずれかの桁上げがあれば、上位に送るだけですのでORゲートを用います。このORゲートの2つの入力が2つとも1になることはないことに注意してください。
よって、全加算器は半加算器とORゲートを用いて左下図のように構成できます。また、全加算器を右下図のように表現することにします。
これで、複数桁の2つの2進数の数を足し合わせる回路を構成する準備ができました。 あとは、組み合わせるだけです。
まず、入力となる2進法の数 \(x\) と \(y\) をそれぞれ4ビットとします。各桁の1ビットの値を、それぞれ \(x_i\) と \(y_i\) で次のように表します。
たとえば、\(x=1011\) のときは \(x_1=1\), \(x_2=1\), \(x_3=0\), \(x_4=1\) となります。 すると、4ビットの加算器は下記のように構成できます(計算結果は \(s=s_4s_3s_2s_1\))。最上位の桁上げ \(c_{\text{out}}\) は5桁目(あふれ)を表します。
3.4. 論理回路の遅延時間
ブール代数による式を論理回路として表現するときには、遅延時間を考慮する必要があります。 論理関数としては、結合律がなりたちますので次式の両辺は等価です。
しかし、論理回路としては左辺は左図、右辺は右図のようになります。
左辺はANDゲートが3段、右辺は2段の深さです。値が入力されてから論理回路の値が決まるまでの時間を論理回路の遅延時間といいます。左図では、入力 \(w\) と \(x\) は3段のANDゲートを通るため、この部分が左図の回路の遅延時間を決定づけています。つまり、右の論理回路より、左の論理回路の方が遅延時間が長くなってしまうのです。遅延は素子、電圧、負荷などに依存し、個別の論理ICではナノ秒単位の場合もあります。例えば仮に各ゲートの遅延を同じ100ピコ秒とすれば、3段で300ピコ秒、2段で200ピコ秒となります(1ピコ秒は10-12秒)。
この遅延時間は、先ほど作った加算器でも問題になります。先の4ビット加算器では、各桁の全加算器が下の桁からの桁上げを受け取ってから計算するため、桁上げが最下位から最上位へ順に伝わるのを待つ必要があります。この方式を桁上げ伝搬加算器(リップルキャリー加算器)とよびます。桁数が増えるほど桁上げの伝搬段数が増え、遅延時間が長くなります。そこで、桁上げをあらかじめ別経路でまとめて計算する桁上げ先見加算器(キャリールックアヘッド加算器)など、より速い加算回路が考案されています。回路は論理関数として正しいだけでは十分でなく、遅延時間まで考えて設計する必要があるのです。
|
【マインクラフトと論理回路設計】
マインクラフトではレッドストーン回路で論理回路を設計し、様々な仕掛けを作れます。次回学ぶ記憶の仕組みも組み合わせれば、ゲーム内に計算機を作ることもできます。現実のゲームには領域や速度の制限がありますが、論理演算から計算機を組み立てる発想を試す題材になります。 |
4. 今週の問題
次の問【1】〜【2】に取り組んでください。
【1】NORゲートを表す論理演算子を \(\downarrow\) で表し、論理ゲートは下図の記号で表すことにします。
NORゲートの真理値表を下記に示します。
| \(x\) | \(y\) | \(x\downarrow y\) |
|---|---|---|
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
これは、論理和の結果を反転させた関数ですので、\(x\downarrow y = \overline{x+y}\) と定義できます。
(1) NORゲートのみでNOTゲートが実現できることを示し、その論理回路を描け。
(2) NORゲートのみでORゲートが実現できることを示し、その論理回路を描け。
(3) NORゲートのみでANDゲートが実現できることを示し、その論理回路を描け。
【2】カルノー図を用いて次の論理式を簡単化せよ。
5. 今週の問題の解答
まず自分で解いてから読むことをすすめます。
【1】NORゲートを表す論理演算子を\(\downarrow\)で表し、論理ゲートは下図の記号で表すことにします。
NORゲートの真理値表を下記に示します。
| \(x\) | \(y\) | \(x\downarrow y\) |
|---|---|---|
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
これは、論理和の結果を反転させた関数ですので、\(x\downarrow y = \overline{x+y}\) と定義できます。
(1) NORゲートのみでNOTゲートが実現できることを示し、その論理回路を描け。
(2) NORゲートのみでORゲートが実現できることを示し、その論理回路を描け。
(3) NORゲートのみでANDゲートが実現できることを示し、その論理回路を描け。
(1)
(2)
(3)
本章では、NANDゲートだけであらゆる論理関数が作れること(関数的完全性)を確認しました。上の(1)〜(3)から、NORゲートも同じく関数的完全であることがわかります。この性質は、次章でメモリ回路(SRラッチ)の組み立てに使います。
【2】カルノー図を用いて次の論理式を簡単化せよ。
上記の積和形論理式からカルノー図を作成すると、左図が得られます。これを囲みなおすと右図のようになります。
よって、
と簡単化できました。 「カルノー図の端と端はつながっている」の節で扱った内容ですが、上下のつながりは見落としやすいところです。以下の点を再度確認しておきます。
-
\(2^n\) 個の1を含んだ四角で囲む
-
上下左右はつながっている
-
囲みは互いに重なって良い
隣接する \(xy\) の値の割り当てを通常の2進法による数の順番 00 → 01 → 10 → 11 にしてしまう間違いもよくあります。「3変数のカルノー図」の節で述べたとおり、隣接する値は1桁だけ異なるように 00 → 01 → 11 → 10 と並べてください。
カルノー図は和積形を求めるのにも使えます。図には示していませんが、値が0の2つのマス \((xy,z)=(01,0),(11,0)\) を囲むと、元の関数 \(f\) が0になる範囲、つまり補関数(否定) \(\bar f\) の積和形
が得られます。両辺の否定をとってド・モルガンの法則を適用すると、和積形
を得ます。
以上です