🐈

基本論理回路から加算器を作る

2024/11/07に公開

奥深きノイマン型アーキテクチャ

#include <stdio.h>
プログラムを初めて触った時、おまじないだと言われるのはあるあるだろう。
しかし、このように思わなかっただろうか?
「いや、その後に書いてあることが動く理由もわからないが...??????」
自分には全部がおまじないに見えていた。やりたいことは書いてあるが、書いたことがどのように動いているのか、最終的にディスプレイに表示されるまでに一体何が起きているのか全くわからないじゃないか。
そんなあなたにコンピューターを動かしている技術の基礎の一端を解説できればと思う。

基本論理回路

論理回路の基本要素のAND回路とOR回路、NOT回路を解説する。
理論上、これらが表現できれば、どの環境であれコンピューターを構築することができる。(マイクラとかでやってる人もいるよね)

Not

仕様

回路名: Not
入力: in
出力: out
関数: if in=1 then out=0 else out=1

真理値表

in Not(in)
0 1
1 0

And

仕様

回路名: And
入力: a, b
出力: out
関数: if a=b=1 then out=1 else out=0

真理値表

a b And(a, b)
0 0 0
0 1 0
1 0 0
1 1 1

Or

仕様

回路名: Or
入力: a, b
出力: out
関数: if a=b=0 then out=0 else out=1

真理値表

a b Or(a, b)
0 0 0
0 1 1
1 0 1
1 1 1

トランジスタ

では、これらの回路をコンピューターではどのように実現しているのだろうか。
TODO
ここの解説はまた今度やる。トランジスタ万歳。

実装

では、加算器をAND/OR/NOTを仕様して実装する

半加算器

回路名: HalfAdder
入力: a, b
出力: carry, sum
関数: sum=a+bの最下位bit
     carry=a+bの最上位bit

真理値表

a b carry sum
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

回路図

全加算器

回路名: FullAdder
入力: a, b, c
出力: carry, sum
関数: sum=a+b+cの最下位bit
     carry=a+b+cの最上位bit

真理値表

a b c carry sum
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

回路図

加算器

回路名: Add[x]
入力: a[x], b[x]
出力: out[x], carry
関数: out=a+b

回路図

その他実装紹介

せっかくなので、その他よく使用する回路についても解説する

Nand

仕様

回路名: Nand
入力: a, b
出力: out
関数: if a=b=1 then out=0 else out=1

真理値表

a b Nand(a, b)
0 0 1
0 1 1
1 0 1
1 1 0

回路図

Xor

仕様

回路名: Xor
入力: a, b
出力: out
関数: if a=b then out=0 else out=1

真理値表

a b Xor(a, b)
0 0 0
0 1 1
1 0 1
1 1 0

回路図

マルチプレクサ

仕様

回路名: Mux
入力: a, b, sel
出力: out
関数: if sel=1 then out=a else out=b

真理値表

a b sel Mux(a, b, sel)
0 0 0 0
0 1 0 0
1 0 0 1
1 1 0 1
0 0 1 0
0 1 1 1
1 0 1 0
1 1 1 1

デマルチプレクサ

TODO

発展

算術ができるのはわかったが、それをどうやって保存しているのだろうか?
そこで出てくるのがフリップフロップだ!

フリップフロップ

TODO

以上!!!

Thanks

Discussion