加算器とALU — ゲートを組んで計算をつくる
前のレッスンで作った論理ゲート。じつは XOR と AND を数個つなぐだけで足し算ができます。半加算器 → 全加算器 → 多ビットの加算器へと積み上げ、最後は加算も引き算も論理演算も1台でこなす ALU(演算装置)まで。CPUの心臓部を、自分で動かして組み上げましょう。
1. 1桁の足し算 — 半加算器
2進数の1桁の足し算を考えます。0+0=0、0+1=1、1+0=1、そして 1+1=10(桁上がり)。つまり出力は2つ必要 — 和 S と 桁上げ C。よく見ると S は XOR、C は AND そのもの。これだけで1桁加算器の完成です。A・B を切り替えてみてください。
半加算器 — XOR が和、AND が桁上げ
緑に光れば1。A=1, B=1 のとき、和 S は 0 に戻り桁上げ C が 1 になる(1+1=2進数で「10」)。XOR と AND、たった2つのゲートが1桁の足し算の正体です。
S = A ⊕ B C = A · B
S=和(sum)、C=桁上げ(carry)。この2出力で「1+1=10」まで表せる
POINT — なぜ「半」加算器?
半加算器は、下の桁からの桁上げを受け取れない。1桁目はそれでよいが、2桁目以降は「前の桁からの繰り上がり」も足す必要がある。そこで入力を1つ増やしたのが次の全加算器。
2. 桁上げを受け取る — 全加算器
全加算器は入力が3つ:A・B・下位からの桁上げ Cin。作り方はシンプルで、半加算器を2つつなぎ、2つの桁上げを OR でまとめるだけ。A・B・Cin を切り替えて、内部の信号(s1・c1・c2)がどう伝わるかを見てください。
全加算器 — 半加算器2つ + OR
1つ目の半加算器が A+B を計算し、2つ目がそこに Cin を足す。どちらかで桁上げが出れば、OR を通って Cout=1。3つの入力の合計(0〜3)が、Cout と S の2桁でちゃんと表せます。
3. 多ビットを足す — リップルキャリー加算器
1桁ぶんの全加算器を桁の数だけ横に並べ、各桁の桁上げ Cout をひとつ上の桁の Cin につなぐ。すると下の桁から順に計算が進み、桁上げが波(ripple)のように左へ伝わっていきます。A・B をセットして、キャリーが伝播する様子を眺めてください。
リップルキャリー加算器 — 桁上げが左へ伝わる
右端(一番下の桁)から計算がスタートし、オレンジの桁上げトークンが左へ流れます。各桁が確定すると下段に結果が現れる。桁上げの連鎖が長いほど計算が遅くなる — これが「加算器の速さ」の課題です。
注意 — 桁あふれ(オーバーフロー)
n ビットの加算器の結果が n ビットに収まらないと、一番上の桁上げがはみ出して結果が化ける。例えば 4 ビットで 1111 + 0001 は 10000 だが、下位4桁だけ残ると 0000。プログラムの整数オーバーフローは、まさにこれ。
4. 1台で何でもこなす — ALU
足し算器に少し回路を足すと、引き算・AND・OR なども同じハードでこなせます。どの演算をするかは 制御信号(オペコード)で選ぶだけ。この「演算の選べる箱」が ALU(算術論理演算装置)。CPUが命令を実行するとき、実際に計算しているのはここです。A・B と演算を選んでみましょう。
ALU — 制御信号で演算を切り替える
同じA・Bでも、制御信号(00/01/10/11)を変えるだけで出力が加算・減算・AND・OR に切り替わります。中身は加算器や論理ゲートの集まりで、最後に「どれを出力するか」を制御信号が選んでいるだけ。ゼロ・桁上げ・負のフラグも一緒に出ます。
5. まとめ — ゲートから計算機へ
- 半加算器:XOR(和)+AND(桁上げ)で1桁の足し算。
- 全加算器:半加算器2つ+ORで、下位からの桁上げも足せる。
- リップルキャリー加算器:全加算器を並べ、桁上げを伝播させて多ビット加算。
- ALU:制御信号で加算・減算・論理演算を切り替える演算の中枢。
一歩先へ — もっと速く、もっと賢く
桁上げが端から端まで伝わるのを待つリップルキャリーは遅い。実際のCPUは、桁上げを先に予測するキャリールックアヘッド加算器で高速化している。掛け算は「足し算とシフトの繰り返し」、割り算も同様に、すべては加算器の応用。そして「どの演算をするか」を決める制御信号は、次のレッスンで学ぶ命令デコーダが命令から生成する — こうして ALU は CPU の一部になる。