目次
・1. 前回まで
・2. 作成した回路
・3. And4,Or4Way,Not4,Mux4作成
・4. 2の補数(どうやって負の数を表現するか)
・5. HalfAdder,FullAdder,Add14作成
・6. ALU作成
・7. 今後
1. 前回まで
↓前回書いた記事
NANDで自作CPUを作成する①
前回は基本的な回路を作成しました。
また、今回は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に変えたので作りました。前回の記事で作成した回路とほぼ同じなのではしょります。
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]);
}
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);
}
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]);
}
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になります。
[回路図]
[配線図]
・FullAdder
2^1,2^2,2^3の位の計算を行えます。入力はIN1とIN2とCarryの各1bitです。出力はCarryとSumになります。
例えばIN=1, IN2=1, Carry=1の時Carry=1, Sum=1になります。
[回路図]
[配線図]
・Add4
4bitどうしの足し算が行えます。
[回路図]
[配線図]
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 |
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 |
計算ができてやっとCPUに近づいた気がしました。疲れましたw
7. 今後
つぎはメモリ、クロック、リセット回路を作っていこうかと思います。