Lernpfad Know-How-Computer/KHC als Von-Neumann-Rechner
Die Von-Neumann-Architektur
Die Von-Neumann-Architektur unterscheidet die Hauptkomponenten
- Steuerwerk, das den Programmablauf steuert,
- Rechenwerk, das Rechnungen und logische Operationen wie z.B. Größenvergleiche von Zahlen durchführt,
- Speicherwerk, das den Zugriff auf den Hauptspeicher verwaltet,
- ein so genanntes Bus-System. Damit bezeichnet man die Verbindungsleitungen, über die Adressen, Daten und Steuersignale zwischen den einzelnen Komponenten transportiert werden.
Die Hauptkomponenten beinhalten u.a. verschiedene so genannte Register. Das sind kleine Speichereinheiten, auf die die Komponenten sehr schnell zugreifen können.
Das Steuerwerk enthält als Register den Programmzähler (PZ), der immer die Adresse des aktuellen Befehls enthält, sowie das Befehlsregister (BR), das diesen Befehl selbst (z.B. inc 4) enthält und nochmals in einen Operations-Teil (enthält z.B. „inc“) und einen Adress-Teil (enthält z.B. „4“) unterteilt wird. Außerdem befindet sich im Steuerwerk der so genannte Dekodierer, der die Maschinenbefehle in noch kleinere Arbeitsschritte (Mikrobefehle) zerlegt.
Das Rechenwerk verfügt über ein Register, das als Akkumulator (Akku) bezeichnet wird. In diesem wird der Wert gespeichert, mit dem gerade gerechnet wird. Die Berechnung selbst übernimmt die so genannte „Arithmetisch-logische Einheit“ (ALU). Beim KHC muss diese lediglich drei Operationen ausführen können, nämlich den Akku um 1 erhöhen, ihn um 1 verringern und prüfen, ob er den Wert 0 enthält. Außerdem verfügt das Rechenwerk noch über einige Status-Flags, die etwas über den Zustand des Rechenergebnisses aussagen. Flags sind Minispeichereinheiten, die entweder den Wert „wahr“ (Ziffer 1) oder „falsch“ (Ziffer 0) speichern können. Beispiele sind das Zero-Flag, das von der ALU auf den Wert „wahr“ gesetzt wird, wenn der Wert im Akku gleich 0 (zero) ist. Ein anderes Flag, das Overflow-Flag, zeigt an, ob bei einer Berechnung ein Bereichsüberlauf (overflow) aufgetreten ist. Das könnte z.B. passieren, wenn der Wert im Akku durch eine Berechnung so groß wird, dass er anschließend nicht mehr in den Akku hineinpasst.
Steuerwerk und Rechenwerk werden zusammen auch als „Zentraleinheit“ oder „Central Processing Unit“ (CPU) bezeichnet. Zur CPU gehört außerdem noch eine Uhr, die als Schrittmacher den Takt vorgibt, in dem die einzelnen Schritte ausgeführt werden.
Das Speicherwerk besitzt ein Adress- und ein Datenregister (AR und DR). Sie stellen als Schnittstellen die Verbindung zwischen dem Hauptspeicher und den anderen Hauptkomponenten her. Wenn der Inhalt einer Zelle aus dem Hauptspeicher gelesen werden soll, dann wird die Adresse dieser Zelle in das Adressregister AR kopiert und über ein Steuersignal die Aufforderung zum „Lesen“ gegeben. Das Speicherwerk kopiert daraufhin den Inhalt der angegebenen Zelle in das Datenregister DR. Soll dagegen ein Wert in einer Hauptspeicherzelle gespeichert werden, so wird deren Adresse im Adressregister AR und der Speicherwert im Datenregister DR abgelegt. Anschließend wird über das Steuersignal „Schreiben“ das Speichern des Wertes in der entsprechenden Zelle des Hauptspeichers veranlasst.
Zur Rechnerarchitektur gehört eigentlich noch ein Ein- und Ausgabewerk, worauf hier aber verzichtet wird, da es im Zusammenhang mit dem KHC nicht benötigt wird.
Die folgende Abbildung zeigt schematisch den Aufbau der Von-Neumann-Architektur.
Der Von-Neumann-Zyklus am Beispiel des inc-Befehls
Das Zusammenspiel der Prozessor-Komponenten soll am Beispiel der Ausführung eines inc-Befehls erklärt werden. Der Ablauf einer solchen Befehlsausführung wird in mehrere Phasen unterteilt, die den so genannten Von-Neumann-Zyklus bilden. Jeder Zyklus besteht aus einer Reihe so genannter Mikroprogrammschritte.
Unser Beispiel geht von folgender Ausgangssituation aus: Im Hauptspeicher steht das Programm Beispiel 1 „x plus 2“ aus dem obigen Kapitel „Erste Schritte“. Das bedeutet, der Programmzähler zeigt auf die Speicherzelle mit der Adresse 1 und in dieser Zelle steht der Befehl „inc 4“: ==> 1: inc 4
1. Phase: FETCH (Befehl holen)
Der nächste Befehl, der laut Programmzähler PZ ausgeführt werden soll, wird aus dem Hauptspeicher geholt und ins Befehlsregister BR geladen. Außerdem wird der Programmzähler (vorsorglich) um 1 erhöht. Im Beispiel werden die folgenden Mikroprogrammschritte ausgeführt:
- Wert „1“ von PZ an AR senden
- Signal „Lesen“ von Steuerwerk an Speicherwerk senden
- „inc 4“ aus Hauptspeicherzelle 1 lesen und an DR übergeben
- „inc 4“ von DR an BR senden
- Wert „1“ von PZ an Akku senden
- Signal „Akku um 1 erhöhen“ von Steuerwerk an ALU senden
- ALU führt Erhöhung durch und hinterlässt Wert „2“ in Akku
- Wert „2“ von Akku an PZ senden
Diese FETCH-Phase, in der der nächste auszuführende Maschinenbefehl aus dem Hauptspeicher geholt wird, läuft für alle Befehle gleich ab. Die nun folgenden Schritte hängen jeweils von dem gerade geholten Befehl ab.
2. Phase: DECODE (Befehl dekodieren)
Der Dekodierer des Steuerwerks enthält für jeden Maschinenbefehl die passende Sequenz von Mikroprogrammschritten und sorgt nun dafür, dass genau diese als nächstes ausgeführt werden. In unserem Beispiel sind das für den Befehl „inc“ die folgenden Schritte.
3. Phase: FETCH OPERANDS (Operanden holen)
Wenn hinter dem Befehlsbezeichner die Adresse einer Zelle steht, in der sich ein Datenwert befindet (also inc, dec oder isz), dann muss erst einmal dieser Wert selbst noch aus der entsprechenden Zelle aus dem Hauptspeicher geholt werden. Im Beispiel steht hinter inc die Adresse 4. Der Wert, der an dieser Adresse steht, ist 0. Dieser Wert, der um 1 erhöht werden soll, wird als nächstes aus dem Hauptspeicher geholt und ins DR transportiert:
- Adresse „4“ von Befehlsregister-Adressteil an Adressregister AR senden
- Signal „Lesen“ von Steuerwerk an Speicherwerk senden
- Wert „0“ aus Hauptspeicher lesen und an DR übergeben
4. Phase EXECUTE (Befehl ausführen)
Die ALU des Rechenwerks führt die durch den Befehl vorgegebene arithmetische oder logische Operation aus. Bei einem Sprungbefehl wird ggf. der in der ersten Phase vorsorglich schon erhöhte Programmzähler auf einen neuen Wert gesetzt. In unserem Beispiel wird der Wert „0“ vom Akku um 1 erhöht.
- Wert „0“ von DR an Akku senden
- Signal „Akku um 1 erhöhen“ von Steuerwerk an ALU senden
- ALU führt Erhöhung durch und hinterlässt Wert „1“ in Akku
5. Phase WRITE BACK (Ergebnis in den Speicher zurückschreiben)
Wenn durch den Befehl der Wert in einer Speicherzelle neu berechnet wurde, wird das Ergebnis der Berechnung in diese Zelle zurückgeschrieben. Im Beispiel wird der Wert „1“ in die Speicherzelle 4 geschrieben und damit der alte Wert „0“ überschrieben.
- Adresse „4“ von Befehlsregister-Adressteil an AR senden
- Signal „Schreiben“ von Steuerwerk an Speicherwerk senden
- Wert „1“ von DR in Zelle Nr. 4 im Hauptspeicher schreiben
Ergebnis des ersten Durchlaufs: In der Speicherzelle 4 steht jetzt der Wert „1“ und der Programmzähler zeigt auf die Zelle mit der Adresse 2, in der der nächste Programmbefehl steht. Mit diesem beginnt der Von-Neumann-Zyklus nun wieder von vorne - so lange, bis der Stop-Befehl erreicht und ausgeführt wird.
