Inhaltsverzeichnis
  Übersicht Kapitel 2
2.6 Der Registersatz      3. Hardware/Software-Schnittstelle

2.7 Die Systembus-Schnittstelle


2.7.1 Aufbau der Systembus-Schnittstelle

Die Systembus-Schnittstelle (Bus Interface Unit - BIU) stellt die Verbindung des Mikroprozessors zu seiner Umwelt, also den Komponenten des Mikroprozessor-Systems dar. Dazu übernimmt sie einerseits die (logische) Funktion der Zwischenspeicherung von Adressen und Daten, andererseits die elektrische Funktion der Anpassung von internen und externen Signalpegeln und der Bereitstellung genügend großer Ausgangsleistung. Dies geschieht durch die Treiber, die als Stromverstärker eine größere Buslast und damit eine größere Anzahl von angeschlossenen Bausteineingängen erlauben. Auf beide Funktionen soll nun näher eingegangen werden. Dazu ist im Bild 2.7-1 noch einmal die Systembus-Schnittstelle skizziert.


Bild 2.7-1:  Die Systembus-Schnittstelle

Wie bereits gesagt, werden Register, die nur zur kurzzeitigen Zwischenspeicherung eines Datums dienen und die vom Benutzer nicht direkt durch spezielle Befehle angesprochen werden können, häufig als Puffer(-Register, Latches, Buffer) bezeichnet. Die Systembus-Schnittstelle des Prozessors enthält wenigstens die folgenden Pufferregister.

Datenbuspuffer

Der Datenbuspuffer (DBP) speichert alle Daten, die von der Außenwelt in den Prozessor gelesen werden oder in umgekehrter Richtung den Prozessor verlassen. Bei Prozessoren, die intern eine erheblich höhere Verarbeitungsgeschwindigkeit haben, als sie beim Zugriff auf einen externen Speicher möglich ist, hält dieser Puffer das auszugebende Datum so lange fest, bis es vom Speicher übernommen wurde.

Adreßbuspuffer

Der Adreßbuspuffer enthält stets die Adresse der Speicherzelle, auf die im nächsten Buszyklus zugegriffen werden soll. Bei einem Befehlszugriff wird er dazu vom Adreßwerk mit dem Wert des Programmzählers, bei einem Operandenzugriff aus dem Adreßpuffer geladen. Beide Register, Programmzähler und Adreßpuffer, sind über einen Multiplexer mit dem Adreßbuspuffer verbunden.

Lese/Schreib-FIFO

Bei modernen Hochleistungsprozessoren sind Daten- und Adreßbuspuffer häufig als FIFO-Speicher ("Warteschlange") mit wenigstens vier Speicherplätzen ausgebildet. In diese kann der Prozessor die auszugebenden Daten, mit ihren Adressen und Bus-Steuerinformationen, mit der internen Arbeitsgeschwindigkeit eintragen (Store Buffer). Der Transport dieser Daten in den Arbeitsspeicher wird dann von der Systembus-Schnittstelle mit der Arbeitsgeschwindigkeit des Systembusses (£ 133 MHz) autonom durchgeführt. Entsprechend können eingelesene Daten in einem Lade-FIFO-Speicher (Load Buffer) durch die Systembus-Schnittstelle zwischengespeichert werden und dort auf die weitere Bearbeitung durch den Prozessor warten.

Selbsttestaufgabe S2.7-1:  (–>Lösungsvorschlag)

Skizzieren Sie den beschriebenen Adreßbuspuffer mit Multiplexer für je ein Bit des Programmzählers bzw. des Adreßpuffers.

Bemerkung

Im Abschnitt 2.5 haben wir den Programmzähler und den Adreßpuffer dem Adreßwerk zugewiesen. Bei einfachen Prozessoren, die nur ein Adreßwerk geringer Komplexität besitzen, werden beide Register häufig der Systembus-Schnittstelle zugeteilt, da sie die logische und physikalische Schnittstelle zur Anbindung der externen System-Komponenten darstellen.

Um den Prozessor vom Systembus "abschalten" zu können und so anderen Systemkomponenten den Zugriff darauf zu erlauben, sind die Ausgänge der Pufferregister als Tristate-Ausgänge realisiert. Im folgenden Exkurs gehen wir auf die Realisierung der Busankopplung genauer ein.


Exkurs 2.7-1: Zur Realisierung der Busankopplung


Um die beschriebenen Aufgaben erfüllen zu können, muß der Datenbuspuffer von beiden Richtungen aus, also vom Innern des Prozessors sowie von seiner Außenwelt her, gelesen und beschrieben werden können. Um anderen Komponenten des Systems den exklusiven Zugriff auf den Datenbus zu gewähren, muß es zusätzlich möglich sein, die Ausgänge der Datenbus- und Adreßbuspuffer zum externen Systembus "abzuschalten". Dieses Abschalten wird durch eine besondere Gatterform, das Tristate-Gatter, erlaubt. Sein Schaltbild und seine Funktionstabelle sind im Bild 2.7-2 dargestellt.

a) links: Schaltsymbol, b) rechts: Funktionstabelle



c) Busleitung

Bild 2.7-2:  Tristate-Gatter


Wie der Name bereits angedeutet, besitzt es drei Ausgangszustände: neben den Pegelzuständen H (high) und L (low) noch den Zustand Z. In diesem Zustand ist der Ausgang A hochohmig gegen beide Betriebsspannungen (High Impedance). Dieser Ausgangszustand wird stets angenommen, wenn der Steuereingang C (Control) auf L-Potential liegt. Tristate-Gatter ermöglichen es, mehrere Gatterausgänge auf eine gemeinsame Leitung zusammenzuschalten (s. Bild 2.7-2c). Sie werden deshalb bevorzugt zum Aufbau von Bussystemen benutzt. Solange dafür gesorgt wird, daß stets höchstens einer der Steuereingänge Ci aktiviert, also auf H-Potential ist, kann es am gemeinsamen Ausgang A der Gatter keinen Kurzschluß geben.
Im Bild 2.7-3 ist ein Treiber aus Tristate-Gattern gezeichnet, der einen Datentransfer in beiden Richtungen zuläßt. Für jede Bit-Leitung des Datenbusses muß ein solcher Treiber vorhanden sein.


Bild 2.7-3:  Ein bidirektionaler (Datenbus-)Treiber

Durch ein L-Potential am Steuereingang G werden über die UND-Gatter beide Tristate-Gatter gesperrt, ihre Ausgänge also hochohmig. Somit ist ein Datentransfer in keine Richtung möglich. Liegt G auf H-Potential, so ist stets genau eines der UND-Gatter aktiviert. Welches von beiden, wird durch das Richtungs-Umschaltsignal DIR (Direction) vorgegeben: Ist DIR auf L-Potential, so geht die Übertragung von E nach A, für DIR auf H-Potential von A nach .
(Hinweis: Die Tristate-Treiber des Datenbusses sind hier im µP selbst integriert. Jedoch gibt es auch "diskrete" Bausteine mit beispielsweise acht uni- bzw. bidirektionalen Tristate-Treibern zum Anschluß beliebiger Komponenten an den Systembus.)
Im Bild 2.7-4 ist der bidirektionale Datenbus-Treiber so um ein D-Flipflop erweitert, daß aus beiden Richtungen der Inhalt des Flipflops gelesen oder verändert werden kann.
Die Übernahme eines neuen Datums in das Flipflop wird durch ein spezielles Taktsignal erzwungen. Durch ein L-Signal am Steuereingang G werden alle Tristate-Gatter deaktiviert. Ein H-Signal an G selektiert genau die beiden Tristate-Gatter einer Übertragungsrichtung (G1, G4 bzw. G2, G3). Durch das Signal DIR wird wiederum die gewünschte Richtung ausgewählt. Zwei zusätzliche Steuersignale OE, OA ermöglichen die Deaktivierung der Ausgangs-Gatter G2 bzw. G4, so daß der Flipflop-Inhalt verändert werden kann, ohne daß der Ausgang des Flipflops auf die Leitung E bzw. A gelegt wird.


Bild 2.7-4:  Bidirektionaler Datenbustreiber mit Puffer-Flipflop


2.7.2 Zeitverhalten der Systembus-Signale

Der zeitliche Ablauf (Timing) aller Signale auf dem Systembus für Lese- und Schreiboperationen wird vom Prozessorhersteller exakt spezifiziert, um den Anschluß verschiedener externer Komponenten - insbesondere von fremden Herstellern - sicherzustellen. Die Spezifikation der Signalformen und Pegel sowie ihre zeitliche Abfolge wird als Systembus-Protokoll des Prozessors bezeichnet. Leider existiert eine ganze Reihe sehr unterschiedlicher Protokolle, so daß - neben anderen Gründen - Standard-Systemkomponenten bei größeren Systemen nicht direkt am Systembus, sondern an einem zusätzlichen Peripheriebus angeschlossen werden müssen.
Die wesentliche Unterscheidung der Protokolle liegt darin, ob es sich um einen "getakteten" Systembus handelt oder der Bus ohne eigenen Takt auskommt. Im ersten Fall übernimmt der Bustakt dadurch die Synchronisierung aller Buskomponenten, daß alle Signalübergänge auf seine Flanken bezogen sind. Hier spricht man von einem synchronen Bus, im zweiten Fall von einem asynchronen Bus.


2.7.2.1 Synchroner Systembus

Im Bild 2.7-5 ist der zeitliche Ablauf der Signale auf einem getakteten Systembus für eine Lese- und eine Schreiboperation dargestellt. Die Zeitspanne zur Ausführung einer Systembus-Operation (insbesondere das Lesen bzw. Schreiben eines Datums) wird häufig als Buszyklus T bezeichnet.


Bild 2.7-5:  Zeitliche Abläufe auf einem synchronen Systembus

An dieser Stelle soll darauf hingewiesen werden, daß viele Prozessoren - anstelle des kombinierten Lese/Schreibsignals R/ über zwei getrennte Signal RD# (Read), WR# (Write) verfügen, durch die Lese- bzw. Schreiboperationen angezeigt werden.
Da bei dem betrachteten Bus alle Vorgänge synchron zum Takt in einem starren Muster ohne Benutzung weiterer Steuersignale ablaufen, spricht man von einem synchronen Systembus (im engeren Sinne). Insbesondere geschieht die Übergabe bzw. Übernahme der Daten zu festgelegten Taktflanken. Der Nachteil dieses Busprotokolls ist, daß alle am Bus angeschlossenen Komponenten dieselben strengen Zeitvorgaben erfüllen müssen. Insbesondere bestimmt so entweder die langsamste Komponente die zulässige Geschwindigkeit des Busses, oder aber der Bus schließt den Einsatz von Komponenten aus, die seinen Anforderungen nicht genügen. Daher wurde dieses Busprotokoll nur in den Anfangsjahren der Mikroprozessoren eingesetzt - mit Busfrequenzen von wenigen MHz.
Beim bisher betrachteten Busprotokoll stimmt die Buszykluszeit mit dem Taktzyklus überein. Bei realen Prozessoren, besonders der älteren Generationen, entspricht ein Buszyklus häufig jedoch mehreren Taktzyklen. Üblich sind Bustakte mit bis zu vier Vollschwingungen pro Buszyklus. Im Bild 2.7-5 ist durch ein gestricheltes Signal ein Bustakt gezeichnet, der pro Buszyklus zwei Vollschwingungen besitzt, so daß Adressierungs- und Datenphase jeweils eine Taktschwingung dauern.
Zur Vermeidung der geschilderten Nachteile verwenden die getakteten Systembusse vieler moderner Mikroprozessoren weitere Steuer- und Meldesignale zur Synchronisation der Buszugriffe. Heutzutage werden diese Busse ebenfalls mit dem Begriff "synchroner Bus" bezeichnet; in früheren Jahren war dafür auch der Begriff "semi-synchroner Bus" üblich. Im Bild 2.7-6 ist das Busprotokoll eines solchen Busses dargestellt.


Bild 2.7-6:  Zeitliche Abläufe auf einem (semi-)synchronen Systembus


Nach Beginn einer Speicheroperation legt der Prozessor möglichst frühzeitig zu Beginn des "Zustandes" (State) Ta die Adresse auf den Adreßbus. Die Auswahl der Übertragungsrichtung wird wiederum durch die Steuerleitung R/vorgenommen.

Im Bild 2.7-7 wird gezeigt, wie der Prozessor reagiert, wenn am READY#-Eingang  am Ende von Tb noch ein H-Pegel anliegt. Der Prozessor fügt in diesem Fall solange Wartezyklen (Wait State, Wait Cycle - TW) ein, bis am READY#-Eingang ein L-Signal  erscheint. Jeder Wartezyklus dauert - im betrachteten Fall - konstant eine halbe Buszykluslänge, d.h. die Länge von Tb. (Bei Prozessoren, bei denen Buszyklus- und Taktzykluslänge übereinstimmen, wird dadurch auch die Länge eines Wartezyklus bestimmt.)
Während der Wartezyklen werden alle Adreßsignale, das Steuersignal R/ und beim Schreiben auch die Daten konstant gehalten, um dem Speicher weiterhin Gelegenheit zu geben, diese zu übernehmen. Im Beispiel können durch das Einfügen eines Wartezyklus nun auch Speicherbausteine mit einer um 50% längeren Zugriffszeit benutzt werden.

Bild 2.7-7:  Einfügen von Wartezyklen


Bei den (semi-)synchronen Systembussen liegt die Dauer einer Datenübertragung nicht von vornherein fest. Gegenüber den synchronen Bussen (im engeren Sinne) verlangen sie zwar einen höheren Steueraufwand, erlauben jedoch den Anschluß von Komponenten mit unterschiedlichsten Antwortzeiten. Genügen alle Komponenten des Systems jedoch den vom Prozessor vorgegebenen Geschwindigkeitsanforderungen, so kann man den READY-Eingang  fest mit der Masse verbinden und so einen wirklich synchronen Bus erhalten. Ist dies nicht der Fall, so kann das READY-Signal z.B. durch eine Schaltung erzeugt  werden, wie sie im folgenden Exkurs beschrieben wird.


Exkurs 2.7-2: Erzeugung des READY-Signals


Im Bild 2.7-8 ist die Erzeugung des READY-Signals mit Hilfe eines Monoflops - vereinfachend - skizziert. Hier muß man lediglich dafür sorgen, daß durch jeden Zugriff auf den Speicher das Monoflop "getriggert", also zur Ausgabe eines H-Impulses der Länge der maximalen Zugriffszeit als READY#-Signal veranlaßt wird. Nach Ablauf  dieses Signals liegt dann am READY#-Eingang wunschgemäß ein L-Pegel vor, und  der Buszugriff kann mit der positiven Flanke des nächsten Zustandes (Tb bzw. TW) abgeschlossen werden. Der Decoder im Bild 2.7-8 überwacht ständig den Adreßbus. Sobald er darauf eine gültige Speicheradresse feststellt, gibt er das (negative) Triggersignal zum Monoflop aus, das gleichzeitig zur Aktivierung des Speichers dient (Chip Select -CS). Durch das ODER-Gatter am Ausgang des Monoflops wird dafür gesorgt, daß das READY#-Signal wieder einen H-Pegel annimmt,  wenn die Speicheradresse nicht mehr auf dem Adreßbus vorliegt. Dies ist im unteren Teil des Bildes als Zeitdiagramm dargestellt.


Bild 2.7-8:  Schaltung zur Erzeugung eines READY-Signals

Die Systembus-Schnittstelle von anwendungsorientierten Mikroprozessoren, also Mikrocontroller und DSPs, verfügt in der Regel über integrierte Schaltungen zur Erzeugung von Wartezyklen (Wait-State Generators). Diese fügen bei Zugriffen auf unterschiedliche Adreßbereiche automatisch eine programmierbare Anzahl von Wartezyklen ein.


2.7.2.2 Asynchroner Systembus

Wie bereits gesagt, nehmen die eben beschriebenen (semi-)synchronen Systembusse mit READY-Signal eine Mittelstellung zwischen den synchronen Bussen im engeren Sinne und den asynchronen Bussen ein, die wir in diesem Unterabschnitt beschreiben werden. Bild 2.7-9 zeigt die zeitlichen Signalverläufe auf einem asynchronen Systembus.
Hier erzeugt die CPU ein spezielles Steuersignal AS# (Address Strobe), mit dem sie der angeschlossenen Komponente das Vorliegen einer gültigen Adresse auf dem Adreßbus anzeigt. Die Komponente wiederum besitzt einen Ausgang ACK# (Acknowledge), über den sie die CPU (mit der negativen Flanke) davon informieren kann, daß sie die Adresse auf dem Adreßbus erkannt hat. Zwischen der Aktivierung beider Signale kann im Prinzip eine beliebig große Zeitspanne liegen. Beim Lesen eines Datums zeigt die angesprochene Komponente durch die positive Flanke des Signals ACK# an, daß sie das  geforderte Datum auf den Datenbus gelegt hat. Beim Schreiben eines Datums meldet sie durch die positive Flanke von ACK#, daß sie das angebotene Datum übernommen hat. Wenn  die CPU das Signal ACK# erkannt hat, nimmt sie ihr Signal AS# zurück. Bis dahin  kann prinzipiell wiederum eine beliebig lange Zeit vergehen. Als Reaktion darauf kann nun die Komponente ihrerseits ihr Signal ACK# deaktivieren.


Bild 2.7-9:  Zeitliche Abläufe auf einem asynchronen Systembus

Verfahren der eben beschriebenen Art werden Handshake-Verfahren (Quittungsverfahren) genannt, da sich bei ihnen die beiden Kommunikationspartner, CPU und angesprochene Komponente, durch den Austausch der AS#- bzw. ACK#-Signale sozusagen "die Hand geben". Wie beim synchronen Bus können Sender und Empfänger eines Datums durch die Steuerung der Handshake-Signale beliebige Wartezeiten einfügen, die - vereinfachend - meist auch als Wartezyklen (Wait States) bezeichnet werden. Wir haben hier nur eine von vielen Möglichkeiten für das Zusammenspiel von zwei Handshake-Signalen gezeigt. Eine Variante des dargestellten Protokolls besitzt - wie im Bild 2.7-9 gestrichelt skizziert - ein zusätzliches Strobe-Signal DS# (Data Strobe), durch dessen negative Flanke der Prozessor das Vorliegen eines gültigen Datums auf dem Datenbus (Schreiben) bzw. durch die positive Flanke die Übernahme eines Datums (Lesen) anzeigt.
Wie die semi-synchronen Busse erlauben auch die asynchronen Busse den Anschluß von Komponenten mit (fast) beliebiger Zugriffszeit, verlangen dazu aber einen höheren Steueraufwand. Auf asynchronen Systembussen spielt der Systemtakt keine (wesentliche) Rolle für die Synchronisation der Übertragung. (Deshalb wurde er im Bild 2.7-9 gestrichelt gezeichnet.) Da das Steuerwerk der CPU ein synchrones Schaltwerk ist, werden aber die Zeitpunkte, zu denen sich die CPU-Signale ändern, vom Systemtakt vorgegeben. Die Reaktion von CPU und Komponenten auf das Steuersignal des jeweiligen Kommunikationspartners hingegen sind nicht in das starre Taktraster eingebunden. Da der Empfänger eines Signals (CPU, oder Komponente) dieses jedoch mit seinem eigenen Takt synchronisieren muß und dazu u.U. eine Taktschwingung benötigt, sind asynchrone Busse in der Regel langsamer als eine synchrone Lösung. Die Dauer einer Datenübertragung liegt bei ihnen nicht von vornherein fest.

Semi-synchrone Systembusse werden u.a. in Rechnersystemen realisiert, die einen Intel-Prozessor besitzen. Die Motorola-Prozessoren 680X0 mit X£ 3 besitzen hingegen einen asynchronen Bus. Erst beim letzten Familienmitglied, dem MC68040, war auch die Firma Motorola auf einen semi-synchronen Systembus umgestiegen. Viele Mikrocontroller ermöglichen es dem Systementwickler, durch Programmierung spezieller Register die Systembus-Schnittstelle so zu steuern, daß sie wahlweise als semi-synchroner oder asynchroner Bus arbeitet. Dies geht bei einigen Controllern soweit, daß diese Auswahl für verschiedene Adreßbereiche unterschiedlich getroffen werden kann.


2.7.2.3 Systembusse mit überlappter Adressierung

In Abschnitt 2.7.2.1 wurde gezeigt, daß jeder Buszyklus beim synchronen Bus (wenigstens) aus der Adressierungs- und der Datenphase besteht. Dabei wird, um der angesprochenen Komponente eine möglichst lange Reaktionszeit einzuräumen, die ausgegebene Adresse auch während der Datentransferphase konstant gehalten. Schon in den 80er Jahren kam man auf den Gedanken, die ausgegebene Adresse in einem Register des Speichers selbst aufzufangen und dort bis zum Ende des Buszyklus zu speichern. Dies erlaubte, Adreß- und Datenphasen hintereinander folgender Speicherzugriffe überlappt in Form eines einfachen "Fließbandes" (Pipelined Addressing) durchzuführen, wie es im Bild 2.7-10 für Lesezugriffe dargestellt ist.


Bild 2.7-10:  Protokoll eines Busses mit überlappter Adressierung

Während des Taktzyklus T1 gibt der Prozessor die Adresse des ersten Datums aus. Am Ende von T1 zeigt der Speicher durch sein Signal NA# (Next Address) dem Prozessor an, daß er bereit ist, vorzeitig die nächste Adresse aufzunehmen. Während T2 gibt daher der Prozessor bereits diese Adresse aus und liest gleichzeitig das erste Datum ein. Die vorzeitig ausgegebene Adresse wird durch das nicht gezeichnete Signal AS# (Address Strobe) in einem Register des Speichers aufgefangen. Damit ist der erste Buszugriff beendet, während der zweite bereits überlappend begonnen wurde.

Vereinfachend wurde im Bild auf die Darstellung des READY-Signals verzichtet. Mit dessen Hilfe kann auch hier der Speicher das Einfügen von Wartezyklen veranlassen. Während dieser Wartezyklen hält er das NA-Signal inaktiv, so daß der Prozessor die vorzeitig ausgegeben Adresse konstant vorhält, aber keine neue Adresse anlegt.


2.7.2.4 Busse mit gesplittetem Adreß- und Datenzugriff

Die beschriebene Trennung von Adressierungs- und Datenphase wird auch in Multiprozessor-Systemen angewandt, bei denen sich mehrere Prozessoren den Zugriff zum gemeinsamen Systembus teilen müssen. Hier können nun während eines Bustaktzyklus zwei verschiedene Prozessoren auf den Adreß- bzw. Datenbus zugreifen. In diesem Fall spricht man von einem Bus mit gesplitteten Zugriffen (=Transaktionen, Split-Transaction Bus). Im Bild 2.7-11 ist eine Möglichkeit für ein Busprotokoll skizziert. Dabei werden nur Lesezugriffe dargestellt. Reale Protokolle unterscheiden sich häufig sehr stark in der Definition und Verwendung der Steuersignale.


Bild 2.7-11:  Bus mit gesplittetem Zugriff

Im gezeigten Beispiel liegen zwischen den einzelnen Adressierungsphasen jeweils "ungenutze" Taktzyklen, während derer sich die beteiligten Prozessoren um den Adreßbuszugriff bewerben müssen (Busarbitrierung). Nachdem ihnen der Adreßbus zugeteilt wurde, legen sie nacheinander die Adresse ihres Speicherzugriffs auf den Adreßbus und zeigen es jeweils durch ein Signal ("gültige Adresse", im H-Pegel aktiv) an. Sobald der Speicher(-Controller) den aktuell ausgeführten Datenbuszugriff (Transaktion) beendet hat, teilt er dem ersten Prozessor über ein spezielles Signal mit, daß ihm der Datenbus zur exklusiven Nutzung zur Verfügung steht. Gleichzeitig informiert er über ein weiteres Signal alle angeschlossenen Prozessoren darüber, daß der Datenbus belegt ist. Im Bild ist der Fall skizziert, daß der selektierte Prozessor (#1) nun einen Block (Burst) aus zwei Daten einliest (vgl. den folgenden Unterabschnitt). Nach Abschluß dieser Übertragung erteilt der Speicher über eine weitere Steuerleitung dem zweiten Prozessor den Zugriff zum Datenbus. Die Datenausgabe geschieht in der gleichen Reihenfolge wie die Adreßausgabe.


2.7.2.5 Systembusse mit Blockübertragungen

Eine weitere Beschleunigung der Buszugriffe kann man erreichen, wenn nicht einzelne Daten übertragen werden sollen, sondern mehr oder weniger große Blöcke (Bursts) von hintereinanderfolgenden Speicherzellen gelesen oder beschrieben werden müssen. In diesen Fällen werden die Adressen, die bei den Buszugriffen ausgegeben werden, lediglich hochgezählt. Daher liegt es nahe, nur die Anfangsadresse auszugeben, die Erzeugung der Folgeadressen jedoch durch einen Zähler im Speicher vornehmen zu lassen. Diese Form der Blockübertragung (Burst Transfer) ist im Bild 2.7-12 skizziert.

Wichtigste Anwendung der Burst-Übertragung ist das Laden oder Abspeichern von ganzen Cache-Blöcken. Dazu gibt der Prozessor lediglich die Anfangsadresse aus und zeigt das durch das Strobe-Signal ADS# an. Der Speicher-Controller erkennt selbständig, daß diese Adresse zu einem Cache-Block gehört, und zeigt durch KEN# (Caching Enable) seine Bereitschaft zur Burst-Übertragung an. Der Prozessor akzeptiert dieses "Angebot" und stoppt die Ausgabe der nächsten Blockadressen. Diese werden nun intern vom Speicher(-Controller) z.B. durch fortlaufendes Inkrementieren der Anfangsadresse selbst erzeugt. Über das Signal BRDY# (Burst Ready) kann der Speicher - falls benötigt - Wartezyklen anfordern.
Beginn und Ende der Burst-Übertragung beliebig langer Blöcke werden oft durch ein spezielles (nicht gezeichnetes) Prozessor-Signal (z.B. FRAME# genannt) angezeigt, das den "Rahmen" des Blockes vorgibt. Meist wird jedoch ein Block nach einer festen Anzahl von Datentransfers, häufig vier 32- oder 64-bit-Wörter, beendet. Im Bild 2.7-12 ist eine von der Firma Intel patentierte, nicht lineare Adreßfolge gezeigt, mit der die Pentium-Prozessoren einen Burst aus vier 64-bit-Wörtern (8 byte) übertragen. Sie hat zum Ziel hat, aus einem 32-byte-Cache-Block stets zuerst das Datum zu übertragen, auf das der Prozessor gerade zugreifen will. Außerdem wird dadurch erreicht, daß bei einer geeigneten Aufteilung des Speichers in zwei sogenannte "Bänke" unmittelbar aufeinander folgende Zugriffe auf verschiedene Bänke und damit schneller stattfinden.


Bild 2.7-12:  Ablauf einer Block-Übertragung


Anders als im Bild 2.7-12 dargestellt, kann vor Ablauf der Burst-Übertragung bereits überlappend die Adresse für den nächsten Speicherzugriff - Einzel- oder Bursttransfer - ausgegeben werden. Die Kombination von überlappender Adressierung und Block-Übertragung kommt beim Zugriff auf einen sog. "Pipelined Burst Cache" zum Einsatz.


2.7.3 Adressierung von Peripheriebausteinen

Die vom Prozessor ausgegebenen Adressen dienen nicht nur zur Selektion bestimmter Speicherzellen, sondern auch zur Auswahl der einzelnen Register in den übrigen Systembausteinen, insbesondere den Schnittstellenbausteinen, wie Sie sie im Kapitel 4 kennenlernen werden. Die Prozessorfamilien verschiedener Hersteller unterscheiden sich darin, wie diese Bausteine angesprochen werden. Im Bild 2.7-13 sind die beiden gängigen Verfahren dargestellt.


Bild 2.7-13:  Zur Adressierung von Peripherie-Bausteinen



2.7.4 Multiplex-Bus

Um die Anzahl der Anschlußstifte am Prozessorgehäuse und der Signalleitungen zu begrenzen, werden bei einigen Prozessortypen bestimmte Gruppen von Signalen zeitlich hintereinander über dieselben Busleitungen geschickt. Man spricht in diesen Fällen von einem Multiplex-Bus. Das Multiplexen kann dabei stattfinden zwischen

Im Bild 2.7-14 ist die Systembus-Schnittstelle für den Fall gezeichnet, daß Daten- und Adreßleitungen "gemultiplext" werden: Ein Multiplexer in der Systembusschnittstelle des Prozessors schaltet nacheinander den internen Adreß- und Datenbus auf den gemeinsamen externen Bus. Zu beachten ist, daß der Multiplexer im Datenbusbereich einen bidirektionalen Betrieb zulassen muß.

Bild 2.7-14:  Multiplex-Busschnittstelle

Da zur Übertragung eines Datums aus dem bzw. in den Speicher die Adresse während der gesamten Zugriffszeit vorliegen muß, wird die vorzeitig ausgegebene Adresse in Auffangflipflops (Latches) gespeichert. Im Bild 2.7-15 ist das Zeitverhalten des Multiplexbusses aus Bild 2.7-14 dargestellt.
Während des ersten Systemtaktes T1 erscheint auf dem Daten-/Adreßbus die Speicheradresse. Durch ein Signal der Bussteuerung wird das Vorliegen einer gültigen Adresse angezeigt. Dieses Signal wird häufig mit AS (Address Strobe, auch ADS), VMA (Valid Memory Address) oder ALE (Address Latch Enable) bezeichnet.


Bild 2.7-15:  Zeitliches Verhalten des Multiplexbusses

Die Adresse wird z.B. durch die negative Signalflanke dieses Signals in die Auffangflipflops übernommen und steht dort bis zur nächsten negativen Signalflanke unverändert an. Während des Systemtakts T3 liegen die zu übertragenden Daten stabil auf dem Multiplexbus. Dabei müssen u.U. weitere Bustakte als Wartezyklen eingefügt werden, wenn die Zugriffszeit des adressierten Speichers (oder Preripheriebausteins) zu groß ist. Während der Taktzyklen T2 und T4 werden der Multiplexer und - bei Lesezugriffen - die Richtung der Datensignale umgeschaltet (Turn-around Cycles). Neben der Serialisierung der Adreß- und Datenübertragungen sind diese Umschaltzyklen der Grund, warum Multiplexbusse relativ langsam sind. Bei sehr schnellen Bussen werden diese Umschaltvorgänge deshalb oft noch während der Adreß- und Datenphase vorgenommen. Andere Busprotokolle fügen die Umschaltzyklen T2 nur bei Lesezugriffen ein, bei denen ja die Richtung der externen Bussignale umgeschaltet werden muß.
Trotz der beschriebenen Nachteile werden Multiplexbusse - insbesondere im Mikrocontroller-Bereich - sehr häufig eingesetzt, da sie eine Reduktion der Baustein-Anschlüsse und damit kostengünstigere Chip-Gehäuse und Platinen ermöglichen. Hochleistungs-Mikrocontroller ermöglichen dem Entwickler sogar, die Systembus-Schnittstelle so zu programmieren, daß sie nicht gemultiplext oder wahlweise in einer von mehreren Multiplex-Varianten (s.o.) arbeitet.
An dieser Stelle soll schon einmal darauf hingewiesen werden, daß aus Kostengründen - neben den Systembussen - auch standardisierte Peripheriebusse, wie z.B. der PCI-Bus (Peripheral Connect Interface) als Multiplexbusse realisiert werden.

Selbsttestaufgabe S2.7-2:  (–>Lösungsvorschlag)
Skizzieren Sie den beschriebenen Multiplexer für je ein Bit des Datenbuspuffers sowie des Adreßbuspuffers. Benutzen Sie dabei den bidirektionalen Datenbustreiber nach Bild 2.7-4 als einen einzigen Block.

2.7.5 Steuerung der Datenbusbreite


Moderne 16/32/64-bit-Prozessoren erlauben es, die effektive Breite des Datenbusses dynamisch, d.h. von Befehl zu Befehl, ja sogar von Buszyklus zu Buszyklus zu verändern. Dadurch ist es möglich, in einem System Bausteine mit unterschiedlicher Datenbusbreite einzusetzen. So kann z.B. ein 32-bit-Prozessor Daten über einen 8-bit-Schnittstellenbaustein ausgeben. Ein 32-bit-Registerinhalt wird dazu sequentiell in 4 Bytes über die gleichen acht Datenleitungen übertragen. Ein weiteres Beispiel ist der Einsatz eines 8-bit-Festwertspeichers in einem 32-bit-System, der eine Initialisierungsroutine enthält, die lediglich nach dem Einschalten des Systems ausgeführt wird.
Zur Steuerung der Datenbusbreite besitzen die Prozessoren Eingangsleitungen, die von den Systemkomponenten individuell nach deren Busbreite angesteuert werden müssen. Zur Demonstration sollen die folgenden Beispiele dienen:

Im Bild 2.7-16 ist ein einfaches Mikroprozessor-System gezeichnet, das Komponenten mit 8, 16 und 32 bit Datenbusbreite integriert. Für jede ausgegebene Adresse wird durch einen zentralen Adreßdecoder die Komponente festgestellt, zu deren Adreßraum diese Adresse gehört. Im Adreßdecoder ist außerdem für alle angeschlossenen Komponenten die benötigte Datenbusbreite festgelegt. Der Adreßdecoder wählt nun über ein Ausgangssignal SELECT #i die gewünschte Komponente an und informiert gleichzeitig den Prozessor durch die Steuersignale BS16, BS8 über die zu verwendende Datenbusbreite.


Bild 2.7-16:  dynamische Busbreiten-Steuerung

Im Bild 2.7-17 ist der zeitliche Ablauf auf dem Datenbus für Zugriffe auf 32-bit-Wörter in Komponenten mit unterschiedlicher Datenbusbreite skizziert. Bei den Datenbusbreiten 16 oder 8 werden diese Wörter im Multiplexbetrieb (vgl. Abschnitt 2.7.4) übertragen. Dazu werden stets die niederwertigen Datenbusleitungen DBn,...,DB0 (n = 15, 7) benutzt und die niederwertigen Datenbits (meist) zuerst transferiert. Bei Lesezugriffen müssen die sequentiell empfangenen Teildaten von der Systembusschnittstelle des Prozessors wieder "parallelisiert" werden (assembly), daß heißt, durch einen Demultiplexer in die richtigen Bitpositionen des Datenpuffers geschrieben werden. Bei Schreibzugriffen muß die Schnittstelle das Multiplexen dieser Teildaten auf die gemeinsam benutzten Leitungen vornehmen (disassembly).


Bild 2.7-17:  Zeitlicher Ablauf von Busoperationen mit unterschiedlicher Datenbusbreite


Beim ersten Zugriff (Adr. 32) liegen BS16# und BS8# auf dem H-Pegel und das Datum wird parallel in einem Buszyklus über den 32-bit-Datenbus übertragen. Durch BS16# auf L-Pegel, BS8# auf H-Pegel wird die Übertragung über einen 16-bit-Datenbus angefordert. Der Prozessor liefert dazu zunächst die Adresse der niederwertigen 16 Bits des Datums. Im nächsten Zyklus folgt dann die Adresse der höherwertigen 16 Bits. Bei einem 8-bit-Transfer - gekennzeichnet durch BS16# auf H-Pegel, BS8# auf L-Pegel - werden die Daten in vier Zyklen byteweise übertragen. Dazu liefert der Prozessor jeweils die Byteadressen des Datums in aufsteigender Reihenfolge.

2.7.6 Weitere Funktionen der Systembus-Schnittstelle

Bei einfachen Prozessoren werden die beschriebenen Steuer- und Meldesignale der Systembus-Schnittstelle vom (zentralen) Steuerwerk (vgl. Abschnitt 2.2.2), bei komplexen Prozessoren hingegen von der Schnittstelle selbst erzeugt bzw. ausgewertet. Im letztgenannten Fall arbeitet die Schnittstelle also wie ein eigenständiger Steuerbaustein (Controller), der über spezielle Signale mit dem Steuerwerk kommuniziert. Die Komponente der Schnittstelle, die die beschriebenen und weitere Funktionen (vgl. Bild 2.7-1) erfüllt und die Integration des Prozessors in ein Rechnersystem erleichtert, wird z.B. mit System Integration Module (SIM, Motorola) oder External Bus Controller (EBC, Siemens) bezeichnet.

Zu den weiteren Signalen, die der Systembus-Controller zur Ausführung seiner Funktionen benötigt, gehören zunächst die im folgenden beschriebenen Signale, auf die wir nicht ausführlich eingehen wollen. In Unterabschnitten werden wir uns danach mit anderen wichtigen Signalgruppen beschäftigen.


2.7.6.1 Busarbitrierungs-Signale

Die Signale BR (Bus Request), BG (Bus Grant) und BGACK (Bus Grant Acknowledge) zur Busarbitrierung wurden bereits im Unterabschnitt 6.5.2.1 beschrieben. Ihr Zeitverhalten ist im Bild 2.7-18 skizziert.


Bild 2.7-18:  Busarbitrierung


Während der Prozessor im 1. Takt die Adresse der selektierten Speicherzelle ausgibt, fordert eine Systemkomponente (oder ein zweiter Prozessor) von ihm über den BR-Eingang den Systembus an. Zum Ende von Takt 2 hat der Prozessor das Datum übertragen und gewährt über sein Ausgangssignal BG nach Abschluß des Buszyklus der Komponente den Buszugriff. Optional kann nun die zugriffsberechtigte Komponente über ein drittes Signal, BGACK#, dem Prozessor und eventuell weiteren Busteilnehmern mitteilen, daß sie die Systembuskontrolle übernommen hat und ihren Buszugriff durchführt.
In einem Mikroprozessor-System der beschriebenen Art besitzen die angeschlossenen Buskomponenten stets eine höhere Priorität als der Prozessor, so daß er deren Zugriffswünsche (nach Beendigung des laufenden Buszugriffs) erfüllen muß. Immer wenn mehrere aktive Komponenten an den gemeinsamen Systembus gekoppelt werden, benötigt man einen "Schiedsrichter" (Arbiter), der die Konflikte durch gleichzeitige Zugriffswünsche auflöst und diese in eine geeignete zeitliche Reihenfolge bringt. Häufig ist dieser Arbiter als externer Baustein realisiert, dem jede Buskomponente ihr Signal BRQi zuführt. Dies ist im Bild 2.7-19 skizziert. Der Arbiter ist über spezielle Leitungen BGRi mit allen Komponenten verbunden und kann darüber genau eine Komponente zum momentanen Busmaster erklären, sobald der Bus durch das Prozessorsignal BG freigegeben wurde. (Diese Form der Bus-Arbitrierung nennt man, wegen der individuellen Anforderungs- und Zuteilungssignale, "unabhängige Anforderung" - Independent Request. Auf andere Möglichkeiten werden wir im weiteren ausführlicher eingehen.)


Bild 2.7-19:  Buszuteilung mit zentralem Arbiter


Wenn mehrere Busteilnehmer auf dieselben Speicherzellen zugreifen sollen, entsteht ein Problem dadurch, daß ein Datum im Speicher bereits von einem zweiten Teilnehmer angesprochen wird, während der erste dieses noch bearbeitet und das Ergebnis noch nicht im Speicher abgelegt hat. Zur Vermeidung dieses Problems kann eine Operationsfolge 'lesen - bearbeiten - abspeichern' (Read-Modify-Write) zu einem unteilbaren Buszyklus (Indivisible Cycle) erklärt werden.
Dazu besitzen die Prozessoren häufig ein Ausgangssignal, das z.B. mit LOCK oder RMC (Read-Modify-Write-Cycle) bezeichnet wird. Dieses wird dem Arbiter zugeführt und veranlaßt ihn, die Weitergabe des Zugriffsrechts auf den Bus an eine andere Komponente solange zu verzögern, bis der Prozessor den unteilbaren Buszyklus beendet hat. Dies ist im Bild 2.7-20 dargestellt.
Zur Aktivierung des Blockiersignals für einen unteilbaren Buszyklus auf Programmebene existieren zwei Alternativen (vgl. Abschnitt 3.2):


Bild 2.7-20:  Blockierung des Systembusses



2.7.6.2 Aufbau und Funktion eines programmierbaren Systembus-Controllers

Im Gegensatz zu PCs und Workstations besteht der Arbeitsspeicher von anwendungsorientierten Prozessoren, d.h. Mikrocontrollern und DSPs, häufig nicht aus einem homogenen Speicherblock, sondern aus einer Vielzahl mehr oder weniger großer Speicherblöcke, die aus unterschiedlichen Bausteinen aufgebaut sind. Dazu gehören insbesondere Schreib-/Lesespeicher und Festwertspeicher der unterschiedlichsten Technologien, mit individuellen Schnittstellen und Steuersignalen, Zugriffszeiten und Kapazitäten. Um dem Systementwickler größtmögliche Freiheit bei Auswahl und Einsatz der geeigneten Bausteine einzuräumen, bieten moderne Prozessoren vielfältige Möglichkeiten, den Systembus-Controller geeignet zu "programmieren". Im Bild 2.7-21 ist exemplarisch der Anschluß eines strukturierten Arbeitsspeichers an einen Prozessor mit programmierbarem Bus-Controller skizziert. Der Speicher bestehe aus einem großen Schreib-/Lesespeicher mit 32 bit breitem Datenpfad, einem 8 bit breiten Festwertspeicher sowie einem weiteren Speicherbereich, der den Zugriff auf 16-bit-Datenwörter ermöglicht.


Bild 2.7-21:  Aufbau eines Systembus-Controllers

Der Bus-Controller (des behandelten Beispiels) besteht aus zwei Hauptkomponenten:


  Inhaltsverzeichnis
  Übersicht Kapitel 2
2.6 Der Registersatz      3. Hardware/Software-Schnittstelle