# Steuerwerk

Das Steuerwerk, auch Programmsteuerwerk oder Leitwerk (englisch control unit, kurz CU), ist eine Funktionseinheit eines Prozessors, die den Ablauf der Befehlsverarbeitung steuert. Diese Aufgabe erledigt das Steuerwerk, indem es Steuersignale über den Steuerbus an andere Funktionseinheiten sendet und von ihnen empfängt. Alle Aktivitäten des Steuerwerks sind unmittelbar abhängig vom CPU-Takt.

## Funktionsweise

Das Steuerwerk ist neben dem Rechenwerk die Hauptkomponente des Prozessors. Im Steuerwerk befinden sich der Befehlszähler, das Befehlsregister, der Befehlsdecoder und die Operationensteuerung. Die Aufgabe des Steuerwerks ist die Steuerung aller anderen Funktionseinheiten im Prozessor und im Ergebnis die Abarbeitung eines Maschinenprogramms. Dies erreicht es durch das Anlegen von Steuersignalen an den Steuerbus (z. B. um Register-Input/Output oder ALU-Operationen auszuwählen). Andererseits empfängt das Steuerwerk auch Signale vom Steuerbus, insbesondere die Status-Bits der ALU. Diese Statusbits ermöglichen es dem Steuerwerk bedingte Sprungbefehle (bei x86: JZ, JE …) auszuführen.
Das Steuerwerk eines Rechners mit „klassischer“ Von-Neumann-Architektur folgt bei der Abarbeitung eines Maschinenprogramms dem Von-Neumann-Zyklus mit den Phasen FETCH, DECODE, FETCH OPERANDS, EXECUTE und WRITE BACK. Die FETCH- und DECODE-Phasen sind für jeden Maschinenbefehl gleich, die restlichen Phasen sind spezifisch für den Maschinenbefehl.
* FETCH: Es wird auf die Arbeitsspeicheradresse zugegriffen, die im Befehlszähler steht. Die Daten, die an dieser Adresse im Arbeitsspeicher liegen, werden ins Befehlsregister geladen. Der Befehlszähler wird inkrementiert (+ 1 gerechnet).
* DECODE: Der Decoder ist ein Schaltnetz, das die Inhalte des Befehlsregisters als Input hat. Der Decoder hat Ausgänge für jeden möglichen Maschinenbefehl (z. B. bei x86: ADD, MUL, JMP…) und für jeden möglichen Operanden (z. B. bei x86: eax, ebx, ecx, edx, eine Speicheradresse …). Diese Ausgänge setzt er entsprechend dem Inhalt des Befehlsregisters. Alle Ausgänge des Decoders münden in die Operationensteuerung.
* FETCH OPERANDS: In der Operationensteuerung wurde jetzt der endliche Automat aktiviert, der für die Ausführung des Maschinenbefehls im Befehlsregister steht. Je nachdem welche Operanden durch den Decoder ausgewählt wurden und um welchen Maschinenbefehl es sich handelt, werden jetzt entweder die Operanden, die für die Ausführung des Befehls gebraucht werden geladen, oder es wird sofort (im selben Taktzyklus) mit der EXECUTE-Phase begonnen.
* EXECUTE: Alle notwendigen Daten sind jetzt in Registern vorhanden. Je nach Art des Maschinenbefehls werden jetzt eine oder mehrere Operationen ausgeführt. Bei x86 gilt: Einfache Befehle wie MOV, JMP oder ADD benötigen wenig Zeit. Komplexe Befehle sind MUL und DIV, diese benötigen abhängig von der Mikroarchitektur mehr Zeit.
* WRITE BACK: Diese Phase der Befehlsausführung existiert nur in CISC-Rechnern. Bei x86 gilt: Eine WRITE-BACK-Phase ist nur notwendig, wenn ein Befehl in den Arbeitsspeicher zurückschreibt, sie ist jedoch nicht für den MOV-Befehl notwendig, denn dieser schreibt gegebenenfalls schon in der EXECUTE-Phase zurück in den Arbeitsspeicher.
Wenn kein HALT-Befehl ausgeführt wurde, beginnt der Zyklus jetzt von neuem.
Modernere Rechner verwenden Pipelining, Superskalarität, dynamisches Scheduling (Scoreboarding, den Tomasulo-Algorithmus), Simultaneous Multithreading und andere Methoden, die das Steuerwerk verkomplizieren, jedoch die Befehlsausführung beschleunigen.