NANDからマルチプレクサ 制御フローを作る 【コンピューターアーキテクチャ】

👀 概要

論理回路とは、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入力のゲートである。

  • 入力二つはa,bはデータセットと解釈でき、その名前の通りデータが入る。
  • 三つ目の入力selは選択ビットと解釈でき、 aとbのどちらかを出力するかをselでコントロールできる。

プログラミング言語で表現すると、以下の通り

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
    • 感覚的な説明 :
  • 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回実行しているような感覚してしているような感覚。
  • 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

Dear My Frends.: 個人開発宣伝ラボ - 個人開発者が間違った施策で時間を溶かさないための、心理学と実務知見のナレッジ共有コミュニティ