👀 概要
論理回路とは、0 と 1 (あるいは、true,false) の組み合わせによって計算や判断を行う電子回路。 この論理回路を組み合わせて、コンピューターを作ることができる。 この記事は、その過程を理解する試みです。
参考 : https://web-docs.gsi.de/~vpenso/notes/posts/code/nand2tetris/#part-1 参考 : https://www.youtube.com/playlist?list=PLrDd_kMiAuNmllp9vuPqCuttC1XL9VyVh
📖 関連ページ
👦 対象読者
- とにかく低レイヤーが好きな人
- 「システム開発ですぐに役に立つことを知りたい」という方の需要は満たせません...。
🔗 参考リンク
💡 マルチプレクサとは
マルチプレクサは3入力のゲートである。
プログラミング言語で表現すると、以下の通り
if(sel == 0 ): return a else: return b
ラベルは MUX
NANDだけでif文を作れるか?
上記のマルチプレクサは、簡単にいえばif文さえ書ければ問題なく作成できる。
プログラムのif(if (cond) X else Y)を簡単に実装するとすれば、それは以下のようになる
OUT = (cond AND X) OR ((NOT cond) AND Y)
ここで、AND,OR,NOT ではなく、NANDのみで置き換えたい。
※ : NANDは、入力値の両方が1の場合のみ、0が出力される。
- NOTの実装 :
NOT A = A NAND A- A=0の時、
NOT 0 = 0 NAND 0 = 1 - A=1の時、
NOT 1 = 1 NAND 1 = 0 - 感覚的な説明 :
- A=0の時、
- ANDの実装 :
A AND B = (A NAND B) NAND (A NAND B)- A=0,B=0の時
0 AND 0 = (0 NAND 0) NAND (0 NAND 0) = (1) NAND (1) = 0 - A=1,B=0の時
1 AND 1 = (1 NAND 1) NAND (1 NAND 1) = (0) NAND (0) = 1 - A=1,B=0の時
1 AND 0 = (1 NAND 0) NAND (1 NAND 0) = (1) NAND (1) = 0 - A=0,B=1の時
0 AND 1 = (0 NAND 1) NAND (0 NAND 1) = (1) NAND (1) = 0 - -> 感覚的な説明 : 両方が1の場合のみNANDの結果が0になる。 それを2回実行しているため、 NANDを2回実行しているような感覚してしているような感覚。
- A=0,B=0の時
- ORの実装 :
A OR B = (A NAND A) NAND (B NAND B)- 証明
(A NAND A) NAND (B NAND B) = (NOT A) NAND (NOT B) = NOT((NOT A) AND (NOT B)) = NOT(NOT A) NOT(AND) (NOT(NOT B)) = A OR B - A=0,B=0の時
0 OR 0 = (0 NAND 0) NAND (0 NAND 0) = (1) NAND (1) = 0 - A=1,B=0の時
1 OR 0 = (1 NAND 0) NAND (1 NAND 0) = (0) NAND (0) = 1 - A=0,B=1の時
1 OR 0 = (1 NAND 0) NAND (1 NAND 0) = (0) NAND (0) = 1 - A=1,B=1の時
1 OR 1 = (1 NAND 1) NAND (1 NAND 1) = (0) NAND (0) = 1
- 証明
ここまでの
OUT = (cond AND X) OR ((NOT cond) AND Y) = ((cond NAND X) NAND (cond NAND X) OR ((cond NAND cond) AND Y)) = (((cond NAND X) NAND (cond NAND X)) OR (((cond NAND cond) AND Y) NAND ((cond NAND cond) NAND Y) )) = (((cond NAND X) NAND (cond NAND X)) NAND ((cond NAND X) NAND (cond NAND X))) NAND ((((cond NAND cond) AND Y) NAND ((cond NAND cond) NAND Y) ) NAND ((((cond NAND cond) AND Y) NAND ((cond NAND cond) NAND Y) )))
デマルチプレクサ
https://www.allaboutcircuits.com/textbook/digital/chpt-9/demultiplexers/
デマルチプレクサはマルチプレクサと逆のことを行う。
aとbの出力二つのうち、どちらに流すかをselで決めるのだ。
selが0の時、入力値IはD0に流れるし、1の時は入力値IはD1に流れる。
デマルチプレクサをNANDでかけるか?
結論... 書くことは可能。
D0及びD1は以下の式で書くことがかのう。
D0 = I AND (NOT A)D1 = I AND A
マルチプレクサ同様、ANDとNOTをNANDのみで表せれば
D0 = (I NAND (A NAND A)) NAND (I NAND (A NAND A))D1 = (I NAND A) NAND (I NAND A)
複数ビットの演算について
NANDの時と同様、今までの2bitの論理ゲートを、16bitの論理ゲートに拡張する。 しかしこれは何のことはない。
- 今までやっていた1回の演算を、16回やるだけだ。(答えも1個だったものが16個に増えるだけ。)
- あるいは、流れるデータが1bitだけだったものが、16bitになるだけ。流れる向きのコントロールする方法もなにも変わらない。
page:https://minegishirei.hatenablog.com/entry/2025/10/11/145533