ブール代数とカルノー図
1 ブール代数
ブール代数(boolean algebra)は、イギリスの数学者ブール(George Boole)が19世紀の中ごろに提唱した代数系の1つです。ブール代数は束(そく、lattice)の理論が築かれる契機となったものです。ブール代数は1または0の2値のみを持つ変数を用いる論理です。そのため2値代数、2値論理数学、デジタル数学、スイッチング代数などとも呼ばれます。スイッチング回路では、スイッチがONかOFFの2値を取りますので、ブール代数でスイッチング回路を表すことができます。
1.1 ブール代数の公理
1 |
全ての変数Aは、0か1のいずれかである |
2 |
a |
A・0=0・A=0 |
b |
A+1=1+A=1 |
3 |
a |
A・1=1・A=A |
b |
A+0=0+A=A |
4 |
a |
¬0=1 |
b |
¬1=0 |
公理2、3、4はブール代数の基本である論理和、論理積、否定について述べたものです。
■ 否定(NOT演算)
変数Aの否定は、NOT演算とも呼ばれます。Aの否定はAの上に横棒(¯)を書いて表します。読み方は「ノットA」、「Aバー」、「Aの否定」、「Aの反転」などです。ただこれをここに表記するのは難しいので¬Aと書くことにします。NOT演算は次の通りです。
NOT演算の真理値表は次の通りです。
論理回路ではNOT演算を行う回路は次の回路記号であらわされます。
この図は左側が入力で右側が出力を表します。三角形(▷)はバッファ(入力と出力が同じ処理で、論理演算としては意味はありませんが、電子回路の入出力ゲートとして記述されることがあります)を表す記号で、否定を意味するのは三角形の前についている小さな○です。他の論理ゲートの入出力にも小さな○が付いていることがありますが、これらは全て否定(値の反転)を意味します。
■ OR演算
変数A、BのOR演算はA+Bで表され、「AオアB」、「AまたはB」などと読みます。論理演算はA、Bのいずれかでも1なら、出力は1、両方とも1でも1、入力が何れも0の場合に、出力が0となります。真理値表は次の通りです。
OR演算 |
A |
B |
A+B |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
(A、B)=(0、0)、(1、0)、(0、1)の場合は、公理3のbから導くことができます。(A、B)=(1、0)、(0、1)、(1、1)の場合は、公理2のbから導くことができます。
OR演算の論理回路記号は次の通りです。
■ AND演算
変数A、BのAND演算はA・Bまたは演算記号を省略してABと表し、「AアンドB」、「AかつB」などと読みます。AND演算は2つの入力がともに1の場合だけ、出力が1になります。入力に1つでも0が入れば、結果は0となります。
AND演算 |
A |
B |
AB |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
(A、B)=(0、0)、(1、0)、(0、1)の場合は、公理2のaから導くことができます。(A、B)=(1、0)、(0、1)、(1、1)の場合は、公理3のaから導くことができます。
AND演算の回路記号は次の通りです。
1.2 ブール代数の基本的な性質-定理
ブール代数の演算において基本となる定理及び法則をまとめたものを次に示します。これらはNOT演算、OR演算、AND演算の公理から導くことができます。
補元 |
a) A+(¬A)=1 |
b) A(¬A)=0 |
交換律 |
a) A+B=B+A |
b) A・B=B・A |
分配律 |
a) A+(B・C)=(A+B)(A+C) |
b) A(B+C)=(A・B)+(A・C) |
結合律 |
a) A+(B+C)=(A+B)+C |
b) A(B・C)=(A・B)C |
吸収律 |
a) A+(A・B)=A |
b) A(A+B)=A |
ドモルガンの法則 |
a) ¬(A+B)=(¬A)(¬B) |
b) ¬(A・B)=(¬A)+(¬B) |
対合(二重否定) |
¬(¬A)=A |
べき等律 |
a) A+A=A |
b) A・A=A |
共有項律 |
a) A+(¬A)B=A+B |
b) A(¬A+B)=A・B |
c) A・B+B・C+(¬A)C=A・B+(¬A)C |
d) (A+B)(B+C)(¬A+C)=(A+B)(¬A+C) |
以上の定理は変数に全ての値の組み合わせを代入することで証明することができます。例としてドモルガンの定理のaについて真理値表を作成して証明してみたいと思います。
A |
B |
A+B |
¬(A+B) |
¬A |
¬B |
(¬A)(¬B) |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
式の変形で証明することももちろんできます。分配律aは次のように証明できます。
A+BC=A(1+C)+BC=A+AC+BC=A(1+B)+AC+BC=AA+AB+AC+BC=A(A+B)+C(A+B)=(A+B)(A+C)
共有項律も見た目が少しわかりにくいと思いますので、上のように式の変形をしてみたいと思います。
共有項律a) A+(¬A)B=A(1+B)+(¬A)B=A+AB+(¬A)B=A+(A+¬A)B=A+B
※1=1+B、A+¬A=1より
共有項律b) A(¬A+B)=A(¬A)+AB=AB
※A(¬A)=0より
共有項律c) AB+BC+(¬A)C=AB+BC(A+¬A)+(¬A)C=AB(1+C)+(¬A)C(B+1)=AB+(¬A)C
※A+¬A=1、1+C=1、1+B=1より
共通項律d) (A+B)(B+C)(¬A+C)=(¬AA+AC+¬AB+BC)(B+C)=(AC+¬AB+BC)(B+C)=ABC+ACC+¬ABB+¬ABC+BBC+BCC=(A+¬A)BC+AC+¬AB+BC+BC=BC+¬AB+AC=B(¬A+C)+AC+¬AA=B(¬A+C)+A(¬A+C)=(A+B)(¬A+C)
※¬AA=0、A+¬A=1より
1.3 論理演算と論理回路
論理回路ではNOT、OR、AND回路が基本ですが、実際によく利用されるのはNAND(NOT-AND、否定論理積)や、XOR(eXclusive-OR、排他的論理和)です。
NANDの真理値表は次のようになります。
A |
B |
¬(AB) |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
AND回路とNOT回路を組み合わせるとNAND回路となります。ドモルガンの定理を使うと、¬(AB)=¬A+¬Bとなりますので、OR回路とNOT回路の組み合わせでも実現できます。
XORは入力がいずれかが1で、もう一方が0の場合のみ出力が1となり、入力が、ともに1、ともに0の場合は、何れも出力が0となります。記号は⊕が使用されます。真理値表は次のようになります。
A |
B |
A⊕B |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
A⊕B=¬A・B+A(¬B)=¬A・B+¬A・A+A(¬B)+¬B・B=¬A(A+B)+¬B(A+B)=(A+B)(¬A+¬B)=(A+B)(¬(A・B))
となりますので、排他的論理和はOR回路と、NAND回路の組み合わせで実現できます。
否定、論理積、論理和、否定論理積、排他的論理和などいろいろあると、回路が複雑になり、工業的には効率的ではありません。一種類の回路で作ると、生産過程がシンプルになるだけでなく、面積当たりの回路数という意味でも、効率的にICの設計ができます。実は、NANDを使うと、NOT回路、AND回路、OR回路の何れも設計することが可能です。従って、実際ICでは、NOT回路も、AND回路も、OR回路もNANDで設計されています。
NANDでNOTを作る場合は、¬(A・A)=¬Aとなります。これを回路記号を使って表すと、次のようになります。
NANDでOR回路を作る場合は、¬[¬(A・A)・{¬(B・B)}]=¬{¬A・(¬B)}=A+B となります(ドモルガンの定理bより)。これを回路記号を使って表すと、次のようになります。
NAND回路でAND回路を作る場合は、¬[¬(A・B){¬(A・B)}]=A・B+A・B=A・B(ドモルガンの定理とべき等律)となります。これを回路記号を使って示すと、次のようになります。
1.4 半加算器の設計
ブール代数に少し慣れたと思いますので、半加算回路について考えてみたいと思います。
半加算器の真理値表は次のようになります。入力はA、Bで和はS0、桁上りはC0です。
入力 |
出力 |
A |
B |
C0 |
S0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
これを論理式に表すと、S0=A(¬B)+¬A(B)=A⊕B、C0=ABとなります。これを回路記号を使って表現すると次のようになります。
排他的論理和の回路記号を使って、S0=A⊕B、C0=ABで回路図を書くと次のようになります。
S0=A(¬B)+¬A(B)、C0=ABで回路を作ると、次のようになります。
AND回路をNAND回路に置き換えると次のようになります。
S0=A⊕B=¬A・B+A(¬B)=¬A・B+¬A・A+A(¬B)+¬B・B=A(¬A+¬B)+B(¬A+¬B)=¬(A・B)A+¬(A・B)B=¬[¬{¬(A・B)・A}][¬{¬(A・B)・B}]
C0=A・B=¬(¬(A・B))
となりますので、NAND回路(とNOT回路)だけで構成すると、次のようになります。
半加算器は下位ビットからの桁上りを取り入れることができません。下位ビットからの桁上りをCn-1とすると、真理値表は次のようになります。
入力 |
出力 |
A |
B |
Cn-1 |
Cn |
Sn |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
この真理値表から論理式を導き出すのは少し難しいようです。このような場合に役に立つのがカルノー図です。
2 カルノー図
カルノー図(Karnaugh map)は論理回路などにおいて論理式を簡単にするための表です。
カルノー図では変数が2つの場合は次のようになります。
f |
B |
0 |
1 |
A |
0 |
¬A(¬B) |
¬A・B |
1 |
A(¬B) |
A・B |
従って、(A、B)=(1、0)のセルに1が入っている場合は、論理式はf=A(¬B)となります。
(A、B)=(1、0)、(A、B)=(1、1)の場合は、カルノー図は次のようになります。
この場合は
f=A(¬B)+A・B=A(¬B+B)=A
となります。
変数が3つの場合は次のようになります。
次の形でも構いません。
変数が4個の場合は次のようになります。
|
CD |
00 |
01 |
11 |
10 |
AB |
00 |
|
|
|
|
01 |
|
|
|
|
11 |
|
|
|
|
10 |
|
|
|
|
ここで注意してほしいのは、外枠の変数に対応する2進数が00、01、11、10になっていることです。隣接した2つのセルの2進数は1しか違っていません。このことは巡回的にも成立しています。ABの場合は一番上の00と一番下の10も隣接しています。CDの場合は左端の00と右端の10も隣接しています。このように隣接性を持つ2つのセルを隣接対といいます。
カルノー図ではこの隣接対を利用して式を簡単にしていきます。分かり易いので3変数の場合を例にして説明します。A、B、Cを変数とした論理式があるとします。この式をカルノー図を使って簡略化していきます。
f= ¬A(¬B)(¬C)+¬A・B(¬C)+A・B(¬C)+A(¬B)(¬C)
各変数の組み合わせを次のように考えてください。
¬A(¬B)(¬C)=000
¬A・B(¬C)=010
A・B(¬C)=110
A(¬B)(¬C)=100
¬A(¬B)C=001
¬A・B・C=011
A・B・C=111
A(¬B)C=101
f |
C |
0 |
1 |
AB |
00 |
¬A(¬B)(¬C) |
¬A(¬B)C |
01 |
¬A・B(¬C) |
¬A・B・C |
11 |
A・B(¬C) |
A・B・C |
10 |
A(¬B)(¬C) |
A(¬B)C |
これを基にして該当するセルに「1」をセットします。
f |
C |
0 |
1 |
AB |
00 |
1 |
|
01 |
1 |
|
11 |
1 |
|
10 |
1 |
|
上の論理式の場合は次のようになります。
慣れてくると、A、Bの値に関係なくC=0の場合だけ「1」となっていますので、式の値は¬Cであることが直ぐに分かるようになります。
初めのうちは一歩一歩進みましょう。上の表では1の入ったセルは隣接ですから簡単にまとまります。000[¬A(¬B)(¬C)]と010[¬A・B(¬C)]、110[A・B(¬C)]と100[A(¬B)(¬C)]は隣接ですので、それぞれ次のようにまとめることができます。
¬A(¬B)(¬C)+¬A・B(¬C)=¬A(¬C)(¬B+B)=¬A(¬C)
A・B(¬C)+A(¬B)(¬C)=A(¬C)(¬B+B)=A(¬C)
更に次のように2つの項をまとめることができます。
f=¬A(¬C)+A(¬C)=¬C(¬A+A)=¬C
ABの01と11、00と10も隣接していますので、次のように変形しても構いません。
次の場合はどうでしょうか。
論理式は次のようになります。f=A・B(¬C)+¬A・B・C+A・B・C+A(¬B)C
互いに隣接しているセルを赤枠で括りました。その赤枠内の式はそれぞれA・B、B・C、A・Cとなりますので、f=A・B+B・C+C・Aとなります。
※隣接セルを1つにまとめるときは、同じセルを何度も使うことができます。
次に隣接関係を見落としやすい例について計算してみましょう。
隣接セルが隅に固まっていますので、慣れないうちは見落としてしまいがちです。次の例はどうでしょうか。
これも隣接関係にありますので、¬A(¬B)(¬C)(¬D)+¬A(¬B)C(¬D)+A(¬B)(¬C)(¬D)+A(¬B)C(¬D)=¬A(¬B)(¬D)(¬C+C)+A(¬B)(¬D)(¬C+C)=¬A(¬B)(¬D)+A(¬B)(¬D)=¬B(¬D)(¬A+A)=¬B(¬D)となります。
次は変数が5つの場合です。
E=0の場合を見てみると、B(¬C)(¬D)+A(¬C)となります。E=1の場合も同じですので、論理式は[B(¬C)(¬D)+A(¬C)](¬E+E)=B(¬C)(¬D)+A(¬C)となります。
次は変数が6つの場合です。
F=0の場合、A(¬C)(¬D)(¬F)、F=1の場合はA(¬C)(¬D)FとA(¬B)CFとなりますので、論理式はA(¬C)(¬D)(¬F)+A(¬C)(¬D)F+A(¬B)CF=A(¬C)(¬D)(¬F+F)+A(¬B)CF=A(¬C)(¬D)+A(¬B)CFとなります。
それでは、カルノー図を使って全加算回路を設計してみましょう。初めに真理値表をSn(各桁の和)とCn(桁上り)のものに分離します。
Sn |
下位桁の桁上り
Cn-1 |
0 |
1 |
入力
AB |
00 |
0 |
1 |
01 |
1 |
0 |
11 |
0 |
1 |
10 |
1 |
0 |
Sn=¬A・B(¬Cn-1)+A(¬B)(¬Cn-1)+(¬A)(¬B)・Cn-1+A・B・Cn-1=(A⊕B)(¬Cn-1)+[(¬A)(¬B)+AB]Cn-1=*
(¬A)(¬B)+AB=(¬A)(¬B)+¬A・A+AB+¬B・B=(¬A+B)(A+¬B)=[¬{A(¬B)}][¬(¬A・B)]=¬[¬A・B+A(¬B)]=¬(A⊕B)
従って、*=(A⊕B)(¬Cn-1)+¬(A⊕B)Cn-1=(A⊕B)⊕Cn-1=A⊕B⊕Cn-1
上の計算は力づくで無理やり計算したという感じですが、上の表をよく眺めてみると、排他的論理和が使えることが分かります。枠の2進表示が00、10、01、11という順に並んでいると直ぐに気づくのですが、Cn-1が1の場合は¬(A⊕B)となっていて、Cn-1が0の場合は、A⊕Bとなっていますので、論理式は次のようになります。
Sn=¬(A⊕B)Cn-1+(A⊕B)(¬Cn-1)=(A⊕B)⊕Cn-1=A⊕B⊕Cn-1
次に桁上りについて分離します
Cn-1の値に関わりなく(A、B)=(1、1)のときに1がセットされています。それから、Cn-1=1のときA⊕Bとなっていますので、Cn=AB+(A⊕B)Cn-1となります。
3 順序回路
ここまで論理回路を組み合わせることで、「組み合わせ回路」を設計する方法について説明しましたが、ここでは順序回路の説明をしたいと思います。順序回路では、組み合わせ回路にはなかった「時間の要素」が加わります。
代表的な順序回路がフリップフロップ(flip-flop)です。フリップフロップは1ビットの情報を一時的に「0」または「1」に保持することができますの、レジスタやメインメモリ、キャッシュメモリなどの基本回路として利用することができます。フリップフロップで構成されたRAMはSRAMと呼ばれます。
3.1 RS-FF(リセットフリップフロップ)
フリップフロップにはRS-FF(リセットフリップフロップ)、T-FF(トグルフリップフロップ、JK-FF(JKフリップフロップ)、D-FF(ディレイフリップフロップ)など様々なものがありますが、ここではフィリップフロップの基本となるRS-FFについて考えてみましょう。
組み合わせ回路では設計に真理値表を作成しましたが、順序回路では出力を入力に戻しています(帰還ループ)ので、真理値表は作成できません。順序回路で役に立つのは状態遷移図や状態遷移表です。RS-FFでは、現状維持とリセット、セットができ、またある特定の入力は状態が不安定(1か0か定まらない)ので、禁止されています。
RS-FFの状態遷移表は次の通りです。
入力 |
現在の状態Q |
次の状態Qn |
|
S(Set) |
R(Reset) |
0 |
0 |
0 |
0 |
現状維持 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
リセット |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
セット |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
x |
禁止 |
1 |
1 |
1 |
x |
(S、R)=(0、0)の場合は、現在の状態Qが0なら、次の状態Qnも0、現在の状態が1なら、次の状態も1なので、1ビットが現状のまま維持されることになりますので、1ビットを記憶することができます。(S、R)=(0、1)の場合は、現在の状態が0か1に関わらず、次の状態は0になりますので、リセットになります。(S、R)=(1、0)の場合は、入力が0か1に関わらず、次の状態は1になりますので、セットとなります。RとSに同時に1を入力することは、互いに矛盾するため禁止されています。
上の論理式をカルノー図で簡略化します。
このカルノー図からQn=S+¬R・Qが成立することが分かります。もう一つ、R、Sがともに1の場合は入力を禁じられていますので、RS=0という条件が追加されます。
RS=0 ・・・・・・・・・・①
Qn=S+¬R・Q ・・・ ②
②にドモルガンの定理を適用すると、¬(Qn)=¬(S+¬R・Q)=¬(S+¬(R+¬Q))となります。これにより、NOR回路を使うと、RS-FFが設計できます。
これを更に変形すると、Qn=¬(¬(S+¬R・Q))=¬[(¬S)(¬(¬R)Q)]となりますので、NAND回路で構築することもできます。回路は次のようになります。入力のRとSが負論理になっているので注意してください。
更新履歴
2016/11/30 作成 |