Entwerfen einer einfachen ALU


8

Ich muss eine ALU mit zwei 8-Bit-Eingängen A und B und Steuereingängen x, y und z entwerfen, die die folgenden Operationen unterstützen:

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)

Dies soll mit einem 8-Bit-Addierer und einem Arithmetik-Logik-Extender erfolgen. Beim Lesen meines Lehrbuchs sehe ich, dass der Zweck eines AL-Extenders darin besteht, die Eingabebits so zu ändern, dass ein Addierer anstelle vieler zusätzlicher Komponenten verwendet werden kann, um alles zu tun (oder zumindest verstehe ich das daraus ). Zum Beispiel könnte der AL-Extender die Bits in das Zweierkomplement setzen, so dass der Addierer eine Subtraktion durchführt. Ebenso könnten für die bitweisen logischen Operationen die Bits entsprechend geändert werden und einer der Addierereingänge könnte einfach Null sein, so dass das Ergebnis richtig durchkommt.

Aber was genau mache ich gegen Multiplikation? Mein Buch ist sehr vage, daher bin ich mir nicht sicher, ob ein AL-Extender von mir verlangen würde, etwas Kluges zu tun, damit der Addierer die Arbeit erledigt (in meinem Fall nur 8 Mal hinzufügen? ... ha ha), oder ob ich kann einfach einen Multiplikator hineinwerfen. Ich muss mich über die Division informieren, aber ich wette, es ist ähnlich wie bei der Multiplikation.

Nun, unter dem Strich ist immer noch, was darf ein AL-Extender "haben"? Ist es der einzige Zweck, die Eingabe so zu ändern, dass sie einem Addierer zugeführt werden kann?

* EDIT: Nun, es ist eine Multiplikation / Division mit 8, also kann dies leicht durch Verschieben nach links oder rechts um 3 durchgeführt werden. Hätte ich immer noch einen echten / richtigen AL-Extender, wenn ich dort einige Schalthebel hinzufügen würde? (Vielleicht überdenke ich das als Anfänger ...)


1
Was ist 00011111 * 8? Was ist 00000000-00000111? Wenn sich Ihr AL-Extender für den Operationscode "010" dreimal nach links verschiebt, kann er 0 B zuweisen und dann die Operationscodes "001" oder "000" in der ALU aufrufen.
Tony Ennis

Antworten:


5

Der einfachste Ansatz wäre, die xyz-Eingänge in acht Zeilen zu decodieren. Anschließend implementieren Sie eine Logik, die die Chipauswahlleitungen steuert, um die entsprechende Einheit zu aktivieren, die die Eingaben verarbeitet, sowie alle erforderlichen Transformationen, damit die Einheit die richtige Operation ausführt.

Ich glaube nicht, dass Sie einen Addierer für Ihre Logikoperationen verwenden können, da der Addierer trägt (es sei denn, er hat eine Eingabe, die das Verhalten der Übertragsausbreitung deaktiviert). Sie können jedoch eine einzige Einheit haben, um die gesamte Logik auszuführen.

Vielleicht gibt es einen Grund, warum sie diese ALUs mit einem separaten A und L nennen :)

Multiplikation mit 8 bedeutet nur, Nullen auf den untersten drei Eingabezeilen zu fahren, die oberen drei Zeilen zu ignorieren und Zeile 0 auf Zeile 3, 1 bis 4 usw. abzubilden. Es ist wie eine Eisenbahnweiche.


6


××××

OK, vielleicht willst du das nicht; Logikgatter sind viel schwieriger. Wie Kaz sagt, beginnen Sie mit einem 3-zu-8-Decoder, um für jeden Opcode ein eindeutiges Signal zu erhalten. Sie können dies mit einfachen Gates machen, aber ich würde vorschlagen, zunächst einen 74HC238 zu verwenden. Wenn die ALU funktioniert, können Sie den HC238 weiterhin durch eine Sammlung von Gates ersetzen.

Was Sie für den Multiplikator nicht wollen, ist ein Schieberegister, das dreimal nach links verschiebt. Dies ist eine registrierte Funktion, die eine Uhr benötigt, anstelle einer kombinatorischen Funktion, die das Ergebnis sofort erzeugt. (Beachten Sie, dass der Flash auch in Nanosekunden ein Ergebnis erzeugt , wenn auch langsamer als mit kombinatorischer Logik.) Verfügen Sie über einen Pfad von A0 nach Y3, A1 nach Y4 usw., den Sie mit dem decodierten Opcode "010" aktivieren. Ebenso wird Y3 mit A6 verbunden, wenn das Signal "011" aktiv ist (Division), und mit A4, wenn der Opcoe ​​"110" ist (Bitumkehr). Das bedeutet viel Multiplexing.

()



()

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

Ich habe mich mit demselben Problem aus demselben Buch beschäftigt. Zum Glück bin ich auf diesen Thread gestoßen, der mir eine Idee gab, was ich tun soll. Kaz hat einen sehr guten Punkt darin, Nullen zu fahren und Linien abzubilden. Der ALU-Extender in diesem Buch besteht aus n (n steht für die Anzahl der zu bearbeitenden Bits) identischer, aber getrennter Kombinationskomponenten und einer unterschiedlichen Komponente für den Übertrag. Diese Komponenten haben fünf Eingänge und zwei Ausgänge. Die fünf Eingänge sind: 'X', 'Y', 'Z' (zur Auswahl der Operation) und 'a', 'b' (einzelne Bits von A und B mit gleicher Bedeutung). Ich denke, die Idee hier ist, das Problem in kleinere Teile zu unterteilen, um eine Wahrheitstabelle mit angemessener Größe zu erhalten. Das sind 5 Eingänge gegenüber 8 + 8 + 3 = 19 Eingängen, wenn der Extender alle Bits von A und B plus Steuereingänge akzeptieren würde. Jetzt, Wenn der Extender so zusammengesetzt wäre (19 Eingänge), könnte die Logik für die Multiplikation meiner Meinung nach in dieser einzelnen Komponente implementiert werden, aber das Schreiben einer Wahrheitstabelle hierfür wäre ausgeschlossen. Meine Lösung besteht also darin, nach jeder Komponente, die einzelne Bits a und b verarbeitet, Muxes zu verwenden, vorausgesetzt, die Komponente ist bereits so ausgelegt, dass ein Eingang XYZ = 010 'a' Bit unverändert übergibt und 'b' herausfiltert 'b' = 0. Der Mux sollte zwei Eingänge haben, einen von der obigen Komponente und einen von der Komponente drei Stellen rechts. Drei Muxes ganz rechts sollten als zweiten Eingang Nullen haben. Eine einfache Kombinationslogik mit einem UND-Gatter und zwei Invertern kann die Mux einstellen, wenn XYZ = 010 ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.