Frage:
Wie implementiere ich eine 8-Bit-CPU?
cerremony
2014-11-22 12:17:52 UTC
view on stackexchange narkive permalink

Ich versuche, eine CPU mit 8-Bit-Anweisungen zu erstellen, und es werden 9 oder 10 davon sein.

Ich habe Anweisungen zum Hinzufügen, Subtrahieren, Multiplizieren, Laden, Speichern, Verzweigen, wenn Null, Verzweigen, wenn nicht Null, Drucken (zum Anzeigen), Eingeben (von der Tastatur) und Zurückgeben (Programm beenden).

Adressen sind 4 Bit lang und ich habe zwei Allzweckregister, sodass ich nur ein einziges Bit pro Register benötige. Für Addition, Subtraktion und Multiplikation benötige ich 2 Bits für die Register (eines pro Register, zwei Register), sodass ich 6 zusätzliche Bits im Befehlsformat habe.

Zum Laden / Speichern / Verzweigen, wenn Null / Verzweigung, wenn nicht Null, ich benötige ein Bit für das einzelne Register und 4 Bits für die Adresse, so dass ich 3 zusätzliche Bits im Befehlsformat habe.

Zum Drucken und Zurückgeben benötige ich nur ein Register , also 1 Bit, so dass ich für den Rest des Befehlsformats 7 Bit habe; und für die Rückgabe habe ich volle 8 Bits. Ich bin mir nicht sicher, was ich damit machen soll.

Also muss ich das Befehlsformat herausfinden und meine Steuereinheitsschaltung aufbauen. Ich habe versucht, viel zu lesen, und ich bin ziemlich festgefahren, wie ich das überhaupt machen soll - wie groß mein Op-Code sein sollte, wie man dies in einer Logikschaltung implementiert usw.

Jeder Rat wäre willkommen.

BEARBEITEN: Ich habe diese Spezifikationen erhalten und muss sie umgehen, obwohl ich weiß, dass sie nicht wirklich ideal sind - es ist nur ein kleines Projekt, das mir zugewiesen wurde (Ich freue mich jedoch über die zusätzlichen Eingaben, da ich so viel wie möglich lernen möchte. Ich weiß nur, dass ich die Spezifikationen nicht wirklich ändern kann.)

Was ist der Umsetzungsplan?Mit diskreten Elementen (ICs)?oder auf einem FPGA?
Wurden Ihnen diese Anweisungen ausgehändigt oder haben Sie sich dafür entschieden?
@nidhin Dies ist nur eine simulierte Schaltung in logisim.
@IgnacioVazquez-Abrams Dieser Befehlssatz wurde mir übergeben
Haben Sie einige sehr spezifische Programme, die Sie auf Ihrer CPU ausführen müssen?Diese Anleitung erscheint mir ziemlich seltsam, es hört sich nicht so an, als würde sie sich gut verallgemeinern lassen.
@DavidSainty Ich muss zwei Zahlen multiplizieren, eine aus dem Datencache und eine aus dem Eingabepuffer, und die Lösung wird auf einer 1-stelligen Digitalanzeige angezeigt.Es soll einfach sein, nichts zu kompliziert, es ist ein sehr Anfängerprojekt.
Ein Datencache?Caches werden nur verwendet, wenn der Hauptspeicher nicht schnell genug ist.
Gibt es einen separaten Anweisungsadressraum?16 Anweisungen sind zu klein, um einen Software-Multiplikator zu implementieren. Hardware-Multiplikatoren sind etwas kompliziert.
Wenn Sie nur zwei Register haben, benötigen Sie nur 1 Bit, um sie auszuwählen (0 = erstes Register, 1 = zweites Register), da Sie sie nicht zusammen auswählen mussten - es sei denn, Sie wollten sowohl ein Quell- als auch ein Zielfeld von habenjeweils ein Bit, aber es klang nicht so.
@tcrosley ok, zum Beispiel habe ich ADD $ x $ y, und ich muss die Zahlen in $ x und $ y hinzufügen und sie wieder in $ x speichern.Oder zur Multiplikation habe ich MULT $ x $ x und speichere das Ergebnis in $ x.
@cerremony Das habe ich mir gedacht, aber es war nicht wirklich klar, was Sie geschrieben haben (zumindest für mich).
@cerremony Ich habe meiner Antwort einen vorgeschlagenen Befehlssatz hinzugefügt. Lassen Sie mich wissen, wenn ich etwas verpasst habe, nach dem Sie gesucht haben.
Es riecht nach Hausaufgaben und die Richtlinien zum Posten von Hausaufgaben wurden nicht befolgt.Geben Sie an, ob es sich um Hausaufgaben handelt, und teilen Sie uns mit, was Sie versucht haben, wo Sie festsitzen und was Sie Ihrer Meinung nach tun sollten, aber nicht herausfinden können.
@cerremony Wenn Sie in meinem Befehlssatz das zusätzliche Byte mit den Anweisungen zum Aufrufen / Zurückgeben und Laden / Speichern ignorieren, haben Sie eine 4-Bit-Adressierung gemäß Ihrer Spezifikation. Ich habe auch Eingabe- / Ausgabeanweisungen hinzugefügt und multipliziert.Ich konnte viel mehr Anweisungen hinzufügen, als Sie verlangt haben.Sie können die zusätzlichen einfach ignorieren, wenn Sie möchten.
Sechs antworten:
#1
+8
tcrosley
2014-11-22 23:07:07 UTC
view on stackexchange narkive permalink

Für einen echten Computer möchten Sie definitiv mehr als 4 Bit Programmadresse, da 4 Bit nur 16 Befehle zulassen. Also habe ich ein Schema entwickelt, das einen Zwei-Byte-Befehl für Sprünge, Aufrufe, Laden und Speichern verwendet, der Ihnen eine 12-Bit-Adresse oder einen 4096-Speicherort gibt.

Jedoch Wenn Sie dieses zusätzliche Byte weglassen, erlaubt mein Befehlsformat 5 Bit (nicht nur 4) Programmadresse und bis zu 4 Bit RAM-Adressierung.

Also das Folgende ist ein Befehlssatz, der auf der Spezifikation von zwei Registern basiert. Alle Anweisungen sind ein Byte, mit Ausnahme der vier, die vollständige Adressen erfordern (optional, wie zuvor beschrieben, lassen Sie dieses zweite Byte für die 4-Bit-Adressierung weg).

Ich habe in den langen Formaten belassen, denn wenn man sie enthält, Ich denke, dies wäre ein vernünftiger 8-Bit-Computer (obwohl er nur 4 KByte adressieren kann).

Obwohl ich speicherabgebildete E / A gegenüber Eingabe- / Ausgabeanweisungen bevorzuge, habe ich jeweils zwei davon bereitgestellt Erfüllen Sie die Spezifikation.

  Register-Register-Anweisungen: 0 0 xxxxds wobei xxxx der Opcode ist, d das Zielregister 0 oder 1 ist und s das Quellregister 0 oder 1 Opcode-Feld ist: 0000 addiere d = d + s 0001 adc d = d + s + c 0010 sub d = d - s 0011 subb d = d - s - c 0100 und d = d und s 0101 oder d = d oder s 0110 x oder d = d xoder s 0111 nicht d = nicht s 1000 asr s = 0 arithmetische Verschiebung nach rechts d (s = 0 bedeutet s Feld ist 0, nicht dass das Register 0 ist) 1000 asl s = 1 arithmetische Verschiebung nach links d 1001 ror s = 0 nach rechts drehen d 1001 rol s = 1 nach links drehen d 1010 inc s = 0 Inkrement d 1010 dec s = 1 Dekrement d 1011 cmp d - s (kein Speicher) 1100 inp1 s = 0 Eingang, um d vom Eingang zu reg d Port 1 1100 inp2 s = 1 Eingang zu reg d von Eingang Port 2 1101 out1 s = 0 Ausgang von reg d zu Ausgang Port 1 1101 out2 s = 1 Ausgang von reg d zu Ausgang Port 2
1110 mul d / s = s * d (hohes Byte des Ergebnisses in d, niedriges Byte in 1-d) 1111 s ds = 00 setze Übertrag 1111 clc ds = 01 lösche Übertrag 1111 ret ds = 10 Rückkehr vom Unterprogramm 1111 hlt ds = 11 halt 0 1 0 0 nnnn brn - bedingungsloser Verzweigungsnegativ -n Bytes (bis zu -16), der zum Zurückverzweigen am Ende einer kurzen Schleife nach einer Sprunganweisung verwendet wird 0 1 0 1 bbii Sprunganweisungen, wobei bb die Art der Verzweigung ist ii = Anzahl der zu überspringenden Bytes, normalerweise 1 oder 2, letzteres zum Überspringen von Sprung / Aufruf) i Bytes überspringen, wenn Nullbit gelöscht ist 0 1 1 rnnnn sofort laden, um den vorzeichenbehafteten Wert r (0 oder 1) zu registrieren nnnn +15 bis -16 1 0 xpaaaaaaaaaaa (2. Byte nur für erweitertes Format) Sprung- oder Aufrufanweisung (x = 0 ist Sprung , 1 ist call) p ist für ein Seitenbit reserviert (oder könnte nur das High-Bit von sein Adresse). 12 Bit Adresse bieten einen direkten Aufruf oder einen Sprung zu 4 KB Programmspeicher (oder 5 Bit bieten Zugriff auf 32 Byte Speicher). 1 1 xriaaaaaaaaaaa (2. Byte nur für erweitertes Format) Laden von / in RAM (x = 0 ist Laden, 1 ist Speichern) 11 Adressbits bieten direkten Zugriff auf 2 KB RAM (oder 3 Bit bieten Zugriff auf 8 Byte RAM ) r ist das Ziel- oder Quellregister (0 oder 1). Das Feld i gibt die indizierte Adressierung unter Verwendung des Registers an, das nicht durch das Feld r angegeben ist. Wenn die Indizierungsfunktion weggelassen wurde, können entweder 4 KB oder 16 Byte adressiert werden.  

Es gibt drei Arten von Zweigen: Sprung- und Aufrufanweisungen, die eine vollständige Adresse annehmen; ein bedingungsloser Verzweigungsbefehl, der bis zu 16 Bytes rückwärts verzweigen kann; und bedingte Sprunganweisungen, die bis zu 4 Bytes voraus überspringen können. Die Verwendung von Sprüngen anstelle von Verzweigungen ermöglichte ein kürzeres Adressfeld. Es könnte stattdessen als Verzweigung wiederholt werden, indem die Anweisungen zum sofortigen Laden entfernt werden:

  0 1 bbaaa bedingte Verzweigungsanweisungen, wobei bb der Typ der Verzweigung ist, aaaa ist das Feld für die relative Verzweigung + - 8 Bytesb b signiert : 00 scs branch i bytes wenn Carry set01 scc branch i bytes wenn Carry clear10 szs branch i bytes wenn Nullbit set11 szc branch i Bytes wenn Zero Bit clear  

Die Art und Weise, wie die Multiplikation funktioniert, ist wie folgt folgt: Eine 8x8-Multiplikation ergibt ein 16-Bit-Ergebnis. Der Multiplikationsbefehl multipliziert immer Register 0 mit Register 1. Das High-Byte des Ergebnisses geht in Register d und das Low-Byte geht in Register 1-d. s wird ignoriert.

Ich habe das Konzept der Multiplikation des "Eingabepuffers" mit dem "Datencache" nicht implementiert, da das OP keine Details zum Cache angegeben hat - und ich habe derzeit die Eingangspuffer wird in eines der beiden Register eingelesen. Das Laden eines Eingangsports in eines der Register und das Multiplizieren mit dem anderen, wodurch in beiden ein 16-Bit-Produkt erzeugt wird, ist viel sinnvoller.

Mit Ausnahme der Multiplikation könnte dies ziemlich einfach implementiert werden. Alle arithmetischen Operationen (Addieren, Subtrahieren, Vergleichen) und logischen Operationen (und oder oder xor, nicht) können von einer ALU (Arithmetik / Logikeinheiten) ausgeführt werden, die in Logisim unterstützt wird. Im wirklichen Leben kann dies mithilfe von zwei 4-Bit-ALUs 74LS181 implementiert werden, die zusammen kaskadiert sind.

#2
+2
davidcary
2014-11-23 09:54:44 UTC
view on stackexchange narkive permalink

Implementierung

wie dies in einer Logikschaltung usw. implementiert wird.

Im normalen Ausführungsfluss wird eine Anweisung in die Anweisung abgerufen Register IR, wird dann von der Steuereinheit in ein großes Bündel einzelner Steuerdrähte decodiert, das dann den Datenpfad des Prozessors steuert.

Wenn ich Sie wäre, würde ich den Steuerpfad "rückwärts" von entwerfen Dieser Prozess:

Entwerfen Sie zuerst den Datenpfad.

Erstellen Sie dann eine Liste aller Steuersignale, die erforderlich sind, um anzugeben, wie Daten durch diesen Datenpfad fließen. Die ALU benötigt einige Steuersignale, um Geben Sie an, ob addiert, subtrahiert usw. werden soll. Der Programmzählerabschnitt benötigt Steuersignale, um anzugeben, ob der Programmzähler mit einer inkrementierten Version des vorherigen Werts oder mit einem völlig anderen Verzweigungswert usw. neu geladen wird.

Stellen Sie dann für jede Assembler-Befehls-Mnemonik fest, welche Impulsfolge auf jeder Steuersignalleitung erforderlich ist, um dies zu implementieren Befehl.

Wenn Sie Glück haben, können viele dieser Steuersignale direkt aus dem Befehlsregister "decodiert" werden. Die verbleibenden Steuersignale werden von der Steuereinheit erzeugt, die als Moore implementiert ist Maschine oder eine mehlige Maschine.

Wenn Sie eine Princeton-Architektur haben, bezieht Ihr Prozessor normalerweise Anweisungen aus demselben Speicher mit einem Port, der zum Lesen und Schreiben von Daten verwendet wird --dann müssen mindestens LOAD und STORE mehrere Zyklen ausführen.

Möglicherweise ist der konzeptionell einfachste und universellste Ansatz die Implementierung der Steuereinheit mit einem sehr breiten Steuerungsspeicher ROM hält das Mikroprogramm mit einem Pipeline-Register, das alle Ausgangsbits dieses ROM-Taktzyklus zwischenspeichert.

Jedes Mal, wenn ein neues erstellt wird Der Opcode wird aus dem Hauptspeicher abgerufen, typischerweise werden die hohen Bits des microPC mit dem Opcode geladen und die niedrigen Bits des microPC auf Null zurückgesetzt

Das "Mikroprozessor-Design: Entwurfsschritte" geht viel detaillierter.

ps: Bitte helfen Sie, den aktuellen Entwurf des "Mikroprozessor-Designs" Buch, um der nächsten Person das Entwerfen eines Prozessors zu erleichtern.

typische 8-Bit-CPUs

... unter Verwendung von 8-Bit-Anweisungen ...

Mit sehr seltenen Ausnahmen verwendet jeder Befehlssatz, den ich jemals vorgeschlagen habe (viel weniger sogar simuliert oder tatsächlich implementiert), mehr als 8 Bit für mindestens einige Befehle.

Alle "8-Bit-CPUs", die ich je gesehen habe (6800, 6502, Zilog Z80, 8080, 68HC11, Microchip PIC, Atmel AVR usw.; sowie einige einzigartige Homebrew-Prozessoren und eine Reihe von "Nur-Papier" -Ideen, die noch nicht implementiert wurden) enthalten mindestens einige Anweisungen, die länger als 8 Bit sind.

Für praktisch alle diese CPUs Das erste Byte des Befehls hat den vollständigen Opcode, und aus diesem Byte kann der Decoder in der CPU genau herausfinden, wie lange die Ins dauern Die Funktion ist. Oft sind NOP und RETURN Ein-Byte-Befehle. Oft ist BRANCH ein Mehrbyte-Befehl - ein Byte für den Opcode, gefolgt von der Anzahl der Bytes, die zum Füllen des Programmzähler-PCs erforderlich sind.

Ich halte es für unwahrscheinlich, dass die Person, die Ihnen diese Spezifikationen für eine 8-Bit-Maschine gegeben hat, wirklich beabsichtigte, dass Sie unter der zusätzlichen schweren Last arbeiten, auch die maximale Länge jeder Anweisung zu begrenzen, einschließlich der Nicht-Anweisungen Opcode-Bits auf 8 Bit.

Und so können Sie wahrscheinlich den nächsten Abschnitt überspringen.

Was wäre, wenn jeder Befehl genau 8 Bit breit wäre?

Ich denke Die maximale Befehlslänge auf 8 Bit (oder sogar noch kürzer!) zu beschränken, ist eine faszinierende Idee. Dies vereinfacht einige Teile des Prozessors und macht die Implementierung und das Testen anderer Dinge viel schwieriger.

... Anweisungen, und es werden 9 oder 10 davon sein. ...

Ein Prozessor mit mindestens 9 Befehlen benötigt mindestens 4 Bits, um diese Befehle vollständig zu unterscheiden - die Opcode-Bits.

Zum Laden / Speichern / Verzweigen, wenn Null / Verzweigung, wenn nicht Null, ich benötige ein Bit für das einzelne Register und 4 Bits für die Adresse

Plus mindestens 2 Bits, um zwischen diesen 4 verschiedenen Operationen unterscheiden zu können 1 weiteres Bit, um anzuzeigen, ob es sich um eine dieser 4 Anweisungen oder um eine andere Anweisung handelt.

Dies bedeutet, dass das Laden / Speichern / Verzweigen bei Null / Verzweigen bei Nicht-Null-Befehlen das folgende Format hat:

3-Bit-Opcode + 1-Bit-Quell- / Zielregisterauswahl + 4-Bit-Adresse = 8 Bit.

Das sind insgesamt 8 Bit, also passt es kaum.

Wenn Sie Wenn Sie wirklich 2 Bit Registerauswahl für andere Anweisungen benötigen (ich bin mir nicht sicher, ob Sie dies tun), müssen Sie für diese Anweisungen ein anderes Format verwenden, möglicherweise

3-Bit-Opcode + 1-Bit-Quelle / Ziel Registerauswahl + 1-Bit-Quellregister ter + 2 Funktionsbits + 1 nicht verwendetes Bit = 8 Bits. Typischerweise wird der gleiche maschinensprachliche Opcode für mehrere verschiedene ALU-Operationen verwendet. Die Funktionsbits wählen die bestimmte Operation aus - Addieren, Subtrahieren oder eine andere ALU-Operation.

#3
+1
Saad
2014-11-22 13:36:17 UTC
view on stackexchange narkive permalink

Ich gehe davon aus, dass Sie eine Harvard-Architektur mit separaten Code- und Adressräumen verwenden.

Es ist einfach, Anweisungen binär zuzuordnen. Sie können den MIPS-Befehlssatz sehen, um sich ein Bild zu machen. Und vergessen Sie nicht, Ihre ISA sofort zu laden, wenn Sie können!

Wenn Sie mit dem Entwerfen der ISA fertig sind, können Sie sich überlegen, wie Ihr Datenpfad aussehen wird. Der Datenpfad beschreibt, wie Daten in Ihre CPU gelangen. Die Steuerlogik steuert diesen Fluss.

Ich empfehle Ihnen dringend, sich Nand2Tetris anzusehen. Es enthält ein Kapitel zum Aufbau einer einfachen 16-Bit-CPU mit einem grafischen Bildschirm und einer Tastatur.

#4
+1
Jerry Coffin
2014-11-22 22:38:26 UTC
view on stackexchange narkive permalink

Ich würde keine Anweisungen speziell zum Lesen der Tastatur und / oder zum Schreiben auf das Display einfügen. Stattdessen würde ich sie wahrscheinlich dem Speicher zuordnen, sodass die Tastatur (zum Beispiel) wie ein paar Bytes Speicher aussieht (eines für den Status, das andere für Daten). Ebenso würde die Anzeige für die CPU wie ein Byte Speicher aussehen, und Sie würden einfach den LED-Controller anschließen, um von diesem Speicherort zu lesen und seinen Inhalt anzuzeigen.

Bearbeiten: die zwei Bytes (Status / Daten) für die Tastatur werden verwendet, damit Sie überprüfen können, ob gerade eine Taste gedrückt wird und welche "Modifikator" -Tasten (z. B. Umschalt, Steuerung) zusammen mit der Taste A kbd> (nur) gedrückt wurden zum Beispiel). Sie können es als einen Strom von Ereignissen darstellen ( Strg kbd> wurde gedrückt, A kbd> wurde gedrückt, A kbd> wurde freigegeben, ctrl kbd> wurde veröffentlicht), aber um dies sinnvoll zu nutzen, ist mehr Programmspeicher erforderlich, als Sie anscheinend zur Verfügung haben. Die ganze Frage kann jedoch umstritten sein, wenn (zum Beispiel) Sie nur einen Satz von Zifferntasten haben und der Benutzer jeweils nur eine Ziffer eingeben kann.

Soweit Sie möchten Implementieren Sie es: Nein, es wäre nicht in der Anweisung. Es würde von der Speicherschnittstelle gehandhabt werden. In einem typischen Fall benötigen Sie einen Speicherdecoder, der (zum Beispiel) einige Bits einer Adresse verwendet und anhand dieser Bits entscheidet, an welchen Speicherchip eine Anforderung weitergeleitet werden soll. In diesem Fall würden Sie (zum Beispiel) das höchstwertige Bit Ihrer Adresse verwenden, und wenn es festgelegt ist, würden Sie aus einer Logik anstelle des tatsächlichen Speichers lesen.

Sie sagen also, ich könnte die Leseanweisung als Speicheranweisung und die Druckanweisung als Ladeanweisung implementieren, aber die Adressen für diese Anweisungen beziehen sich speziell auf zwei bestimmte Speicherstellen, die in der Binäranweisung angegeben sind.und diese Speicherplätze sind mit der Tastatur und dem Display verbunden? Können Sie auch erklären, was Sie mit zwei Bytes für Status und Daten meinen?Wäre das etwas, was ich in der Steuereinheit und den binären Definitionen der Anweisungen vorsehen muss, oder etwas, das ich im Speicher implementieren muss?
#5
  0
David Sainty
2014-11-22 13:16:00 UTC
view on stackexchange narkive permalink

Es hört sich so an, als könnten Sie alles in ein einziges 8-Bit-Byte packen, wenn die Adressen 4-Bit sind. Die niedrigen 4 Bits könnten im Allgemeinen "Adresse" sein. Die hohen 3 Bits zeigen die Operation an, und das verbleibende Bit könnte das Register auswählen.

3 Bits geben Ihnen 8 Operationen, aber einige Ihrer Anweisungen benötigen kein Register oder keine Adresse (z. B. Rückgabe benötigt nichts; print, input, branch benötigt wahrscheinlich nur ein Register). Ich bin mir ziemlich sicher, dass Sie mit Ihren Anforderungen herumspielen können, bis alles in 8 Bit passt.

Aber 4-Bit-Adressen klingen ziemlich einschränkend! Sie sollten Ihr Programm wahrscheinlich zuerst besser implementieren und sicherstellen, dass es in das passt, was so klingt, dass es nicht länger als ein 16-Byte-Programm sein kann!

Und wenn ich Sie wäre, würde ich wahrscheinlich die Multiplikationsanweisung fallen lassen und die Multiplikation in Software implementieren.Sie benötigen einen allgemeineren Befehlssatz, müssen jedoch keine Multiplikation in der Hardware implementieren.
#6
  0
supercat
2014-11-23 05:20:24 UTC
view on stackexchange narkive permalink

Adressen mit nur 4 Bit Länge scheinen eher eng zu sein. Während einige Maschinen möglicherweise 4-Bit-Registeradressen verwenden, können solche Maschinen im Allgemeinen auf ein Speichersystem mit einem viel größeren Adressraum zugreifen.

Ich würde vorschlagen, dass Sie als persönliches Projekt möglicherweise eine grobe Aufnahme machen möchten -16-Bit-Adressraum. Wenn Sie etwas zum Spielen erstellen, würde ich vorschlagen, dass eine Von Neuman-Architektur (gemeinsam genutzte Adresse und Datenspeicher) möglicherweise einfacher zu verarbeiten ist als eine Harvard-Architektur, selbst wenn Anweisungen über einen 8-Bit-Bus abgerufen werden müssen Eine einfache Möglichkeit, Befehle mit variabler Breite bis zu 21 oder 28 Bit zu verarbeiten, besteht darin, drei oder vier 8-Bit-Befehls-Latches zu haben. Einer der Befehls-Latches sollte Daten vom Bus erfassen, der zweite sollte Daten vom ersten erfassen und der dritte sollte Daten vom zweiten erfassen (und der vierte, falls vorhanden, vom dritten). Zusätzlich sollte es einen Latch geben, der, wenn er gesetzt ist, das Löschen der oberen Befehls-Latchs erzwingt, wenn der untere geladen wird (anstatt von den Latches unten kopiert zu werden). Das obere Bit jedes Befehlsbytes würde anzeigen, ob dieses Byte das letzte Byte eines Befehls ist. Die Befehlsdecodierungslogik könnte daher sehr leicht einen Befehl mit 7, 14, 21 oder 28 Informationsbits für jeden Befehl abrufen, ohne mehr als ein Bit des Opcodes betrachten zu müssen.

Ich würde vorschlagen Einfachheit mit einem einzelnen Akkumulator und einigen Primärregistern; Lassen Sie als typisches Muster jeden Befehl eine ALU-Berechnung durchführen, an der der Akkumulator und ein sekundärer Operand beteiligt sind. Lassen Sie das Ergebnis an die ALU oder an den sekundären Operanden zurücksenden. Zu den Möglichkeiten für sekundäre Operanden gehören:

  • Ein "Flags" -Register
  • Eine 8-Bit-Sofortmenge, die in der Anweisung codiert ist.
  • Eine in up codierte Adresse auf 16 Bits der Anweisung
  • Eine Adresse, die durch Abrufen eines Paares aufeinanderfolgender Bytes aus dem Speicher an einer in der Anweisung codierten Adresse gebildet wird.

Um beispielsweise Sprungbefehle zu berücksichtigen, kann es hilfreich sein, eine " ALU-Operation "Opcode, der den Akkumulator und die Flags unberührt lässt, aber eine berechnete effektive Adresse in den Programmzähler kopiert; Die Verwendung dieses Opcodes mit einem der letzten beiden Operandenstile würde einen "Sprung" ergeben. Da ein Versuch, einen Befehl auf einen unmittelbaren Wert zu speichern, nutzlos wäre, könnten Opcodes, deren Bitdefinition dies nahelegt, verwendet werden, um Anweisungen zum "bedingten Überspringen" zu implementieren. Ein solcher Befehl würde einen Latch setzen, der, wenn er gesetzt wird, bewirken würde, dass der nächste Befehl keine andere Wirkung hat, als den Latch "Sprungbefehl" zu löschen.

Es wird eine breite Palette von Kompromissen zwischen den Schaltkreisen geben Komplexität, Geschwindigkeit und Benutzerfreundlichkeit. Beispielsweise kann es hilfreich sein, einige zusätzliche Optionen für den sekundären Operanden einzuschließen:

  • Eines von vier 8-Bit-Adressierungsregistern (die als zwei Paare arbeiten)
  • Speicher an einer Adresse, die gebildet wird, indem ein Registerpaar oder der Programmzähler genommen, eine in der Anweisung angegebene Konstante hinzugefügt und optional der Akkumulator als vorzeichenlos, vorzeichenbehaftet oder vorzeichenlos minus 256 hinzugefügt wird.

Weiter kann es hilfreich sein, Anweisungen zum Erfassen einer effektiven Adresse in eines der Paare von Adressierungsregistern einzufügen. Ein solches Merkmal würde die Effizienz vieler Arten von Programmen erheblich verbessern. Auf der anderen Seite würde das Hinzufügen solcher Dinge bedeuten, dass man sich der Designkomplexität eines 16-Bit-Prozessors nähert, was darauf hindeutet, dass man vielleicht auch einen 16-Bit-Prozessor bauen

.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...