TTA-Prozessor. Teil 2

Vorwort


Dies ist der zweite Teil eines Versuchs, einen TTA- Prozessor in Logisim zu erstellen . Während des Erstellungsprozesses bestand ein Bedarf an zusätzlichem Speicher, in dem einige Zwischenwerte gespeichert werden konnten, und für diesen Speicher bestand die Notwendigkeit, das Steuergerät zu ändern.

Teil 1
Teil 2

Zusätzlicher Speicher


Da es schwierig ist, Befehle und Konstanten im Speicher zu speichern, ist es schwierig, einen vollständig adressierbaren Speicher zu erstellen. Sie benötigen also etwas Einfacheres. Ein Stapel oder eine Warteschlange ist dafür gut geeignet.

Die Warteschlange sieht nicht sehr praktisch aus, und die Forth- Sprache wurde für den Stapel erfunden , dessen Compiler ich schreiben möchte. Wir implementieren den Stack als funktionales Gerät:


Es sieht verwirrend aus, aber tatsächlich führt dieses Gerät einfache Funktionen aus: Der Zähler zeigt auf die nächste Zelle. Wenn Daten eintreffen, werden sie in die Zelle geschrieben, auf die der Zähler zeigt, und es nimmt zu, wenn Daten entnommen werden, werden sie von der Zelle vor der einen gegeben durch den Zähler angezeigt und der Zähler nimmt ab. Dann tritt ein anderes Problem auf: Woher wissen Sie, welche Daten vom Stapel genommen wurden? Sie benötigen dafür ein Flag. Dann sieht das Steuergerät (UU) folgendermaßen aus:


Zur Vereinfachung der Verbindung befinden sich die Ausgänge links und die Eingänge rechts, dann die Steuereinheit und andere Funktionsgeräte (Stapel, Addierer, UND, ODER, Register usw.):


Lassen Sie uns eine einfache Schaltung mit einem Speicher von Befehlen, zwei Stapeln, zwei Registern, einem Addierer, einem Negator und einer Konstante (sei es 5) zusammenstellen:


Es bleibt noch Speicher für die Konstanten zu erstellen, und Sie können den Forth-Compiler schreiben, aber jetzt versuchen wir, einige Wörter direkt daraus in den Speicher zu schreiben.

Dup


Das Wort dup macht eine einfache Sache: Dupliziert die Daten der obersten Zelle des Stapels zurück auf den Stapel. Zuerst müssen Sie zum Beispiel unsere Konstante (in6 -> o1) auf den Stapel laden, jetzt haben wir Daten in der ersten Zelle des Stapels, aber wenn Sie die Daten nehmen, verschwinden sie irgendwie vom Stapel. Was soll ich tun? Hierfür gibt es Register, laden Sie die Stapelzelle in das Register und speichern Sie sie dort. Danach laden wir sie zweimal auf den Stapel und duplizieren sie dabei. Der Pseudocode sieht folgendermaßen aus:

1. in6 -> o1 // Laden der Konstante in den Stapel
2. in1 -> o3 // Lade eine Zelle vom Stapel in Register
3. in3 -> o1
4. in3 -> o1 // Lade den Inhalt des Registers zweimal auf den Stapel

Das ist alles, im Speicher sieht es so aus:


Und nach der Ausführung sieht der Stapel folgendermaßen aus:


Wie erwartet unsere beiden Konstanten. Das ist alles, auf ähnliche Weise können Sie fallen lassen, tauschen, verrotten usw.

Vielen Dank für Ihre Aufmerksamkeit, ich hoffe es war nicht langweilig!

Github Link: GitHub

All Articles