Von-Neumann-Architektur
Lernziele
- Sie wissen, was die Schritte des Fetch-Decode-Execute-Zyklus tun.
- Sie wissen, was folgende Teile der Von-Neumann-Architektur sind: CPU, CU, ALU, Register (PC und ACC), RAM, Bus
- Sie können kleine Programme im LMC nachvollziehen. Versichern Sie sich, dass Sie alle Befehle in der Tabelle verstehen (nicht auswendig lernen!)
1945 wurden in den USA und Europa an verschiedenen Universitäten Rechenmaschinen gebaut. Das Mathegenie John von Neumann fasste seine Arbeit am EDVAC-Computer in einem Bericht zusammen, in dem er die Kernprinzipien und die Organisation der Komponenten erklärte und beschrieb. Diese Grundprinzipien waren für lange Zeit und bis heute die Basis der meisten Allzweckcomputer.
Ich habe Ihnen im violetten Teil eine moderne Input- und Output-Infrastruktur angehängt. In dieser Lektion ist aber nur der obere Teil wichtig: die klassische Von-Neumann-Architektur. Sie definiert vier Hauptteile:
- Control Unit, CU: Koordiniert den Rechenprozess.
- Arithmetisch-logische Einheit (ALU): Führt alle Rechen- und Logikoperationen aus. Hier befindet sich der Addierer, den wir in der Lektion dazu bauen.
- Register: Ultraschnelle Speicherzellen, die einzelne Informationen des Rechenprozesses zwischenspeichern.
- Die Aktuelle Instruktion (CIR) enthält die Instruktion, die als nächstes ausgeführt wird.
- Der Program Counter (PC) enthält die Adresse, die beim nächsten Fetch-Schritt geladen wird.
- Der Akkumulator enthält das aktuelle Zwischenergebnis.
- Arbeitsspeicher (RAM): Speichert Daten und Befehle.
- Input/Output (I/O): Verbindet diesen Kern des Computers mit Ein- und Ausgabegeräten wie Massenspeicher (SSD, Festplatten), Grafikkarten, USB-Geräte und Peripheriegeräte.
Um sich das Diagramm zu merken, hilft es, den Rechenprozess zu verstehen und nur den oberen Teil anzuschauen. Ignorieren Sie die verschiedenen Ein- und Ausgabegeräte!
Fetch-Decode-Execute-Zyklus
Der Schlüssel für den Rechenprozess steckt in der Control Unit (CU): Dort läuft der Fetch-Decode-Execute-Zyklus. Hier habe ich Ihnen zwei FDE-Zyklen visualisiert. Klicken Sie hier durch die Tabs durch, um zu verstehen, was bei den Schritten passiert.
Erklärvideo zu diesem Beispiel
Auffälligkeiten der Von-Neumann-Architektur
Wir bemerken:
- Daten und Instruktionen werden nicht unterschieden und binär im selben Speicher (RAM) gespeichert. Dieselbe Adresse kann je nach Operation als Daten oder als Instruktion interpretiert werden.
- Der Zyklus setzt sich automatisch fort bis zu einer Stopp-Anweisung.
LMC-Simulator
- Führen Sie das Beispielprogramm mehrfach aus und versuchen Sie es mit der Befehlsliste nachzuvollziehen.
- Laden und Ausführen des Beispiels: Auf Bsp 1 klicken; mit «übertragen» in den Speicher laden; in «Eingabe» zwei Werte untereinander schreiben; mit Play starten.)
- Schreiben Sie dann entsprechende Programme für die nachfolgenden Aufgaben.
Aufgaben
Ändern Sie Beispiel 1 so ab, dass zwei Inputwerte subtrahiert werden.
Lösung mit Videoerklärung901 309 901 310 509 210 # Hier stand vorher 110 311 902 000
Schreiben Sie ein Programm, das die ersten zwei Inputwerte addiert und dann den dritten Inputwert subtrahiert.
LösungZum Speichern der Inputs brauche ich hohe Speicheradressen (>20), weil ich während dem Schreiben des Programms ja nicht weiss, wie lange das Programm wird.
Beispiel 2 nutzt die Springbefehle. Mit diesen "springt" das Programm an einen anderen Ort im Speicher, indem der Program Counter (PC) überschrieben wird. Ändern Sie das Beispiel 2 so ab, dass ein Inputwert unendlich lange zu sich selbst addiert wird, e.g. Input 3 => 3, 6, 9, 12,... (Also nicht wie im Beispiel die vorprogrammierte Zahl 7.)
Lösung901 310 902 110 602
Es gibt auch Springbefehle, die nur springen, je nachdem was im Akkumulator gerade steht.
7xxspringt nach xx, falls im Akkumulator aktuell 0 steht, sonst nicht.8xxspringt nach xx, falls im Akkumulator eine Zahl grösser oder gleich 0 steht, sonst nicht.
Entwickeln Sie damit ein Programm, das zwei Inputwerte vergleicht und 1 ausgibt, wenn sie gleich sind, und 0, wenn sie ungleich sind.
LösungIm Speicher hat es "Lücken", weil ich beim Schreiben des Programms ja nicht weiss, wie lange das Programm wird. (In einem richtigen Computer wäre das verschwenderisch! Assembler löst das mit "Labels".)
901 320 901 220 710 521 615 522 615 902 000 0 1
Entwickeln Sie ein Programm, das zwei Inputwerte multipliziert, dann das Ergebnis ausgibt und stoppt.
Mögliche Lösung901 716 318 901 716 319 520 118 320 519 217 714 319 604 520 902 0 1 0
Weitere Ideen:
- Entwickeln Sie ein Programm, das die zwei Inputwerte subtrahiert, wenn sie nicht gleich sind, ansonsten addiert, dann das Ergebnis ausgibt und stoppt.
- Entwickeln Sie ein Programm, das Fakultät berechnet. Ein Beispiel für Fakultät 4.
Binär ist das etwas komplizierter
Von Neumann im Binärsystem
Wir haben hier die Funktion mit Dezimalzahlen erklärt. In Wahrheit funktioniert alles binär.
- Ein 64-Bit-Prozessor hat eine 64-Bit (8 Byte) breite Datenverarbeitung. Das heisst: Die Register, die Speicheradressen und die relevanten Busse sind 64-Bit breit.
- Eine einzelne adressierbare Speicherzelle im RAM ist 1 Byte lang. Eine 64-Bit Instruktion braucht also 8 Speicherzellen!
- Der "Program counter" erhöht sich nicht um 1 wie hier, sondern zeigt auf die nächste Speicheradresse, wo die nächsten Instruktion beginnt.
