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:

  1. Control Unit, CU: Koordiniert den Rechenprozess.
  2. Arithmetisch-logische Einheit (ALU): Führt alle Rechen- und Logikoperationen aus. Hier befindet sich der Addierer, den wir in der Lektion dazu bauen.
  3. 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.
  4. Arbeitsspeicher (RAM): Speichert Daten und Befehle.
  5. 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.

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

  1. 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.)
  2. Schreiben Sie dann entsprechende Programme für die nachfolgenden Aufgaben.

Aufgaben

Ändern Sie Beispiel 1 so ab, dass zwei Inputwerte subtrahiert werden.

901
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.

Zum 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.)

901
310
902
110
602

Es gibt auch Springbefehle, die nur springen, je nachdem was im Akkumulator gerade steht.

  • 7xx springt nach xx, falls im Akkumulator aktuell 0 steht, sonst nicht.
  • 8xx springt 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.

Im 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.

901
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. 4!=4×3×2×1=244! = 4 \times 3 \times 2 \times 1 = 24

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.