Entwerfen einer Steuereinheit

Ich habe vor kurzem begonnen, Prozessoren zu studieren und versuche, meinen eigenen einfachen Prozessor in Logisim zu entwerfen. Ich habe zuvor die MIPS-Assemblersprache studiert und hoffe, dass mein Prozessor mit MIPS-ähnlichen Anweisungen arbeitet. Meine Anweisungen sind 12 Bit lang und meine ALU unterstützt nur Addition und Subtraktion. Meine CPU verwendet einen 12-Bit-Befehls-RAM und einen 8-Bit-Daten-RAM.

 

Mein Befehlssatz besteht bisher nur aus den folgenden 4-Bit-Opcodes, ähnlich wie bei MIPS-Befehlen:

lw    0000
sw    0001
addi  0010
add   0011
sub   0100

Meine Anweisungen haben folgendes Format:

     [opcode: 4 bits] [rs: 2 bits] [rt: 2 bits] [rd/offset/const: 4 bits]

Zum Beispiel:

addi $t1, $1, 5    ->    0010 1010 0101

 

Ich habe den Programmzähler, die ALU, das 8-Bit-Register usw. erstellt, aber das eine Bit, mit dem ich wirklich verloren bin, ist die Steuereinheit. Ich verstehe, dass die Steuereinheit den Opcode des Befehls als Eingabe nehmen und dann Signale an die erforderlichen Register / Speicher / ALU / usw. ausgeben sollte.

Also, wie viele Ausgänge benötigt mein Steuergerät und was entspricht jedem Ausgang?

Antworten (2)

Sie werden mit ziemlicher Sicherheit mehr als eine Leitung für das ALU OP benötigen. (Ich bezweifle, dass alle Operationen ADD oder SUB sein werden. Zum Beispiel könnte NOP benötigt werden.) Sie erwähnen vier, aber ich sehe dort fünf geschrieben. Ich denke, Sie werden schnell Anweisungen brauchen, um auch das Addieren und Subtrahieren mit mehreren Genauigkeiten zu ermöglichen.

Sie haben nicht angegeben, wie Sie Ihre CPU anordnen, aber Sie benötigen mit ziemlicher Sicherheit auch eine Leitung für einen Latch vor einem der beiden Eingänge zur ALU, wenn Sie auf dieser Seite einen gemeinsamen Bus teilen. Diese Leitung speichert einen Wert lange genug, damit Sie einen zweiten Wert abrufen und auf den Bus legen können. Vielleicht möchten Sie einen Latch für beide ALU-Eingänge. Wenn ja, sind das zwei Zeilen statt einer.

Wenn Sie ADD mit Übertrag und SUB mit Ausleihe unterstützen, benötigen Sie zwei weitere Steuerleitungen, damit der Übertrag einer von vier Werten sein kann: 0, 1, C ¯ , oder C .

Der ALU-Status muss mit einem anderen Latch erfasst werden – und seiner zugehörigen Steuerleitung. Wenn Sie dieses ALU-Statusregister als Daten lesen möchten, benötigen Sie dafür ein separates Latch mit einer Tri-State-Steuerung. Zwei weitere Steuerleitungen.

Sie benötigen mit ziemlicher Sicherheit einen Latch am Ausgang der ALU, um den Ausgang zu erfassen, nachdem genügend Zeit für die kombinatorische Verzögerung vergangen ist. Dieser Latch benötigt mit ziemlicher Sicherheit auch einen Tri-Stateing-Eingang, damit der Bus mit Ihrer Registerdatei, abgerufenen Speicherwerten usw. geteilt werden kann. Das sind also zwei Zeilen zu diesem Latch.

Sie sagen, Sie haben einige Dinge erreicht (wie RAM), aber nichts darüber gesagt, wie. Ich gehe also davon aus, dass Sie die dort erforderlichen Steuerleitungen kennen. Sie benötigen jedoch einen Programmzähler (einen Latch), eine Möglichkeit, ihn zu erhöhen, eine Möglichkeit, ihn zu laden, und eine Möglichkeit, ihn beim Zurücksetzen zu löschen oder zu setzen. Für diese Vorgänge benötigen Sie jedoch Steuerleitungen.

Ihr PC-Register (das für den Zugriff auf die nächste Anweisung verwendet wird) benötigt wahrscheinlich auch einen vorherigen Mux, um Zugriff auf Register und / oder sein Addierersystem zu erhalten. Dies unterscheidet sich vom Adressbus-Latch und erfordert mehr Steuerleitungen für den Mux.

Abgehende Buswerte benötigen einen Latch, um den Wert für den Speicherbus zu halten. Das sind ein oder zwei weitere Steuerleitungen (Latching- und Tri-Stateing-Ausgang, wenn der externe Datenbus bidirektional ist.)

Sie benötigen ein Register, um den aktuellen Befehl zu speichern (und möglicherweise auch den nächsten, je nachdem, wie Sie die Dinge verwalten). Dieses Register muss zum richtigen Zeitpunkt vom eingehenden Datenbus zwischengespeichert werden. Eine weitere Steuerleitung dafür.

Wenn Sie Adressierungsmodi haben (und Sie haben ein Addi und ein Add, also bereits), benötigen Sie einen Mux (mehr Leitungen) und feste Register zum Anzapfen (mehr Leitungen), um Ihren Adresslatch und die Trennung zu unterstützen Addierer -- oh, dieser separate Addierer benötigt auch mehr Steuerleitungen.

Sie benötigen wahrscheinlich auch einen weiteren Mux, um Ihren externen Bus-Adresslatch zu erreichen. Sie möchten zumindest in der Lage sein, die Ausgabe Ihres Adressierungsaddierers oder alternativ eine Ausgabe der Registerdatei auszuwählen. Das ist also mindestens eine weitere Steuerleitung, wenn nicht auch mehr für diesen Mux.

Hast du einen Stackpointer? Mehr Steuerleitungen. Datei registrieren? Noch mehr Zeilen.

Möglicherweise benötigen Sie spezielle Konstanten – wie 0, -1, 1, 2 und andere. Und dafür brauchen Sie einen Mux und mehr Steuerleitungen.

Sie benötigen auch eine Möglichkeit, einen Teil Ihres Befehlsregisters zum ALU-Eingang (Latch oder auf dem Bus) zu schalten. Ihr Addi benötigt dies, um auf dieses Feld zuzugreifen. Möglicherweise müssen Sie dies signieren (mehrere Spuren zur ALU von einer einzigen [Zeichen]-Spur in Ihrer Anweisung leiten), um eine +/- konstante Unterstützung zu erhalten. Dazu bedarf es mindestens einer Tristate-Steuerleine und wahrscheinlich auch einer Spurverbreiterung.


Wenn Sie den Punkt noch nicht verstanden haben, sollte es Ihnen jetzt langsam dämmern (hoffe ich). Sie haben VIEL ZU WENIG Informationen bereitgestellt, damit IRGENDJEMAND Ihnen sagen kann, wie viele Steuerleitungen Ihre Ausführungsmaschine bedienen und / oder reagieren muss Zu.

Persönlich? Ich glaube nicht, dass du getan hast, was du sagst. Wenn ja, hätten Sie genaue Details darüber angegeben, was Sie eingerichtet haben und wie alles kontrolliert wird, damit wir weniger Arbeit beim Schreiben aufwenden und Ihnen eine bessere Antwort geben können. Ich glaube also nicht, dass Sie alles getan haben, was Sie sagen.

Es ist eine gute Idee, diese Dinge in Logisim auszuprobieren. Sie werden viel lernen und es ist ein raffiniertes Werkzeug. Aber es "schummelt" auch in dem Sinne, dass Sie einen Subtrahierer getrennt von einem Addierer herunterfallen lassen können, ohne wirklich zu lernen, wie diese beiden Funktionen wirklich ausgeführt werden. (Ein Subtrahierer ist nur ein Addierer, bei dem einer der Eingänge vom kommt Q ¯ Ausgabe eines vorhergehenden Latch [natürlich über einen anderen Mux] und wo der Übertrag geändert wird. Sie verwenden dafür keine separate "Einheit".) Es betrügt auf viele andere Arten, was Ihr Wachstum ebenfalls hemmen wird. (Es ignoriert Glitching-Probleme, um nur eines von vielen zu nennen.)

Wenn Sie das alles ernst meinen, gibt es einige gute Bücher, die ich empfehlen könnte, um Ihnen zu helfen. Konnten Sie in Logisim eine fertige CPU finden? Damit könntest du anfangen.

Würden Sie bitte Ihre Buchempfehlungen teilen? Ich bin sehr daran interessiert, mehr über diesen Prozess zu erfahren.
@Steven Wenn Sie an Details zu den Steuerleitungen interessiert sind (worüber ich hier hauptsächlich gesprochen habe), dann werfen Sie einen Blick auf youtu.be/dXdoim96v5A als erste Einführung in die Verwendung von Steuerleitungen im Kontext eines CPU-Designs. Das ist wahrscheinlich das beste Bild, das ich derzeit kenne. (Gehen Sie es auch ganz durch. Er muss einen "Fehler" in seiner Hardware finden.) Buchempfehlungen hängen von Ihrem Hintergrund ab. Kannst du ein bisschen darüber reden, damit ich wählerischer sein kann?
Vielen Dank für die Videoempfehlung. Ich habe einen Bachelor-Hintergrund in Elektrotechnik, den ich gerade im zweiten Semester meines Juniorjahres begonnen habe. Ich interessiere mich speziell für Computertechnik, aber mein College ist in diesem Bereich nicht stark vertreten. Ich versuche, die Bereiche, die sie willkürlich behandelt haben, selbst zu studieren, das Design von Steuergeräten ist speziell einer, für den ich Schwierigkeiten habe, gute Ressourcen zu finden. Danke!
@Steven Ich denke, der Grund für die geringere Konzentration auf die Steuerdetails für eine Anweisung liegt darin, dass an anderer Stelle eine saubere, einfache Logik angewendet wird (z. B. Register und Registerdateien, eine Bussteuereinheit und die ALU selbst) und der Rest "gefegt" wird unter dem Teppich" der Kontrolldetails in einem mysteriösen "Handwinken". Sie wissen, dass etwas passieren muss und es muss eine gewisse Ordnung haben. Aber diese Themen bleiben viel zu oft unausgesprochen. Das Video, auf das ich verwiesen habe, hilft Ihnen, tatsächlich zu "visualisieren", was passieren muss, damit eine Anweisung ordnungsgemäß ausgeführt wird.
@Steven Ich versuche, mir ein gutes Buch zu diesem engen Thema auszudenken, und kann ehrlich gesagt keins empfehlen. Der beste Weg, dies zu lernen, ist, es zu tun.
@Steven Aber stellen Sie sich vor, Sie legen alle Funktionseinheiten, die Sie benötigen, auf einem Blatt Papier an. Diese werden eingehende Steuersignale und ausgehende Statussignale haben - Übertrags- und Steuerleitungen in die ALU, Statusbits von ihr, Tristate-Steuerleitungen für Latches, die in einen Bus eingespeist werden usw. Ziehen Sie alle diese Steuerleitungen in den Ausgang einer imaginären MCU Pins und bringen Sie auch alle Statusleitungen in die Eingangspins dieser MCU. Fügen Sie der MCU einen Code hinzu. Und jetzt können Sie den größeren Befehlssatz zum Laufen bringen. Rechts? Natürlich müssen wir jetzt diese MCU entwerfen. Oh? Haben wir das Problem einfach unter den Teppich gekehrt?
@Steven Es ist wie dieser Witz, in dem die Dame sagt: "Wir leben auf einer Erdkruste, die sich auf dem Rücken einer Riesenschildkröte befindet." Auf die Frage "Worauf steht diese Schildkröte?" Sie antwortet schnell: "Die erste Schildkröte steht auf dem Rücken einer zweiten, viel größeren Schildkröte, die direkt unter ihr steht." Auf die Frage: "Aber worauf steht diese zweite Schildkröte?" Sie kräht triumphierend: "Es sind Schildkröten ganz unten." Manchmal scheint das MCU-Steuerungsdesign wie diese Geschichte zu sein. Aber eigentlich geht es nur darum, die innere MCU so weit zu vereinfachen, dass es trivial ist. Dies bringt den Kern von RISC vs. CISC auf den Punkt.
@Steven Ein halbwegs guter Übergang zu all dem wäre "Bebop Bytes Back: An Unconventional Guide to Computers" von Clive Maxfield. Die ersten Teile des Buches sind eine halbwegs anständige Einführung, obwohl einige genaue Details fehlen, die Sie vielleicht wünschen. Es ist immer noch eine gute Folge. Für einen spezifischen Designansatz mit FPGAs und Verilog HDL können Sie Monte Dalrymples „Microprocessor Design Using Verilog HDL“ heranziehen. Es bietet einen sehr detaillierten Designansatz für die Z80-CPU. Aber ein völlig anderer Lehransatz als Clive in „Bebop BYTES Back“.

Die Steuereinheit verwendet den eingegebenen Opcode und steuert die CPU (Schreiben/Lesen von Registern, Speicher oder ALU).

Da Sie in Ihrer ALU nur Addition und Subtraktion verwenden, können Sie sie mit zwei Bits steuern (Bypass und Subtraktion).

Dann müssen Sie für Ihre Register und Ihren Speicher das Schreiben in das Ergebnisregister oder den Speicher aktivieren, daher benötigen Sie zwei weitere Bits (Registerschreiben und Speicherschreiben).

Schließlich benötigen Sie zwei weitere Bits, um die Operandenquelle auszuwählen (aus dem Speicher, aus dem Direktzugriff oder aus dem gelesenen Register).

Also würde ich sagen, dass man mindestens 2 + 2 + 2 = 6 Signale benötigt.

Danke. Zum Steuern des Register- und Speicherschreibens habe ich also einen Einzelbitausgang, der, wenn er hoch ist, der CPU mitteilt, in das Register zu schreiben, und ein weiteres Ausgangsbit, das, wenn er hoch ist, der CPU mitteilt, in den Speicher zu schreiben? Oder könnte ich kein einzelnes Ausgangsbit haben, das bei Low in den Speicher und bei High in das Register schreibt? Und für Ihren letzten Punkt in Bezug auf die Auswahl der Quelle des Operanden, wie kann ich aus 3 Quellen mit 2 Ausgangsbits auswählen? Sind die Ausgangsbits unabhängig voneinander oder werden sie miteinander kombiniert (z. B. 00 = aus dem Speicher, 01 = aus dem Direktzugriff, 10 = aus dem Register)?
Für die Speicher- oder Registerauswahl ist es einfach das Freigabebit des Flipflops. Wenn High, nimmt das Flip-Flop den angegebenen Wert an. Für das Gedächtnis ist es das gleiche Prinzip. Ich würde zwei unabhängige Bits verwenden, um sicherzustellen, dass Sie wirklich den Speicher schreiben oder registrieren möchten. Es gibt Operationen, wo Sie nicht wollen. Für die Operandenquelle sind diese verknüpft und werden beispielsweise für einen Mux mit 3 Eingängen verwendet.