NANDで自作CPUを作成する①

## 目次
・1. はじめに
・2. 作成した回路
・3. LEDを光らせてみる
・4. Not,And,Or,Xor作成
・5. And16,Not16,Or16作成
・6. Or8Way作成
・7. Mux,Mux16,Mux4Way16,Mux8Way16作成
・8. DMux,DMux4Way,DMux8Way作成
・9. 今後

## 1. はじめに
初心者がNANDで自作CPUを作成するまでの記録を書こうと思います。僕と同じような初心者に少しでも参考になったら幸いです。

・始めようと思ったきっかけ
ちぇりーさんという方の投稿を見て、ピカピカ光ってかっけぇなーと思って始めました。
それと純粋にプログラムが動く仕組みを低レイヤから知ってみたいという知的好奇心です。
https://twitter.com/cherry_takuan/status/1633289780581793793?s=20

・僕のTwitterで自作CPUをつくるまでをだらだら投稿してます。
@iGPj10g3JGjodFI

・狂気の沙汰だと思った回路。Mux8Way16(16bit8入力のマルチプレクサ)
6時間ぐらいかかった笑
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/e23a02ec-343d-5ba4-2781-08a734a73540.png)

・使用したツール
最初はSteamのCRUMBというアプリを使ってましたがTinkercadの方が早くできそうだったので変えました。

・参考にした本
CPUの創りかた
コンピュータシステムの理論と実装


初めて電子回路をいじったので配線が汚いのはすいません。(だんだん上手になっているつもり笑)
間違ってるところや、こうしたほうがいいよ！楽だよ！みたいなのがあったらコメントで教えて下さるととてもうれしいです。☺

## 2. 作成した回路
・Not
・And
・Or
・Xor
・And16
・Not16
・Or16
・Or8Way
・Mux
・Mux16
・Mux4Way16
・Mux8Way16
・DMux
・DMux4Way
・DMux8Way

## LEDを光らせてみる
・ブレッドボードの仕組み
この画像の同じ色の箇所で、既に配線してくれてるらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/5acea08d-59c1-75f2-0d98-07f9c0b3b922.png)

・とりあえずLEDと抵抗をつなげてみた。

1. 左の回路はLEDのさしている箇所が+と-が同じ電位になっているため光らない。
2. 真ん中の回路はLEDの+と-の接続する場所が逆のため光らない。曲がってる方を+側に接続する(抵抗はどっちでもいいらしい)
3. 正しい回路
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/baa6be88-6c5a-add7-4eff-3d4095e8c02c.png)

最初、左のパターンでやってて光らずに何時間も無駄にしました。。笑
ブレッドボードの使い方がおかしいのかなって調べても正しそうなので最終的にアプリのバグのせいにしてました笑(よくない癖ですね)

## 3. Not,And,Or,Xor作成
・Nand回路
まずNand回路を根底にこれから様々な回路、最終的にはCPUを作成していきます。

Nand回路の仕様
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/ec592882-dfc2-2666-6973-cd8cfab6fbf7.png)
入力がA,Bの2つで出力がOutの1つです。値が0の時が電流が流れてない状態(GNDの電位)で1の時が流れている状態になってます。
つまり、入力のA,Bがどちらも電流が流れているときOutが流れず、それ以外の3パターンの時はOutに流れます。

実際に配線してみるとこんな感じです。
[A,B=0] 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/6bb923df-47cd-af62-29b0-1b91388e515a.png)
[A,B=1] 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/31dde264-827b-c87c-ca84-426477073057.png)

AとBが0の時のみLEDが光ってませんね。

ここで赤いスイッチと、黒いゲジゲジみたいなやつを説明します

・赤いスイッチ
Onのとき電流が流れます。

・黒いゲジゲジ
こんな感じでNand回路が4つ入ってます。
74HC00とありますが、NandのICのことで同じようにAndは74HC08,Orは74HC32,Notは74HC04と表記されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/a30c9c21-24b7-cfe0-61be-c3c0123eb803.png)

## 3. Not,And,Or,Xor作成
Not,And,Or,Xorの真理値表は調べてください

・Notの作成
1つの入力値をNandの2つの入力ピンに接続することでNot回路を作ることができる。

[回路図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/a999f626-bd1b-6516-908b-22d040705e2e.png)
[配線図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/81926b26-12be-e511-0aa4-cbd7d8aa733d.png)

最初作ったときめちゃくちゃ感動しました。Nand回路を組み合わせることで別の機能を持つ回路を作ることができるんだ！！
おそらくこんな感じでAndやOrなどの回路をひとつづつ作っていってCPUまで完成させるんだと思います。(まだ完成してない)

・And
[回路図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/3cbb95f1-9ed2-1d8a-6a9b-ac7a4b015084.png)
[配線図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/f755de86-961a-b056-be0d-67ac868b0a88.png)

Not回路は作ったので実際の配線ではNot回路を直接使いました(全部Nand回路を使うのではなく)

・Or
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/9b7b8ffc-23e9-edce-6843-45d87aad1af2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/71b07e89-b32f-da5e-e3a3-cc3c810643ae.png)

・Xor
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/dbc549b1-db97-d7f7-e424-37c9fe0eee32.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/d90b9b41-dc7e-2e14-e6fb-3713484b2d74.png)

## 4. And16,Not16,Or16作成
今まで作成した回路は1bitに対応した回路でした。
普段僕たちが使っているパソコンは64bitだと思います。
今回作成するのは16bitに対応したCPUを作成しようと思ってるので、16bitのNot,And,Orを作成します。

・And16
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/974f0ea2-ba64-16b8-0600-545a5e9cdc70.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/4fe071e1-9dc6-147a-6e49-73ce933bc68b.png)
回路図は自分用に作ったのでかなりきもいですが笑、ただ先ほど作成した1bit対応のAndをビットごとに16個使ってるだけです。
配線図をみたらかなり複雑ですが、本当に各ビットに対してAndを使ってるだけです。同じようにNot16,Or16も作っていきます

・Not16
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/c0df58ae-a18e-e72d-84c2-086fe35d8cad.png)

・Or16
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/99390126-a3e2-bea7-0780-eaba3ba18ff8.png)

## 5. Or8Way作成
今まで1bit対応で入力が2つのOrと、16bit対応の入力が2つのOrを作成しました。
後々使いそうなので1bit対応の8つ入力のOrを作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/ea42e782-59bd-de7c-8298-08cc1de8fb00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/3ff21a92-cbeb-1619-6d7f-1d37b64a3283.png)

## 6. Mux,Mux16,Mux4Way16,Mux8Way16作成
次はマルチプレクサを作成していきます
マルチプレクサとは複数の入力に対して、制御ビット(ここではSELと表記)でどれか一つだけ出力させます。

例えば入力がIN1,IN2,SELの時SELが0の時、出力はIN1
SELが1の時、出力はIN2。になります

・Mux
[真理値表]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/b5d0e3e5-d018-bf88-7a05-6694a7920d1f.png)
[回路図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/5bea574e-064c-ab3e-65d6-a559923efb4e.png)
[配線図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/5ee37177-392f-7752-fa39-5640b809f52a.png)

・Mux16
And16と同じように16bitに対応したMuxを作成します。
同じように16個Muxを使用するだけです。　　が！！！TinkercadというツールはMux回路を準備してくれてないので
先ほど作成したMuxを1から16個作りました。。。。ここから地獄のはじまり。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/db07b69c-5032-c751-abcc-1b28a11b3276.png)

・Mux4Way16
入力が4つの16bitに対応したMuxを作成します。
入力が4つのため制御するビットは2bitになります。(2^2)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/0ba7d34f-e928-060c-0642-57a2e27282da.png)

・Mux8Way16
最後に入力が8つの16bitに対応したMuxを作成します。
入力が8つのため制御するビットは3bitになります。(2^3)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/bcbc7fa5-c0c4-f0e9-b845-c569ee7a2cb2.png)

朝から始めたのに気が付いたら日が暮れてました笑

## 7. DMux,DMux4Way,DMux8Way作成
マルチプレクサの逆のデマルチプレクサを作成します。
1つの入力に対して複数の出力をします。制御ビットで1つだけ入力値を出力するのですが残りは0を出力します。

例えば入力がIN1,SELの時SELが0の時、出力1はIN1,出力2は0
SELが1の時、出力1は0,出力2はIN1。になります

・DMux
[真理値表]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/48ab46a0-c751-f390-806e-3c42cf30cfaf.png)
[回路図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/8d6a7c65-18af-4622-3478-f3468a519ffe.png)
[配線図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/de1ad953-a7ea-e766-5880-a251d4760f6f.png)

・DMux4Way
1つの入力に対して4つの出力を行うDMuxを作成します。
4つの出力のため制御ビットは2ビットになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/1650c18e-1d3e-d9fc-2ffa-38239fc2d14b.png)

・DMux8Way
1つの入力に対して8つの出力を行うDMuxを作成します。
8つの出力のため制御ビットは3ビットになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/7fc96c13-5ed1-1481-1326-78dd3ca08c03.png)


## 8. 今後
つぎはALUっていうやつを作成していこうと思います。
Tinkercadでは限界があるので他のいいアプリを見つけて頑張ります。