-
HINTERGRUND DER ERFINDUNG
-
Die vorliegende Erfindung bezieht
sich auf einen Datenprozessor entsprechend dem Vorwort von Anspruch
1. Insbesondere können
die verschiedenen Unterbrechungsquellen über eine Vielzahl von einzelnen Prioritätsverkettungen
verteilt sein.
-
Unterbrechungsorganisationen gibt
es seit längerer
Zeit, jedoch besteht immer noch der Bedarf nach einer weiteren Verbesserung
und Erweiterung. Eine derartige Entwicklung kann auf verschiedenen
Qualitäts- und
Quantitätsebenen
liegen, und aus diesem Grund sollte die vorliegende Erfindung insbesondere
für Folgendes
sorgen:
- – sie
sollte eine große
Anzahl verschiedener Unterbrechungsquellen und/oder Unterbrechungsursachen, typischerweise
200 oder mehr, unterstützen;
- – sie
sollte eine große
Anzahl verschiedener Prioritätsebenen,
typischerweise 16 oder 32, unterstützen;
- – sie
sollte eine Vektorunterstützung
bieten, um die schnelle Auswahl einer geeigneten Behandler-Routine zu
erleichtern;
- – sie
sollte in ihrer Größe leicht
erweiterbar sein;
- – sie
sollte eine flexible Zuordnung von Unterbrechungsprioritäten erlauben;
- – sie
sollte nur ein Minimum an Routing-Aufwand erfordern.
-
Es wurde kein System angetroffen,
das in der Lage ist, alle oben genannten Anforderungen zu einem akzeptablen
Preis/Leistungs-Verhältnis
zu erfüllen.
-
ZUSAMMENFASSUNG DER ERFINDUNG
-
Die vorliegende Erfindung hat daher
unter anderem zur Aufgabe, einen Datenprozessor mit einer Unterbrechungsarchitektur
zu schaffen, der eine umfassende und vielseitige Lösung für die Kombination
aller obigen Anforderungen bietet. Zu diesem Zweck ist die Erfindung
gemäß einem
ersten Aspekt dadurch gekennzeichnet, dass die genannten Unterbrechungsbehandler-Mittel
einen Lese-Vektor-Befehl an alle Unterbrechungsquellen parallel
kommunizieren, um daraufhin die Übertragung
eines tatsächlichen
Unterbrechungsadressvektors auf den genannten Busmitteln zu erlauben.
Insbesondere kann der Bus für
andere Transportarten außerhalb
der Unterbrechungsprozedur verwendet werden, wodurch die Hardware-Anforderungen
gemindert werden.
-
Vorteilhafterweise bildet ein Unterbrechungs-Standardvektor-Generator
den Abschluss der genannten Prioritätsverkettungsmittel. Dieses
Merkmal verhindert die Entwicklung eines blockierten Fortgangs.
Weitere vorteilhafte Aspekte werden in den abhängigen Ansprüchen genannt.
-
KURZE BESCHREIBUNG DER
ZEICHNUNG
-
Diese und andere Aspekte und Vorteile
der Erfindung werden im Folgenden unter Bezugnahme auf die Beschreibung
der bevorzugten Ausführungsbeispiele
und insbesondere unter Bezugnahme auf die beigefügten Figuren ausführlicher
beschrieben. Es zeigen:
-
1 ein
elementares Ausführungsbeispiel
einer erfindungsgemäßen Unterbrechungsarchitektur;
-
2 ein
Timing-Diagramm des Unterbrechungsmechanismus;
-
3 ein
Blockschaltbild der Unterbrechungssteuerung;
-
4 ein
Blockschaltbild einer Unterbrechungsquelle;
-
die 5A bis 5D vier verschiedene Implementierungen
einer Unterbrechungsquelle;
-
6 ein
Blockschaltbild eines Unterbrechungs-Standardvektor-Generators;
-
7 ein
ausführliches
Beispiel eines Verbindungsschemas;
-
8 ein
beispielhaftes Verbindungsschema;
-
9 eine Übersicht über eine
Unterbrechungsarchitektur;
-
10 die
Unterbrechungsquittierungs-Prioritätsverkettung und den Vektorauswahlmechanismus.
-
AUSFÜHRLICHE BESCHREIBUNG DER BEVORZUGTEN
AUSFÜHRUNGSBEISPIELE
-
In 1 ist
ein elementares Ausführungsbeispiel
einer erfindungsgemäßen Unterbrechungsarchitektur
dargestellt. Das Blockschaltbild enthält die wesentlichen Teilsysteme
eines Datenprozessors einer höchstintegrierten
Schaltung. Wie abgebildet ist die zentrale Verarbeitungseinheit
(CPU) 20 mit dem PI-Bus 30 verbunden, ebenso wie
eine Unterbrechungssteuerung 22, die Unterbrechungsquellen 24 und 26 und
der Unterbrechungs-Standardvektor-Generator 28. In der
Praxis kann die Anzahl der Unterbrechungsquellen groß sein: ein
betrachtetes System kann mehr als 20 derartige physikalische
Quellen aufweisen, die gemeinsam mehr als 200 verschiedene Unterbrechungsursachen
erzeugen können,
welche durch einen zugehörigen
einzigartigen oder nicht-einzigartigen Unterbrechungsvektor unterschieden
werden können.
Wie nachstehend in 4 dargestellt,
sind die physikalischen Unterbrechungsquellen effizient mit ODER
verknüpft,
um der Unterbrechungssteuerung 22 auf einer der INTREQ-Leitungen
eine Unterbrechungsanforderungs-Signalisierung vorzulegen, und auf ähnliche
Weise in Reihen verkettet, um auf der niedrigeren Mehrbit-Leitung
eine Unterbrechungsquittierungs-Signalisierung, eine für jede mit
ODER verknüpfte
Leitung, von der Unterbrechungssteuerung 22 zu erhalten.
Die Anzahl dieser Leitungen kann größer als 1 sein, und der Unterbrechungsbehandler kann
entscheiden, welche Anforderung zuerst zu behandeln ist, z. B. basierend
auf einer Hierarchie, auf einem zyklischen Warteschlangenbetrieb.
Die Steuerung 22 legt weiterhin allen derartigen Quellen
ein Unterbrechungslesevektor-Signal (Interrupt Read Vector) auf
Leitung 32 vor. Der Unterbrechungsvektor kann der zentralen
Verarbeitungseinheit 20 durch die eigentlich teilweise
selbstgewählte
aktive Quelle auf dem Gesamtbus 30 vorgelegt werden. Vorzugsweise
ist dies der sogenannte PI-Bus, wie in der PCT-Anmeldung EP 94/01711 beschrieben.
Weiterhin wurde der Prozessor mit einem On-Chip- oder Off-Chip-Speicher 34,
einem E/A-Teilsystem 36 und einem Teilsystem „Verschiedenes", bezeichnet mit 38,
zum Beispiel einer Steuereinheit BCU, die nicht Teil der Erfindung
ist, dargestellt. Unterbrechungserzeugende Vorrichtungen würden in
der Kette 24–26 angeordnet.
Vorzugsweise sollte die Architektur sowohl niederrangige als auch
anspruchsvolle Unterbrechungsquellen erlauben.
-
Der Prozessor kann beispielsweise,
wobei dieses Beispiel nicht einschränkend zu sehen ist, ein RISC-Prozessor
sein, und die Anzahl der mit ODER verknüpften Unterbrechungsanforderungsleitungen
kann gleich 16 sein. Nach Erhalt einer Unterbrechungsanforderung
führt die
Unterbrechungssteuerung oder der Unterbrechungsbehandler 22 eine
Unterbrechungs-Maskierung durch und bestimmt außerdem, welche der möglicherweise
gleichzeitig vorliegenden Unterbrechungen die höchste Priorität hat. Ein
geeignetes Ein-Bit-Signal gibt der zentralen Verarbeitungseinheit 20 die
Existenz einer nicht-maskierten
Unterbrechung an. Wenn die zentrale Verarbeitungseinheit 20 den
eigentlichen Unterbrechungsvektor lesen möchte, erzeugt die Unterbrechungssteuerung 22 ein
Quittie rungssignal auf der betreffenden Leitung des Quittierungsbusses,
die der mit ODER verknüpften
Leitung entspricht, die die Quelle damals gewählt hat oder sogar in diesem
Augenblick wählt.
Wenn eine Unterbrechungsquelle das eigentliche Quittierungssignal
akzeptiert, erzeugt sie den unteren Teil des Unterbrechungsvektors,
während
die Unterbrechungssteuerung den oberen Teil erzeugt. Wenn das Unterbrechungsquittierungssignal
unter bestimmten Umständen
von keiner der angeschlossenen Quellen akzeptiert wird, sondern
beim Unterbrechungs-Standardvektor-Generator 28 eintrifft,
wird letzterer stattdessen den unteren Teil des Unterbrechungsvektors
erzeugen. Anschließend
wird der Unterbrechungsvektor dem Bus 30 für die zentrale
Verarbeitungseinheit zugeführt.
-
Definitionen
-
CPU: Die CPU ist eine Verarbeitungseinheit
auf der integrierten Schaltung (IC). Es werden Unterbrechungen erzeugt,
um den normalen Programmablauf zu unterbrechen und Unterbrechungsbehandlungsprogramme
durchzuführen.
-
CPU_INT[M-1..0]: Dies ist der einzige
CPU-Unterbrechungsbus, der aus M Leitungen besteht, die die Unterbrechungssteuerung
mit der CPU verbinden.
-
Unterbrechungssteuerung: Decodiert
die Unterbrechungsanforderung von den verschiedenen Unterbrechungsquellen
zu CPU-Unterbrechungsanforderungen, und wählt eine von den möglicherweise
zahlreichen (16) mit ODER verknüpften
Anforderungen (Requests) aus. Sie quittiert auch die Unterbrechungen
und erzeugt den oberen Teil des Unterbrechungsvektors.
-
Unterbrechungs-Standardvektor-Generator:
Erzeugt den unteren Teil des Unterbrechungsvektors, wenn dies keine
Unterbrechungsquelle tut. Unterbrechungsquelle: Jedes Modul auf
dem IC, das die CPU eventuell unterbrechen möchte. Ein bestimmtes Modul
kann mehrere verschiedene Unterbrechungen auf einer oder mehreren
mit ODER verknüpften
Anforderungsleitungen erzeugen.
-
INT-REQ[N-1..0]: Die N Leitungen
des Unterbrechungsanforderungsbusses verbinden die Unterbrechungsquellen
mit der Unterbrechungssteuerung.
-
INT_ACK[N-1..0]: Die N Leitungen
des Unterbrechungsquittierungsbusses verlaufen von der Unterbrechungssteuerung über die
Unterbrechungsquellen zu dem Unterbrechungs-Standardvektor-Generator. Jede
Leitung INT_ACK[x] entspricht einer mit ODER verknüpften Unterbrechungsanforderungsleitung INT_REQ[x].
-
INT_CLEAR: Die Unterbrechungsstatus-Variable
INT_STATUS in der Unterbrechungsquelle kann gelöscht werden, indem eine „1" in die entsprechende
Unterbrechungslöschungs-Variable
INT_CLEAR geschrieben wird.
-
INT_ENABLE: Die Unterbrechungsaktivierungs-Variable
INT_ENABLE in der Unterbrechungsquelle kann auf „1" gestellt werden, um eine Unterbrechung
für die
Unterbrechungsanforderungsleitungen zuzulassen, oder auf „0", um sie zu ignorieren.
-
INT_MASK: Die (optionale) Unterbrechungsmaskierungs-Variable
zum Maskieren der verschiedenen Unterbrechungsanforderungsleitungen
INT_REQ[x].
-
INT_MASK LEVEL: Die (optionale) Unterbrechungsmaskierungspegel-Variable zum Maskieren
aller Unterbrechungsanforderungsleitungen INT_REQ[x] unterhalb eines
bestimmten Pegels.
-
INT_PRIORITY[N-1..0]: Die (optionalen)
Unterbrechungsanforderungsleitungs-Prioritätsvariablen, so dass die Priorität für jede Unterbrechungsanforderungsleitung
INT_REQ[x] separat einfacher variiert werden kann.
-
INT_RD_VECTOR: Diese Unterbrechungslesevektorleitung
verbindet die Unterbrechungssteuerung mit allen Unterbrechungsquellen.
Es wird durch die Unterbrechungssteuerung festgestellt, wann die
CPU den Unterbrechungsvektor INT_VECTOR lesen möchte: zuerst kommt das Signal
ACK, und danach der RD_Vektor.
-
INT_SET: Die optionale Unterbrechungsstatus-Variable
INT_STATUS in der Unterbrechungsquelle kann eingestellt werden,
indem eine „1" in die entsprechende
Unterbrechungseinstellvariable INT_CLEAR geschrieben wird.
-
INT_STATUS: Die Unterbrechungsstatus-Variable
INT_STATUS in der Unterbrechungsquelle entspricht „1 ", wenn die Quelle
die CPU unterbrechen möchte,
oder „0", wenn die Unterbrechungsquelle
keine Unterbrechung wünscht.
-
INT_VECTOR: Die CPU wird die Unterbrechungsvektor-Variable
lesen, um zu der entsprechenden Unterbrechungsroutine zu verzweigen,
wenn sie unterbrochen wird. Die Unterbrechungsvektor-Variable ist
in zwei 16-Bit-Teile unterteilt:
-
INT_VECTOR[31..16]: Der obere Teil
der Unterbrechungsvektor-Variablen wird immer durch die Unterbrechungssteuerung
erzeugt;
-
INT_VECTOR[15..0]: Der untere Teil
des Unterbrechungsvektors kann durch die verschiedenen Unterbrechungsquellen
oder durch den Unterbrechungs-Standardvektor-Generator
erzeugt werden.
-
L: Die Anzahl der Bustaktzyklen,
die erforderlich ist, damit das prioritätsverkettete Unterbrechungsquittierungssignal
durch alle Unterbrechungsquellen (und zurück zur Unterbrechungssteuerung)
läuft.
-
M: Die CPU-abhängige Breite des CPU-Unterbrechungsbusses.
Im Allgemeinen ist M = 1.
-
N: Die Breite des Unterbrechungsanforderungsbusses.
Typischerweise entspricht N 16 oder 32. Außerdem ist N die Anzahl der
INT_ACK-Leitungen.
-
PI-Bus D: Diese Leitungen sind die
Datenleitungen des Busses.
-
PI-Bus CLK: Dies ist das Taktsignal
des Busses.
-
Variable in den Unterbrechungsquellen
und in der Unterbrechungssteuerung
-
Die Variablen sind Teil der Register,
die über
den Bus ausgelesen und geladen werden können. Die Adressen der Register
werden innerhalb des Busadressbereichs abgebildet, der der betreffenden
Unterbrechungsquelle oder der Unterbrechungssteuerung zugeordnet
ist.
-
Jede Unterbrechungsquelle hat eine
Anzahl von Variablen. Es gibt eine Gruppe von Variablen (INT_STATUS,
INT_ENABLE, INT_CLEAR und optional INT_SET) für jede Unterbrechung, die sie
erzeugen kann, und normalerweise wird eine weitere Gruppe von Variablen
das weitere Verhalten der Vorrichtung mit der Unterbrechungsquelle
steuern. Außerdem
können
ein oder mehrere INT_VECTOR[15..0] Variablen oder Konstanten Teil
einer Unterbrechungsquelle sein.
-
Die Unterbrechungssteuerung hat eine
Anzahl von Variablen wie INT_VECTOR[31..16], und weitere Variablen
für die
Maskierung und Prioritätsdecodierung.
Die Adresse des gesamten Unterbrechungsvektors INT_VECTOR wird in
den Adressbereich abgebildet, der der Unterbrechungssteuerung zugeordnet
ist.
-
Der Unterbrechungs-Standardvektor-Generator
kann eine programmierbare Standardvariable INT_VECTOR[15..0] haben.
Wenn dies der Fall ist, wird ihre Adresse in den Adressbereich abgebildet,
der dem Unterbrechungs-Standardvektor-Generator zugeordnet ist.
-
Anfordern einer Unterbrechung
-
Wenn eine Unterbrechungsquelle eine
(interne) Unterbrechungsanforderung hat, schreibt sie eine „1" in die entsprechende
Variable INT_STATUS. Wenn auch die ent sprechende Variable INT_ENABLE
gleich „1" ist, wird die Anforderung über die
Unterbrechungsanforderungsleitung INT_REQ[x], mit der diese spezielle
Unterbrechung verbunden ist, an die Unterbrechungssteuerung gesendet.
Wenn die Variable INT_ENABLE gleich „0" ist, wird die interne Anforderung ignoriert.
Sie wird nur an die Unterbrechungssteuerung gesendet, wenn INT_ENABLE
auf „1" gesetzt wurde.
-
Maskieren und Setzen von
Prioritäten
-
Die Implementierung der Maskierung
und Prioritätensetzung
ist nicht spezifiziert. Es gibt keine explizite Reihenfolge unter
den N Unterbrechungsanforderungsleitungen INT_REQ[N-1..0] und den
M CPU-Unterbrechungsleitungen CPU_INT[M-1..0]. Der Prioritätsdecoder
kann in der Hardware festgelegt oder programmierbar sein. Das Maskierungsmerkmal
ist keine unbedingte Voraussetzung.
-
Die einfachste Implementierung der
Maskierung und Prioritätensetzung
besteht in der Nutzung einer strengen und festgelegten Hierarchie.
Eine weitere Lösung
besteht darin, ein N-Bit-Unterbrechungsmaskierungsregister zu implementieren,
wobei jedes Bit des Registers eine Unterbrechungsanforderungsleitung
maskiert. Wenn ein Bit des Unterbrechungsmaskierungsregisters gleich „1" ist, wird die entsprechende
Unterbrechungsanforderungsleitung aktiviert, und wenn das Bit gleich „0" ist, wird die entsprechende
Unterbrechungsanforderungsleitung deaktiviert. Eine dritte Lösung besteht
darin, ein Unterbrechungsmaskierungspegekegister zu implementieren.
Es werden nur Unterbrechungsanforderungsleitungen mit einem Rang
aktiviert, der mindestens dem Wert des Unterbrechungsmaskierungspegelregisters
entspricht, die anderen bleiben deaktiviert. Die Prioritätensetzung
kann erfolgen, indem man eine Prioritätsvariable für jede Unterbrechungsanforderungsleitung
implementiert, so dass die Priorität für jede Unterbrechungsanforderungsleitung
INT_REQ[x] separat eingestellt werden kann. Kombinationen der obigen
Lösungen
sind ebenfalls möglich.
Oft sind auch weitere Möglichkeiten
zum Bestimmen der höchsten
Priorität
realisierbar, zum Beispiel ein zyklischer Warteschlangenbetrieb.
-
Schnittstelle mit der
CPU
-
Die Weise, in der die N Unterbrechungsanforderungsleitungen
INT_REQ[N-1..0] (nach dem Maskieren und Festlegen der Prioritäten) mit
den M CPU-Unterbrechungsleitungen
CPU_INT[M-1..0] verbunden werden, hängt von der jeweiligen Implementierung
ab. Normalerweise reicht M = 1 aus. Wenn die CPU unterbrochen wird, kann
sie einige spezifische Aktionen durchführen, zum Beispiel Kontextsicherung,
und verzweigt dann zu einem Unterbrechungsvektor. Am Ende verzweigt
die Software zum Unterbrechungsbehandler, wobei der Unterbrechungsvektor
INT_VECTOR als Versatz zu einer Verzweigungstabellen-Basisadresse
benutzt wird: dies ist eine schnelle Möglichkeit, weil keine weitere
Verarbeitung der verschiedenen Bits von INT_VECTOR, dem Unterbrechungsbehandler
oder der eigentlichen Quelle erforderlich ist.
-
Erzeugen der Quittierung
und Erhalten des Unterbrechungsvektors
-
Der Unterbrechungsvektor INT_VECTOR
wird als Busregister adressiert, das auf den Adressbereich abgebildet
ist, welcher der Unterbrechungssteuerung zugeordnet ist. Wenn die
Unterbrechungssteuerung eine Busleseanforderung für den Unterbrechungsvektor
erhält,
wird sie ein Quittierungssignal wählen, das der Anforderung REQ
und ihrer Prioritätsmaske
zugeordnet ist; eine aktive Quelle wird sich anschließend entsprechend
der Prioritätsverkettung
(oder dem Unterbrechungs-Standardvektor-Generator) und über eine
Unterbrechungsquittierungsleitung selbst wählen und die Unterbrechungsquelle
(oder den Unterbrechungs-Standardvektor-Generator) auffordern, den
unteren Teil des Unterbrechungsvektors (INT_VECTOR[15..0] auf die PI-Bus
D-Leitungen zu geben. Der obere Teil INT_VECTOR[31..16] wird immer
durch die Unterbrechungssteuerung selbst erzeugt.
-
Die Unterbrechungssteuerung wird
den aktuellen Wert der Unterbrechungsanforderungsleitungen vor oder
nach dem Maskieren und Festlegen der Prioritäten zwischenspeichern. Nur
die aktive Unterbrechungsanforderungsleitung mit der zurzeit höchsten Priorität – abhängig von
der Maskierung und der Festlegung der Prioritäten – wird mit einem prioritätsverketteten
Abfragesignal auf ihrer entsprechenden Unterbrechungsquittierungsleitung
beantwortet. Andere Unterbrechungsanforderungsleitungen bleiben
für den
Augenblick unbeantwortet. Die Prioritätsverkettung beginnt, die mit
der bestätigten
Unterbrechungsquittierungsleitung verbundenen Unterbrechungsquellen
zu durchlaufen.
-
Wenn mehr als eine Unterbrechungsquelle
eine Anforderung auf der gewählten
Unterbrechungsanforderungsleitung erzeugt hat, sorgt die Prioritätsverkettung
dafür,
dass nur eine der Unterbrechungsquellen die Quittierung bekommt.
Dies wird die Unterbrechungsquelle sein, die logisch am engsten
mit der Unterbrechungssteuerung verbunden ist. Andere Quellen, die „nachgeschaltet" sind, werden von
der Quittierung ferngehalten. Dies führt zu einem impliziten Schema
von Unterprioritäten
für jedes
Paar der Unterbrechungsanforderungs- und Quittierungsleitungen.
Die Unterbrechungsquelle, die am engsten mit der Unterbrechungssteuerung
verbunden ist, hat innerhalb der Prioritätsverkettung eine höhere Unterpriorität.
-
Es wird eine Verzögerung eingeführt, um
dem Quittierungssignal genug Zeit zu geben, die Prioritätsverkettung
zu durchlaufen. Während
dieser Verzögerung
wird die Unterbrechungssteuerung die Busquittierungs-ACK-Leitungen
mit der WAT-Quittierung ansteuern. Die Verzögerung entspricht L Bustaktzyklen
synchron zur ansteigenden Flanke des Bustakts CLK. Die genaue Anzahl
der Buswartezyklen wird durch die Verzögerung in den prioritätsverketteten
Unterbrechungsquittierungsleitungen bestimmt und hängt von
der Implementierung ab.
-
Nach dieser Verzögerung bestätigt die Unterbrechungssteuerung
das Unterbrechungslesevektor-Signal INT_RD_VECTOR während der
letzten WAT-Quittierung (weil das INT_RD_VECTOR Signal ein frühes Signal
ist) und steuert die Bus-ACK-Leitungen
mit der RDY-Quittierung statt mit der WAT-Quittierung an. In diesem
Zyklus wird die Unterbrechungssteuerung auch die Bits 31 bis 16
des Unterbrechungsvektors INT_VECTOR[31..16] auf den Bus geben,
während
die Bits 15 bis 0 des INT_VECTOR[15..0] entweder durch die quittierte
Unterbrechungsquelle oder durch den Unterbrechungs-Standardvektor-Generator
angesteuert werden.
-
Die Unterbrechungssteuerung friert
die Quittierung der neuen Unterbrechungen während des Lesens des Vektors
quasi ein, um mögliche
Wettlaufsituationen zu vermeiden. Der obere Teil des Unterbrechungsvektors,
INT_VECTOR[31..16], kann die Prioritätssignalisierung enthalten
und wird immer durch die Unterbrechungssteuerung erzeugt. Es gibt
viele verschiedene untere Teile des Unterbrechungsvektors INT_VECTOR[15..0],
von mindestens einem (in dem Unterbrechungs-Standardvektor-Generator) bis zu
einem für
jede Unterbrechung.
-
Löschen der Unterbrechungsanforderung
-
Wenn die Unterbrechungsanforderung
durch eine Unterbrechungsroutine bedient wurde, kann die Unterbrechungsquelle
gelöscht
werden, indem eine „1" in die entsprechende
Variable INT_CLEAR geschrieben wird. Es empfiehlt sich nicht, die
Variable INT_STATUS durch Schreiben einer „0" zu löschen, weil eine Lesen-Modifizieren-Schreiben-Aktion
die Hardware stören
könnte
und andere Bis in dem gleichen Register ändern könnte.
-
In 2 ist
ein Diagramm des vollständigen
Timing-Mechanismus der Architektur dargestellt. Das Signal INT_REQ[x]
ist asynchron mit dem Bustakt CLK, das Signal INT_RD_VECTOR synchron.
Die aufeinanderfolgenden Verläufe
zeigen die folgenden Signale: den Systembustakt, die Buslese-Operation,
den Bus-Operationscode, die Bus-Adressensignalisierung, insbesondere
die in dem Unterbrechungsvektor enthaltene Adresse, die Bus-Datenschlitze,
von denen der letzte den Unterbrechungsvektor überträgt, die Busquittierung, die
vier Wartezyklen gefolgt von einem einzelnen Quittierungszyklus
hat, die Unterbrechungsanforderungssignalisierung, die CPU-Unterbrechungssignalisierung,
die Unterbrechungsquittierung, die Rücksendung der Unterbrechungsquittierung
(keine Signalisierung), und schließlich den Unterbrechungslesevektor. Die
vertikalen Linien geben Intervalle von geeigneter Größe an.
-
Signale
-
INT_REQ[N-1..0] verbindet die Unterbrechungsquellen
mit der Unterbrechungssteuerung. Es wird keine Reihenfolge oder
Priorität
spezifiziert. Die Unterbrechungsquellen werden über ODER-Gatter mit diesen Leitungen
verbunden. Jede Unterbrechungsquelle kann mit einer oder mehreren
Unterbrechungsanforderungsleitungen verbunden werden. Die Unterbrechungsanforderungsleitungen
sind asynchron und aktiv hoch.
-
INT_ACK[N-1..0]: Jede Unterbrechungsquittierungsleitung
INT_ACK[x] entspricht einer Unterbrechungsanforderungsleitung INT_REQ[x].
Die Unterbrechungsquittierungsleitungen sind asynchron und aktiv hoch.
-
Wenn die CPU die Unterbrechungssteuerung
adressiert, um INT_VECTOR zu lesen, aktiviert die Steuerung genau
eine der Unterbrechungsquittierungsleitungen. Prioritätenfestlegung
und Maskierung bestimmen, welche Quittierungsleitung aktiviert wird.
Die Unterbrechungsquittierungsleitungen werden durch die Unterbrechungsquellen,
die REQ entsprechen, prioritätsverkettet.
Jede Quelle kann das Quittierungssignal für andere, „nachgeschaltete" Unterbrechungsquellen
blockieren, wenn eine Unterbrechung auf der entsprechenden Anforderungsleitung
aussteht.
-
INT_RD_VECTOR: Die Unterbrechungslesevektor-Leitung
verbindet die Unterbrechungssteuerung mit den Unterbrechungsquellen,
die in der Lage sind, die untere Hälfte des Unterbrechungsvektors
zu erzeugen, einschließlich
des Unterbrechungs-Standardvektor-Generators.
Wenn die CPU die Unterbrechungssteuerung adressiert, um INT_VECTOR
zu lesen, wird dieser nach einer Verzögerung von L-1 Bustaktzyklen
durch die Unterbrechungssteuerung bestätigt. Die Unterbrechungslesevektor-Leitung
ist aktiv hoch und synchron mit dem Bustakt CLK.
-
CPU_INT[M-1..0]: Diese M sind die
CPU-Unterbrechungsleitungen, normalerweise M = 1, um die Unterbrechungssteuerung
mit der CPU zu verbinden. Wenn die Unterbrechungssteuerung eine
oder mehrere Unterbrechungsanforderungen auf den Unterbrechungsanforderungsleitungen
INT_REQ[N-1..0] erhält,
bestätigt sie
eine oder mehrere der CPU-Unterbrechungsleitungen (wenn nicht alle
REQs maskiert sind). Welche Leitungen) bestätigt wird (werden), hängt von
der Maskierung und der Festlegung der Prioritäten sowie von der Abbildung
auf die CPU-Unterbrechungsleitungen ab, die alle implementierungsspezifisch
sind. Der aktive Pegel und das Timing-Verhalten der CPU-Unterbrechungsleitungen
hängen
von der CPU ab.
-
PI-Bus D: diese Leitungen sind PI-Bus-Datenleitungen.
-
PI-Bus CLK: dies ist das Taktsignal
des PI-Busses.
-
ACK = WAT (warten), ACK = RDY (bereit),
je nach vorliegender Situation.
-
In 3 ist
ein Blockschaltbild der Unterbrechungssteuerung dargestellt. Oben
rechts treffen die N Unterbrechungsanforderungsleitungen 302 ein.
Nach Durchlaufen des Maskierungs-, Prioritätenfestlegungs- und Zwischenspeicherblocks 310 werden
die N Leitungen auf die M normalerweise einzelnen (M = 1) CPU-Unterbrechungsleitungen 306 abgebildet 308.
-
Eine Busleseanforderung für den Unterbrechungsvektor
wird über
die Busschnittstelle 318 an den Steuerblock 314 weitergeleitet.
Dieser Block steuert den Zwischenspeicherblock 310 und
den Quittierungserzeugungsblock 312, der die geeignete
prioritätsverkettete
Unterbrechungsquittierung auf Leitung 304 erzeugt.
-
Nach einer Verzögerung von L-1 Bustaktzyklen
fordert der Steuerblock den oberen Vektorblock auf, die Daten des
Unterbrechungsvektors INT_VECTOR[31..16] im nächsten Bustaktzyklus CLK auf
die D-Leitungen von Bus 322 zu geben. Gleichzeitig bestätigt der
Steuerblock 314 die INT_RD_VECTOR Leitung, um den unteren
Vektorblock (in einer der Unterbrechungsquellen oder in dem Unterbrechungs-Standardvektor-Generator)
aufzufordern, die Daten von INT_VECTOR[15..0] im nächsten PI-Bus-Taktzyklus
CLK auf die D-Leitungen des Busses zu geben. In der Unterbrechungssteuerung
nur ist nur die Variable INT_VECTOR obligatorisch.
-
INT_VECTOR: Diese Unterbrechungsvektor-Variable
wird durch die CPU gelesen, indem eine PI-Bus-Leseanforderung ausgegeben
wird. Die Variable INT_VECTOR wird in zwei Teile unterteilt. Die
oberen 16 Bits INT_VECTOR[31..16] werden immer durch die Unterbrechungssteuerung
erzeugt. Die unteren 16 Bits INT_VECTOR[15..0] werden entweder durch
die quittierte Unterbrechungsquelle oder durch den Unterbrechungs-Standardvektor-Generator
erzeugt.
-
Die Unterbrechungsvektor-Variablen
INT_VECTOR[31..16] in der Unterbrechungssteuerung können feste
Konstanten (nur lesen) oder programmierbar (auch schreibbar) sein.
Entsprechend der Entscheidungen, die durch den Mechanismus zur Maskierung
oder Festlegung der Prioritäten
getroffen wurde, kann eine andere Variable INT_VECTOR[31:16] oder
Konstante ausgewählt
werden. Die Priorität
kann Teil von INT_VECTOR[31:16] sein.
-
INT_MASK: eine optionale Unterbrechungsmaskierungsvariable
zum Maskieren der verschiedenen Unterbrechungsanforderungsleitungen
INT_REQ[x]. Jedes Bit INT_MASK[x] = 0 in dieser Variablen wird die entsprechende
Unterbrechungsanforderungsleitung INT_REQ[x] maskieren.
-
INT_MASK_LEVEL: Wenn eine optionale
Unterbrechungsmaskierungspegel-Variable verwendet wird, um alle
Unterbrechungsanforderungsleitungen INT_REQ[x] unterhalb eines bestimmten
Pegels zu maskieren, wird sie INT_MASK_LEVEL genannt. Wenn diese
Variable einen Wert von y hat, werden alle Unterbrechungsanforderungsleitungen
INT_REQ[x] mit x < y
maskiert (wenn y = 0, wird keine der Unterbrechungsanforderungsleitungen
maskiert).
-
INT_PRIORITY[N-1..0]: Wenn die optionalen
Unterbrechungsanforderungsleitungs-Prioritätsvariablen implementiert sind,
werden sie mit INT_PRIORITY[N-1..0]
bezeichnet. Diese Variablen haben typischerweise eine Breite von
vier Bits (für
N = 16) und erleichtern die separate Einstellung der Priorität für jede einzelne
Unterbrechungsanforderungsleitung INT_REQ[x].
-
In 4 ist
ein einfaches Blockschaltbild einer Unterbrechungsquelle dargestellt.
In den Ecken oben rechts und links treffen die Unterbrechungsanforderungsleitungen
ein 402 bzw. gehen heraus 406. Wenn die eintreffende
Unterbrechungsanforderungsleitung aktiv ist, wird auch die herausgehende
Unterbrechungsanforderungsleitung aktiv sein. Wenn die eintreffende
Unterbrechungsanforderungsleitung nicht aktiv ist, kann die heraus gehende
Unterbrechungsanforderungsleitung aktiv sein, wenn der Unterbrechungsquelle über die ODER-Verknüpfung 404 eine
(aktivierte) Unterbrechungsanforderung zur Verfügung steht.
-
In der Mitte auf der linken und der
rechten Seite der Unterbrechungsquelle trifft die Unterbrechungsquittierungsleitung
ein 416 bzw. geht heraus 414. Die herausgehende
Unterbrechungsquittierungsleitung wird nur aktiv sein, wenn die
eintreffende Unterbrechungsquittierungsleitung aktiv ist und bei
der Unterbrechungsquelle keine aktivierte Unterbrechungsanforderung über die
UND-Verknüpfung 410 aussteht.
Diese UND-Verknüpfung ist
optional und braucht nicht implementiert zu werden, wenn die Unterbrechungsquelle
nicht ihren eigenen INT_VECTOR[15..0] erzeugt, sondern den Standardvektor
INT_VECTOR[15..0] nutzt, der durch die Unterbrechungssteuerung erzeugt
wird.
-
Unten auf dem Bild sind die Busschnittstelle 420 und
die Zuführung
der Lesevektorleitung INT_RD_VECTOR 422 dargestellt. Wenn
die Lesevektorleitung INT_RD_VECTOR aktiv ist und bei der Unterbrechungsquelle
eine quittierte Unterbrechungsanforderung ansteht, wird der untere
Teil des Unterbrechungsvektors IN_VECTOR[15..0] in dem nächsten Buszyklus
auf die D-Leitungen des Busses gegeben. Wenn die Quelle nicht ihren
eigenen INT_VECTOR[15..0] erzeugt, ist auch die Leitung INT_RD_VECTOR
nicht implementiert.
-
Jede Unterbrechungsquelle wird drei
(und eine optionale vierte) 1-Bit-Variablen für jede Unterbrechung haben,
die sie erzeugen kann. Sie hat auch eine optionale Variable INT_VECTOR[15..0].
- 1 INT_STATUS: Diese Variable entspricht „1", wenn die Quelle
die CPU unterbrechen möchte,
oder „0", wenn die Unterbrechungsquelle
keine Unterbrechung wünscht.
Diese Variable kann ein separates Register oder ein Flipflop sein
oder durch einen Zustand in einer (finiten) Zustandsmaschine dargestellt
werden. Die Variable kann mit Hilfe des Busses zum Abfragen gelesen
werden. In der Zwischenzeit können
andere Variablen im gleichen Register durch die Hardware geändert werden.
Das Löschen
und Setzen der Variablen kann über
die Variable INT_CLEAR (und optional INT_SET, zum Beispiel Diagnosezwecke)
erfolgen. Die Adresse der Variablen wird innerhalb des Bus-Adressbereichs
abgebildet, der der betreffenden Unterbrechungsquelle zugeordnet
ist.
- 2 INT_ENABLE: Diese Variable kann auf „1" gesetzt werden, um die Variable INT_STATUS
für die
Unterbrechungsanforderungsleitungen (über das ODER-Gatter) zuzulassen,
oder auf „0" gesetzt werden,
um die Variable INT_STATUS zu ignorie ren und sie von den Unterbrechungsanforderungsleitungen
zu trennen. INT_ENABLE kann über
den PI-Bus gelesen und geschrieben werden. Die Adresse der Variablen
wird innerhalb des PI-Bus-Adressbereichs abgebildet, der der betreffenden
Unterbrechungsquelle zugeordnet ist.
- 3 INT_CLEAR:INT_STATUS[b] kann gelöscht werden, indem eine „1" in die entsprechende
Variable INT_CLEAR geschrieben wird. Wenn eine „0" in diese Variable geschrieben wird,
wird dies ignoriert. Nachdem eine „1" in diese Variable geschrieben wurde,
wird die Variable automatisch auf „0" zurückgestellt.
Die Adresse der Variablen wird innerhalb des Bus-Adressbereichs
abgebildet, der der betreffenden Unterbrechungsquelle zugeordnet
ist.
- 4 INT_SET: Diese optionale Variable kann auf „1" gesetzt werden,
indem eine „1" in die entsprechende
Variable INT_SET geschrieben wird, um eine Unterbrechung dieser
betreffenden Quelle simulieren zu können. Wenn eine „0" in diese Variable
geschrieben wird, wird dies ignoriert. Nachdem eine „1" in diese Variable
geschrieben wurde, wird die Variable automatisch auf „0" zurückgestellt.
Diese Variable ist optional. Die Adresse der Variablen wird innerhalb
des PI-Bus-Adressbereichs abgebildet, der der betreffenden Unterbrechungsquelle
zugeordnet ist.
-
INT_VECTOR[15..0]: Die unteren 16
Bits der Unterbrechungsvektor-Variablen
INT_VECTOR werden durch die Unterbrechungsquelle 418 erzeugt.
Dies geschieht, nachdem die Unterbrechungsquelle eine Anforderung
auf der Lesevektorleitung INT_RD_VECTOR 422 erhalten hat
und die betreffende Unterbrechung quittiert wurde. Die Variable
INT_VECTOR[15..0] kann eine feste Konstante oder ein programmierbares
Register sein. Wenn es sich um eine feste Konstante handelt, ist
ihr Wert festverdrahtet. Wenn es sich um ein programmierbares Register
handelt, wird die Adresse in den PI-Bus-Adressbereich abgebildet, der der Unterbrechungsquelle
zugeordnet ist (eine programmierbare Variable INT_VECTOR[15..0]
in einer Unterbrechungsquelle kann über ihre lokale Adresse INT_VECTOR[15..0]
in der Unterbrechungsquelle gelesen werden). Im Allgemeinen sollten
die beiden niedrigstwertigen Bits immer Null sein, um ihre Verwendung
als 32-Bit-Adresswort
zu ermöglichen,
das als Versatz in einer Tabelle benutzt wird. Diese Variable ist
optional; standardmäßig wird
die Unterbrechungs-Standardquelle die unteren 16 Bits von INT_VECTOR
erzeugen. Der Kürze
halber wurde eine detaillierte Abbildung der obigen Variablen und
anderer Parameter innerhalb der Unterbrechungsquelle hier nicht weiter
spezifiziert. Eine separate PI-Bus-Adresse kann gebildet werden,
indem in einem oder mehreren adressierbaren Registern addiert oder
kombiniert wird.
-
Bei jeder Unterbrechungsquelle können alle
Unterbrechungen entweder mit der gleichen Unterbrechungsanforderungsleitung
INT_REQ[x] oder mit unterschiedlichen Unterbrechungsanforderungsleitungen verbunden
sein. Siehe die 5A und 5B, die verschiedene Implementierungen
durch ODER-Gatter veranschaulichen. Die Lösung B ist flexibler. Die verschiedenen
Unterbrechungsanforderungen können
auf Wunsch auf einer Unterbrechungsanforderungsleitung verkettet
werden, siehe 5C. Es
ist zulässig,
die Unterbrechungsanforderungsleitung programmierbar zu machen,
wenn die korrekte Abbildung auf die Unterbrechungsanforderungsleitungen
multiplexiert wird, siehe 5D.
-
Einfache Unterbrechungsquellen können zusammengefasst
und zu einer größeren Unterbrechungsquelle
kombiniert werden, um den Aufwand für die Bus-Schnittstelle, den Anforderungs- und
Quittierungsmechanismus und die Variable INT_VECTOR[15..0] zu reduzieren.
Jede Unterbrechungsquelle sollte mindestens eine Leitung haben,
aber nicht mehr als der Unterbrechungsbehandler handhaben kann.
Für jede
Unterbrechungsanforderungsleitung INT_REQ[x] kann eine Unterbrechungsquittierungsleitung
INT_ACK[x] implementiert werden oder nicht.
-
In 6 ist
ein Blockschaltbild des Unterbrechungs-Standardvektor-Generators dargestellt.
Auf der linken Seite treffen die Unterbrechungsquittierungsleitungen
INT_ACK[N-1..0] 602 zugeführt. Unten im Bild sind die
PI-Bus-Schnittstelle 608 und die Zuführung der Lesevektorleitung
INT_RD_VECTOR 610 dargestellt. Wenn der Eingang der INT_RD_VECTOR-Leitung
und ein INT_ACK[x] aktiv sind, wird der untere Teil des Unterbrechungsvektors
INT_VECTOR[15..0] 606 in dem nächsten PI-Bus-Zyklus 612 durch
den Unterbrechungs-Standardvektor-Generator auf die D-Leitungen
des PI-Busses gegeben.
-
INT_VECTOR[15..0]: Dies sind die
unteren 16 Bits der (standardmäßigen) Unterbrechungsvektor-Variablen
INT_VECTOR, die durch den Unterbrechungs-Standardvektor-Generator erzeugt werden.
Dies geschieht, nachdem er eine Anforderung auf der Lesevektorleitung
INT_RD_VECTOR erhalten hat und ein INT_ACK[x] aktiv ist. Alle Details
sind für
die Variable INT_VECTOR[15..0] innerhalb der Unterbrechungsquellen
die gleichen.
-
Es kann eine Anordnung aus N verschiedenen
Variablen INT_VECTOR[15..0] implementiert werden, z. B. eine für jede eintreffende
Leitung INT_ACK[x], so dass ein unterschiedlicher Unterbrechungsvektor
für jede
Prioritätsebene
erzeugt werden kann. Der Unterbrechungs-Standardvektor-Generator
kann mit der Unterbrechungssteuerung zusammengefasst werden, um
die Kosten zu reduzieren.
-
Die einzigen Anforderungen an die
CPU bestehen darin, dass sie genügend
Unterbrechungseingänge hat,
damit die CPU-Unterbrechungsleitungen CPU_INT[M-1..0] angeschlossen
werden können
und damit sie eine Busleseanforderung ausgeben kann, um den Unterbrechungsvektor
INT_VECTOR zu lesen. Diese Leseanforderung kann direkt durch die
CPU-Hardware oder softwaremäßig über eine
Unterbrechungsroutine ausgegeben werden.
-
Verbindung
-
Es gibt eine Reihe von Anforderungen
in Bezug auf das Verbindungsschema für die CPU, die Unterbrechungssteuerung
und die verschiedenen Unterbrechungsquellen.
-
Die Unterbrechungsanforderungsleitungen
INT_REQ[x] können
nicht aufgeteilt werden. Sie sind alle Punkt-zu-Punkt-Verbindungen
zwischen entweder:
- – dem Ausgang INT_REQ[x] und
dem Eingang INT_REQ[x] von zwei verschiedenen Unterbrechungsquellen,
- – dem
Ausgang INT_REQ[x] einer Unterbrechungsquelle und einem anderen
Eingang INT_REQ[x] der gleichen Unterbrechungsquelle; siehe 5
- – dem
Ausgang INT_REQ[x] einer Unterbrechungsquelle und dem Eingang INT_REQ[x]
der Unterbrechungssteuerung.
-
Wenn bei einer Unterbrechungsquelle
ein Unterbrechungsanforderungsleitungseingang INT_REQ[x] angeschlossen
ist, muss auch der Ausgang INT_REQ[x] angeschlossen sein.
-
Der Eingang INT_REQ[x] der ersten
Unterbrechungsquelle in einer Kette wird mit einem logischen „0"-Pegel verbunden.
-
Die Unterbrechungsquittierungsleitungen
INT_ACK[x] können
nicht aufgeteilt werden. Sie sind alle Punkt-zu-Punkt-Verbindungen
zwischen entweder:
- – dem Ausgang INT_ACK[x] und
dem Eingang INT_ACK[x] von zwei verschiedenen Unterbrechungsquellen;
- – dem
Ausgang INT_ACK[x] und einem weiteren Eingang INT_ACK[x] der gleichen
Unterbrechungsquelle;
- – dem
Ausgang INT_ACK[x] der Unterbrechungssteuerung und dem Eingang INT_ACK[x]
einer Unterbrechungsquelle;
- – dem
Ausgang INT_ACK[x] einer Unterbrechungsquelle und dem Eingang INT_ACK[x]
des Unterbrechungs-Standardvektor-Generators;
- – dem
Ausgang INT_ACK[x] der Unterbrechungssteuerung und dem Eingang INT_ACK[x]
des Unterbrechungs-Standardvektor-Generators.
-
Wenn bei einer Unterbrechungsquelle
ein Unterbrechungsquittierungsleitungsausgang INT_ACK[x] angeschlossen
ist, müssen
auch der INT_ACK[x] Eingang und Ausgang angeschlossen sein. Der
INT_ACK[x] Ausgang der letzten Unterbrechungsquelle in der Kette
wird an den entsprechenden INT_ACK[x] Eingang des Unterbrechungs-Standardvektor-Generators
geleitet.
-
Jede Unterbrechungsquelle ist mit
mindestens einer Unterbrechungsanforderungsleitung INT_REQ[x] und
mit höchstens
allen Unterbrechungsanforderungsleitungen verbunden.
-
Für
jede Leitung INT_REQ[x] muss es eine entsprechende Leitung INT_ACK[x]
geben. Selbst wenn keine Unterbrechungsquellen mit dieser Leitung
INT_ACK[x] verbunden sind, muss sie zum Unterbrechungs-Standardvektor-Generator
geleitet werden, damit dieser den Standardvektor INT_VECTOR[15..0]
erzeugen kann. Der Unterbrechungs-Standardvektor-Generator muss
mit allen INT-ACK[N-1..0] Leitungen verbunden werden.
-
Jede Unterbrechungsquelle kann mit
einer bis zu allen Unterbrechungsquittierungsleitungen INT_ACK[x]
verbunden werden. Unterbrechungsquellen, die INT_VECTOR[15..0] nicht
erzeugen, brauchen nicht mit den Unterbrechungsquittierungsleitungen
INT_ACK[x] verbunden zu werden.
-
Unterbrechungsquellen, die INT_VECTOR[15..0]
erzeugen, müssen
mit der Unterbrechungslesevektor-Leitung INT_RD_VECTOR verbunden
werden. Unterbrechungsquellen, die INT_VECTOR[15..0] nicht erzeugen,
brauchen nicht mit der Unterbrechungslesevektor-Leitung INT_RD-VECTOR
verbunden zu werden. Auch der Unterbrechungs-Standardvektor-Generator
muss mit der Leitung INT_RD_VECTOR verbunden werden.
-
Die Unterbrechungssteuerung, alle
Unterbrechungsquellen und der Unterbrechungs-Standardvektor-Generator
müssen
mit dem PI-Bus verbunden werden.
-
Die CPU-Unterbrechungsleitungen CPU_INT[M-1..0]
sind durch die CPU-Unterbrechungsleitungsausgänge der
Unterbrechungssteuerung mit den Unterbrechungseingängen der
CPU verbunden.
-
7 zeigt
ein realisierbares Verbindungsschema. Hier ist N = 4 und M = 1.
Es gibt vier Unterbrechungsanforderungsleitungen INT_REQ[3..0] und
auch vier Unterbrechungsquittierungsleitungen INT_ACK[3..0].
-
Wie verschiedene Unterbrechungsquellen
miteinander verbunden werden können,
ist in 8 dargestellt.
Weiterhin sind alle Unterbrechungsquellen, die Unterbrechungssteuerung
und der Unterbrechungs-Standardvektor-Generator mit der Unterbrechungslesevektor-Leitung
INT_RD-VECOTR und dem PI-Bus verbunden. Die CPU ist nicht dargestellt,
jedoch besteht der CPU-Unterbrechungsbus aus nur einer Leitung CPU_INT.
Es ist zu beachten, dass die Quelle C in diesem Fall nicht mit INT_ACK[x]
verbunden ist, sondern offensichtlich auf der effektiven Erzeugung
des Standardvektors beruht.
-
In 9 ist
die Unterbrechungsarchitektur zusammenfassend dargestellt, insbesondere
die Funktion des Unterbrechungssteuerungskerns INTC in Bezug auf
die vielen möglichen
Unterbrechungsquellen. Zugeführt
werden rechts 32 Anforderungsleitungen 918, die
jede eine Prioritätsebene
darstellen. Die Information auf diesen Leitungen kann in dem Latch 904 zwischengespeichert
werden. Das Maskenregister 906 führt über die bitweise UND-Verknüpfung im
UND-Gatter 902 zum prioritätsbestimmenden Element 908 und
dem Codierer 903 weiter. Der Codierer codiert zum Sechs-Bit-Signal
CPU_INT[5:0] auf Leitung 920, obwohl eines ausreichen würde. Nach
Bestimmung der Priorität
wird auf 32 Quittierungsleitungen 909 quittiert,
die durch entsprechende Quellen 910, 912, ... 914 verkettet
sind, welche kollektiv ein weiteres Steuersignal 911 vom
Kern erhalten. Wie abgebildet senden die Quellen Signale an den
Anforderungsleitungskanal und auch an den Systembus 916.
Der Prozessor wird, wenn er den Sechs-Bit-Unterbrechungscode erhält, unabhängig von
der Unterbrechungsquelle selbständig
die Handhabungszeitpunkt vorgeben. Er wird dann den Status sichern
und zu einer Unterbrechungsroutine verzweigen.
-
Anschließend wird der Prozessor einen
Buslesesignal für
den Unterbre chungsvektor ausgeben: hierbei handelt es sich um eine
Adresse, und die Unterbrechungssteuerung wird die zurzeit höchste Unterbrechungsebene
zwischenspeichern und eine prio ritätsverkettete Abfrage für die mit
dieser Ebene verbundenen Quellen erzeugen. Die Unterbrechungsquelle
wird nach der Verzögerung
der Prioritätsverkettung
ihren Vektor auf den Bus geben. Die Steuerung gibt anschließend ein
ACK = OK auf die Bus-ACK-Leitungen.
Der Prozessor kann jetzt den tatsächlich erhaltenen Wert als
einen Adressversatz verwenden, um weitere Aktionen zu beschließen. Auf
diese Weise wird eine zweidimensionale matrixartige Unterbrechung
realisiert, in der sowohl die physikalischen Unterbrechungsquellen
als auch ihre jeweils erzeugten Unterbrechungen unabhängige Werte
haben können.
-
In der Quelle gibt es verschiedene
Variablen: INT_X signalisiert, dass eine Unterbrechung vorhanden ist
(1) oder nicht; hierbei kann es sich um ein Flipflop handeln. Das
Flipflop wird zurückgesetzt,
indem in eine PI-Bus-abgebildete Adresse in dem PI-Bus-Bereich geschrieben
wird, der der Einheit zugeordnet ist, zu der diese Unterbrechungsquelle
gehört.
Außerdem
signalisiert ENAB_X(1), INT_X auf der entsprechenden Leitung INT_REQ(L)
zuzulassen; hierbei kann es sich um ein weiteres Flipflop handeln,
das über
den Bus gelesen und in das über
den Bus geschrieben werden kann. Seine Adresse befindet sich in
dem Busbereich, der zu der Einheit zugeordnet ist, zu der diese
Quelle gehört.
-
10 zeigt
ein Beispiel für
eine Unterbrechungsquittierungs-Prioritätsverkettung
und den Vektorauswahlmechanismus für eine bestimmte Unterbrechungsquelle.
Oben befinden sich das Unterbrechungssteuerungskern-Bündel 1002 (= 909)
und der Systembus 1004 (= 916). Von links treffen
das Bit INT_REQ_X und die Unterbrechungsquittierung INT_ACK_IN ein.
Letztere wird in Element 1016 invertiert, um den Latch 1008 zu
aktivieren, wodurch INT_REQ_X zwischengespeichert wird. Wenn eine „0" gespeichert wird, öffnet der
invertierte Latch-Ausgang das UND-Gatter 1014 und erlaubt
hiermit INT_ACK_OUT, weiter nach rechts zu laufen. Wenn eine „1" gespeichert wird,
ist das UND-Gatter 1014 blockiert, aber das UND-Gatter 1010 geöffnet, falls
eine weitere „1" von dem Unterbrechungssteuerungskern
zugeführt
wird, wodurch der Puffer 1012 aktiviert wird. Hierdurch
wird dann der Unterbrechungsvektor auf den Bus gegeben.
-
Text in der
Zeichnung
-
Figur
1
CPU | zentrale
Verarbeitungseinheit |
CPU
INT | CPU-Unterbrechung |
INT
CTR | Unterbrechungssteuerung |
INT
SOU | Unterbrechungsquelle |
INT
DEF VECT | Unterbrechungs-Standardvektor-Generator |
MEM | Speicher |
I/O | E/A |
VAR | Variable |
Figur
2
Address
of INT_VECTOR | Adresse
des INT_VECTOR |
WAT | Warten |
RDY | Bereit |
Figur
3
CPU_INT[M-1..0]
Outputs | CPU_INT[M-1..0]
Ausgänge |
Mapping | Abbildung |
Masking | Maskierung |
Prioritising | Prioritätensetzung |
Latching | Zwischenspeicherung |
INT_REQ[N-1..0]
inputs | INT_REQ[N-1..0]
Eingänge |
Acknowledge
generation | Quittierungserzeugung |
Upper
vector | Oberer
Vektor |
Control | Steuerung |
PI-bus
interface | PI-Bus-Schnittstelle |
Figur
4
Output | Ausgang |
Input | Eingang |
Outputs | Ausgänge |
Inputs | Eingänge |
Control
variables | Steuerung
d. Variablen |
Control | Steuerung |
OR | ODER |
AND | UND |
Lower
vector | unterer
Vektor |
PI-bus
interface | PI-Bus-Schnittstelle |
Figur
5A
Output | Ausgang |
Input | Eingang |
Enabled
requests | Aktivierte
Anforderungen |
Interrupt
source | Unterbrechungsquelle |
OR | ODER |
Figur
5B, 5C, 5D
OR | ODER |
Interrupt
source | Unterbrechungsquelle |
Multiplexer | Multiplexer |
Figur
6
Inputs | Eingänge |
Input | Eingang |
Control | Steuerung |
Lower
vector | unterer
Vektor |
PI-bus
interface | PI-Bus-Schnittstelle |
Figur
7
Interrupt
controller | Unterbrechungssteuerung |
Interrupt
cource | Unterbrechungsquelle |
Interrupt
default vector generator | Unterbrechungs-Standardvektor-Generator |
PI-bus | PI-Bus |
Figur
8
Interrupt
source | Unterbrechungsquelle |
Figur
9
Core | Kern |
LATCH | Latch |
MASK | Maskierung |
"many" int. sources | viele
Unterbrechungsquellen |
32
req lines | 32
Anforderungsleitungen |
32
ack lines | 32
Quittierungsleitungen |
enabling
the vector | Aktivierung
des Vektors |
Figur
10
Vector | Vektor |
INTC
signals | Unterbrechungssteuerungssignale |
LAT | Latch |