| Inhaltsverzeichnis | |||||
| Übersicht Kapitel 2 | |||||
| |||||
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.
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.
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.
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 |
|
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.
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 .
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.
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.

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 |
|
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.
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.
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.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.
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

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 |
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
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.
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
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 | |||||
| |||||