# Datenpfad

Ein Datenpfad ist eine Sammlung aus Rechenwerken, wie z. B. ALU oder Multiplizierer, die Datenverarbeitungsoperationen, Register und Busse ausführen. Zusammen mit dem Steuerwerk bildet es die CPU.
Seit kurzem gibt es einen Anstieg der Forschung im Bereich der rekonfigurierbaren Datenpfade – das sind Datenpfade, die man während der Laufzeit umfunktionieren könnte, indem man FPGA nutzt. Diese Designs können möglicherweise in effizientere Berechnungen und beträchtlichen Energieeinsparungen resultieren.

## Funktionale Blöcke

In Computerprozessoren besteht der Datenpfad aus folgenden funktionalen Blöcken oder aus Variationen aus diesen:
* Das Instruktionsregister speichert die derzeitige Instruktion, um sie auszuführen.
* Der Befehlszähler (kurz PC genannt) speichert die Adresse der nächsten Instruktion, um sie dann zu laden.
* Das Speicheradressregister (kurz SAR) ist ein Register, das die Speicheradresse, deren Daten von der CPU abgeholt oder überschrieben werden, speichert.
* Das Speicherdatenregister (kurz SDR) ist ein Register einer Computersteuereinheit, das die Daten, die in den Hauptspeicher gespeichert oder von dort geholt wurden, beinhaltet.
Es gibt auch noch zwei Register innerhalb des Prozessors, die die Kommunikation vom Prozessor und Speicher ermöglichen – oder prinzipiell bei den Speicheroperationen des Registers helfen.

## Single-Bus-Aufbau

Das erste und daher wichtigste Verbindungselement für alle Register innerhalb des Prozessors ist der Systembus. Dieser Bus ist der Prozessorbus und sollte nicht mit dem externen Bus, der verschiedene Speicherchips und Ein- und Ausgabegeräte mit dem Prozessor verbindet, verwechselt werden.
Dieser externe Bus ist mit dem internen Systembus über die Register SAR und SDR verbunden. Die Datenleitungen vom externen Bus sind mit dem SDR verbunden und die Adressleitungen vom externen Bus sind mit dem SAR verbunden. Das SDR ist ein bidirektionales Register, d. h., es kann Daten senden und empfangen und zwar zu internen und externen Bussen. Das SAR ist ein unidirektionales Register; es empfängt seine Eingabe vom internen Bus und übergibt seine Ausgabe dem externen Bus.
Die ALU wird genutzt, um arithmetische und logische Operationen auf den Daten, die in den verschiedenen Registern gespeichert sind, auszuführen. Es ist das Herz eines Mikroprozessors. Der Multiplexer (kurz MUX) ist vorgesehen, um entweder den konstanten Wert 4 oder das Register X auszuwählen. Der konstante Wert 4 wird ausgewählt, wenn eine Instruktion abgeschlossen wurde und der Programmzähler (PC) erhöht wird. {Wie früher erwähnt: (PC ← (PC)+4)}. Der Block „Instruktionsdekoder und Steuerlogik“ dekodiert und befördert die laufende Instruktion in das IR-Register.
Der Prozessor nutzt all diese Blöcke zusammen, um verschiedene Primäroperationen auszuführen; Beispiele sind:
* Inter-Register-Datentransfer
* Arithmetische oder logische Operationen
* Daten vom Speicher abrufen
* Daten in den Speicher schreiben

### Beispiele

Nun betrachten wir eine Addition als eine arithmetische Operation und das Abrufen von Daten vom Speicher im Detail.
Beispiel 1) Arithmetische Addition: Inhalt der Register reg1 und reg2 werden miteinander addiert und in reg3 gespeichert.
Sequenz der Operationen:
* reg1$_{out}$,X$_{in}$
* reg2$_{out}$,choose X,ADDITION,Y$_{in}$
* Y$_{out}$,reg3$_{in}$
Die Steuersignale, die in der einen Zeile geschrieben sind, werden in einem Taktzyklus ausgeführt. Alle anderen Signale bleiben unberührt. Im ersten Schritt wird der Inhalt von Register1 in Register X durch den Bus geschrieben. Im zweiten Schritt wird der Inhalt von Register2 auf den Bus platziert und der MUX wählt den Input X als den Inhalt von reg1, dieser in Register X gespeichert ist, aus. Die ALU addiert dann den Inhalt vom Register X und reg2 und speichert das Ergebnis der Addition im Spezialtemporärregister Y. Im abschließenden Arbeitsschritt wir das Ergebnis, das im Register Y steht, nach Register reg3 über den internen Prozessorbus geschickt und dort abgespeichert. Nur ein Register kann pro Schritt seine Daten über den Bus schicken, daher können die Schritte 2 und 3 nicht kombiniert werden.
Beispiel 2) Abruf von Daten im Speicher: Um Daten vom Speicher abzurufen, muss der Prozessor die Adresse kennen, an der die benötigten Daten abgelegt sind. Die Daten die in einem bestimmten Speicherort sind, können entweder eine Instruktion eines Programms sein oder ein Operand einer bestimmten ausführbaren Instruktion.
Die Sequenz der Operationen hierfür ist folgende:
* reg1$_{out}$,MAR$_{in,}$,READM
* MDR$_{inEX}$,WMC
* MDR$_{out}$,reg2$_{in,}$
Dabei wurden die englischen Abkürzungen MAR für das Speicheradressregister (SAR) sowie MDR für das Speicherdatenregister (SDR) verwendet. Das Steuersignal WMC steht für englisch wait for memory operation to complete, deutsch ‚Warte, bis die Speicheroperation abgeschlossen wird‘. Meistens ist das adressierte Gerät am Speicherbus langsamer als der Mikroprozessor. Daher muss der Mikroprozessor warten, bis das adressierte Gerät seinen Befehl abgearbeitet hat. Dieser Hinweis, dass die Speicheroperation abgeschlossen wurde, wird dem Prozessor über das Steuersignal WMC mitgeteilt.
Das Speicherdatenregister MDR ist ein bidirektionales Register; es ist mit beiden Bussen (de internen wie dem externen) verbunden. Daher wird das Signal MDR indiziert als EX – die Abkürzung steht für externen Bus. Das Signal impliziert, dass Daten vom externen Speicherbus in das Speicherdatenregister MDR verschoben wurde. Die verbleibenden Steuersignale sind selbsterklärend und können verstanden werden wie in Beispiel 1.

### Eine vollständig ausgeführte Instruktion

Nun fügen wir die ursprünglichen Operationen zusammen, um zu sehen, wie eine vollständige Instruktion ausgeführt wird.
Ziehen wir z. B. folgende Instruktion in Betracht:
    ADD (reg3),reg1.
Diese Instruktion addiert die Daten vom gezeigten Speicherort Register3 zum Inhalt vom Register1.
Die Sequenz von Steuersignalen für die oben genannten vollständigen Instruktion lautet wie folgt:
* PCount$_{out}$,MAR$_{in}$,READM,Choose4,ADDITION,Y$_{in}$
* Y$_{out}$,PC$_{in}$,X$_{in}$,WMC
* MDR$_{out}$,IReg$_{in}$
* reg3$_{out}$,MAR$_{in}$,READM
* reg1$_{out}$,X$_{in}$,WMC
* MDR$_{out}$,ChooseX,ADDITION,Y$_{in}$
* Y$_{out}$,reg1$_{in}$,HALT
Die ersten drei der beschriebenen Schritte sind üblich bei allen Instruktionen von Mikroprozessoren. Diese bilden die früher erwähnte Phase „Holen des Befehls“. Danach ist die Instruktion in das Instruktionsregister geladen. Die „Instruktionsdekodierung und Steuerschaltung“ dekodiert anschließend die Instruktionen und schaltet dann alle Steuersignale, die für die Schritte 4 bis 7 benötigt werden, an. Die Schritte 4 bis 7 stellen die "Ausführung, basierend auf der Holen des Befehls"-Phase dar.
Der Inhalt von Register 3 wird in das Speicheradressregister MAR kopiert und in Schritt 4, welche die Adresse des gewünschten Speicherorts übergibt und die READM-Instruktion wird ausgeführt. Der Inhalt vom Register 1 wird über den Bus nach Register X transferiert. Sobald der READM-Befehl abgeschlossen ist, werden die Daten vom gewünschten Speicherort im Speicherdatenregister MDR verfügbar gemacht. Der Multiplexerwert, der in Y gespeichert ist, wird im siebten Schritt über den Bus zum Register1 geschickt.
Der Inhalt des aktualisierten Programmzählers wird im zweiten Schritt in das Register X kopiert. Obwohl es für das oben angeführte Programm nicht gebraucht wird, wird der aktualisierte Wert des PC generell immer im Register X gespeichert im Falle von Verzweigten Instruktionen (englisch branched instructions), die die Verzweigungszieladresse (englisch branch target address) berechnen.

## Multi-Bus Aufbau

Der interne Aufbau eines Prozessors wie oben beschrieben ist ein Single-Bus-Aufbau; dieser ist für theoretische Betrachtungen sinnvoll. Praktisch jedoch sind solche Single-Bus-Mikroprozessoren nicht realisierbar, denn ihr Aufbau würde in sehr umfangreichen Steuersignalsequenzen resultieren.
Um die Anzahl der für eine Instruktion benötigten Schritte zu senken, verwendet man einen Multi-Bus-Aufbau.