🐈
基本論理回路から加算器を作る
奥深きノイマン型アーキテクチャ
#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