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?
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, , oder .
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 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.
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.
Stefan
jonk
Stefan
jonk
jonk
jonk
jonk
jonk