自分で ALU を作成する方法を教えてください

コンピューターは歯車なしでどうやって計算を行うのでしょうか?

ALU はコンピューターの計算を担当するコンポーネントです。この記事では、ALU を自分で作成する方法を説明します。

最初の ALU

1970 年に、単一チップにパッケージ化された最初の完全な ALU、Intel 74181 が誕生しました。これは当時の驚くべきエンジニアリングの偉業でした。

演算器

バイナリでは、1=true、0=false

2 つの数字を加算する

加算回路半加算器(キャリー非対応)

2 つのビットを追加します (ビットは 0 または 1)。

2 つの入力 AB、1 つの出力は AB の合計です。これら 3 つの値はすべて単一ビット (0 または 1) です。

0+0=0

論理ゲートに変換すると、両方の入力が false になり、出力も false になります。XOR論理ゲートと同じ

1+0=1、0+1=1

これを論理ゲートに変換すると、1 つの入力は true、1 つの入力は false、出力は true になります。これは、XOR 論理ゲートとも一致します。

(特別) 1+1=0 にはキャリーが必要です

1+1 の結果は 0 で、1 が次のビットに進みます。XOR 論理ゲートがこれをサポートしていないことがわかります (入力はすべて true で、出力は false ですが、これは部分的にのみ正しいです)。また、carry を示す出力ラインも必要なので、少し変更する必要があります。

上記の状況に従って、キャリー番号を表す新しい出力行が追加されます。このキャリーの出力は、1+1 の場合にのみ 1 を出力します (すべての入力が true の場合に true になります)。これは AND 論理ゲートのように見えますか?

2 つの入力ラインをキャリーの処理に特別に使用される AND 論理ゲートに接続すると、1 ビット加算器 (現時点ではキャリー入力を処理できません。半加算器とも呼ばれます) が準備されます。

独立したコンポーネントへの抽象カプセル化

別のコンポーネントとしてカプセル化します。

2 つの入力 AB、2 つの出力 SUM は合計を表し、CARRY はキャリーを表します (次の桁を計算するときは、前の桁のキャリーを加算する必要があります)

全加算器(キャリー対応加算器)

先ほどキャリーについて触れましたが、次のビットを計算する際には前のビットのキャリーを加算する必要がありますが、上記では1ビットの加算だけで完了します(キャリー入力の加算処理は必要ありません)。複数のビットを操作する必要がある場合、これが必要です。もう 1 つの入力キャリーがあります。3 つの入力を必要とするこの種の加算器は全加算器と呼ばれ、キャリーの計算に使用されます。

全加算器の演算表を見てください。

入力 AB は 2 つあり、1 つは前の入力のキャリー C です。

2 つの出力のうちの 1 つは、次の加算器の C として次の加算器のキャリー ビットを表し、SUM はこのビットの計算結果を表します。

実装のアイデア

出力合計

まず、私たち人間がどのように計算を行うかを見てみましょう。まず 2 つの入力 AB を加算し、次に合計とキャリーを加算します最初のステップの計算は 1 ビットの加算であり、2 ステップ目の結果とキャリー加算も 1 ビットの加算であるため、半加算器を 2 つ組み立てます。

最初の半加算器は、結果 (最初の 2 つの入力: AB) を計算するために使用されます

2 番目の半加算器は、前の半加算器の結果とキャリーを入力として受け入れます (前の半加算器の SUM とキャリー [3 番目の入力])

出力キャリー

まず、キャリーが必要な 2 つのケースを見てみましょう。

1. 2 つの入力自体にキャリーが必要です(AB が両方とも 1 の場合、1+1 自体にキャリーが必要です)。この状況は最初の加算器のキャリーではないでしょうか~~

2. 2 つの AB の計算結果は 1 なので、1 もキャリーする必要がありますこの状況は2番目の加算器のキャリー出力(ABの出力とキャリーを加算)ではないでしょうか~~

2 つの条件のいずれかが成立した場合、キャリーが必要であることがわかります。したがって、OR ゲートを使用して 2 つの半加算器のキャリーを全加算器の CARRY 出力に接続します。

説明する:

これは依然として 1 ビット加算器ですが、半加算器より 1 つ多いキャリー入力をサポートしていることに注意してください。このタイプの加算器は全加算器と呼ばれます。

検証プロセスは次のようになります。左側の AB が入力、右側の CS がキャリーとサムです。2 番目の加算器の入力 AB (実際には、入力 AB が最初の加算器と入力 C の合計を表すわけではありません) を混同しないでください。

読者は、上記の全加算器テーブルと組み合わせて ABC を入力し、対応する最終的な SUM と CARRY が正しいかどうかを確認できます。

独立したコンポーネントへの抽象カプセル化

入力キャリーが半加算器より 1 つ多い

8ビット加算器を作成する

以上が1ビットの加算演算である。複数のビットに対して複数の加算器を組み合わせるだけです。


数字を表す:

A、B は入力として 2 つの 8 桁の数値を表し、数値を表すために A0、A1、A2... が使用されます。


計算:

明らかに、キャリーがないため、A0 と B0 は半加算器を使用して演算できます

次に、全加算器を使用して、A1B1 と A0B0 の 3 つのキャリー ビットを演算の入力として接続します。

3位、4位…と続きます。

図を見てください: 最初の計算では半加算器が使用され、次に全加算器が使用されます (全加算器の入力 C は前の加算器のキャリー出力であることに注意してください)

計算を続けて、最後にsum0、sum1、各ビットの合計を並べて結果を求めます。

8 ビット加算器とは、コンピュータが 8 ビット長で表現されたデータ ブロックを処理すること、つまり 8 ビット コンピュータを意味します。

オーバーフロー

9 番目の桁にキャリーがある (つまり、キャリー 7 が 1) 場合は、2 つの数値の合計が大きすぎて 8 桁を超えていることを意味します。

たとえば、 999+1の 3 番目の出力キャリーが1の場合、つまり4 番目のビットのキャリーは 1 になります。結果は、1000 が 3 桁を超えます。これはオーバーフローです

一般に、「オーバーフロー」とは、2 つの数値の合計が大きすぎて、元の桁数を超えないことを意味します。これにより、エラーや予測不可能な結果が生じる可能性があります。

「パックマン」オーバーフロー事件

パックマン ゲームは、現在のレベル番号を保存するために 8 ビットを使用します。レベル 256 ( 8 ビットの最大表現は 256 ) までプレイすると、ALU がオーバーフローします(このレベル番号を表すには 9 ビットが必要であり、上の例と比較すると、1000の桁を追加して表現するだけでは十分ではなく、エラーやコード化けが続出し、レベルを進めることができなくなります。

このバグは、強力なパックマン プレイヤーの象徴となっています。

オーバーフローを避ける

オーバーフローを回避する方法も非常に簡単で、上記の 999+1 の例と同じで、もう1 ビット追加します。つまり、余分なビット(999+ で使用される)を計算するために全加算器を追加する必要があります。 1 3桁の足し算です。4桁の1000になりたい場合は4桁の足し算をサポートする必要があります。

与えられた例は 10 進数で示されているため、読者は意味を理解できます。

したがって、解決策は、16 ビットまたは 32 ビットの数値を演算できる全加算器をさらに追加することです。これにより、オーバーフローが発生しにくくなりますが、より多くの論理ゲートが必要となり、各桁上げ演算には少し時間がかかり、高速ではありますが、今の時代、1秒間に数十億回の計算が行われ、どんなに小さな遅延でも増幅されてしまいます。

キャリー先読み加算器

最近のコンピュータでは、桁上げ先読み加算器を使用する、多少異なる加算回路が使用されています。同じことをより高速に実行し、2 進数を追加します。

その他の数学演算

ALU は他の数学演算もサポートしており、通常は次の 8 つがサポートされており、加算器と同様に論理ゲートで構成されています。

掛け算と割り算

単純な ALU 回路には乗算と除算はありませんが、複数の加算を使用して乗算を実現します。

たとえば、12X5 は 12 を 5 回加算するのと同じで、結果を得るには 5 回の ALU 演算が必要です。

遅いですが、うまくいきます! はは、テレビのリモコン、電子レンジ、サーモスタットなどの単純なプロセッサーはこのようにして作られています。

しかし、コンピュータや携帯電話には、このような複雑な演算の処理に特化した優れたプロセッサと演算装置が搭載されており、その本質はより多くの論理ゲートを組み立てることにあります。

論理ユニット

論理ユニットは、前述の AND、OR、XOR の単純な論理などの論理演算を実行しますが、一部の複雑な論理判断も行うことができます。

次の回路は、出力番号が 0 かどうかを判定するために使用されます。番号が 0 の場合、出力は true1 になります。

OR ゲートを介して 1 が存在する限り、数値のビットの 1 つが 1 であるため、最終出力は 0false になります。

独立したコンポーネントへの抽象カプセル化

まず、INPUTA と INPUTB は2 つの 8 ビット入力です(8 ビット ALU であるため)。

オペレーション コード: 4 桁のオペレーション コードは、ALU がどのような種類の演算を実行する必要があるかを示すために使用されます。たとえば、加算 ADD は 1000、減算は 1100 です。

OUTPUTというのは出力結果も8Bitということですが、オーバーフローしているかどうかはどうやってわかるのでしょうか?心配しないでください。それらは以下にリストされます。


右側の FLAGS は 1 ビット (1Bit) で、特定の状態を表します (次の 3 つの状態が最も一般的に使用され、高度な ALU にはさらに多くの FLAGS が含まれます)。

  • OVERFLOW オーバーフロー フラグは、オーバーフローしたかどうかを表しますこのラインは加算器のキャリービットに接続されています
  • ZERO は、結果が 0 であるかどうかを表します (数値が 0 であるかどうかを判断する上記の論理ユニット操作を通じて)
  • NEGATIVE は負の符号を表し、AB が 0 未満の場合は 1 になります。

要約する

さて、上記の説明で、8 ビットを処理できる ALU (算術演算器および論理演算器) が作成できました。ただし、記事の冒頭で説明した Intel 74181 は 4 ビットの ALU しか処理できません。 Intel よりも優れた ALU、悪くない ALU! まだ完全には作成されていませんが、概念と原則はすでに理解しています。

74181 には 70 個の回路があり、乗算や除算は処理できませんでしたが、小型化への大きな一歩となり、コンピュータがより小さく、より安価になりました。

次の記事ではこのALUを使ってCPUを作りますが、その前にコンピュータには計算結果を記録するための「メモリ」が必要です。計算後に捨ててしまってはあまり意味がありません。結果は後で使用します。次の記事ではメモリモジュールについて説明します。


オリジナルビデオ

[コンピュータサイエンス短期集中コース][全40話/微修正] - コンピュータサイエンス短期集中コース

Youtubeオリジナル動画

元のリンク:自分で ALU を作成する方法を教えます - Nuggets (juejin.cn)

おすすめ

転載: blog.csdn.net/m0_65909361/article/details/132893490