第6回: 加算器(その4) / ALU(その1)

桁上げ保存加算器(p.140)

趣向を変えて、2つ以上の数の加算を行う加算器を 考えてみましょう。(これは実は後ほど乗算器のところでで使います) 例えば、4ビットの3つの数 X={X3, X2, X1, X0}, Y={Y3, Y2, Y1, Y0}, Z={Z3, Z2, Z1, Z0}を加算する加算器を考えてみます。 順当には、まずはX+Yを4ビット加算器で求め、 その結果とZの和を、さらに別の4ビット加算器で求めれば よいわけですが、ちょっと工夫をすると、次のような回路構成を とることができます。

つまりまずX+Y={C'3, S'3, S'2, S'1, S'0}をもとめ、 続いて、それとZとの和を求めているように見えますが、 実はX+Yの加算のところで、上の桁の和は求められていません。 (例えば、本来はS'1 = X1 + Y1 + C0のはずだが、C0が入ってきていない) つまり下の桁からの桁上がりを加算しないまま、Zを足してしまっているわけです。 どうせここでも桁上がりが発生するだろうから、 X+Yのところで桁上げを求めずに、Zを足した後で、桁上げを まとめて求めているわけです。 最後の桁上げを求める段を、この回路構成では桁上げ伝播加算器(RCA)を 使っていますが、もちろんCLAやBCLAでも構いません。

種々の加算器の比較

これまで、全加算器自体や、それを使った、RCAやCLA、BCLAなどの 多ビットの加算器の構成を見てきましたが、 最後に比較の一例を紹介しておきましょう。 もちろん加算器の速度などは、設計するときのテクノロジ(最小加工寸法など)に 依存しますので、あくまでもこれは一例ですが、 傾向は、テクノロジが変わってもそうは変わらないでしょう。

これからわかるように、RCAのほうが遅いがやや回路規模は小さい、 というところでしょうか。 実際には、要求される演算速度、回路規模、消費電力などから 適切な構成を選択することになります。

※RCAのMOSFET数が妙に多いように見えますが、 この「MOSFET数」は、標準サイズのMOSFETに換算した数です。 (つまり実際のLSI上で占める面積の目安) 高速化するためにMOSFETの大きさを大きくしないといけない部分が 多く、MOSFETの数自体は少ないものの、この換算した「MOSFET数」は 多くなるわけです。

算術論理演算ユニット(ALU)

1の補数と2の補数

2進数で負の数をあらわすときには、「2の補数」というものを 使うのでした。 「2の補数」は、「1の補数(全ビットのNOTをとったもの)」+1で、 次の表のように、たしかに足してゼロになる(最上位の桁上がりは無視する) ので、負の数をあらわしていることがわかります。
数(1) 1の補数 2の補数(2) (1)+(2)
000 111 (1)000 (1)000
001 110 111 (1)000
010 101 110 (1)000
011 100 101 (1)000
100 011 100 (1)000
101 010 011 (1)000
110 001 010 (1)000
111 000 001 (1)000

加算器を使った減算器


この2の補数を使うと、減算を行う減算器を作ることができます。 つまりこのようにN桁の加算器で、最下位の桁上がり入力Cinを 使うと、S = A + B + Cin ということですが、 たとえばBのところに/B(つまりBの全ビットの反転をとったもの)を 入力し、Cin=1とすれば、S = A + (/B + 1) となりますが、 「/B+1」は、Bの2の補数そのものですから、結果としてS = A - B を 求めたのと同じことになります。

このように拡張していくと、B, Cinに与える値によって 次の8通りの演算ができることがわかります。
S1S0B Cin S = A + B + Cin 内容
00すべて0 0 A そのまま
00すべて0 1 A+1 increment
01B 0 A+B 加算
01B 1 A+B+1
10/B 0 A+/B
10/B 1 A+/B+1 = A-B 減算
11すべて1 0 A -1 decrement
11すべて1 1 A
つまりBから、選択信号(S1, S0)によって、すべて0, B, /B, すべて1、の いずれかをつくり、それとCin、AをNビット加算器に加えれば、 これらのすべての算術演算を行うことができるわけです。

ちなみにBのところは、上のような回路(EXORゲートそのもの)を入れておけば、 f=0のときはBが、f=1のときは/Bが、加算器に与えられることになりますから、 fの値に応じて加算(f=0)と減算(f=1)を切り替えるためには 次のような回路とすればよいでしょう。

このように、いろいろな演算機能をもつ演算ユニットを総称して 算術論理演算ユニット (Arithmetic Logic Unit; ALU)と 呼びますが、この回路は、加算と減算機能をもつALU、ということになります。

論理演算ユニット

ALUは、加算減算のような算術演算だけでなく、 論理演算、すなわちビットごとの論理積(AND)・論理和(OR)・否定(NOT) ・排他的論理和(EXOR)も演算できる必要があります。 おそらく最も素直な論理演算ユニットの作り方は、 次のようなものでしょう。

つまり4種類の演算を、それぞれ論理ゲートで用意しておいて、 その中から希望のものをS1, S0の値の組でどれかが選ばれるセレクタで選んで 出力とする、ということです。

ただ、これはあまり格好いい回路とはいえません。 そこで、このALUの真理値表を書いてみることにしましょう。

A  | 0 1 0 1   0 1 0 1   0 1 0 1   0 1 0 1 
B  | 0 0 1 1   0 0 1 1   0 0 1 1   0 0 1 1 
S1 | 0 0 0 0   0 0 0 0   1 1 1 1   1 1 1 1
S0 | 0 0 0 0   1 1 1 1   0 0 0 0   1 1 1 1
---+---------------------------------------
X  | 0 1 1 1   0 0 0 1   0 1 1 0   1 0 1 0
      (OR)      (AND)     (EXOR)    (NOT)
そしてこの真理値表から、積和標準形やカルノー図などを用いて論理式を つくり、それから論理回路をつくれば、所望の論理演算ユニットを つくることができます。 (つまり入力がA, B, S1, S0の4変数で、出力がXの論理式)

最も素直なALUの構成

さてALUは、算術論理演算ユニットというくらいですから、 算術演算(加減算)と論理演算を両方ともできなければいけません。 算術演算は前回つくりましたし、論理演算はいま作りましたから、 この2つを組み合わせて、次のようにセレクタでどちらかを選べば、 ALUが完成することになります。

ただし、これも先ほどのセレクタを使った論理演算器と同様、 あまり格好いい回路とはいえません。
この回の配布資料(第6回・第7回分)
この回のソボクな疑問集
戻る