本日の内容 コンピュータアーキテクチャと 機械語演習 加算器とその高速化 z 乗算器・除算器 z 3年次前期 (第12回) 中島 克人 情報メディア学科 [email protected] 1 1ビット加算器 z z 1ビット加算器 半加算器(HA: Half Adder) A 0 0 1 1 B 0 1 0 1 S 0 1 1 0 C 0 0 0 1 A 2進数1ビット の加算 A + B CS B HA C S S : 和(Sum) C : 桁上げ (Carry) 全加算器(FA: Full Adder) A 0 0 1 1 B 0 1 0 1 Ci S 0 0 0 1 0 1 0 0 Co 0 0 0 1 2 A 0 0 1 1 B 0 1 0 1 Ci S 1 1 1 0 1 0 1 1 Co 0 1 1 1 2進数1ビット (途中桁) の加算 ‥ Ai + ‥ Bi Co Ci ‥ Si z半加算器のAND/OR回路 Ai-1 Bi-1 ‥ ‥ A 0 0 1 1 Ci : Carry-in S : 和(Sum) Co : Carry-out A B 0 1 0 1 C 0 0 0 1 B 0 1 0 1 Ci S 0 0 0 1 0 1 0 0 Co 0 0 0 1 ● A 0 0 1 1 B B 0 1 0 1 Ci S 1 1 1 0 1 0 1 1 Co 0 1 1 1 Ci ● ● ● ● A 0 0 1 1 A B ● B Ci FA Co S S 0 1 1 0 z全加算器のAND/OR回路 ● ● ● ● ● ● ● ● ● ● A C 3 S Co S 4 Nビット加算器 Nビット加算器 z 全加算器(1ビット)をカスケード(=縦つなぎ)接続して 構成した Nビット加算器が構成できる z 4ビットの例(Ripple Carry Adder) z A 0 1 1 0 B 0 1 0 0 16bit 加算器(Ripple Carry Adder) A(16bit) 16 Ci = 0 4 4 A B Ci Co Co Co = 0 B FA S 1 Ci A Co B FA Ci S A B FA Co Ci A S 0 B Ci FA Co 4 S 1 4ビット加算器 4ビット加算器の改良 z Ci ● ● ● ● Co Ci A 4 B ● ● Ci 4 A B Ci 4bit Adder 4bit Adder 4bit Adder Co Co Co S 4 S 4 S 4 16bit Ripple Carry Adder z クリティカル・パス(最大通過ゲート数)は AND・ORゲート換算で 何段か? 6 4ビット加算器の改良 ● ● ● B 4 問題点は?… Carryの伝播時間が大きい ● z 桁上げ予見(Carry Look-ahead) ci+1 = ai・bi + ai・ci + bi・ci = ai・bi + (ai + bi)・ci = gi + pi・ci B ● A 4 z 5 ● 4 Co = 0 0 A S Ci = 0 16 4 4bit Adder A B(16bit) 4-bit CLA(Carry Look-ahead) S C4 = g3 + p3・g2 + p3・p2・g1 + p3・p2・p1・g0 + p3・p2・p1・c0 .... どれか 2つが 1だとCarryが上がる ci+1 ( ただし、 gi = ai・bi (Carry Generation), pi = ai + bi (Carry Propagation) ) g3 ai bi ci FA co s C4 a2 b2 ci a1 b1 = gi + pi・( gi-1 + pi-1・ci-1 ) = gi + pi・gi-1 + pi・pi-1・( gi-2 + pi-2・ci-2 ) = gi + pi・gi-1 + pi・pi-1・gi-2 + pi・pi-1・pi-2・gi-2 + … 4-bit CLA 7 P3 P2 P1 a3 b3 a3 b3 a2 b2 a1 b1 a0 b0 C0 8 Nビット減算器 16ビット加算器の改良 z 16bit 加算器(Carry Look Ahead Adder) z 16bit減算器 桁上げ予見回路を付加することで大幅に動作速度向上 A12~15 B12~15 A8~11 B8~11 A4~7 B4~7 ● ● A15~0 ● ● - A-B = A+(-B ) = A+(B+1) A0~3 B0~3 C0 ● ● ● 2の補数 B15~0 16 ● A B C12 4bit CLA C16 A B A B C8 4bit CLA C12 A B C4 4bit CLA C8 A B C0 4bit CLA C4 ● ● ● C12 A B C8 4bit Adder 4bit Adder C16 C12 S S A B C4 4bit Adder C8 C0 = 1 ● S 16 - B A B A C0 S Ci 16bit FA S 4bit Adder C4 B Co 16 C16 S12~15 S8~11 S4~7 S0~3 9 加算器のまとめ z 乗算器 加算器 z – Ripple Carry Adder 全加算器(Full Adder/FA)をカスケード(=縦つなぎ)接続すれば任意 のビット数の加算器が構成可能だが,最下位ビットのFAの桁上げ(C1) が最上位ビット結果(Sn-1,Cn)に反映されるまで時間がかかる(多くのゲ ートを通過) – Carry Look Ahead Adder 原理 – 被乗数をシフトしながら加算する – ただし、乗数の1の立っているビット位置だけ加算する – 被乗数および乗数の桁数を nビットとすると積は 2nビット 1101 × 1001 1101 0000 0000 1101 1110101 4ビット程度ずつまとめて桁上げ予見器(Carry Look-ahead)で桁上が り情報を上位ビットに伝える事で,最大通過ゲート数(クリティカル・パス) を削減し,加算器の動作を高速化できる z 10 減算器 – 2の補数は,ビット反転して最下位ビットに1を加えて作れる – 加算器をベースに簡単に構成可 – B入力をビット反転し,最下位ビットのC0入力を1とする 正整数での例 11 被乗数 乗数 被乗数レジスタ(D) 2n ビット 初期値 0 step 1 左シフト step 2 ゲート n ビット LSB step 3 step 4 乗数レジスタ (R) 右シフト 2n ビット加算器 コントロール 積 積レジスタ(P) 1 / 2n ビット 12 乗算器(高速乗算その1) 乗算器(高速乗算その1) z z ブースの方法(Booth Recoding) ... 部分積加算回数の削減 – 連続する「1」を1回の加算と1回の減算に置き換える(Booth Recoding) – bit(i+1) と bit(i) をまとめて bit(i) の位置で表現 – アルゴリズム: 連続する「1」を1回の加算と1回の減算に置き換える bit位置 → i j i j i j 乗数 011 .... 110 .... = +100 .... 000 .... = 100 .... 010 ... -000 .... 010 .... 連続する「1」 例: 乗数 00110111 = 5510 – 後ろのビット(i-1番目)を見つつ、コードし直す(ブースリコーディング) – 2ビットずつリコーディングする(改良ブースリコーディング)と2ビット当り 高々1回の加減算で済むことが分かる 4進 乗数ビット コード化後のビット → 部分積加算の回数が半分! i+1 i i -1 i+1 i 表現 乗数ビット コード化後の i i-1 ビット i 0 0 1 1 0 1 0 1 0 +1 -1 0 2ビットずつ リコーディング 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 ブースリコーディング 0 1 0 1 0 1 0 1 0 0 0 +1 -1 0 0 0 0 +1 +1 0 0 -1 -1 0 = 01011001 = 6410-1610+810-110 = 01010201 0 +1 +1 +2 -2 -1 -1 0 改良ブースリコーディング この2段階の操作を一度に行うに は右表を使用 乗数 00110111 0 通常の乗算 01011 × 0 1 0 1 0 = (8-2)10 0 00000000 -1 1110101 0 000000 +1 01011 01000010 Booth Recodingでの乗算 乗数ビット i+1 i i -1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 コード化後のビット i+1 i 0 0 0 +1 -1 0 0 0 0 +1 +1 0 0 -1 -1 0 4進表現 i 0 +1 +1 +2 -2 -1 -1 0 改良Booth Recoding変換表 14 乗算器(高速乗算その1) 1110×610=6610 01011 × 00110 00000000 0001011 001011 00000 01000010 = 01010201 13 乗算器(高速乗算その1) z例: 改良Booth Recoding ... 部分積加算回数の半減 01011 × 0 2 2 = (8-2)10 1 1 1 0 1 0 1 0 -2 +2 010110 0 0000 01000010 改良Booth Recoding(基数4) での乗算 z演習: 6bitの2進数乗算 0011012×0011102 を下記の変換表を 用いて改良Booth Recording(基数4)で計算せよ z解答: 変換表により 乗数 001110 0 = 010002 故に 0 0 1 1 0 1 = (13)10 × 1 0 2 = (16-2)10 1 1 1 1 1 1 1 0 0 1 1 0 ... -2 ... 0 0000000000 ... +1 00001101 •Booth Recodingでは加減算回数が増える可能性がある(010101→111111) •改良Booth Recoding(2ビットずつ→基数4)では最大でも N/2(N:乗数桁数) •部分積用加算回路で (0、+1、-1、+2、-2)倍 の機能を 持たせるのは容易 ← どう構成する? 15 0 0 0 0 1 0 1 1 0 1 1 0 = (182)10 乗数ビット i+1 i i -1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 コード化後のビット i+1 i 0 0 0 +1 -1 0 0 0 0 +1 +1 0 0 -1 -1 0 4進表現 i 0 +1 +1 +2 -2 -1 -1 0 改良Booth Recoding変換表 16 乗算器(高速乗算その2) 乗算器(高速乗算その2) z 部分積の加算を一度に行う z – 3入力1bitのCSA:1bit FA(Full Adder)と同じ – 4入力CSA(Nbit):1bit当り FAを2個使用(下図) – 最終段だけ通常の加算器(Carry Look-ahead Adder等)が必要 加算の途中結果は2進表現でなくても良いので桁上げ 保存加算器(CSA:Carry Save Adder)を用いる 4入力加算器の改良例 4入力加算器の例 A B C + D B C CSA + + A 桁上げ伝播 が2回 CSA Carry 4入力 CSA – 除数を右シフトしながら 被除数から減算する – ただし、減算して負にな ると加算して戻す(加え 戻し) – 被除数は 2nビット、 除数および商は nビット ai ai bi ci co CSAでは 桁上げは 斜め左に伝播 ● ● ● s ai bi ci bi ci FA FA co bi ci FA co s ai ● ● ● co s ● ● ● s bi ai bi CLA:Carry Look-ahead Adder 桁上げ伝播 が1回 s Carry と Sum を別々に計算 し、最後に両者を加算 除算器 原理(加え戻し法) A B C D FA Sum 第n+1ビット 17 z A B C D ai + 通常の加算器を積み 重ねると、桁上げ伝播 時間が多く必要 D 桁上げ保存加算器(CSA:Carry Save Adder) s Booth Recoding、 改良Booth Recodingと組合せ 可能!! 第nビット 18 除算器 除数 0 1 0 1 ) 0 1 1 1 0 1 0 1 ... 被除数 ... 1 - 0101 0100101 -0101 11111101 ... 0 +0101 0100101 ... 1 - 0101 10001 ... 1 - 0101 0111 ... 1 - 0101 余り 0 0 1 0 商 1 0 1 1 1 z 原理(引き放し法) 0101)01110101 - 0101 – 除数を右シフトしながら被 0 1 0 0 1 0 1 ... 1 除数から減算する -0101 – ただし、減算して負になる 1 1 1 1 1 1 0 1 ... 0 と加え戻しは省略し、次の + 0101 ステップで減算の代りに加 算する 10001 ... 1 - 0101 何故なら、 0111 ... 1 +除数×2k-除数×2k-1 -0101 =+除数×2k-1 0010 ... 1 余り0 0 1 0 商1 0 1 1 1 (ただし、余りが負になれば 、加え戻しが必要) 正整数での例 19 20 乗算器と除算器のまとめ 除算器(引き放し法) z z 回路構成 レジスタ R: R≧0 n ビット 商0/1セット + - Rをテスト Rを左シフトし、最下位を 1 に、Fを 0 にセット +/-指示 除数 n ビット – 乗数のnビット連続する1を、n+1ビット目の +1 と1ビット目の -1に置き かえる(そのためのビットごとのコーディングが booth recoding) – 改良booth recoding – 2ビットずつ、 +2, +1, 0, -1, -2 のどれかにコーディングする – これにより、部分積の加算回数が乗数のビット数の半分になる R<0 – 部分積の加算に必要な多入力加算器には、Carry Save Adder が用いられる Rを左シフトし、最下位を 0 に、Fを 1 にセット z コントロール レジスタ D 符号ビット 桁数回 終了? 除算器 – 加え戻し法 NO – 被除数から除数を引いて余りの符号が反転したら、除数を加え戻す YES – 引き放し法 Rを右にシフトする もしFが 1 なら Rに Dを加算 End 乗算器 – booth recoding DをRの左半分から 減算(F=0)または加算(F=1) 左シフト n ビット z Start: 被除数を レジスタR にセット 除数を レジスタD にセット フラグF を 0 にセット 商(下位) 余り(上位) 初期値:被除数 アルゴリズム – 被除数から除数を引いて余りの符号が反転したら、除数を加え戻す代 わりに、次の桁(1ビット右シフトした位置)で除数を加える 21 22
© Copyright 2025 ExpyDoc