第4回: 加算器(その2)

桁上げ先見加算器(p.138)

前回みたように、全加算器の論理式は、 キャリーが生成する場合(生成項)と伝播する場合(伝播項)に分けて、 次のように書くことができました。 (または Pn = An + Bn とおいて、Cn = Gn + Pn・Cn-1)

たとえば4ビット加算器をつくるとして、 この生成項と伝播項を順番に書くと次のようになります。
G0 = A0・B0Q0 = A0B0 C0 = G0 + Q0・C-1
G1 = A1・B1Q1 = A1B1 C1 = G1 + Q1・C0
G2 = A2・B2Q2 = A2B2 C2 = G2 + Q2・C1
G3 = A3・B3Q3 = A3B3 C3 = G3 + Q3・C2
このうち、C1は次のように書くことができます。
C1 = G1 + Q1・C0 = G1 + Q1・(G0 + Q0・C-1) = A1・B1 + (A1B1){A0・B0 + (A0B0)・C-1}
つまり、C1が、前の桁からの桁上がりC0を使わずに、 入力An, Bn(とC-1)のみであらわせることになります。 同様に、C2, C3も、入力An, Bnのみであらわすことができます。

ちなみにSn = Qn + Cn-1ですから、 これらを使うと、この4ビット加算器の回路図は次のようになります。

この構成では、RCAのようなキャリーの伝播は起こらず、 すべての桁のキャリーが、入力An, Bnのみから決まるため、 RCAのように桁数に比例した演算時間がかかることはありません。 このような構成の加算器を キャリー先見加算器 (Carry Look-ahead Adder; CLA) と呼びます。

このようにCLAは桁数が多くても高速な演算が可能ですが、 桁数が多くなるほど、キャリーCnを求めるための論理式が 急激に複雑になり、論理回路が大規模になってしまうという問題があります。 (元気がある人は8ビットCLAでも作ってみましょう・・・)

2進桁上げ先見加算器(p.141)

ビット数が多い加算器をつくるときに さらに高速化が可能な構成として、 2進桁上げ先見加算器(Binary Carry Look-ahead Adder; BCLA)というものが あります。 これはかなり大変ですので、気合を入れていきましょう。

ですが、このCn = gn + qnとおいてみると、 次のように書くことができます。 つまり、(gn, qn)は、(Gn, Qn), (gn-1, qn-1)から、この式のように 求められる、というわけです。これを「◎」という「演算」として 定義することにしましょう。 つまり、 さてC-1 = G-1 + Q-1・C-2のはずですが、C-1=0(最初の桁には、下の桁からの 桁上がりはない)のはずです。 ところがG-1 = Q-1 = 0 (最初の桁には、キャリーの生成も伝播もない)なので、 C-2は0でも1でも構いません。そこでC-2=1、とおくことにしましょう。 そうすると、(g-1, q-1)は次のように求められます。 これを使うと、(gn, qn)が、次のように順番に求められることになります。 ちなみにn桁目のキャリーCnとn桁目の和Snは、次のように求められます。 これを使うと、たとえば8桁の加算器を次のように構成することができるでしょう。

ここでは、◎演算を行う部分と、最初にGnとQnと生成する部分を まとめて機能ブロックとして描いてあります。

ただしこれだと、8桁目の結果が出るまでに、◎演算を7回も行う必要があり、 あまり高速とは言えません。 そこで、◎演算の順番を変えていいことに注目すると、 要は右端の(gn, qn)に至るまでに、(G0, Q0), (G1, Q1), ..., (Gn, Qn)の ◎演算を通ればいいことになりますから、次のように考えることができます。

これをうまく使うと、うまいことを思いつく人がいるものだ、と 感心するしかありませんが、次のような回路で、8ビットの加算器を つくることができることになります。

たとえば(g4, q4)を生成するためには、(G4, Q4)から(G-1, Q-1)までの ◎演算をとればよいわけですが、図の赤矢印のように、 たしかにこれらすべてが◎演算をとおっています。

このような構成の加算器を 2進桁上げ先見加算器(BCLA)と呼びますが、 一般に、2Mビットの加算器をつくるのに、 M段の◎演算ブロックを通ることになるため、 劇的な高速化が可能となります。

このような、「規則的な構造(アーキテクチャ)」は、 一見複雑そうでも、集積回路を作るときには、 要素回路をただ並べるだけなので、実は非常に楽チンで効率的なのです。


この回の配布資料
この回のソボクな疑問集
戻る