単純なALUの設計


8

次の操作をサポートする2つの8ビット入力AおよびBと制御入力x、y、zを備えたALUを設計する必要があります。

x  y  z  |  operation

0  0  0  |  S = A-B
0  0  1  |  S = A+B
0  1  0  |  S = A*8
0  1  1  |  S = A/8
1  0  0  | S = A NAND B (bitwise)
1  0  1  | S = A XOR B (bitwise)
1  1  0  | s = reverse the bits of A
1  1  1  | S = NOT A (bitwise)

これは、8ビット加算器と算術論理拡張器を使用して行われることになっています。私の教科書を読んでみると、ALエクステンダーの目的は、入力ビットを変更して、多くの追加コンポーネントではなく加算器を使用してすべてを実行できるようにすることです(または、少なくともそれは私が理解していることです) )。たとえば、AL-extenderはビットを2の補数にして、加算器が減算を行うようにします。同様に、ビットごとの論理演算では、ビットを適切に変更し、加算器入力の1つをゼロにして、結果が適切に渡されるようにすることができます。

しかし、私は乗算について正確に何をしますか?私の本は非常に漠然としているので、ALエクステンダーが加算器に機能させるために何か賢いことを要求するかどうかはわかりません(私の場合は8回加算するだけですか?...ハハ)、またはそこに乗数を投げることができます。私は除算について読まなければならないでしょうが、それは乗算に似ていると思います。

さて、とにかく、肝心なことはまだ、ALエクステンダーに何を "許可"しておくことができるか、またはその中に含めることができるかです。加算器に供給できるように入力を変更することが唯一の目的ですか?

*編集:まあ、それは8による乗算/除算なので、これは左または右に3シフトすることで簡単に実行できます。そこにシフターを追加した場合、実際の/適切なALエクステンダーはまだありますか?(多分私はこれを完全な初心者として考えすぎています...)


1
00011111 * 8とは何ですか?00000000-00000111とは何ですか?ALエクステンダーが「010」オペコードの左に3回シフトする場合、Bを0に割り当ててから、ALUで「001」または「000」オペコードを呼び出すことができます。
トニー・エニス

回答:


5

最も簡単な方法は、xyz入力を8行にデコードすることです。次に、これらから、チップセレクトラインを駆動するロジックを実装して、入力を処理する適切なユニットと、ユニットが正しい動作を実行するために必要な変換を有効にします。

論理演算に加算器を使用できないと思います。加算器にはキャリーが含まれているためです(キャリー伝播の動作を無効にする入力がない場合)。しかし、単一のユニットですべてのロジックを実行できます。

たぶん、彼らがこれらのALUをAとLに分けて呼び出す理由があるのか​​もしれません。:)

8による乗算は、下の3つの入力ラインでゼロを駆動し、上の3つのラインを無視して、ライン0をライン3に、1を4に、というようにマッピングすることを意味します。それは鉄道のスイッチのようなものです。


6

(チート)
最も単純でありながら最も強力なソリューションは、結果のルックアップテーブルとしてフラッシュメモリを使用することです。8ビットA入力+ 8ビットB入力+ 3ビットオペレーションコードは19ビットです。512 kを選択×16ビットフラッシュ(約$ 2)、19の入力ラインをアドレスとして使用し、各入力の組み合わせの結果をプログラムします。このようにして好きな操作を行うことができます。あなたは罪(A)が欲しいですか?256ワードのサインルックアップテーブルを追加するだけで、16ビットの正確な結果を得ることができます。8を掛けるだけではありません。AとBを乗算できます。同様に、AをBで除算して、8 ビットの商 8ビットの剰余を取得できます。乗算と除算では、64 kwordブロックのすべてのビットを使用しますが、たとえば、ビット反転では、ブロックの使用効率が低下します。これは、Bの値に依存しないため、256の同じ値になります。各A入力、および上位バイトは使用されません。したがって、必要なのは256のみです× 8 = 65536を使用するビット反転用の2048ビット ×16 = 1048576ビット。それはあまり効率的ではありません。これはFlashソリューションの重大な欠点と言えますが、8を実装してほしいと思います。× $ 2の基本的な論理ゲートを使用する8つの乗算器。

OK、多分あなたはそれを望まないでしょう。論理ゲートははるかに挑戦的です。Kazが言うように、各オペコードに対して一意の信号を取得するには、3対8のデコーダーから始めます。これは基本的なゲートで作成できますが、最初は74HC238を使用することをお勧めします。ALUが機能している場合でも、HC238をゲートのコレクションで置き換えることができます。

あなたがいない乗数のために欲しいのシフトが3回を左シフトレジスタです。これは、結果を即座に生成する組み合わせ関数ではなく、クロックを必要とする登録済み関数です。(フラッシュも結果をナノ秒単位で生成することに注意してください。ただし、組み合わせロジックの場合よりも遅くなります。)A0からY3、A1からY4などへのパスがあり、「010」デコードされたオペコードで有効にします。同様に、 "011"信号がアクティブ(除算)の場合、Y3はA6に接続され、opcoeが "110"(ビット反転)の場合、A4に接続されます。それは多くの多重化を意味します。

フラッシュに戻るには、NAND、NOR、左シフト、右シフトなどの単純な操作のための組み合わせロジックの組み合わせを作成することもできます、および乗算と除算にのみフラッシュを使用します。小さなフラッシュ(512 kwordではなく128 kword)を使用する、例として挙げた正弦波のようなより高度な関数を追加することができます(多分最高ではないかもしれませんが、何か考えられると思います)。



どうして8倍になっているのですか?左/右シフト、左/右回転(キャリーと非キャリーの両方)は、どのALUにも必要であり、3のシフト権限を使用して8で除算できますが、2で除算することはできません。ビット反転は、典型的なDSPです。機能はありますが、最初からDSPを構築したくありませんか?関数を次のように変更します

x  y  z  |  operation

0  0  0  |  S = A - B
0  0  1  |  S = A + B
0  1  0  |  S = shift left A by 1 bit
0  1  1  |  S = shift right A by 1 bit
1  0  0  |  S = A NAND B (bitwise)
1  0  1  |  S = A XOR B (bitwise)
1  1  0  |  S = rotate left A
1  1  1  |  S = NOT A (bitwise)

1

同じ本から同じ問題に悩まされました。幸いなことに、私はこのスレッドを偶然見つけました。Kazは、ゼロの駆動とラインのマッピングについて非常に優れています。この本のALUエクステンダーは、n(nは操作するビットの数を表す)で設計されていますが、組み合わせコンポーネントは別々で、キャリーイン用に1つの異なるコンポーネントがあります。これらのコンポーネントには、5つの入力と2つの出力があります。5つの入力は、「X」、「Y」、「Z」(操作を選択するため)および「a」、「b」(同じ意味を持つAおよびBの個々のビット)です。ここでの考え方は、問題を小さなチャンクに分割して、妥当なサイズの真理値表を作成することだと思います。これは、エクステンダーがAおよびBからのすべてのビットと制御入力を受け入れる場合、5入力vs 8 + 8 + 3 = 19入力です。さて、エクステンダーがこのように構成されている場合(19入力)、乗算のロジックはその単一のコンポーネントで実装できると思いますが、これの真理値表を書くことは問題外です。したがって、とにかく、私の解決策は、コンポーネントが入力XYZ = 010が「a」ビットを変更せずに渡し、「b」をフィルターで取り除くようにコンポーネントがすでに設計されていると仮定して、各コンポーネントの後にビットを処理する各コンポーネントの後にマルチプレクサを使用することです。 'b' =0。muxには2つの入力が必要です。1つは上のコンポーネントからの入力で、もう1つはコンポーネントの右側の3か所からです。右端の3つのマルチプレクサには、2番目の入力としてゼロが必要です。ANDゲートと2つのインバーターを持つ単純な組み合わせロジックは、XYZ = 010のときにマルチプレクサを設定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.