
コンピューティングにおいて、算術論理ユニット(ALU)は、整数の2進数に対して算術演算とビット演算を実行する組み合わせ デジタル回路です。[1] [2]これは、浮動小数点数で動作する浮動小数点ユニット(FPU)とは対照的です。これは、コンピューターの中央処理装置(CPU)、FPU、グラフィックス処理装置(GPU)など、多くの種類のコンピューティング回路の基本的な構成要素です。 [3]
ALU への入力は、オペランドと呼ばれる演算の対象となるデータと、実行される演算を示すコードです。ALU の出力は、実行された演算の結果です。多くの設計では、ALU にはステータス入力または出力、あるいはその両方があり、それぞれ ALU と外部ステータス レジスタの間で、前の演算または現在の演算に関する情報を伝えます。
信号
ALU にはさまざまな入力ネットと出力ネットがあり、これらはALU と外部回路の間でデジタル信号を伝達するために使用される電気導体です。ALU が動作しているとき、外部回路は ALU 入力に信号を適用し、それに応じて ALU は信号を生成し、出力を介して外部回路に伝達します。
データ
基本的な ALU には、 2 つの入力オペランド( AとB ) と結果出力 ( Y )で構成される3 つの並列データバスがあります。各データ バスは、1 つの 2 進整数を伝達する信号のグループです。通常、A、B、および Y バス幅 (各バスを構成する信号の数) は同一であり、外部回路 (カプセル化 CPU またはその他のプロセッサなど) の ネイティブワード サイズと一致します。
オペコード
オペコード入力は、ALU に演算選択コードを伝達するパラレル バスです。演算選択コードは、 ALU が実行する算術演算または論理演算を指定する列挙値です。オペコードサイズ (バス幅) によって、ALU が実行できる個別の演算の最大数が決まります。たとえば、4 ビットのオペコードは、最大 16 個の異なる ALU 演算を指定できます。一般に、ALU オペコードはマシン言語オペコードと同じではありませんが、マシン言語オペコード内のビット フィールドとして直接エンコードされる場合もあります。
状態
出力
ステータス出力は、現在の ALU 演算の結果に関する補足情報を伝えるさまざまな個別の信号です。汎用 ALU には、次のようなステータス信号が一般的にあります。
- キャリーアウトは、加算演算の結果としてのキャリー、減算演算の結果としてのボロー、またはバイナリ シフト演算の結果としてのオーバーフロー ビットを伝えます。
- ゼロ。これは、Y のすべてのビットが論理ゼロであることを示します。
- 負。算術演算の結果が負であることを示します。
- オーバーフローは、算術演算の結果が Y の数値範囲を超えたことを示します。
- パリティは、Y 内の偶数ビットまたは奇数ビットが論理 1 であるかどうかを示します。
各 ALU 演算が完了すると、ステータス出力信号は通常、将来の ALU 演算 (たとえば、多倍長演算の実装) や条件分岐の制御に使用できるように外部レジスタに保存されます。ステータス出力を保存するビット レジスタの集合は、多くの場合、単一のマルチビット レジスタとして扱われ、「ステータス レジスタ」または「条件コード レジスタ」と呼ばれます。
入力
ステータス入力により、演算を実行するときに ALU に追加情報を利用できるようになります。通常、これは、以前の ALU 演算から保存されたキャリーアウトである単一の「キャリーイン」ビットです。
回路動作

ALU は組み合わせ論理回路であり、入力の変化に応じて出力が非同期的に変化します。通常の動作では、安定した信号がすべての ALU 入力に適用され、信号が ALU 回路を伝搬するのに十分な時間 (「伝搬遅延」と呼ばれる) が経過すると、ALU 演算の結果が ALU 出力に表示されます。ALU に接続された外部回路は、演算全体にわたって ALU 入力信号の安定性を確保し、ALU 結果をサンプリングする前に信号が ALU を伝搬するのに十分な時間を確保する役割を担っています。
一般的に、外部回路は入力に信号を適用することで ALU を制御します。通常、外部回路はシーケンシャル ロジックを使用してALU 操作を制御します。この操作は、最悪の状況でも ALU 出力が安定するのに十分な時間を確保するために十分に低い周波数のクロック信号によってペースが調整されます。
たとえば、CPU は、オペランドをそのソース (通常はレジスタ) から ALU のオペランド入力にルーティングすることによって ALU 加算操作を開始します。同時に、制御ユニットはALU のオペコード入力に値を適用し、加算を実行するように設定します。同時に、CPU は ALU 結果出力を合計を受け取る宛先レジスタにルーティングします。次のクロックまで安定している ALU の入力信号は、CPU が次のクロックを待つ間に ALU を介して宛先レジスタに伝播できます。次のクロックが到着すると、宛先レジスタに ALU 結果が格納され、ALU 操作が完了しているため、ALU 入力は次の ALU 操作用にセットアップされます。
機能
ALUは、一般的にいくつかの基本的な算術演算とビット論理演算をサポートしています。基本的な汎用ALUには、通常、次の演算が含まれています。[1] [2] [4]
算術演算
- 加算: A と B が加算され、その合計が Y とキャリーアウトに表示されます。
- キャリー付き加算: A、B、キャリーインが合計され、その合計が Y とキャリーアウトに表示されます。
- 減算: B が A から減算され (またはその逆)、その差が Y とキャリー アウトに表示されます。この機能では、キャリー アウトは実質的に「借用」インジケータです。この操作は、A と B の大きさを比較するためにも使用できます。このような場合、プロセッサは Y 出力を無視できます。プロセッサは、操作の結果のステータス ビット (特にゼロと負の値) のみに関心があります。
- 借入による減算: 借入 (キャリーイン) により B が A から減算され (またはその逆)、その差が Y とキャリーアウト (借入アウト) に表示されます。
- 2 の補数: A (または B) をゼロから減算し、その差が Y に表示されます。
- 増分: A (または B) が 1 増加し、結果の値が Y に表示されます。
- 減分: A (または B) が 1 減少し、結果の値が Y に表示されます。
- パススルー: A (または B) のすべてのビットが Y で変更されずに表示されます。この操作は通常、オペランドのパリティまたはそれがゼロか負かを判断するため、またはオペランドをプロセッサ レジスタにロードするために使用されます。
ビット論理演算
- AND : A と B のビット単位の AND が Y に表示されます。
- OR : A と B のビット単位の OR が Y に表示されます。
- 排他的論理和: A と B のビット単位の XOR が Y に表示されます。
- 1 の補数: A (または B) のすべてのビットが反転され、Y に表示されます。
ビットシフト操作
ALU シフト操作により、オペランド A (または B) が左または右にシフトされ (オペコードによって異なります)、シフトされたオペランドが Y に表示されます。単純な ALU では通常、オペランドを 1 ビット位置だけシフトできますが、より複雑な ALU ではバレル シフターが採用されており、1 回の操作でオペランドを任意のビット数だけシフトできます。すべての 1 ビット シフト操作では、オペランドからシフトされたビットがキャリー アウトに表示されます。オペランドにシフトされたビットの値は、シフトの種類によって異なります。
- 算術シフト: オペランドは2 の補数の整数として扱われます。つまり、最上位ビットは「符号」ビットであり、保持されます。
- 論理シフト: 論理ゼロがオペランドにシフトされます。これは、符号なし整数をシフトするために使用されます。
- 回転: オペランドはビットの循環バッファとして扱われるため、最下位ビットと最上位ビットは実質的に隣接します。
- キャリーによる回転: キャリー ビットとオペランドは、ビットの循環バッファとしてまとめて扱われます。
アプリケーション
多倍長演算
整数演算計算において、倍精度演算は ALU ワード サイズより大きい整数を操作するアルゴリズムです。このため、アルゴリズムは各オペランドを ALU サイズのフラグメントの順序付きコレクションとして扱い、最上位 (MS) から最下位 (LS) またはその逆の順序で並べます。たとえば、8 ビット ALU の場合、24 ビット整数は3 つの 8 ビット フラグメント(MS)、、および(LS)0x123456のコレクションとして扱われます。フラグメントのサイズは ALU ワード サイズと正確に一致するため、ALU はこのオペランドの「部分」を直接操作できます。
0x120x340x56
このアルゴリズムは、ALU を使用して特定のオペランド フラグメントを直接操作し、多倍精度結果の対応するフラグメント (「部分」) を生成します。各部分は、生成されると、多倍精度結果用に指定された関連するストレージ領域に書き込まれます。このプロセスは、すべてのオペランド フラグメントに対して繰り返され、多倍精度演算の結果である完全な部分コレクションが生成されます。
算術演算 (加算、減算など) では、アルゴリズムはまずオペランドの LS フラグメントに対して ALU 演算を呼び出し、LS 部分ビットとキャリー アウト ビットの両方を生成します。アルゴリズムは部分ビットを指定されたストレージに書き込みますが、プロセッサのステート マシンは通常、キャリー アウト ビットを ALU ステータス レジスタに格納します。次に、アルゴリズムは各オペランドのコレクションの次のフラグメントに進み、これらのフラグメントと、前の ALU 演算から格納されたキャリー ビットに対して ALU 演算を呼び出し、別の (より重要な) 部分ビットとキャリー アウト ビットを生成します。前と同様に、キャリー ビットはステータス レジスタに格納され、部分は指定されたストレージに書き込まれます。このプロセスは、すべてのオペランド フラグメントが処理されるまで繰り返され、結果としてストレージ内の部分の完全なコレクションが生成され、これが多精度算術演算結果となります。
複数精度シフト演算では、オペランド フラグメントの処理順序はシフト方向によって異なります。左シフト演算では、格納されたキャリー ビットを介して伝達される各部分の LS ビットは、以前に左にシフトされた、より重要度の低いオペランドの MS ビットから取得する必要があるため、フラグメントは LS から先に処理されます。逆に、右シフト演算では、各部分の MS ビットは、以前に右にシフトされた、より重要度の高いオペランドの LS ビットから取得する必要があるため、オペランドは MS から先に処理されます。
ビット単位の論理演算 (例: 論理 AND、論理 OR) では、各部分は対応するオペランド フラグメントのみに依存するため (前の ALU 演算から格納されたキャリー ビットは無視される)、オペランド フラグメントは任意の順序で処理される可能性があります。
複雑な操作
ALU は複雑な機能を実行するように設計できますが、回路が複雑になり、コスト、消費電力、サイズが大きくなるため、多くの場合、実用的ではありません。その結果、ALU は、非常に高速 (つまり、伝播遅延が非常に短い) で実行できる単純な機能に限定されることが多く、外部プロセッサ回路は、より単純な ALU 操作のシーケンスを調整して複雑な機能を実行する役割を担います。
たとえば、数値の平方根の計算は、ALU の複雑さに応じてさまざまな方法で実装できます。
- 1 クロックでの計算: 1 回の操作で平方根を計算する非常に複雑な ALU。
- 計算パイプライン: 平方根を段階的に計算する単純な ALU のグループで、中間結果は工場の生産ラインのように配置された ALU を通過します。この回路は、前のオペランドが終了する前に新しいオペランドを受け入れることができ、非常に複雑な ALU と同じ速さで結果を生成しますが、結果は ALU ステージの伝播遅延の合計によって遅延されます。詳細については、命令パイプラインに関する記事を参照してください。
- 反復計算:制御ユニットの指示に従って、いくつかのステップを経て平方根を計算する単純な ALU 。
上記の実装は、最も高速で最もコストが高いものから最も低速で最もコストが低いものへと移行します。平方根はすべてのケースで計算されますが、単純な ALU を備えたプロセッサでは、複数の ALU 操作を実行する必要があるため、計算の実行に時間がかかります。
実装
ALU は通常、 74181などのスタンドアロンの集積回路(IC) として実装されるか、より複雑な IC の一部として実装されます。後者の場合、ALU は通常、VHDL、Verilog、またはその他のハードウェア記述言語で記述された記述から合成してインスタンス化されます。たとえば、次の VHDL コードは非常に単純な8 ビットALU を記述しています。
エンティティaluはポートです( -- 外部回路への alu 接続: A : in signed ( 7 downto 0 ); -- オペランド A B : in signed ( 7 downto 0 ); -- オペランド B OP : in unsigned ( 2 downto 0 ); -- オペコードY : out signed ( 7 downto 0 )); -- 演算結果end alu ;
aluのアーキテクチャの動作は、 begin case OPです。--オペコードをデコードして演算を実行します。"000"の場合、 Y < = A + Bです。--加算します。"001"の場合、Y <= A - Bです。--減算します。"010"の場合、Y <= A - 1です。--減算します。"011"の場合、Y <= A + 1です。--増分します。 "100"の場合、Y <= not Aです。-- 1 の補数を取ります。 "101"の場合、Y <= A and Bです。-- ビット単位の AND を取ります。" 110 "の場合、Y <= A or Bです。--ビット単位の OR を取ります。 "111"の場合、Y <= A xor Bです。--ビット単位の XOR を取ります。その他=> Y <= (その他=> 'X' )です。end case です。動作の終了です。
歴史
数学者ジョン・フォン・ノイマンは1945年にEDVACと呼ばれる新しいコンピュータの基礎に関する報告書の中でALUの概念を提案した。[5]
情報化時代の初期には、電子回路のコスト、サイズ、消費電力は比較的高かった。そのため、初期のコンピュータはすべて、一度に 1 つのデータ ビットを処理するシリアル ALU を備えていたが、プログラマーにはより広いワード サイズが提示されることが多かった。複数の並列の個別のシングル ビット ALU 回路を備えた最初のコンピュータは、1951 年のWhirlwind Iであり、16 個の「数学ユニット」を使用して 16 ビット ワードで動作できるようにした。
1967年、フェアチャイルドは、 8ビットの演算ユニットとアキュムレータを備えた、集積回路として実装された最初のALUのようなデバイスであるフェアチャイルド3800を発表しました。これは加算と減算のみをサポートし、論理機能はサポートしていませんでした。[6]
すぐに、 Am2901や74181などの 4 ビット ALU を含む完全な集積回路 ALU が登場しました。これらのデバイスは、通常、「ビット スライス」に対応しており、「キャリー ルック アヘッド」信号を備えていたため、相互接続された複数の ALU チップを使用して、より広いワード サイズの ALU を作成することができました。これらのデバイスはすぐに人気が高まり、ビット スライス ミニコンピュータで広く使用されました。
マイクロプロセッサは1970年代初頭に登場し始めました。トランジスタは小型化しましたが、フルワード幅のALUにはダイスペースが不十分な場合があり、その結果、初期のマイクロプロセッサの中には、機械語命令ごとに複数のサイクルを必要とする狭いALUを採用したものもありました。この例としては、人気の高いZilog Z80が挙げられます。これは、4ビットのALUで8ビットの加算を実行しました。[7]時が経つにつれ、ムーアの法則に従ってトランジスタの形状はさらに縮小し、マイクロプロセッサ上に幅の広いALUを構築することが実現可能になりました。
現代の集積回路 (IC) トランジスタは、初期のマイクロプロセッサのトランジスタよりも桁違いに小型化されているため、非常に複雑な ALU を IC に搭載することが可能です。今日、多くの現代の ALU はワード幅が広く、バレル シフタやバイナリ乗算器などのアーキテクチャ強化により、以前の ALU では複数の演算を必要とした演算を 1 クロック サイクルで実行できます。
ALUは機械回路、電気機械回路、電子回路として実現することができ[8] [検証失敗]、近年では生物学的ALUの研究が行われています[9] [10](例:アクチンベース) [11]。
参照
参考文献
- ^ ab Atul P. Godse; Deepali A. Godse (2009). "3".デジタルロジックデザイン. 技術出版物. pp. 9–3. ISBN 978-81-8431-738-1。[永久リンク切れ]
- ^ ab Atul P. Godse; Deepali A. Godse (2009). 「付録」. デジタル論理回路. 技術出版物. pp. C–1. ISBN 978-81-8431-650-6。[永久リンク切れ]
- ^ 「1. コンピュータアーキテクチャ入門 - 組み込みハードウェアの設計、第2版 [書籍]」。www.oreilly.com 。 2020年9月3日閲覧。
- ^ ホロウィッツ、ポール、ウィンフィールド・ヒル(1989)。「14.1.1」。エレクトロニクスの芸術(第 2 版)。ケンブリッジ大学出版局。pp. 990– 。ISBN 978-0-521-37095-0。
- ^ Philip Levis (2004年11月8日). 「Jonathan von Neumann and EDVAC」(PDF) . cs.berkeley.edu . pp. 1, 3. 2015年9月23日時点のオリジナル(PDF)からアーカイブ。 2015年1月20日閲覧。
- ^ シェリフ、ケン。「74181 ALUチップの内部:ダイの写真とリバースエンジニアリング」ケン・シャリフのブログ。 2024年5月7日閲覧。
- ^ ケン・シャリフ。「Z-80 には 4 ビット ALU が搭載されています。その仕組みは次のとおりです。」2013 年、righto.com
- ^ Reif, John H. (2009)、「機械計算: 物理デバイスの計算複雑性」、Meyers, Robert A. (編)、複雑性とシステム科学百科事典、ニューヨーク、NY: Springer、pp. 5466–5482、doi :10.1007/978-0-387-30440-3_325、ISBN 978-0-387-30440-3、 2020年9月3日取得
- ^ Lin, Chun-Liang; Kuo, Ting-Yu; Li, Wei-Xian (2018-08-14). 「将来のバイオコンピュータ用制御ユニットの合成」. Journal of Biological Engineering . 12 (1): 14. doi : 10.1186/s13036-018-0109-4 . ISSN 1754-1611. PMC 6092829. PMID 30127848 .
- ^ Gerd Hg Moe-Behrens. 「生物学的マイクロプロセッサ、または生物学的部品でコンピュータを構築する方法」
- ^ Das, Biplab; Paul, Avijit Kumar; De, Debashis (2019-08-16). 「アクチン量子セルオートマトンにおける非従来型の算術論理ユニットの設計とコンピューティング」。マイクロシステムテクノロジー。28 (3): 809–822。doi : 10.1007 /s00542-019-04590-1。ISSN 1432-1858。S2CID 202099203 。
さらに読む
- Hwang, Enoch (2006)。VHDL によるデジタルロジックとマイクロプロセッサ設計。Thomson。ISBN 0-534-46593-5。
- Stallings, William (2006)。『コンピュータの構成とアーキテクチャ: パフォーマンスのための設計』(第 7 版)。Pearson Prentice Hall。ISBN 0-13-185644-8。
