380 likes | 608 Views
算術論理演算ユニットの設計. ( 教科書 4.5 節 ). 算術論理演算ユニット ALU (1). 一般的なコンピュータの内部構造. 算術演算や論理演算を実行する.. デコーダ. PC. アドレスバス. レジスタ. ALU. データバス. 主記憶. ・・・. 算術論理演算ユニット ALU (2). 算術論理演算ユニット( ALU: Arithmetic Logic Unit ). 算術演算命令 の処理 加算命令 減算命令 比較命令 論理演算命令の処理 AND 命令 OR 命令 XOR 命令(今回は省略) シフト命令の処理(今回は省略)
E N D
算術論理演算ユニットの設計 (教科書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 0 1 1 0 0 1 0 1 1 1 0 1 1 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 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 1 0 a y b 1ビットのOR回路 Created by Tsuneo Nakanishi, 2002-2004
加算回路の設計(1) 1ビットの加算回路 入力:下位桁桁上げ(cin) 1 1 1 0 1 0 0 0 1 1 1 0 1 1 0 入力:足される数(a) +) 0 0 1 1 0 1 0 1 入力:足される数(b) 1 0 1 0 1 0 1 1 出力:上位桁桁上げ(cout) 出力:和(y) 1bit 加算器 a cout b y cin Created by Tsuneo Nakanishi, 2002-2004
加算回路の設計(2) 1ビットの加算回路を使った32ビット加算器 a31 cout + b31 y31 cin ・・・ a1 cout + b1 y1 cin a0 cout + b0 y0 0 Created by Tsuneo Nakanishi, 2002-2004
加算回路の設計(3) 真理値表 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 y 10 11 cin 操作 2 Created by Tsuneo Nakanishi, 2002-2004
加算/AND/OR対応 32bit ALU cout a31 +/AND/OR 対応 1bit ALU b31 y31 cin ・・・ cout a1 +/AND/OR 対応 1bit ALU b1 y1 cin cout a0 +/AND/OR 対応 1bit ALU b0 y0 cin 操作 2 0 Created by Tsuneo Nakanishi, 2002-2004
1 1 1 1 1 0 1 0 0 0 減算回路の設計(1) 減算(b を引く)=負数の加算(–b を足す) 2の補数表現をした場合,符号を気にすることなく,符号なし整数の加算とまったく同じ方法で減算できる. キャリー 0 1 1 0 0 1 1 0 102(10) +) 1 1 1 0 0 0 1 1 –29(10) 0 1 1 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 +/AND/OR 対応 1bit ALU 0 y31 b31 1 cin 反転=0 のとき b をそのまま出力,反転=1 のとき反転出力. ・・・ cout a1 +/AND/OR 対応 1bit ALU 0 y1 b1 1 cin cout a0 +/AND/OR 対応 1bit ALU 0 y0 b0 1 cin 加算のときキャリーイン=0,減算のときキャリーイン=1とする. 操作 2 反転 cyin Created by Tsuneo Nakanishi, 2002-2004
加減算/AND/OR対応 1bit ALU a b cout 00 + 01 0 y 10 11 1 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) cout a31’ a31 +/AND/OR 対応 1bit ALU 0 y31 b31 b31’ 1 cin オーバーフローはここで検査できる. ・・・ cout a1 +/AND/OR 対応 1bit ALU 0 y1 b1 1 cin cout a0 +/AND/OR 対応 1bit ALU 0 y0 b0 1 cin 操作 2 反転 cyin Created by Tsuneo Nakanishi, 2002-2004
オーバーフロー(4) cin cout ならばオーバーフロー Created by Tsuneo Nakanishi, 2002-2004
オーバーフロー(5) ovf cout a31’ a31 +/AND/OR 対応 1bit ALU 0 b31 y31 b31’ 1 cin cout a1 +/AND/OR 対応 1bit ALU 0 y1 b1 1 cin cout a0 +/AND/OR 対応 1bit ALU 0 y0 b0 1 cin 操作 2 反転 cyin Created by Tsuneo Nakanishi, 2002-2004
最上位ビット専用 1bit ALU a b 00 + 01 0 y 10 11 1 cin 反転 yout 操作 ovf 2 Created by Tsuneo Nakanishi, 2002-2004
slt 回路の設計(1) a31’ a31 ovf +/AND/OR対応 1bit ALU (最上位用) 0 y31 b31 b31’ yout 1 cin a < b ⇔ a – b < 0.ゆえに a – b の結果の符号から,a < b が検査できる. ・・・ cout a1 +/AND/OR 対応 1bit ALU 0 y1 b1 1 cin cout a0 +/AND/OR 対応 1bit ALU 0 y0 b0 1 cin 操作 2 反転 cyin Created by Tsuneo Nakanishi, 2002-2004
slt 回路の設計(2) オーバーフローが生じなくて(ovf=0),結果が負(y31=1) → a < b(sltf = 1) オーバーフローが生じて(ovf =1),結果が正(y31=0) → a < b(sltf = 0) Created by Tsuneo Nakanishi, 2002-2004
slt 回路の設計(3) sltf ovf a31’ a31 +/AND/OR対応 1bit ALU (最上位用) 0 b31 yout b31’ y31 1 cin cout a1 +/AND/OR 対応 1bit ALU 0 y1 b1 1 cin cout a0 +/AND/OR 対応 1bit ALU 0 y0 b0 1 cin 操作 2 反転 cyin Created by Tsuneo Nakanishi, 2002-2004
完全版最上位ビット専用 1bit ALU a b 00 + 01 0 y 10 11 1 cin slt sltf 反転 操作 ovf 2 Created by Tsuneo Nakanishi, 2002-2004
完全版一般用 1bit ALU a b cout 00 + 01 0 y 10 11 1 cin slt 反転 操作 2 Created by Tsuneo Nakanishi, 2002-2004
完全版 32bit ALU(1) sltf a31 完成版 最上位ビット専用 1bit ALU b31 ovf y31 slt=0 cin ・・・ cout a1 完成版 一般ビット用 1bit ALU b1 y1 slt=0 cin cout a0 完成版 一般ビット用 1bit ALU b0 y0 反転 cin 操作 2 cyin Created by Tsuneo Nakanishi, 2002-2004
完全版 32bit ALU(2) sltf a31 完成版 最上位ビット専用 1bit ALU b31 ovf y31 slt=0 cin ・・・ cout a1 完成版 一般ビット用 1bit ALU b1 y1 slt=0 cin cout a0 完成版 一般ビット用 1bit ALU b0 y0 cin 操作 2 反転 Created by Tsuneo Nakanishi, 2002-2004
完全版 32bit ALU(3) sltf a31 完成版 最上位ビット専用 1bit ALU b31 ovf y31 slt=0 cin ・・・ cout a1 完成版 一般ビット用 1bit ALU b1 y1 slt=0 cin cout a0 完成版 一般ビット用 1bit ALU b0 結果が 0 のときに 1.減算の結果に適用して,等不等の検査ができる. y0 cin 2 ALU制御 3 Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(1) 順次桁上げ加算器(Ripple Carry Adder) a31 cout + b31 y31 c31 cin ビット数に比例して遅延が大きくなる. ・・・ a1 cout + b1 y1 c1 cin a0 cout + b0 y0 c0 Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(2) 真理値表 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) 4bit 桁上げ先見 加算器 a3~a0 c4 4 b3~b0 y3~y0 4 4 c0 Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(5) 4bit 桁上げ先見加算器(Carry Look Ahead Adder) a3 y3 + 桁上げ先見ユニット g3 b3 c4 p3 c3 y2 a2 + g2 b2 p2 c1 y1 a1 + g1 b1 p1 c1 y0 a0 + g0 b0 p0 c0 Created by Tsuneo Nakanishi, 2002-2004
加算器の高速化(6) 32bit 加算器 a31~a28 4bit 桁上げ先見 加算器 4 b31~b28 y31~y28 4 4 c28 まだ長い! ・・・ a7~a4 4bit 桁上げ先見 加算器 4 b7~b4 y7~y4 4 4 c4 a3~a0 4bit 桁上げ先見 加算器 4 b3~b0 y3~y0 4 4 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 y31~y28 + 桁上げ先見ユニット 4 4 G7 b31~b28 c32 4 P7 c28 ・・・ c8 y7~y4 a7~a4 + 4 4 G1 b7~b4 4 P1 c4 a3~a0 y3~y0 + 4 4 G0 b3~b0 4 P0 c0 Created by Tsuneo Nakanishi, 2002-2004