Python3
論理回路
デジタルコンピューティング

Pythonでコンピュータを作る#5 -NANDは全ての論理ゲート-

More than 1 year has passed since last update.

暑くて半分溶けている大学生のMotmuuです.

これまでパーセプトロンというアルゴリズムを用いて論理ゲートを実装してきました.

はい??っと思った方はこちらからご覧ください

・#1 アルゴリズムとは

・#2 パーセプトロンとは

・#3 単純な論理回路

・#4 XORゲート

今日は,NANDゲートを用いて他の論理ゲートを作ってみよう!というちょっとしたコーヒーブレイクです笑


開発環境

以下の環境で勉強していきたいと思います.

・Python 3.6.5

・Mac OS X 10.13.2

・Atom 1.10.2

サンプルコードはこちら


ANDゲート

NANDゲートはANDゲートの反対のイメージですね.

真理値表を比較すると以下のようになります

x1
x2
AND
NAND

0
0
0
1

0
1
0
1

1
0
0
1

1
1
1
0

ではNANDの否定をとれば,ANDになりますね

では否定しましょう! ...そういえばNOTゲート忘れていましたね.

では否定を取るNOTゲートをPythonで実装しましょう


NOTゲート

NOTゲートはその通り否定です.1入力1出力で1が入力されれば0が0が入力されれば1を出力します.

あーいえばこういう,ちょっと嫌なやつですね.

これをNANDゲートを用いて再現します.

コードは以下の通りです.

gates/NOT.py

#インポート
fromt gates import NAND

# NOTをクラスとして作成
class NOT():
def __new__(self,a):
return NAND.NAND(a,a) #今回はNOTゲートをNANDゲートを用いて実装しました.

# 実際に真理値表のようになるか確かめてみる

print(NOT(0))
print(NOT(1))

Terminalでの実行けかは以下のようになりました.

*********$ python NOT.py

1
0

友達にはなりたくないですが,このNOTゲートはとてもやくにたちます!

それでは気を取り直してANDゲートを実装していきましょう


気を取り直してANDゲート

Pythonでのコードは以下のようになります.

play.py

# 論理ゲートをインポート
from gates import AND
from gates import NAND
from gates import OR
from gates import NOR
from gates import XOR
from gates import NOT

# ANDゲート
print(NOT.NOT(NAND.NAND(0,0)))
print(NOT.NOT(NAND.NAND(0,1)))
print(NOT.NOT(NAND.NAND(1,0)))
print(NOT.NOT(NAND.NAND(1,1)))

出力は以下のようになります.

********$ python play.py

0
0
0
1

実装できました.同様にORゲート,XORゲートも実装していきましょう


ORゲート

真理値表は以下のようになります.

x1
x2
NAND
OR

0
0
1
0

0
1
1
1

1
0
1
1

1
1
0
1

じっくり見てみると,ORとNANDはなんとなく近い気がします.くるっと反転できればいいなって感じですね.

ではx1とx2の入力を反転させてからNANDをとったらどうでしょうか.

x1
x2
NOT x1
NOT x2
NAND
OR

0
0
1
1
0
0

0
1
1
0
1
1

1
0
0
1
1
1

1
1
0
0
1
1

見事に一致しました.

ではPythonで実装しましょう.

play.py

# 論理ゲートをインポート
from gates import AND
from gates import NAND
from gates import OR
from gates import NOR
from gates import XOR
from gates import NOT

#ORゲート
print(NAND.NAND(NOT.NOT(0),NOT.NOT(0))) #(0,0)
print(NAND.NAND(NOT.NOT(0),NOT.NOT(1))) #(0,1)
print(NAND.NAND(NOT.NOT(1),NOT.NOT(0))) #(1,0)
print(NAND.NAND(NOT.NOT(1),NOT.NOT(1))) #(1,1)

出力です.

********$ python play.py

0
1
1
1

できましたね.

これを否定することで,NORゲートも実装できますね.


XORゲート

前回やったようにXORゲートはNANDゲート,ORゲート,ANDゲートで表せました.

すなわち同様にすれば,NANDゲートで表せることができるはずです.

play.py

# 論理ゲートをインポート
from gates import AND
from gates import NAND
from gates import OR
from gates import NOR
from gates import XOR
from gates import NOT

#XORゲート
print(NOT.NOT(NAND.NAND(NAND.NAND(0,0),NAND.NAND(NOT.NOT(0),NOT.NOT(0))))) #(0,0)
print(NOT.NOT(NAND.NAND(NAND.NAND(0,1),NAND.NAND(NOT.NOT(0),NOT.NOT(1))))) #(0,1)
print(NOT.NOT(NAND.NAND(NAND.NAND(1,0),NAND.NAND(NOT.NOT(1),NOT.NOT(0))))) #(1,0)
print(NOT.NOT(NAND.NAND(NAND.NAND(1,1),NAND.NAND(NOT.NOT(1),NOT.NOT(1))))) #(1,1)

出力です.

********$ python play.py

0
1
1
0

なんだかごちゃごちゃしていますができましたね.


なんでNAND??

最後のXORといい全てNAND表せることはわかりましが,ごちゃごちゃしていて必要性をあまり感じないかもしれません.でも全てNANDで表せるということはNANDさえ作れればいいということになります.

これは,ハード面で実際にコンピュータを作るときに非常に便利です.NANDだけ作れば他の論理回路が作れるのですから.


まとめ

全ての論理回路はNANDゲートで表せることがわかりました.

次からはマイクロプロセッサ内での記憶装置,演算装置を論理回路で再現して行きます!

次はこちら -> #6 記憶装置