Das Adressregister
Wie bereits in Adressierung und Chipauswahl beschreiben, haben wir einen 16 Bit Adressbus, der angibt, auf welches Speicherelement wir zugreifen wollen.
Die Frage ist nun, wie bekommen wird diesen Wert auf den Adressbus?
Hier kommt das Adressregister ins Spiel.
Das ist analog zu den bisher besprochenen Registern, hat jedoch 16 Bit. Die Ausgabe des Registers wird erneut über einen Tri-State-Buffer mit den Adressleitungen verbunden.
Ok, damit die Ausgabenseite klar, wie kommen die Daten in das Register?
Wir wählen 2 Register aus, die wir für die Übertragung nutzen wollen, dann werden die Daten für die 2 Hälften des Adressregisters in diese Register geladen. Jeweils ein Register für die höheren 8 Bit und eins für die niedrigen 8 Bit. Dann geben wir dem Adressregister das Signal für die Datenübernahme.
Damit steht der Wert nun im Adressregister.
Wie wählen wir die 2 Register aus?
Theoretisch könnten wir wieder 2x 4 Bit Registerauswahl machen, einen Bus anlegen etc. Das haben wir aber alles schon über den ALU Bus für unsere Rechnereien. Die können wir hier mitnutzen.
Es ist ja hierbei egal, dass die ALU dabei addiert oder subtrahiert, das Ergebnis ignorieren wir.
Also schließen wir den Eingang des Adressregisters einfach an den ALU Bus A und B an, wählen die Register aus und geben dem Adressregister das Signal. Damit brauchen wir gerade mal eine zusätzliche Steuerleitung zum speichern des Wertes (Addr W) und eine zum ausgeben auf den Bus (Addr R).
Zusätzlich mit den 2 Steuerleitungen für "in den Speicher schreiben" (Mem W) und "aus dem Speicher lesen" (Mem R).
Hier nun das komplette Ungetüm. Hierbei gilt nun, alles was über dem waagrechten Strich ist, ist der Computerkram, unter dem Strich ist die CPU. Der linke Teil ist die Verarbeitungs-Logik (mit Diagnose-LED) und rechts die Steuerlogik (viele Schalter).
Unter dem Simulator gibt es nun noch 2 Textboxen. Das ist der jeweilige Inhalt von RAM und ROM. RAM enthält erstmal nur Zufallskram, ROM aktuell einfach die Zahlen von 0 bis 255, immer wiederholt.
Eine kleine Übung:
Es soll der Wert 5 im RAM an (relative) Adresse 0 gespeichert werden.
- Absolute Adresse berechnen: relative 0 plus RAM Offset 0x4000 macht 0x4000
- Teiladresse 0x40 in Register Nr 0:
- Wert 0x40 auf Datenbus legen (Bit 7 an),
- Schalter W_ON einschalten (wir wollen ins Register schreiben),
- Register Nr 0 (W3...W0 aus)
- einmal Durchtakten
- W_ON wieder ausschalten
- Datenbus wieder alles auf 0
- Teiladresse 0x00 in Register Nr 1: (Inhalt bereits 0, ansonsten gleiches Vorgehen, nur mit W0=an)
- ALU A auf Register 0, ALU B auf Register 1 (A3...A0 aus, B3...B1 aus, B0 an)
- Wert in Adressregisters speichern
- Addr W auf 1
- einmal Durchtakten
- Addr W auf 0
- Inhalt des Adressregisters auf den Bus ausgeben
- Addr R auf 1
- Enable Signal für RAM sollte nun auf 0 sein, d.h. RAM ist aktiv und relative Adresse 0 ausgewählt
- Wert 5 auf Datenbus legen
- Wert in Speicher schreiben
- Schalter "Mem W" auf 1
- Einmal durchtakten
- Inhalt sollte sich in Ausgabe unten geändert haben
- Schalter "Mem W" auf 0
Den Wert des Speicher wieder auslesen ist weitgehend identisch zu oben, erstmal die richtige Adresse auf die Leitungen bringen (schon erledigt)
Danach
- Datenbus wieder auf 0
- Mem R auf 1
- Datenbus sollte nun 5 haben.
Damit haben wir nun eine Computer mit RAM, ROM und noch viel zu vielen Schaltern und manuellen Schritten.
Nur noch ein kleiner Umweg bzw. zwei weitere Features, dann haben wir endlich alles Zusammen um die Schalter loszuwerden.
Weiter geht es mit dem Programmzähler.