![]() |
Einführung Datenverarbeitungssystemevon Prof. Jürgen Plate |
Befehlsprozessor. Das Leitwerk wird auch als Steuerwerk
bezeichnet. Das Leitwerk hat folgende Aufgaben:
Diese Kommunikation erfordert Steuer- und Meldeleitungen:
Befehlsdecoder
Ablaufsteuerung
Adreßrechnung (Ermitteln effektiver Adresse)
Dabei kann jedes Steuerwort vom vorhergehenden Steuerwort und
von äußeren Bedingungen abhängen. Die
äußeren Bedingungen können z.B. der Op-Code
und/oder Modifikatorteil des auszuführenden Befehls oder
Status-Signale sein
Ablaufsteuerung ist synchrones
Schaltwerk.
Die Anzahl der Taktzyklen zur Ausführung eines Befehls
hängt vom jeweiligen Befehl ab (ca. 1 ... 170 Taktzyklen).
CPUs haben typisch 50 bis einige 100 Befehle
Ablaufsteuerung hat dann 500 bis einige 1000 verschiedene Steuerworte.
Daher erfolgt heute bei CISC die Realisierung als
mikroprogrammiertes Schaltwerk. Die einzelnen Steuerworte
stehen dann in einem Festwertspeicher (ROM) - siehe Umdruck. Die
Auswahl eines bestimmten Steuerworts erfolgt durch Anlegen seiner
Adresse. Das adressierte Steuerwort wird aus dem Speicher
ausgelesen und die einzelnen Steuersignale über direkte
Leitungen auf die Steuereingänge der entsprechenden Werke
geschaltet. Die Auswahl des nächsten Steuerwortes erfolgt dann
durch Auswahl der Folgeadresse
Sequencer.
Normalfall: Sequentielle (lineare) Folge von Steuerworten im Mikroprogrammspeicher.
Die Folgeadresse kann von der linearen Folge abweichen, wenn z. B.:
Ein derart
ergänztes Steuerwort heißt Mikrobefehl.
Die
für die Durchführung eines bestimmten CPU-Befehls
erforderliche Folge von Mikrobefehlen heißt
Mikroprogramm. In diesem Zusammenhang wird der CPU-Befehl
manchmal auch Makrobefehl genannt. Für die Realisierung
der Adressbestimmung existieren eine Reihe unterschiedlicher
Konzepte. An dieser Stelle soll beispielhaft nur ein relativ
einfaches Konzept vorgestellt werden. Die Startadresse jedes
Mikroprogramms wird durch den Op-Code des entsprechenden
CPU-Befehls festgelegt. Da die Startadressen der einzelnen
Mikroprogramme weiter auseinander liegen, wird ein
Zuordnungsspeicher (Mapping ROM) zwischengeschaltet.
Die jeweils nächste Adresse kann dann bestimmt werden durch:
Charakteristisch für Mikroprogrammspeicher ist die relativ geringe "Programmlänge" für die Bearbeitung eines CPU-Befehls (typisch ca. 500 bis 2000 Mikrobefehle) und die große Wortbreite (typisch 32 .. 128 Bit, bei IBM-Großrechnern mehrere 100 Bit).
Im allgemeinen ist bei heutigen Rechnern die Ablaufsteuerung
für den Benutzer unzugänglich und kann auch nicht
geändert werden. Es gibt jedoch Prozessoren (z.B. Bit-Slice-P.
AM 29xx-Serie) und CPUs, bei denen der Benutzer die vorhandenen
Mikroprogramme selbst erstellen oder ergänzen kann
speziell angepasste Maschinenbefehle
effektivere
Programmierung und Einsatz des Rechners
"Wunsch-CPU". Durch Verwendung von speziellen
IC-Bausteinen wäre sogar eine CPU denkbar, die
während der Abarbeitung eines Programms die CPU-Befehlsliste
ändern kann.
Bei RISC-Prozessoren wird zur schnelleren Ablaufsteuerung ein anderer Weg beschritten. Hier besteht die Ablaufsteuerung aus einer fest verdrahteten Logik. Zusammen mit einer passenden Architektur der übrigen Werke gelangt man so zu Prozessoren, die einen Befehl innerhalb eines Taktzyklusses ausführen können.
Aufgabe des Unterbrechungs-Werks:
Einfachster Fall ist eine einzige IRQ-Leitung. Diese führt auf ein Flipflop, das durch die IRQ-Anforderung gesetzt wird. Nach Annahme der PU durch die Ablaufsteuerung wird das FF durch die Ablaufsteuerung zurückgesetzt.
Häufig ist es sinnvoll, die sofortige Ausführung einer
Unterbrechung zu verhindern (u. a. dann, wenn gerade eine Routine
zur PU-Behandlung abläuft).Die PU-Anforderung wird gesperrt
(interrupt disable)
maskierbarer Interrupt. Nur,
wenn das Masken-FF gesetzt ist, führt eine PU-Anforderung auch
zu einer PU-Anmeldung (d.h. die PU wird akzeptiert). Das Masken-FF
kann per Software gesetzt oder gelöscht werden.
Als Reaktion auf eine PU erfolgt:
Zustandsvektor). Speicherung meist im Kellerspeicher (Stack).
Teils per HW (PC, Status), teils per SW (z.B. übrige
Register).
Interrupt-Vektor). Das Programm wird nun ab der Startadresse
der ISR fortgesetzt.
Fast immer gibt es mehrere Quellen für PU-Anforderungen. Viele CPUs besitzen mehrere IRQ-Eingänge (aber man kann über zusätzlichen HW-Aufwand auch bei einem einzigen IRQ-Eingang mehrere PU-Quellen bedienen). Die Freigabe der einzelnen IRQ-Eingänge erfolgt über ein spezielles Register, das IRQ-Masken-Register (dem Masken-FF entsprechend). Das Masken-Register kann wieder per SW geladen werden. Neben den maskierbaren IRQ-Eingängen gibt es meist auch nicht-maskierbare IRQ-Eingänge (NMI, RESET). NMI kann z.B. verwendet werden, um Ausfall der Versorgungsspannung zu signalisieren (Nothalt und Datensicherung bei Prozesssteuerung).
Wenn mehr PU-Quellen als IRQ-Eingänge vorhanden sind, müssen mehrere PU-Anforderungen mittels zusätzliche Hardware zusammengefasst werden, z. B. über ODER-Verknüpfung (bei 0-aktiven PU-Anforderungen über NAND). Daraus ergibt sich das Problem, dass die ISR (Interrupt Service Routine) zunächst die jeweilige Quelle identifizieren muss, da in der Regel auf unterschiedliche PU-Quellen vom Programm aus auch unterschiedlich reagiert werden muss. Die Identifizierung der Quelle ist auch notwendig, um das entsprechende IRQ-Flipflop beim Interrupt-Verursacher zurücksetzen zu können. Für die Identifizierung der PU-Quelle gibt es folgende Methoden:
prioritätsgesteuertes Interrupt-System. Die einfachste Form
der Realisierung einer Prioritäts-Steuerung ist die
Vorrang-Kette (daisy-chain = "Gänseblümchen-Kette"). Das von der
Ablaufsteuerung kommende Quittungssignal gelangt über die
UND-Gatter nur bis zu der PU-Quelle mit höchster
Priorität. Nur von dieser wird dann der Identifikations-Code
ausgesendet und das PU-Anforderungs-FF zurückgesetzt. Die
Prioritätsreihenfolge ist durch die Verschaltung der
Quittungsleitungen festgelegt
"geographische
Priorität".
Das Retten des aktuellen Programmzustands des unterbrochenen
Programms geschieht häufig in einem Kellerspeicher (Stack),
der i. a. Teil des Arbeitsspeichers ist, wobei der Top of Stack
über ein spezielles Register (Stackpointer) des Leitwerks
adressiert wird
beliebig geschachtelte
Programmunterbrechungen sind möglich.
Während des Rettens des Programmzustands und des
anschließenden Ladens des Zustandsvektors der ISR darf keine
neue Unterbrechungsanforderung auftreten (Zustandsinformation
unvollständig!)
Bei den meisten CPUs wird daher vom
Leitwerk die PU-Anforderung gesperrt. In der ISR muss dann die
Möglichkeit für PU-Anforderungen wieder per CPU-Befehl
freigegeben werden.
Nach Ende der ISR wird der ursprüngliche Zustandsvektor wieder vom Stack geholt und das Programm an der Unterbrechungsstelle fortgesetzt.
Wesentliches Merkmal des Busprinzips ist die Möglichkeit, mit einer Signalleitung
nicht nur einen Sender und einen Empfänger zu verbinden (Punkt-zu-Punkt-Verbindung),
sondern mehrere Empfänger und sogar mehrere Sender anschalten zu können.
Je nachdem, ob die am Bus angeschlossenen Einheiten jeweils nur als Sender bzw.
nur als Empfänger wirken, oder ob einzelne oder alle Einheiten beides gleichzeitig
sein können, ist der Informationsfluß auf dem Bus unidirektional oder
bidirektional.
Der Adreß-Bus z.B. ist im einfachsten Fall unidirektional, wenn die Adressen
nur vom Prozessor auf den Bus gegeben werden, während Speicher und E/A-Werk
nur Adreßempfänger sind. Der Daten-Bus dagegen ist typisch bidirektional,
denn Daten müssen von jeder Einheit zu jeder anderen transportiert werden
können.
Während beim A- und D-Bus jeweils alle Leitungen parallel betrieben und deshalb auch identisch verschaltet werden, besteht der Steuerbus (Control-Bus oder C-Bus) meist aus verschiedenen voneinander unabhängigen Takt-, Status- und Steuerleitungen. Über sie wird das sogenannte Busprotokoll realisiert, d.h. die Regeln, nach denen die einzelnen Signalübertragungen abzuwickeln sind. Die Tatsache, daß an einem Bus mehrere Sender und Empfänger angeschaltet sind, bringt zwei Probleme mit sich:
Die "offenen" Kollektoren der Bustreiber-Transistoren bei Open-Collector-Ausgängen können nur den Low-Pegel aktiv durchschalten; sind sie gesperrt, so muß ein für alle gemeinsamer Pull-up-Widerstand (Zieh-Widerstand) für den High-Pegel sorgen. Damit ergeben sich unterschiedliche Flankenformen der Rechtecksignale auf dem Bus: schaltet ein Treiber-Transistor durch, so wird rasch (weil niederohmig) der Low-Pegel erreicht (steile High-Low-Flanke); beim Sperren des Transistors erzeugt der hochohmigere Pull-Up den High-Pegel. Die immer vorhandenen Kapazitäten der Busleitungen bilden mit dem Pull-up ein R-C-Glied mit relativ langer Zeitkonstante, die Flanke Low-High ist flacher.
Tri-State-Treiber besitzen den Vorteil, daß beide Pegel aktiv durchgeschaltet werden und damit beide Flanken steil sind. Für die Abschaltung der jeweils inaktiven Treiber sorgt ein Steuereingang, der den Ausgang hochohmig macht; so als wäre kein Treiber angeschaltet (dritter Zustand). Durch die Verschaltung geeigneter Steuersignale des C-Busses muß zu jedem Zeitpunkt dafür gesorgt werden, daß alle Busteilnehmer - mit Ausnahme des einzigen aktiven - im hochohmigen (dritten) Zustand sind. Sind auch nur kurzzeitig zwei aktiv, die unterschiedliche Pegel anlegen wollen, so fließt über die Transistoren der zwei Treiber ein sehr hoher Strom, der zu ihrer Zerstörung führen kann!
Bei einfachen Rechnersystemen steuert der Prozessor das Busprotokoll, d.h. er aktiviert die wichtigsten Steuersignale, während die übrigen Teilnehemer in der geforderten Weise mit entsprechenden Antwortsignalen reagieren müssen (Master-Slave-Prinzip). In Systemen mit mehreren Mastern (z.B. Mehrprozessorsysteme) müssen zusätzliche Steuersignale vorhanden sein, um den sogenannten Master-Transfer zu steuern, d.h. die Übergabe des Rechtes, die Steuerleitungen zu aktivieren. Mit steigenden Prozessorgeschwindigkeiten wachsen auch die Anforderungen an die Übertragungskapazität der Busse. Das führt zu steileren Flanken der Signale und damit zu höheren Frequenzanteilen (Fourier-Analyse!). Entsprechend wächst das Problem der Leitungsreflexionen an den Bus-Enden. Nur durch sorgfältigen Abschluß der Busleitungen mit dem Leitungs-Wellenwiderstand und durch Verwendung der vorgeschriebenen Treiber- und Empfängerbausteine können "saubere" Rechtecksignale mit steilen Flanken und ohne Überschwingen sichergestellt werden!
Das Busprotokoll für den Datentransport kann auf zwei grundsätzlich verschiedene Arten realisiert werden:
Prinzip eines Schreibzyklus auf einem asynchronen Bus:
Ein Vorteil dieses Prinzips ist die Möglichkeit, Speicherbausteine beliebiger Zugriffszeit verwenden zu können (z.B. Austausch gegen schnellere oder Verwendung verschiedener in einem System), wobei jeweils mit der optimal erreichbaren Buszykluszeit operiert wird. Notwendig ist jedoch ein gewisser Aufwand auf der Speicherkarte für das Signal-Handshaking. Auf der Prozessorseite wird außerdem eine Time-Out-Schaltung benötigt, die dann ansprechen muß, wenn innerhalb einer vorgegebenen Zeit keine Quittung empfangen wird (nicht existierende Adresse oder defekte Speicherkarte). Ein Ansprechen des Time-Out muß zu einem Interrupt des Prozessors führen ("Non existing memory trap").
Die Ausgänge Q0 bis Q4 des Registers wählen die Adressen des Speichers aus und bestimmen so das Datenwort, das an den Speicherausgängen D0 bis D8 anliegt. Die Speicherausgänge D0 bis D3 bestimmen zusammen mit dem Multiplexerausgang QM, der auf den Registereingang D4 geleitet wird, den Folgebefehl. Die Speicherausgänge D7 und D8 wählen einer der Multiplexereingänge E0 bis E3 aus:
Bei den Eingangskombinationen 01 oder 10 für D7,D8 hängt die Folgeadresse von Wert der Eingänge A und B ab. Als Beispiel soll Eingang A betrachtet werden:
Die folgenden Beispiele sind absichtlich nicht auf die (komplexe) Ablaufsteuerung im Leitwerk einer CPU bezogen, sonder sollen durch Ihre einfache Aufgabenstellung die Arbeitsweise der einfachen Ablaufsteuerung demonstrieren.
Y0 0: Band stop, 1: Band läuft Y1 Taktimpulse für die Abfülleinrichtung Y2 Taktimpuls für Schließmechanismus A 1: Schachtel in Position
Der Ablauf sieht dann folgendermaßen aus:
Speicherbelegung:
A0 A1 A2 A3 A4 ¦ D0 D1 D2 D3 D4 D5 D6 D7 D8 ---------------+------------------------------ 0 0 0 0 0 ¦ 0 0 0 0 1 0 0 0 1 Schritt 1 0 0 0 0 1 ¦ 0 0 1 0 0 1 0 0 0 Schritt 2 (T1) 0 0 1 0 0 ¦ 0 0 1 1 0 0 0 0 0 Schritt 2 (T1) 0 0 1 1 0 ¦ 0 1 0 0 0 1 0 0 0 Schritt 2 (T2) 0 1 0 0 0 ¦ 0 1 0 1 0 0 0 0 0 Schritt 2 (T2) 0 1 0 1 0 ¦ 0 1 1 0 0 1 0 0 0 Schritt 2 (T3) 0 1 1 0 0 ¦ 0 1 1 1 0 0 0 0 0 Schritt 2 (T3) 0 1 1 1 0 ¦ 1 0 0 0 0 1 0 0 0 Schritt 2 (T4) 1 0 0 0 0 ¦ 1 0 0 1 0 0 0 0 0 Schritt 2 (T4) 1 0 0 1 0 ¦ 1 0 1 0 0 1 0 0 0 Schritt 2 (T5) 1 0 1 0 0 ¦ 1 0 1 1 0 0 0 0 0 Schritt 2 (T5) 1 0 1 1 0 ¦ 1 1 0 0 0 0 1 0 0 Schritt 3 1 1 0 0 0 ¦ 1 1 0 1 0 0 0 0 0 Schritt 3/4 (1) 1 1 0 1 0 ¦ 1 1 1 0 0 0 0 0 0 Schritt 4 (2) 1 1 1 0 0 ¦ 1 1 1 1 0 0 0 0 0 Schritt 4 (3) 1 1 1 1 0 ¦ 0 0 0 0 0 0 0 0 0 Schritt 5Schritt 1 stellt einen bedingten Sprung dar. Mit D7/D8 wird über den Multiplexer der Eingang A als Steuerung für Bit 4 des Registers ausgewählt. Solange der Eingang A Null ist, erfolgt ein Sprung nach 00000, also auf den Befehl selbst. Wechselt der Eingang auf 1, erfolgt ein Sprung nach 00001 (Schritt 2): Die beiden Sprungalternativen sind allgemein immer xxxx0 und xxxx1. Da die erste Adresse (00000) festliegt, ergibt sich die zweite zwangsläufig. Alle nun noch freien Speicherzellen werden sicherheitshalber wie Schritt 5 programmiert (Sprung nach Schritt 1).
Y0 0: Schranke öffnen, 1: Schranke schließen Y1 Lampe rot Y2 Lampe grün A 0: Schranke nicht offen, 1: Schranke ist offen B Taster (1 = öffnen)Der Ablauf sieht dann folgendermaßen aus:
Speicherbelegung:
A0 A1 A2 A3 A4 ¦ D0 D1 D2 D3 D4 D5 D6 D7 D8 ---------------+------------------------------ 0 0 0 0 0 ¦ 0 0 0 1 1 1 0 0 0 Schritt 1 0 0 0 1 0 ¦ 0 0 0 1 1 1 0 1 0 Schritt 2 0 0 0 1 1 ¦ 0 0 1 0 0 1 0 0 1 Schritt 3 0 0 1 0 0 ¦ 0 0 1 0 0 1 0 0 1 Schritt 4 0 0 1 0 1 ¦ 0 0 1 1 0 0 1 0 0 Schritt 5 (1) 0 0 1 1 0 ¦ 0 1 0 0 0 0 1 0 0 Schritt 5 (2) 0 1 0 0 0 ¦ 0 1 0 1 0 0 1 0 0 Schritt 5 (3) 0 1 0 1 0 ¦ 0 1 1 0 0 0 1 0 0 Schritt 5 (4) 0 1 1 0 0 ¦ 0 0 0 0 0 0 1 0 0 Schritt 6Alle nun noch freien Speicherzellen werden sicherheitshalber wie Schritt 6 programmiert (Sprung nach Schritt 1).
Erläuterungen: Die Schritte 2 und 3 enthalten bedingte Sprünge. Bei Schritt 2 wird abhängig von Eingang B (Taster) verzweigt:
B=0 0 0 0 1 0: |
Sprung auf die gleiche Stelle (das letzte Bit wird ja von Eingang B festgelegt). |
B=1 0 0 0 1 1: |
Sprungziel, wenn Taste = 1. Da B = D4 das letzte Bit festlegt, ergibt sich das Sprungziel zwangsläufig. |
Bei Schritt 3 wird nach dem gleichen Schema verfahren:
A=0 0 0 1 0 0: |
Sprung auf die gleiche Stelle (Letztes Bit = Eingang A) |
A=1 0 0 1 0 1: |
Sprungziel für A = 1 Schranke öffnen. |
Schritt 6 ist ein unbedingte Sprung nach 0 0 0 0 0.
Zum vorhergehenden Abschnitt |
Zum Inhaltsverzeichnis |
Zum nächsten Abschnitt |