NANDで自作CPUを作成する②(ALU編)

## 目次
・1. 前回まで
・2. 作成した回路
・3. And4,Or4Way,Not4,Mux4作成
・4. 2の補数(どうやって負の数を表現するか)
・5. HalfAdder,FullAdder,Add14作成
・6. ALU作成
・7. 今後

## 1. 前回まで
↓前回書いた記事
[NANDで自作CPUを作成する①](https://qiita.com/Mihael/items/89e3c9c25fb8c0167137)

前回は基本的な回路を作成しました。
また、今回はCircuit Simulator Appletというツールを使って配線しました。
かっこいいのでお勧めです！

また、16bitCPUを目指してたのですが道のりが長いので4bitにしました
まずは小さく完成させることが大切ですよね！(真顔と言い訳)

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

いつかこんな風にマイクラで作ってみたい~
https://www.youtube.com/watch?v=cC-jGwcfV6U

## 2. 作成した回路
・And4
・Or4Way
・Not4
・Mux4
・HalfAdder
・FullAdder
・Add4
・ALU  (←今回のラスボス)

## 3. And4,Or4Way,Not4,Mux4作成
16bitから4bitに変えたので作りました。前回の記事で作成した回路とほぼ同じなのではしょります。
```hack:And4.hdl
CHIP And4 {
    IN a[4], b[4];
    OUT out[4];

    PARTS:
    // Put your code here:
    And(a=a[0], b=b[0], out=out[0]);
    And(a=a[1], b=b[1], out=out[1]);
    And(a=a[2], b=b[2], out=out[2]);
    And(a=a[3], b=b[3], out=out[3]);
}
```
```hack:Or4Way.hdl
CHIP Or4Way {
    IN in[4];
    OUT out;

    PARTS:
    // Put your code here:
    Or(a=in[0], b=in[1], out=c1);
    Or(a=in[2], b=in[3], out=c2);
    Or(a=c1, b=c2, out=out);
}
```
```hack:Not4.hdl
CHIP Not4 {
    IN in[4];
    OUT out[4];

    PARTS:
    // Put your code here:
    Nand(a=in[0], b=in[0], out=out[0]);
    Nand(a=in[1], b=in[1], out=out[1]);
    Nand(a=in[2], b=in[2], out=out[2]);
    Nand(a=in[3], b=in[3], out=out[3]);
}
```
```hack:Mux4.hdl
CHIP Mux4 {
    IN a[4], b[4], sel;
    OUT out[4];

    PARTS:
    // Put your code here:
    Mux(a=a[0], b=b[0], sel=sel, out=out[0]);
    Mux(a=a[1], b=b[1], sel=sel, out=out[1]);
    Mux(a=a[2], b=b[2], sel=sel, out=out[2]);
    Mux(a=a[3], b=b[3], sel=sel, out=out[3]);
}
```
## 4. 2の補数(どうやって負の数を表現するか)
どうやって負の数を表現するか。。。

まず、4bitCPUをつくるので4bitの取りえる値は2^4=16種類。
10進数だと0~15ですね。

このうち半分を負の値、もう半分を正の値としたら便利そうなので、下記の範囲で4bitの値をとるように決めます。
-8 <= x <= 7 

この時、-x = !x + 1と定義すると負の値を2進数で"上手く"扱えるようになります。
(!xはビット反転の記号でx=0001の時!x=1110になります)
これが2の補数というやつです。

例えば-2を表現すると、
2 -(2進数)-> 0010 -(ビット反転)-> 1101 -(+1)-> 1110

4bitでの-8 ~ 7の値の表はこんな感じになります。
| 10進数(正) | 2進数(正) | 2進数(負) | 10進数(負) |
|:-:|:-:|:-:|:-:|
| 0 | 0000  |   |   |
| 1  | 0001  | 1111  |  -1 |
| 2  |  0010 | 1110  |  -2 |
| 3  |   0011|  1101 | -3  |
| 4  |0100 | 1100  |  -4 |
| 5  | 0101  | 1011  |  -5 |
| 6  | 0110  | 1010  |  -6 |
| 7  | 0111  |  1001 |  -7 |
|   |   |  1000 | -8  |
## 5. HalfAdder,FullAdder,Add4作成
Add4を作成するためにHalfAdderとFullAdderを作成していきます。

・HalfAdder
2^0の位の計算を行えます。入力はIN1とIN2の各1bitです。出力はCarry(繰り上げ)とSum(2^0の値)になります。
例えばIN1=1, IN2=1の時Carry=1, Sum=0になります。
[回路図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/b997d4f5-6806-684e-74f9-6bdd618e1e3b.png)
[配線図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/2de1025e-a4de-df6a-09b3-f350bc26b45c.png)

・FullAdder
2^1,2^2,2^3の位の計算を行えます。入力はIN1とIN2とCarryの各1bitです。出力はCarryとSumになります。
例えばIN=1, IN2=1, Carry=1の時Carry=1, Sum=1になります。
[回路図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/fc2634df-9e38-952c-ec13-3f975236c629.png)
[配線図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/625ef463-c756-f8b9-6348-8847949139eb.png)

・Add4
4bitどうしの足し算が行えます。
[回路図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/be8061ef-088d-752b-af41-ed97b3bfa6ec.png)
[配線図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/5b225392-7168-8057-a08d-6299351d6071.png)

## 6. ALU作成
今回のいただきALUです！！
今回作成するALUは入力がIN1, IN2の2つと制御ビットzx, nx, zy, ny, f, noの6つ、計8つになります。
出力はOUT, zr, ngの3つになります。

制御ビットが6つなので64種類の計算ができます。
これが64パターンの計算表です
| index | zx | nx | zy | ny | f | no | f(x,y) |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | x&y |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | !(x&y) |
| 2 | 0 | 0 | 0 | 0 | 1 | 0 | x+y |
| 3 | 0 | 0 | 0 | 0 | 1 | 1 | -x-y-1 |
| 4 | 0 | 0 | 0 | 1 | 0 | 0 | x&!y |
| 5 | 0 | 0 | 0 | 1 | 0 | 1 | !(x&!y) |
| 6 | 0 | 0 | 0 | 1 | 1 | 0 | x-y-1 |
| 7 | 0 | 0 | 0 | 1 | 1 | 1 | y-x |
| 8 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| 9 | 0 | 0 | 1 | 0 | 0 | 1 | -1 |
| 10 | 0 | 0 | 1 | 0 | 1 | 0 | x |
| 11 | 0 | 0 | 1 | 0 | 1 | 1 | !x |
| 12 | 0 | 0 | 1 | 1 | 0 | 0 | x |
| 13 | 0 | 0 | 1 | 1 | 0 | 1 | !x |
| 14 | 0 | 0 | 1 | 1 | 1 | 0 | x-1 |
| 15 | 0 | 0 | 1 | 1 | 1 | 1 | -x |
| 16 | 0 | 1 | 0 | 0 | 0 | 0 | !x&y |
| 17 | 0 | 1 | 0 | 0 | 0 | 1 | !(!x&y) |
| 18 | 0 | 1 | 0 | 0 | 1 | 0 | y-x-1 |
| 19 | 0 | 1 | 0 | 0 | 1 | 1 | x-y |
| 20 | 0 | 1 | 0 | 1 | 0 | 0 | !x&!y |
| 21 | 0 | 1 | 0 | 1 | 0 | 1 | x|y |
| 22 | 0 | 1 | 0 | 1 | 1 | 0 | -x-y-2 |
| 23 | 0 | 1 | 0 | 1 | 1 | 1 | x+y+1 |
| 24 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 25 | 0 | 1 | 1 | 0 | 0 | 1 | -1 |
| 26 | 0 | 1 | 1 | 0 | 1 | 0 | -x-1 |
| 27 | 0 | 1 | 1 | 0 | 1 | 1 | x |
| 28 | 0 | 1 | 1 | 1 | 0 | 0 | -x-1 |
| 29 | 0 | 1 | 1 | 1 | 0 | 1 | x |
| 30 | 0 | 1 | 1 | 1 | 1 | 0 | -x-2 |
| 31 | 0 | 1 | 1 | 1 | 1 | 1 | x+1 |
| 32 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 33 | 1 | 0 | 0 | 0 | 0 | 1 | -1 |
| 34 | 1 | 0 | 0 | 0 | 1 | 0 | y |
| 35 | 1 | 0 | 0 | 0 | 1 | 1 | -y-1 |
| 36 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
| 37 | 1 | 0 | 0 | 1 | 0 | 1 | -1 |
| 38 | 1 | 0 | 0 | 1 | 1 | 0 | !y |
| 39 | 1 | 0 | 0 | 1 | 1 | 1 | -y-1 |
| 40 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
| 41 | 1 | 0 | 1 | 0 | 0 | 1 | -1 |
| 42 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
| 43 | 1 | 0 | 1 | 0 | 1 | 1 | -1 |
| 44 | 1 | 0 | 1 | 1 | 0 | 0 | 0 |
| 45 | 1 | 0 | 1 | 1 | 0 | 1 | -1 |
| 46 | 1 | 0 | 1 | 1 | 1 | 0 | -1 |
| 47 | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
| 48 | 1 | 1 | 0 | 0 | 0 | 0 | y |
| 49 | 1 | 1 | 0 | 0 | 0 | 1 | !y |
| 50 | 1 | 1 | 0 | 0 | 1 | 0 | y-1 |
| 51 | 1 | 1 | 0 | 0 | 1 | 1 | -y |
| 52 | 1 | 1 | 0 | 1 | 0 | 0 | -y-1 |
| 53 | 1 | 1 | 0 | 1 | 0 | 1 | y |
| 54 | 1 | 1 | 0 | 1 | 1 | 0 | -y-2 |
| 55 | 1 | 1 | 0 | 1 | 1 | 1 | y+1 |
| 56 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 57 | 1 | 1 | 1 | 0 | 0 | 1 | -1 |
| 58 | 1 | 1 | 1 | 0 | 1 | 0 | -1 |
| 59 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |
| 60 | 1 | 1 | 1 | 1 | 0 | 0 | -1 |
| 61 | 1 | 1 | 1 | 1 | 0 | 1 | 0 |
| 62 | 1 | 1 | 1 | 1 | 1 | 0 | -2 |
| 63 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |

[回路図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/41bc89ef-84b1-32e5-9874-dd88228cfa6e.png)
[配線図]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297255/45016fee-7251-fb94-81a4-b37d815149ff.png)

計算ができてやっとCPUに近づいた気がしました。疲れましたw

## 7. 今後
つぎはメモリ、クロック、リセット回路を作っていこうかと思います。