第3章 演算回路

演算とは

演算とは与えられた1つの値、または複数の値から新たな値を作り出す事を言います。 例えば「2+3」は2と3という値から、全く別の値である5を作り出します。また「-3」は正の3という値から負の3という値を作り出します。

与えられた値が1個の場合は「単項演算」、2個の場合は「2項演算」と言います。理論的には、3項演算、4項演算、5項演算…と無限に存在しますが、3項演算以上はソフトウェアによる2項演算の組み合わせとして実現できますので、CPUの設計は単項演算と2項演算のみを実装するのが一般的です。本章でも単項演算と2項演算のみを対象として話を進めます。

上図の左は4bit同士の2項演算を行う素子の回路記号の一例で、右はその略図(複数の信号線を1本で略記した図)です。

この素子はAとBの演算結果を常にFに出力するだけです。 演算の種類は加減乗除をはじめ剰余、論理積、論理和などが想定できますが、まずは最も身近な演算である加算(足し算)を行う素子について説明します。以後加算を行う演算素子を「加算器」と称します。

キャリー入力とキャリー出力

加算器には入出力端子の他に、キャリー入力(Cin)とキャリー出力(Cout)端子があるのが一般的です(74シリーズの加算器は全てこの端子、もしくはそれに相当する端子を有しています)。

キャリー入力端子はそれがLの場合は普通に足し算をしますが、Hの場合は加算結果に1を加えた値を出力端子に出します。 また、キャリー出力は、加算結果がオーバーフローした場合にHとなります。オーバーフロー(桁あふれ)とは、例えば0x8+0x8=0x10となり、出力端子が4bit分しかないと加算結果が0になることを言います。

このキャリー入力とキャリー出力は複数の加算器を並べて、より大きなbit数の加算をする際に、下位の加算器のオーバーフローを上位の加算器に伝える経路を形成します。これにより、オーバーフローが生じる加算も正確にできるようになります。

4bit加算器を4つ並べて16bit加算器を構成する

図がキャリー入力端子とキャリー出力端子を利用した4bitの加算器を4つ並べた16bitの加算器です。キャリーの考え方は、10進法か否かという点を除けば、小学校で習う4桁同士の足し算(1234+5678等)と同じです。

但しコンピュータは10進ではなく16進(上図の場合。厳密に言うと全て2進)で計算を行いますので、「足した結果が9を超したら」ではなく、「足した結果が0xFを超したら」になる点が異なるだけです。


演算素子の端子名

入力端子名のAとBは単にABCD…の先頭2文字を使用しただけであり、何かの頭文字ではありません。多くの書ではAとBを用いていますが、他の文字を使う場合もあります。本書でも一部の解説ではXとY(xyzの先頭2文字)を用いています。但しAとB以外を使うのはAddressやAccumulatorあるいはBusやBase等のAやBで始まる言葉との混同を防ぐ必要がある場合に限ります。

入力端子名のFはFunction value(関数値≒計算結果)の頭文字です。加算器の場合はFではなくΣ(数学で和を意味するギリシャ文字)を用いている書もありますが、本書では全てFで統一します。

Cin、CoutのCはCarry(桁あふれ)の頭文字です。多くの書でもCを用いていますが、inとoutの区別の方法は書によって異なります。よくある表記法としては、Cinの代りC0(0bit目に与えるキャリーの意味)、Coutの代わりにC4、Cn+1(いずれも3bit目の次のbitに与えるキャリーの意味)があります。