ソフトウェア基礎技術研修

算術論理演算ユニットの設計
(教科書4.5節)
Created by Tsuneo Nakanishi, 2002-2004
算術論理演算ユニットALU(1)
一般的なコンピュータの内部構造
算術演算や論理演算
を実行する.
デコーダ
アドレスバス
PC
レジスタ
ALU
データバス
主記憶
・
・
・
Created by Tsuneo Nakanishi, 2002-2004
算術論理演算ユニットALU(2)
算術論理演算ユニット(ALU: Arithmetic Logic Unit)
 算術演算命令の処理
 加算命令
 減算命令
 比較命令
 論理演算命令の処理
 AND命令
 OR命令
 XOR命令(今回は省略)
 シフト命令の処理(今回は省略)
 基本部品: インバータ,AND/ORゲート,マルチプレクサ
Created by Tsuneo Nakanishi, 2002-2004
AND回路の設計
AND演算(&): オペランドのビットごとに AND をとる.
1
1
0
1
1
1
1
0
0
1
0
1
1
0
0
0
1
0
1
0
0
0
0
0
a
y
b
1ビットのAND回路
Created by Tsuneo Nakanishi, 2002-2004
OR回路の設計
OR演算(|): オペランドのビットごとに OR をとる.
1
1
0
1
1
1
1
0
0
1
0
1
1
0
0
0
1
1
1
1
1
1
1
0
a
y
b
1ビットのOR回路
Created by Tsuneo Nakanishi, 2002-2004
加算回路の設計(1)
1ビットの加算回路
1
0
+)
0
出力:上位桁桁上げ 1
1
1
0
0
1
1
1
1
0
1
1
0
1
0
0
1
0
1
1
0
0
1 0
0 1
1 1
入力:下位桁桁上げ
(cin)
入力:足される数(a)
入力:足される数(b)
(cout)
出力:和(y)
a
b
cout
1bit
加算器
y
cin
Created by Tsuneo Nakanishi, 2002-2004
加算回路の設計(2)
1ビットの加算回路を使った32ビット加算器
a31
b31
cout
+
y31
cin
・
・
・
a1
b1
cout
+
y1
cin
a0
b0
cout
+
y0
0
Created by Tsuneo Nakanishi, 2002-2004
加算回路の設計(3)
真理値表
a
b
cin
y
cout
0
0
0
0
0
0
1
0
1
0
1
0
0
1
0
1
1
0
0
1
0
0
1
1
0
0
1
1
0
1
1
0
1
0
1
1
1
1
1
1
Created by Tsuneo Nakanishi, 2002-2004
加算回路の設計(4)
a
b
cin
y
演習問題①: この論理回路を簡単化せよ.(復習)
Created by Tsuneo Nakanishi, 2002-2004
加算回路の設計(5)
a
b
cin
cout
演習問題②: この論理回路を簡単化せよ.(復習)
Created by Tsuneo Nakanishi, 2002-2004
加算/AND/OR対応 1bit ALU
a
b
cout
+
00
01
10
11
y
cin
操作
2
Created by Tsuneo Nakanishi, 2002-2004
加算/AND/OR対応 32bit ALU
cout
a31
b31
+/AND/OR
対応
1bit ALU
y31
cin
・
・
・
cout
a1
b1
+/AND/OR
対応
1bit ALU
y1
cin cout
a0
b0
操作
+/AND/OR
対応
1bit ALU
y0
cin
2
0
Created by Tsuneo Nakanishi, 2002-2004
減算回路の設計(1)
減算(b を引く)=負数の加算(–b を足す)
2の補数表現をした場合,符号を気にすることなく,符号なし整数
の加算とまったく同じ方法で減算できる.
キャリー 1 1
0
+)
1
0
1
1
1 1 0 0
1 1 0 0
1 0 0 1
1
1 1 0
0 1 1
0 0 1
102(10)
–29(10)
73(10)
Created by Tsuneo Nakanishi, 2002-2004
減算回路の設計(2)
2の補数表現による負数のビット表現の簡単な求め方:
① 2進数の 0 と 1 を反転する.
0000 0000 0000 0101
→
1111 1111 1111 1010
② ①で得られた2進数をひとつカウントアップする.
1111 1111 1111 1010
→
1111 1111 1111 1011
a – b を求めるには:
① b の 0 と 1 を反転する.
② a と①の結果を加算する.
③ ②の結果に 1 を加算する.
Created by Tsuneo Nakanishi, 2002-2004
減算回路の設計(3)
cout
a31
b31
+/AND/OR
対応
1bit ALU
0
1
cin
反転=0 のとき b をそ
のまま出力,反転=1
のとき反転出力.
a1
b1
・
・
・
cout
+/AND/OR
対応
1bit ALU
0
1
+/AND/OR
対応
1bit ALU
0
1
操作
反転
y1
cin cout
a0
b0
y31
cin
2
cyin
y0
加算のときキャリーイ
ン=0,減算のときキャ
リーイン=1とする.
Created by Tsuneo Nakanishi, 2002-2004
加減算/AND/OR対応 1bit ALU
a
b
cout
0
1
+
00
01
10
11
y
cin
反転
操作
2
Created by Tsuneo Nakanishi, 2002-2004
オーバーフロー(1)
オーバーフロー: 算術演算の結果がレジスタに格納可能な範囲の
数を超えること.
4bit 加算の場合:
① 正(0000~0111) + 正(0000~0111) → 0000~1110
(0~7) + (0~7) で結果は 0 ~ 14.オーバーフローの可能性あり.
結果が 1000(8)~1110(14) のとき(=負のとき),オーバーフロー.
② 正(0000~0111) + 負(1000~1111) → 1000~0110
(0~7) + (–8~–1) で結果は –8~6.オーバーフローはない.
③ 負(1000~1111) + 正(0000~0111) → 1000~0110
(–8~–1) + (0~7) で結果は –8~6.オーバーフローはない.
④ 負(1000~1111) + 負(1000~1111) → 0000~1110
(–8~–1) + (–8~–1) で結果は –16~–2.オーバーフローの可能性あり.
結果が 0000~0111 のとき(=正のとき),オーバーフロー.
Created by Tsuneo Nakanishi, 2002-2004
オーバーフロー(2)
4bit 減算の場合:
⑤ 正(0000~0111) – 正(0000~0111)
正(0000~0111) + 負(1000~1111) と同じ.オーバーフローなし.
⑥ 正(0000~0111) – 負(1000~1111)
正(0000~0111) + 正(0000~0111) と同じ.
結果が負のとき,オーバーフロー.
⑦ 負(1000~1111) – 正(0000~0111)
負(1000~1111) + 負(1000~1111) と同じ.
結果が正のとき,オーバーフロー.
⑧ 負(1000~1111) – 負(1000~1111)
負(1000~1111) + 正(0000~0111) と同じ.オーバーフローなし.
Created by Tsuneo Nakanishi, 2002-2004
オーバーフロー(3)
a31’
a31
b31
0
1
b31’
cout
+/AND/OR
対応
1bit ALU
cin
・
・
・
cout
a1
b1
+/AND/OR
対応
1bit ALU
0
1
+/AND/OR
対応
1bit ALU
0
1
操作
反転
オーバーフローはここ
で検査できる.
y1
cin cout
a0
b0
y31
y0
cin
2
cyin
Created by Tsuneo Nakanishi, 2002-2004
オーバーフロー(4)
a31’
b31’
cin
y31
cout
備考
0
0
0
0
0
①正+正=正/⑤正ー負=正
0
0
1
1
0
①正+正=負/⑤正ー負=負
0
1
0
1
0
②正+負=負/⑥正ー正=負
0
1
1
0
1
②正+負=正/⑥正ー正=正
1
0
0
1
0
③負+正=負/⑦負ー負=負
1
0
1
0
1
③負+正=正/⑦負ー負=正
1
1
0
0
1
④負+負=正/⑧負ー正=正
1
1
1
1
1
④負+負=負/⑧負ー正=負
cin  cout ならばオーバーフロー
Created by Tsuneo Nakanishi, 2002-2004
オーバーフロー(5)
a31’
a31
b31
0
1
b31’
ovf
cout
+/AND/OR
対応
1bit ALU
y31
cin
cout
a1
b1
+/AND/OR
対応
1bit ALU
0
1
cin cout
a0
+/AND/OR
対応
1bit ALU
0
b0
1
操作
反転
y1
y0
cin
2
cyin
Created by Tsuneo Nakanishi, 2002-2004
最上位ビット専用 1bit ALU
a
b
0
1
+
00
01
10
11
y
cin
反転
操作
yout
2
ovf
Created by Tsuneo Nakanishi, 2002-2004
slt 回路の設計(1)
a31’
a31
b31
0
1
b31’
+/AND/OR対応
1bit ALU
(最上位用)
cin
・
・
・
cout
a1
b1
+/AND/OR
対応
1bit ALU
0
1
+/AND/OR
対応
1bit ALU
0
1
操作
反転
a < b ⇔ a – b < 0.
ゆえに a – b の結果
の符号から,a < b が
検査できる.
y1
cin cout
a0
b0
ovf
y31
yout
y0
cin
2
cyin
Created by Tsuneo Nakanishi, 2002-2004
slt 回路の設計(2)
a31’
b31’
cin
0
0
0
0
0
⑤正ー負=正
0
0
1
1
0
⑤正ー負=負
0
1
0
1
0
⑥正ー正=負(a < b)
0
1
1
0
1
⑥正ー正=正
1
0
0
1
0
⑦負ー負=負(a < b)
1
0
1
0
1
⑦負ー負=正
1
1
0
0
1
⑧負ー正=正(a < b)
1
1
1
1
1
⑧負ー正=負(a < b)
yout cout
備考
オーバーフローが生じなくて(ovf=0),結果が負(y31=1) → a < b(sltf = 1)
オーバーフローが生じて(ovf =1),結果が正(y31=0) → a < b(sltf = 0)
Created by Tsuneo Nakanishi, 2002-2004
slt 回路の設計(3)
a31
b31
0
1
b31’
sltf
ovf
a31’
+/AND/OR対応
1bit ALU
(最上位用)
yout
y31
cin
cout
a1
b1
+/AND/OR
対応
1bit ALU
0
1
cin cout
a0
+/AND/OR
対応
1bit ALU
0
b0
1
操作
反転
y1
y0
cin
2
cyin
Created by Tsuneo Nakanishi, 2002-2004
完全版最上位ビット専用 1bit ALU
a
b
0
1
+
00
01
10
11
y
cin
slt
反転
操作
sltf
2
ovf
Created by Tsuneo Nakanishi, 2002-2004
完全版一般用 1bit ALU
a
b
cout
0
1
+
00
01
10
11
y
cin
slt
反転
操作
2
Created by Tsuneo Nakanishi, 2002-2004
完全版 32bit ALU(1)
sltf
a31
b
slt=0 31
完成版
最上位ビット専用
1bit ALU
y31
命令 反転 操作 cyin
cin
・
・
・
cout
a1
b
slt=0 1
完成版
一般ビット用
1bit ALU
y1
cin cout
a0
完成版
一般ビット用
1bit ALU
b0
反転
操作
cyin
ovf
AND
0
00
*
OR
0
01
*
+
0
10
0
ー
1
10
1
slt
1
10
1
y0
cin
2
Created by Tsuneo Nakanishi, 2002-2004
完全版 32bit ALU(2)
sltf
a31
b
slt=0 31
完成版
最上位ビット専用
1bit ALU
y31
命令 反転 操作 cyin
cin
・
・
・
cout
a1
b
slt=0 1
完成版
一般ビット用
1bit ALU
y1
cin cout
a0
完成版
一般ビット用
1bit ALU
b0
操作
反転
ovf
AND
0
00
*
OR
0
01
*
+
0
10
0
ー
1
10
1
slt
1
10
1
y0
cin
2
Created by Tsuneo Nakanishi, 2002-2004
完全版 32bit ALU(3)
sltf
a31
b
slt=0 31
完成版
最上位ビット専用
1bit ALU
y31
cin
・
・
・
cout
a1
b
slt=0 1
完成版
一般ビット用
1bit ALU
y1
cin cout
a0
完成版
一般ビット用
1bit ALU
b0
2
ALU制御
cin
y0
ovf
命令
ALU制御
AND
000
OR
001
+
010
ー
110
slt
111
結果が 0 のときに
1.減算の結果に
適用して,等不等
の検査ができる.
3
Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(1)
順次桁上げ加算器(Ripple Carry Adder)
a31
b31
cout
cin
c31
+
y31
ビット数に比例して
遅延が大きくなる.
・
・
・
a1
b1
cout
cin
a0
b0
c1
+
y1
cout
c0
+
y0
Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(2)
真理値表
a0
b0
c0
y
c1
0
0
0
0
0
0
1
0
1
0
1
0
0
1
0
1
1
0
0
1
0
0
1
1
0
0
1
1
0
1
1
0
1
0
1
1
1
1
1
1
c1 = a0・c0 + b0・c0 + a0・b0 = (a0 + b0)・c0 + a0・b0
Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(3)
32個の各加算器の回路は同じであるので,
c1 = a0・c0 + b0・c0 + a0・b0 = (a0 + b0)・c0 + a0・b0
c2 = a1・c1 + b1・c1 + a1・b1 = (a1 + b1)・c1 + a1・b1
…
c31 = a31・c31 + b31・c31 + a31・b31 = (a31 + b31)・c31 + a31・b31
c2 の右辺の c1,c3 の右辺の c2,…を順次置換すると,
c2 = ((a0 + b0)・c0 + a0・b0)・(a1 + b1) + a1・b1
 c1 がわからなくても,c0 から c2 が求められる.
c3 = (((a0 + b0)・c1 + a0・b0)・(a1 + b1) + a1・b1)・(a2 + b2) + a2・b2
 c2 がわからなくても,c0 から c3 が求められる.
…
ビット数が増えるほど,指数関数的に式が長くなる(=回路が大きくなる).
Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(4)
gi = ai・bi,pi = ai + bi とすると,
c1 = g0 + p0・c0
c2 = g1 + p1・g0 + p1・p0・c0
c3 = g2 + p2・g1 + p2・p1・g0 + p2・p1・p0・c0
c4 = g3 + p3・g2 + p3・p2・g1 + p3・p2・p1・g0 + p3・p2・p1・p0・c0
4bit 桁上げ先見加算器(Carry Look Ahead Adder)
a3~a0
4
b3~b0
4
c0
4bit
桁上げ先見
加算器
c4
4
y3~y0
Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(5)
4bit 桁上げ先見加算器(Carry Look Ahead Adder)
a3
b3
a2
b2
a1
b1
a0
b0
c0
c3
c1
c1
+
y3
c4
g3
p3
+
g2
p2
+
g1
p1
+
g0
p0
桁
上
げ
先
見
ユ
ニ
ッ
ト
y2
y1
y0
Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(6)
32bit 加算器
a31~a28
b31~b28
4
4
4bit
桁上げ先見
加算器
4
y31~y28
c28
まだ長い!
・
・
・
a7~a4
b7~b4
4
4
4bit
桁上げ先見
加算器
4
y7~y4
4
4
4bit
桁上げ先見
加算器
4
y3~y0
c4
a3~a0
b3~b0
c0
Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(7)
8個の各4bit桁上げ先見加算器の回路は同じであるので,
c4 = g3 + p3・g2 + p3・p2・g1 + p3・p2・p1・g0 + p3・p2・p1・p0・c0
c8 = g7 + p7・g6 + p7・p6・g5 + p7・p6・p5・g4 + p7・p6・p5・p4・c4
…
c32 = g31 + p31・g30 + p31・p30・g29 + p31・p30・p29・g28 + p31・p30・p29・p28・c28
P0 = p3・p2・p1・p0,P1 = p7・p6・p5・p4,…,G0 = g3 + p3・g2 + p3・p2・g1 + p3・
p2・p1・g0, G1 = g7 + p7・g6 + p7・p6・g5 + p7・p6・p5・g4,…として,c8 の右辺の
c4,c12 の右辺の c8,…を順次置換すると,
c4 = G0 + P0・c0
c8 = G1 + P1・G0 + P1・P0・c0
c12 = G2 + P2・G1 + P2・P1・G0 + P2・P1・P0・c0
…
Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(8)
32bit 桁上げ先見加算器(Carry Look Ahead Adder)
a31~a28
b31~b28
4
4
+
4
G7
P7
y31~y28
c32
c28
・
・
・
c8
a7~a4
b7~b4
4
4
+
G1
P1
+
G0
P0
c4
a3~a0
b3~b0
c0
4
4
桁
上
げ
先
見
ユ
ニ
ッ
ト
4
y7~y4
4
y3~y0
Created by Tsuneo Nakanishi, 2002-2004