ALU(演算装置)はCPUを調べると内部構造の一部として必ず登場するものです。論理演算や算術計算などを担うものだそうです。 ALUの一例として74HC181という汎用ロジックICのデータシートにあった論理図をシミュレートしてみました(図2-6)。 このICは4ビットのand, or, xor, 足し算, 引き算, 比較などの一通りの基本的な演算ができる組み合わせ回路です。 下のテーブルが真理値表ですが入力がS0~S3, A0~A3, B0~B3, Cn, Mの 14個と、出力が F0~F3, A=B, Cn+4, X, Y の8個あります。 出力のうちのCn+4, X, Y については複数のICをつなぐ際のキャリーに なります。回路図の上部の複雑な部分はこのキャリーに関する部分なので、 ここを除けば回路を単純にできると思いますが、今回はデータシートにあるものをそのまま再現しました(手で作って、テストもしてないので キャリー部分は配線が間違えているかもしれませんが、その場合ご指摘ください)。また、今このICは手に入りづらいようですのでご了承ください。
近年のCPUにこのICが使われているわけではないですが、自作CPUなどにはとても使い物になるようですので、 様々な演算ができる組み合わせ回路の一例として説明します。入力のS0~S3はfunction Selectionで、 機能を選択する入力です。16通りが選択できることになります。MはModeでここでも2通りを選択できます。MがHのとき論理演算となり繰り上がりが起こりません。 MがLのときは算術演算で繰り上がり繰り下がりが起こることがあります。加算では繰り上がりが起きたときにCn+4 がLとなり、もう一つ用意したALU入力のCnに繋げれば、Lのときは(Hのときより)プラス1されるようになっているようです。 入力はA0~A3, B0~B3の4ビットずつの2値を扱えます。A0(B0)が2進数下1桁目、A3(B3)が4桁目となります。結果はF0~F3に出力されます。 引き算ではマイナス値になるときCn+4がHになり、2の補数表現になるようです。 2の補数とはビット反転して1を加えたものです。例えば-1であれば、0001(+1)のビット反転1110に1を足して1111になります。 (補数とは加算処理したとき桁あふれを無視すれば減算できるような数です。 例えば 5 – 3 → 0101 + (-0011) = 0101 + (1100 + 0001 – 10000) = 0101 + (1101 – 10000) = 0010。 このように2の補数を使えば加算で減算処理できます。※ -10000は桁あふれぶん。) 出力の「A=B」はAとBの入力値を比較するもので、M=L、Cn=H、S0~S3がLHHLのとき F = A MINUS B MINUS 1でA, Bが同じ値のとき演算結果が-1(2の補数で出力はHHHHになる)になることを利用し、 F0~F3出力が全部HのときA=BをHとするものです。 Cn+4を使えば大小も判別できることになります。
| SELECTION | ACTIVE-HIGH DATA | |||||
|---|---|---|---|---|---|---|
| M = H; LOGIC FUNCTIONS | M = L; ARITHMETIC OPERATIONS | |||||
| S0 | S1 | S2 | S3 | Cn = H (no carry) | Cn = L (with carry) | |
| L | L | L | L | F = A | F = A | F = A PLUS 1 |
| L | L | L | H | F = A + B | F = A PLUS AB | F = A PLUS AB PLUS 1 |
| L | L | H | L | F = AB | F = A PLUS AB | F = A PLUS AB PLUS 1 |
| L | L | H | H | F = 1 | F = A PLUS A | F = A PLUS A PLUS 1 |
| L | H | L | L | F = AB | F = A + B | F = (A + B) PLUS 1 |
| L | H | L | H | F = B | F = (A + B) PLUS AB | F = (A + B) PLUS AB PLUS 1 |
| L | H | H | L | F = A ^ B | F = A MINUS B MINUS 1 | F = A MINUS B |
| L | H | H | H | F = A + B | F = (A + B) PLUS A | F = (A + B) PLUS A PLUS 1 |
| H | L | L | L | F = A + B | F = A + B | F = (A + B) PLUS 1 |
| H | L | L | H | F = A ^ B | F = A PLUS B | F = A PLUS B PLUS 1 |
| H | L | H | L | F = B | F = (A + B) PLUS AB | F = (A + B) PLUS AB + PLUS 1 |
| H | L | H | H | F = A + B | F = (A + B) PLUS A | F = (A + B) PLUS A PLUS 1 |
| H | H | L | L | F = 0 | F = MINUS 1 (2’s COMPL) | F = ZERO |
| H | H | L | H | F = AB | F = AB MINUS 1 | F = AB |
| H | H | H | L | F = AB | F = AB MINUS 1 | F = AB |
| H | H | H | H | F = A | F = A MINUS 1 | F = A |