メインページに戻る

はじめに

ALUとは

ALUとはCPUの中で加算や減算、あるいは論理和論理積等の回路を一つのパッケージに収めたものです。
ここではテキサスインスツルメンツ社が開発した74シリーズの中にラインアップされているALUに限定して話をします。

さて、ALUは略さずに書くとArithmetic Logic Unit となり、直訳すると「算術論理装置」となります。これを「算術演算をするための論理装置」と解釈するか「算術演算と論理演算をするための装置」と解釈すべきかは何とも言えません。しかし、一般に加算だけを行う回路を収めたパッケージはAdder、加減算だけを行う回路を収めたパッケージはAdder/Subtractor と呼ばれますので後者の方が正しい様に思えます。
ちなみに、乗算除算は加減算に比べ遥かに複雑な回路が必要ですので、74シリーズの中には乗除算機能をもつALUは存在しません。

ALUに対する誤解

日本では、コンピュータを電子計算機と訳したためか、計算機能を司るALUがCPUの中心となる回路(あるいは中心となる部品)だと思っている方が多い様ですが、これは誤りです。確かに演算回路無しではCPUを作ることは出来ませんが、CPU作りにおいて最も難しいのは「命令を解釈して、ALUを含む様々な回路に指示を出す回路(命令デコーダ)」です。ALUはこの命令デコーダー回路から指示を受ける末端の回路に過ぎません。
よく、ALUに簡単な入出力装置(スイッチやLED)を繋げた作品を作っただけで、コンピュータの殆どを作った錯覚に陥る方がおります。しかし、ALUに簡単な入出力装置を付けた装置を設計(及び作成)することは、CPUを理解する上でとても大事な事ではありますが、それだけでは、コンピュータの仕組み全体の1割程度を理解したに過ぎません。

74シリーズを代表するALU 74181

多くの商用コンピュータのALUとして採用されたSN74181

ここからは、前述の「ALUはCPUの中心回路では無い」ということを理解されたことを前提として、改めて全体として74シリーズを代表するALUである74181とその「芸術的とも呼べる内部回路」の話をしたく思います。

テキサスインスツルメンツの74シリーズの一つであるSN74181は、4bitの加算・減算・論理和・論理積・排他的論理和や他にも様々な演算が一つのパッケージで実現できるTTLです。これを4つ並べると16ビットの演算器が簡単に作れるため、1970年前後に開発されたコンピュータには、このSN74181をALUに採用したコンピュータがも国内外を問わず多数ありました。

しかし、当時の集積回路の技術では、4bitの加算・減算・論理和・論理積・排他的論理和などの様々な演算結果を求める回路を一つのパッケージに納めるのは必要なトランジスタ数が多すぎる為、極めて困難でした。ところが実際に公開されているSN74181の内部回路を見てみますと、芸術的と称するに値する極めて熟慮に富んだ回路構成により、この問題を巧妙に回避していることが判ります。

SN74181の内部を覗いてみる

ここでは、一見複雑なSN74181の内部回路を、その設計者の気持ちを想像しながら理解することに挑戦してみたいと思います。なお、SN74181にはSN74LS181、SN74F181、SN74AS181などがありますが、ここではそれらをまとめてSN74181と記述します。

74LS181のデータシートPDFはこちら(TEXAS INSTRUMENTS社サイト 別窓で開きます)

SN74181の全ての演算入力に存在する不思議な回路

SN74181の内部回路を見ると、全ての演算入力(A0~A3、B0~B3)に風変わりな回路が挿入されていることが判ります。

SN74181の入力側にある不思議な回路AとBの2つの入力値から、aとbの2つの中間状態を作成し、更にa、b両者のEXORを得ているのは確かですが、変換を指定する入力が4本(S0~S3)もあります。これは一体何をしているのでしょうか?

良く見るとS0とS1はaへの変換指示を、S2とS3はbへの変換を指示しているのが判ります。 

そこでまずは、S0/S1/A/aの関係とS2/S3/B/bの関係をそれぞれ表にしてみました。


S0 S1  a出力の論理 
 L  L  Aの反転
 L  H  Aと反転BのNOR
 H  L  AとBのNOR
 H  H  常にL
S2 S3  b出力の論理 
 L  L  常にH
 L  H  AとBのNAND
 H  L  Aと反転BのNAND
 H  H  常にL

表にしても、その意味を直感的に理解するのは難しいです。改めてSN74181の規格表を見てみますと、S0~S3をHLLHとすると4bitの加算ができると書かれています。そこで、まずは加算機能のみをを解析することにします。

まずは加算の仕組みを理解する

SN74181のS0~S3をHLLHすると、前述の表から上記の回路は以下の回路と等価になることがわかります。

加算器の基本回路この回路のAとBの入力に対する各出力の値を調べてみると、EXORの入力はA、Bに直結されていないのにも関わらず、結果的に直結されている場合と同じ出力が得られることがわかります。(下記真理値表参照)

 A入力  B入力  a(NOR出力)  b(NAND出力)  F(a、bのEXOR)  参考:AとBの加算(キャリー無し) 
 L  L  H  H  L  L
 L  H  L  H  H  H
 H  L  L  H  H  H
 H  H  L  L  L  L(上位へのキャリーが生じる)

EXORの真理値は「キャリーのない1bit加算」と等価ですから、これに下位からのキャリーを受け入れる回路と、上位ヘキャリーの有無を伝える回路を加えることにより、完全な1bitの加算器(全加算器)を作ることができます。

半加算器まず、下位からのキャリーは、それがある場合に加算結果が反転するだけですから、単にEXORをもう一段重ねるだけで実現できます。但しSN74181のキャリー入力は負論理(キャリーがあるときL)ですので、181内部の実際の回路は、Cn入力の直後にNOTゲートを挿入し、反転させてからEXORに接続されています。

全加算器次に、上位へのキャリーの生成ですが、これはちょっと面倒です。理解のコツはキャリーが発生する条件を考えるのではなく、キャリーが発生しない条件を考えるのが良いでしょう。


上記の加算回路で上位へのキャリー(Cn+1)が発生しない条件は以下の2つです。

(条件1)「A、Bが共にL」 

これはCnの値にかかわらず、Cn+1が発生しないことは自明です。
 この「A、Bが共にL」は「A nor B」と等価です。

(条件2)「A、Bの少なくとも一方はLで、かつCnがH(下位からキャリー無し)」

 この「A、Bの少なくとも一方はL」は「A nand B」と等価ですから、
 こちらの条件全体は、「(A nand B)and Cn」となります。

2つの条件をORで結合すると、キャリーが発生しないときにHとなる信号が作れます。
上記の回路ではORではなくNORを使っているので、キャリーが発生するときにHになります

多bitの加算器

キャリー入出力付きの加算器(全加算器)を2段重ねると、2bitの加算器となります。
但し多段化すると、キャリー判定回路が複雑になります。

2bitキャリールックアヘッド加算器下位bitの計算が終了するのを待って(左記回路のF0が確定するのを待って)その結果とA1、B1の値で上位の演算結果を作り出すならば左の回路より簡単な回路にすることが可能です。

しかし、その方法は常に下位の計算結果が確定するまで、上位の計算が待たされる(遅延する)ため、重ねたbit数分計算が遅くなります。


計算速度が遅くても趣味としてのCPU自作なら、それはそれで構わないのですが、74シリーズのALUは、SN74181を含め、全てキャリールックアヘッドという、全ての桁を同時に求める手法を使っています。この手法は、計算が速い反面、段数が重なるにつれ、キャリーの判定回路が複雑になるという欠点もあります。

上記の回路図で言うと、1bitの加算ならキャリー判定に必要なANDゲートは*1と書いた一つだけでしたが、2bitの加算にしたため、*2と*3が加わっています。これは上位bitほど、キャリーの有無判定が複雑になるためです。では、上記回路の「キャリー(Cn+2)が発生しない条件」を洗い出してみます。

(条件1)「A1、B1が共にL」 

 この条件に一致すると上記回路図では、a1と書かれたラインがHになります 

(条件2)「A1、B1の少なくとも一方はLで、1段目からのキャリー無し」

 この条件に一致すると上記回路図では、*3と書かれたANDゲートの出力がHになります  

(条件3)「A1、B1の少なくとも一方はLで、A0、B0の少なくとも一方はLで、CnもL」

 この条件に一致すると上記回路図では、*2と書かれたANDゲートの出力がHになります 

 この3つの信号を3入力NORに入れることにより、2bit加算器全体としてのキャリー(Cn+2)が作られます。

以下、参考までに3段重ね(3bit加算器)の回路と条件のみを付記します。

3bitキャリールックアヘッド加算器

(条件1)「A2、B2が共にL」 

 この条件に一致すると上記回路図では、a2と書かれたラインがHになります 

(条件2)「A2、B2の少なくとも一方はLで、2段目からのキャリー無し」

 この条件に一致すると上記回路図では、*6と書かれたANDゲートの出力がHになります

(条件3)「A2、B2の少なくとも一方はLで、A1、B1の少なくとも一方はLで、
      1段目からのキャリーなし」

 この条件に一致すると上記回路図では、*5と書かれたANDゲートの出力がHになります

(条件4)「A2、B2の少なくとも一方はLで、A1、B1の少なくとも一方はLで、
      A0、A1の少なくとも一方はLで、CnもL」

 この条件に一致すると上記回路図では、*4と書かれたANDゲートの出力がHになります

 この4つの信号を4入力NORに入れることにより、3bit加算器全体としてのキャリー(Cn+3)が作られます。この様に段数が増えると回路は複雑になりますが、一定の規則に従ってANDゲートが増えているだけであることがわかります。

減算を実現する仕組み

本頁の冒頭で紹介した、SN74181の全ての演算入力(A0~A3、B0~B3)にある不思議な回路をもう一度見てみます。

SN74181の入力側にある不思議な回路減算はビット列を反転させた値を加算し更に1加えることで実現できます。(A-B = A+反転B+1)
ここで、S0~S3をLHHLとすると左記の回路は以下と等価になります。

減算基本回路


後は加算回路をそのまま使うだけで減算ができます。但し、このままでは A-B = A+反転B+1 の式の最後の+1がされないため、1つ少ない値となりますが、これは減算の時はキャリーを常にON(但し上位からのボローがあるときはOFF)とすることにより、見事に補正されます。

論理演算を実現する仕組み

SN74181にはS0~S3の他に、演算の種類を決めるM(Mode)という信号線があります。
この信号線はキャリーを計算するのに必要な全てのANDゲートに接続されており、これをLに落とすと、全てのキャリー計算がされません。

例えば、加算回路においてキャリー計算をしないと言う事は、EXORと同じ意味になります。
つまり、S0~S3をHLLH(加算指定)にし、MをLにすると、SN74181は4bitのEXORゲートとして機能するのです。

S0 S1  a出力の論理 
 L  L  Aの反転
 L  H  Aと反転BのNOR
 H  L  AとBのNOR
 H  H  常にL
S2 S3  b出力の論理 
 L  L  常にH
 L  H  AとBのNAND
 H  L  Aと反転BのNAND
 H  H  常にL

また、M=Lの状態で、S0~S3をHHLHとすると、左記の表より、出力は「L」と 「AとBのNAND」のNOR、すなわちAとBの論理積(AND)が得られるます。同様にS0~S3をLHHHとすると論理和(OR)を得ることができます。

芸術的回路と称される理由

この他にも、SN74181はS0~S3とMの5本の信号線の値により、様々な演算ができます。

ここで注目すべきは、SN74181は基幹となる加算回路の数値の入力部分やキャリー計算の部分にほんの少し回路を追加しただけで、加減算やインクリメント(+1)、デクリメント(-1)あるいは論理積、論理和、排他的論理和、反転などの重要演算を全て網羅した32種類の演算を可能にしているという点です。
これは、論理回路における演算の本質を知り尽くした設計者による芸術的作品と言っても過言ではありません。

もし、SN74181と同等の機能を持つRTLをVerilogやVHDLで記述しようとすると、殆どの方が、様々な計算式をCASE文で選択するようなコーディングにするのではないでしょうか?。 
 おそらく、設計者本人やオプティマイザ(最適化処理機能)がどんなに優秀でも、SN74181の何倍ものゲート数の回路を生成することと思います。

職業・学業・趣味を問わず、様々なデジタル回路を直接、あるいはHDLで記述されている方が、もしここをお読みになっていたら、改めてSN74181の内部回路の美しさを堪能して頂きたい次第です。
(回路図は冒頭で紹介したPDFファイルに含まれています)

(2011年10月、2013年一部改変、2014年一部改変)

メインページに戻る