tldr; Ich habe Ben Eaters 8-Bit-Breadboard-Computer gebaut und später erweitert. Nach dem ersten Build habe ich 16-Bit-Programmzähler und Speicheradressenregister integriert, den Befehlssatz neu gestaltet und es geschafft, auf 64 KB RAM zuzugreifen. In Zukunft habe ich 8-Bit-X- und Y-Register als Zählerregister hinzugefügt, vergleichbar mit X und Y des 6502/10. Mit diesen 2 zusätzlichen Registern wird die Microcode-Organisation und die notwendige ROM-Größe bereits unangenehm groß. Wie kann ich die Microcode-Organisation besser handhaben?
Details: Im aktuellen Design habe ich bereits 7 8-Bit-Register (A, B, ALU, Ausgang, Befehlsregister, X- und Y-Zähler). Außerdem habe ich 2 16-Bit-Register (Programmzähler, Speicheradressenregister) und ein 2-Bit-Flags-Register.
Aktuell verwende ich 3 ROMs für Microcode mit jeweils 11 Bit Adressbreite, also jeweils 2kB und 6kB zusammen. Die ROMs decodieren derzeit die Ausgabe für bereits 18 Steuersignale, um die Eingabe und Ausgabe der gesamten an den 8-Bit-Einzelbus angeschlossenen Hardware zu handhaben.
Die 11 Eingangsbits für die Decoder-ROMs bestehen aus 6 Bits von der Anweisung (was mir nur maximal 64 Anweisungen lässt), 2 Bits von Flags und 3 Bits von einem Anweisungs-Unterschrittzähler.
Das Design funktioniert wie ein Zauber, aber ich frage mich, wie ich den Mikrocode noch verwalten kann, wenn ich das Design noch weiter erweitere. Ich plane mehr Busse (Daten, Adresse, ALU getrennt), mehr Flags, mehr Register. Ich befürchte, dass die schiere Anzahl der notwendigen Eingabebits für die Befehls-ROMs ihre Größe ziemlich schnell sprengen wird. Andererseits wächst auch der Bedarf an Steuerleitungen recht schnell.
Mögliche Lösungen, die ich sehe: Mein aktuelles Design hat den Vorteil, dass alle Anweisungen superschnell sind und maximal zwischen 2 und 6 Zyklen benötigen. Ich könnte zum Beispiel Steuerleitungen loswerden, indem ich ihre Anzahl verringere und Schieberegister verwenden, um Steuersignale sequentiell zu bilden. Aber das kostete mich viele Zyklen pro ASM-Befehl und würde die Maschine dramatisch verlangsamen. Das Problem der Eingangssignale ist völlig ungelöst.
Ich habe keine formelle Ausbildung in diesem Bereich, verzeihen Sie daher bitte meine naive Frage. Ich würde gerne verstehen, wie Hardware-Ingenieure in den 70er und 80er Jahren diese Probleme in CPUs wie dem RCA 1802, dem MOS 6502 oder dem Z80 gelöst haben. Gibt es Begriffe, die ich nicht kenne? Wo kann ich mich darüber informieren? Kann hier jemand helfen?
Vielleicht könnten Sie etwas Multiplexing/Konsolidierung verwenden. Vielleicht können Sie dieselben Zeilen für verschiedene Kontexte verwenden. Wenn Sie ein Repeat-Flag haben, ist es wahrscheinlich nicht nützlich für Register-zu-Register-ALU-Operationen, also könnten einige der Zeilen für solche Operationen etwas anderes tun. Ich vermute, dass Ihr Microcode-ROM bereits eine Reihe von Lücken aufweist, nur dass Sie sie nicht erreichen können.
user_1818839
Scott van Voss
David Tweed
Kartmann