2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

目次

・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に変えたので作りました。前回の記事で作成した回路とほぼ同じなのではしょります。

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]);
}
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);
}
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]);
}
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
[配線図]
image.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
[配線図]
image.png

・Add4
4bitどうしの足し算が行えます。
[回路図]
image.png
[配線図]
image.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
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
[配線図]
image.png

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

7. 今後

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?