すべてがNANDになる

公開:2020/10/28
更新:2020/10/28
4 min読了の目安(約3700字TECH技術記事

MHRD買ったけどいきなりつんだ..

これじゃ、ULX3SもTinyFPGA BXもつんどくしかない..

Verilog HDLとか無理ぽ..

なんてことにならないように、ちょっと道案内できればな、と筆を持つ次第。

『すべてがNANDになる - The Perfect Insider』

The Nand Gameも、MHRDも、Digital Logic Design (The Game)も、すべてNANDからはじまります。The Nand Gameなんて、そのまま、ザNANDゲームですしね。

なんでNAND? (韻を踏んでいる)

そもそもNANDて?

NANDとは

NANDとは、NOT ANDなだけ。

Pythonなら

out = not (A and B)

だし、Javascriptなら

out = !(A && B)

なだけ。

なぜ、あの3つのゲーム The Nand GameMHRDDigital Logic Design (The Game) が、NANDからはじまるかというと、すべての論理回路はNANDから作り出せる、から。「NANDからテトリスへ」って聞いたことありません? NANDがあれば、テトリスを作れる、と。

そして、物理世界の論理回路では、NANDを使うのが効率がいいから (小さくて、速い)。

以上、2つの理由により、NAND。すべてがNANDになる。

そしてFPGAも.. というと、実はあんまり直接関係ない。でも、楽しいので続ける。

確認

Pythonで確認。

def nand(a, b):
    return not (a and b)


print(nand(False, False)) # True
print(nand(True, False))  # True
print(nand(False, True))  # True
print(nand(True, True))   # False

表にすると (NAND Truth Table)

記号で描くと

第一歩 NOT

あの3つのゲーム、第一歩はNOTを作るところから。

すべての論理回路はNANDから作り出せるということは、NOTもNANDで作れると。ゲームによってはInvertと言ってますが。

念のため、PythonでNOTの確認。

print(not True)   # False
print(not False)  # True

NOTをNANDで作る。

NANDの表から、NOTに必要なところを見ると、いうまでもなく以下の囲ったところ2箇所。AとBが同じ値のときがNOTとまったく同じ。

つまり、NANDの入力2つに、同じものをつなげたものに入れ替えられる。

NANDによるNOTの完成である。

NANDでAND (韻)

PythonでAND。

print(False and False) # False
print(True and False)  # False
print(False and True)  # False
print(True and True)   # True

ANDの記号と表。

ところで、NOT二回つなげたらどうなりましたっけ。みんな大好きでないわけがない二重否定。

print(not not (False and False)) # False
print(not not (True and False))  # False
print(not not (False and True))  # False
print(not not (True and True))   # True

変化なし。NOT二回ないのとまったく同じ。

print(False and False) # False
print(True and False)  # False
print(False and True)  # False
print(True and True)   # True

記号で描くと

これは、ANDとまったく同じ。

そういえば、この囲ったところ、見覚えがありません?

NOT ANDですよね。つまりNAND。

NOTもNANDで描けます。これがANDの最終形態。

Pythonで答え合わせ。

def nand(a, b):
    return not (a and b)


print(not nand(False, False)) # False
print(not nand(True, False))  # False
print(not nand(False, True))  # False
print(not nand(True, True))   # True

あってる!

すべてがNANDになる

NOTもANDもNANDになりました。すべてがNANDになります。

ホントに?