← ブログに戻る算術論理演算装置(ALU)

ALUの仕組み:論理ゲートから作る算術論理演算装置

加算器、ビット単位論理、シフタ、結果マルチプレクサから小さなALUを構成し、キャリー、ゼロ、負、オーバーフローの出力を導きます。

DennyDenny
読了まで約10分
Chalkboard feature illustration for “ALUの仕組み:論理ゲートから作る算術論理演算装置”

**要約:**小さなALUは組み合わせデータパスです。候補となる算術、論理、シフトの各機能が同じ入力ワードに対して動作し、マルチプレクサが外部に見せる結果を選びます。演算の符号化、キャリー/ボローの意味、オーバーフローの挙動、フラグ書き込みの方針を明確にして初めて、設計は完成します。

算術論理演算装置(ALU)は、プロセッサがデータを変換する場所です。ADDとSUBには加算器が必要です。AND、OR、XORには並列のゲートレーンが必要で、シフトには配線またはシフタネットワークが必要です。そして結果マルチプレクサが、どの候補を行き先へ届けるかを選びます。

このブロック図は4ビットや8ビットで作れるほど単純でありながら、実際の設計判断をいくつも明らかにするには十分な豊かさを持っています。

  • 減算はボローを報告するのか、それとも非ボローを報告するのか。
  • 右シフトではゼロを埋めるのか、それとも符号ビットを複製するのか。
  • オーバーフロー出力を定義するのはどの演算か。
  • フラグはALU自身が保持するのか、それとも別のレジスタが取り込むのか。
  • 大きな機能をすべて並列に計算してから1つを選ぶのか、それとも面積を減らすために論理を共有するのか。

このガイドでは、一貫した4ビット教育用ALUを組み立て、別のアーキテクチャが異なる選択をし得る箇所を示します。

インターフェースの契約から始める

ある演算が明示的に符号付き解釈を求めない限り、符号なしビットベクトルを仮定します。

ポート幅方向意味
A4入力第1オペランド
B4入力第2オペランド
OP3入力演算選択
Y4出力選択された結果
C1出力ADDではキャリー、SUBではボロー
Z1出力Y == 0000 のとき1
N1出力Y[3]
V1出力ADDまたはSUBの符号付きオーバーフロー

演算の割り当ての一例を示します。

OP機能定義
000ADDA+BA+B
001SUBA−BA-B
010ANDビットごとの A∧BA\land B
011ORビットごとの A∨BA\lor B
100XORビットごとの A⊕BA\oplus B
101NOT AA‾\overline A
110論理左シフトビット0にゼロが入る
111論理右シフトビット3にゼロが入る

これは教育用の仕様であり、標準的な符号化ではありません。実際の命令セットでは、シフト、乗算、アドレス生成、比較を別の実行ユニットに分ける場合があります。また、能力の異なるALUを複数備えることもあります。

ここで説明するALUには内部状態がありません。入力が変化すると、組み合わせネットワークを伝搬した後に出力が安定します。オペランドレジスタ、結果レジスタ、フラグレジスタは、いずれも別個の順序回路要素です。

ブロック1:加算と減算を1つの加算器で行う

リップルキャリー加算器は、4段の全加算器を接続したものです。ビットiiについて、次が成り立ちます。

Si=Ai⊕Bi′⊕ciS_i=A_i\oplus B'_i\oplus c_i ci+1=AiBi′+Aici+Bi′cic_{i+1}=A_iB'_i+A_ic_i+B'_ic_i

制御ビットSUBを使って、Bと初期キャリーを変換します。

Bi′=Bi⊕SUBB'_i=B_i\oplus SUB c0=SUBc_0=SUB

SUB=0のとき、ネットワークはA+BA+Bを計算します。SUB=1のときは、次を計算します。

A+B‾+1=A−B(mod24)A+\overline B+1=A-B\pmod {2^4}

加算器の最終キャリー出力は、演算によって解釈が異なります。

  • ADDの後では、c4=1c_4=1は符号なしの和が15を超えたことを意味します。
  • SUBの後では、c4=1c_4=1は符号なしのボローが必要なかったことを意味します。

DigiSim の ALU は、ADD の後は未反転のキャリー出力を C として公開しますが、SUB の後はその補数を公開します。

CSUB=c4‾C_{\text{SUB}}=\overline{c_4}

したがって、減算後の C=1 は、符号なしボローが発生したこと(A<BA<B)を意味します。結果ビットは引き続き同じモジュロ 242^4 の和から生成され、変わるのはフラグの極性だけです。

オーバーフローはキャリーではない

符号付きオーバーフローは2の補数での−8-8から+7+7の範囲に関わります。一方、キャリーは符号なしの0から15の範囲に関わります。

加算では次のようになります。

Vadd=A3⊕B3‾∧(A3⊕Y3)V_{\text{add}} = \overline{A_3\oplus B_3}\land(A_3\oplus Y_3)

減算では次のようになります。

Vsub=(A3⊕B3)∧(A3⊕Y3)V_{\text{sub}} = (A_3\oplus B_3)\land(A_3\oplus Y_3)

この加算器/減算器では、同値な表現としてV=c3⊕c4V=c_3\oplus c_4も使えます。CとVを分けておけば、同じ4ビットの結果を符号なしと符号付きの両方として正しく解釈できます。

ブロック2:並列ビット単位論理

各ビットレーンは、独立して論理を計算します。

ANDi=AiBiAND_i=A_iB_i ORi=Ai+BiOR_i=A_i+B_i XORi=Ai⊕BiXOR_i=A_i\oplus B_i NOTi=Ai‾NOT_i=\overline{A_i}

概念的な実装では、4本の候補バスがすべて並列に存在します。合成ツールは項を共有したり、機能をルックアップテーブルにマッピングしたり、複合標準セルを選んだりできます。「ビットごとに1ゲート」という説明はブール構造を表すものであり、トランジスタ数や物理的な遅延を保証するものではありません。

ビット単位の機能にはワード全体にわたるキャリー依存はありませんが、選択された結果は依然としてゲート、配線、出力マルチプレクサを通過します。瞬時に得られるわけではありません。

ブロック3:シフト

固定の1ビット論理シフトは、配線として表せます。

SHL(A):  Y3=A2, Y2=A1, Y1=A0, Y0=0
SHR(A):  Y3=0,  Y2=A3, Y1=A2, Y0=A1

ISAで指定されていれば、シフトアウトされたビットをキャリー候補として保持できます。

SHL carry candidate = A3
SHR carry candidate = A0

算術右シフトとの違いは最上位だけです。A3をY3へコピーして、符号を拡張します。可変距離のシフトにはバレルシフタのような選択可能なルーティングネットワークが必要ですが、1ビット固定シフトには必要ありません。

ブロック4:結果マルチプレクサ

出力マルチプレクサがOPに意味を与えます。概念的には次のとおりです。

case OP
  000: Y = arithmetic_sum
  001: Y = arithmetic_difference
  010: Y = bitwise_and
  011: Y = bitwise_or
  100: Y = bitwise_xor
  101: Y = bitwise_not_a
  110: Y = shift_left
  111: Y = shift_right

4ビットの場合、各結果ビットに1個ずつ8入力1出力のマルチプレクサとして描けます。プログラマブルロジックでは、ルックアップテーブルとルーティングリソースにマッピングされるかもしれません。ASICでは、マルチプレクサセル、AOI/OAI構造、または合成によって選ばれる別の因数分解されたネットワークになる場合があります。

結果選択も、クリティカルタイミングパスの一部です。

tALU,max≈max⁡(tcandidate functions)+tresult select+troutingt_{\text{ALU,max}} \approx \max(t_{\text{candidate functions}}) +t_{\text{result select}} +t_{\text{routing}}

この式は設計上の見積もりであり、サインオフ方程式ではありません。物理的なタイミングは、セル、ファンアウト、配線、電圧、温度、実装に依存します。

結果フラグ

選択されたY値から、演算に依存しない2つの候補が生成されます。

Z=Y3∨Y2∨Y1∨Y0‾Z=\overline{Y_3\lor Y_2\lor Y_1\lor Y_0} N=Y3N=Y_3

CとVは演算固有です。この教育用ALUで一貫性のある方針は次のとおりです。

演算CV
ADD最終キャリー出力加算オーバーフロー
SUBボロー(A<BA<B)、すなわち最終キャリー出力の補数減算オーバーフロー
SHLMSBからシフトアウトしたビット0
SHRLSBからシフトアウトしたビット0
AND/OR/XOR/NOT00

別の設計では、論理演算でCとVをクリアせず、保持することもできます。それはISAと制御方針の選択です。組み合わせALUは候補信号を提示し、クロック同期のフラグレジスタが、格納ビットをロード、保持、または選択的に更新するかを決めます。

符号フラグNは結果のMSBです。しかし、減算後の符号付き小なり判定として、それだけでは正しくありません。符号付きオーバーフローを補正するためにN⊕VN\oplus Vを使います。

4ビットの計算例

6 - 3

A        = 0110
B        = 0011
~B       = 1100
A + ~B+1 = 1 0011

格納される結果は 0011(3)です。未反転のキャリー出力は 1 なのでボローは発生せず、ボローとして符号化する DigiSim の C 出力は 0 です。

Y=0011, Z=0, C=0, N=0, V=0

3 - 6

A        = 0011
B        = 0110
A + ~B+1 = 0 1101

1101 は、符号なしでは 13、符号付きでは -3 です。未反転のキャリー出力は 0 なので、符号なしボローが発生し、C は 1 です。

Y=1101, Z=0, C=1, N=1, V=0

7 + 1

0111 + 0001 = 1000

符号なしキャリーはありませんが、+8は符号付き4ビット2の補数には収まりません。

Y=1000, Z=0, C=0, N=1, V=1

15 + 1

1111 + 0001 = 1 0000

符号なしの結果は折り返し、キャリーを生成します。符号付き演算としては、-1 + 1 = 0は有効です。

Y=0000, Z=1, C=1, N=0, V=0

この最後の2つのベクトルは、CとVが同じものではないことを示しています。

CPUにおけるALUの位置

小さな単一サイクルのデータパスでは、次のような順序で処理が進みます。

  1. ソースレジスタがAとBを提示する。
  2. 制御ユニットがOPを選択する。
  3. ALUとフラグ生成論理が安定する。
  4. アクティブなクロックエッジで、宛先レジスタがYを取り込む。
  5. 有効なら、フラグレジスタが選択されたステータスビットを取り込む。

最大クロック周波数は、ALUだけではなく、レジスタからレジスタまでの最長の完全なパスに依存します。そのパスには、レジスタのclock-to-Q遅延、オペランド選択、ALU論理、結果のルーティング、宛先のセットアップ時間、クロック不確かさ、スキューが含まれ得ます。ALUがクリティカルになる場合もありますが、別のマイクロアーキテクチャではキャッシュアクセス、バイパスネットワーク、デコード、その他の論理が支配的になることがあります。

加算器を最適化しても、システム周波数が自動的に1対1で改善するわけではありません。配置配線後にそのパスが制約となっており、回復したマージンが別の場所で消費されない場合にのみ役立ちます。タイミングの全体像については、伝搬遅延とクロックスキューを参照してください。

歴史的な参照例としての74181

4ビットの74181ファミリは、そのインターフェースが機能選択、モード選択、キャリー入力、キャリー出力、グループキャリー信号を公開しているため、有用な例です。算術・論理機能の一覧をサポートし、キャリールックアヘッドを使ってより広いワード幅へ組み合わせることができます。

ただし、これを現代CPUのトランジスタレベルの設計図と見なすべきではありません。今日のプロセッサには、複数の専用整数実行ユニット、分離されたベクトルおよび浮動小数点データパス、分散した分岐比較論理、実装固有の加算器構造がある場合があります。それでも残るのはアーキテクチャ上のパターンです。オペランドワードを変換し、結果を選択し、正確に定義されたステータス情報を報告します。

4ビット版を構築して検証する

より大きな参照としてDigiSimの8ビットALUテンプレートを使うか、4ビットのインターフェースを直接構築してください。

  1. B XOR SUBとc0=SUBを用いて、4段の加算器/減算器を構築する。
  2. 並列のAND、OR、XOR、NOTレーンを追加する。
  3. 論理シフトを配線し、Cで使う場合はシフトアウトしたビットを保持する。
  4. 8ウェイ4ビットマルチプレクサで結果を選択する。
  5. 選択された結果からZを、MSBからNを生成する。
  6. 演算表に従ってCとVを選択する。
  7. A、B、OP、Y、C、Z、N、Vをプローブする。

通常の値で各オペコードを検証した後、境界値も狙ってください。

  • ゼロの結果。
  • すべて1に1を加える場合。
  • 最大の符号付き正数に1を加える場合。
  • 最小の符号付き負数から1を引く場合。
  • ボローがある減算とない減算の両方。
  • 出ていくビットが1である左シフトと右シフト。
  • 演算クラスを切り替えるときのフラグの振る舞い。

機能シミュレータは、真理値表と制御シーケンスを確立できます。しかし、物理チップの最大周波数、アナログのメタステーブルな挙動、プロセスおよび環境コーナー全体でのタイミングを証明するものではありません。

データパスが動作したら、クロック同期のCPUフラグレジスタと分岐デコーダに接続します。ここで組み合わせ計算は永続的なアーキテクチャ状態となり、プログラムカウンタを変更できるようになります。

参考文献

アイデアを実際に動く回路にしましょう。