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

## 2.7 Die Systembus-Schnittstelle

- 2.7.1 Aufbau der Systembus-Schnittstelle
- 2.7.2 Zeitverhalten der Systembus-Signale
- 2.7.3 Adressierung von Peripheriebausteinen
- 2.7.4 Multiplex-Bus
- 2.7.5 Steuerung der Datenbusbreite
- 2.7.6 Weitere Funktionen der 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

- Zu Beginn der positiven Halbwelle (Zeitspanne Ta) wird für beide Übertragungsrichtungen 'Lesen' bzw. 'Schreiben' die Adresse auf den Adreßbus gelegt. Die Auswahl der Übertragungsrichtung geschieht durch die Bussteuerleitung R/(Lese-/Schreibsignal). Die Zeitspanne Ta kann man daher auch als Adressierungsphase des Buszyklus ansehen.
- Bei einer Leseoperation (R/=1) gibt der Speicher (oder eine andere Systemkomponente) irgendwann während der Zeit Tb diegeforderten Daten auf den Datenbus. Ihre Übernahme in den Prozessor wird durch die positive Flanke des Systemtaktes (am Ende von Tb) angestoßen. Die Zeitspanne Tb ist die Daten(transfer)phase des Buszyklus.
- Beim Schreiben eines Datums (R/=0) in den Speicher legt der Prozessor spätestens mit Beginn der negativen Halbwelle des Systemtaktes (Zeitspanne Tb) die Daten auf den Datenbus. Die Übernahme der Daten in den Speicher wird durch die positive Flanke von R/ausgelöst.

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.

- Bei einer Leseoperation (in einem hinreichend schnellen Speicher) erscheinen während des Buszykluszeit Tb die Daten auf dem Datenbus und können mit der aufsteigenden Taktflanke des nächsten Buszyklus in den Prozessor übernommen werden.
- Bei einer Schreiboperation folgen frühzeitig - im Bild zu Beginn der zweiten Hälfte von Ta - die Daten auf dem Datenbus. Im Beispiel bleibt dem Speicher nun bis zum Ende des Buszyklus Zeit, die gewünschte Speicherzelle zu selektieren und das Datum dorthin zu übertragen.
- Um jedoch auch langsamere und damit preisgünstigere Speicherbausteine (oder Peripheriebausteine) benutzen zu können, besitzt der Prozessor einen Steuereingang, der häufig mit READY# bezeichnet wird. Der eben beschriebene Vorgang einer Speicheroperation wird nur dann mit dem Ende des Zustandes Tb abgeschlossen, wenn rechtzeitig vor der folgenden positiven Taktflanke des nächsten Buszyklus am Eingang READY# ein L-Signal anliegt.

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.

- Beim ersten Verfahren, das als speicherbezogene Adressierung (Memory-mapped I/O) bezeichnet wird, wird nicht zwischen der Adresse einer Speicherzelle oder der eines Registers in einem Schnittstellenbaustein unterschieden. Die Adressen der Register werden meist vom Systementwickler in einem zusammenhängenden Bereich des Adreßraumes untergebracht. Dieser wird gewöhnlich mit I/O-Page bezeichnet (s. Bild 2.7-13a).
- Beim zweiten Verfahren existieren getrennte Adreßräume für den Arbeitsspeicher und die Peripheriebausteine. Deshalb spricht man auch von der isolierten Adressierung (Isolated I/O). Der letztgenannte Adreßraum (I/O-Adreßraum) ist in der Regel erheblich kleiner als der Speicher-Adreßraum. Die Auswahl zwischen beiden Adreßräumen geschieht bei einigen Prozessoren durch ein spezielles Prozessorsignal, das beispielsweise mit M/ (Memory/Input-Output) oder MREQ (Memory Request) bezeichnet wird. Dieses Signal kann somit als zusätzliches Adreßsignal aufgefaßt werden. Bei anderen Prozessoren dienen die im Abschnitt 2.2.2.4 beschriebenen Prozessor-Statussignale den Komponenten dazu, zwischen Speicher- und Schnittstellenzugriffen zu unterscheiden.

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

- den Adressen und Daten,
- den höher- und niederwertigen Adreßbits,
- den höher- und niederwertigen Datenbits
- oder in gemischter Form, z.B. zwischen den niederwertigen Adreßbits und den Daten.

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:

- Beim Intel 80386 kann durch das Signal BS16 (Bus Size) zwischen einem 16-bit-Bus und einem 32-bit-Bus gewählt werden.
- Beim NS 32332 der Firma National Semiconductor konnte durch die Signale BW0und BW1 (Bus Width) zwischen den drei Busbreiten 8, 16 und 32 bit gewählt werden.

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.

- Speicher-Steuersignale
  Insbesondere Mikrocontroller unterstützen den Anschluß verschiedenster Festwert- und Schreib-/Lesespeicher, indem sie die spezifischen Steuersignale für diese Speicherbausteine erzeugen. Dazu gehören insbesondere die Adreß-Strobesignale RAS (Row Address Strobe) und CAS (Column Address Strobe) für dynamische Speicher, die ihre Information als Ladungsträger in kleinen Kapazitäten ablegen. Der Systembus-Controller von Mikrocontrollern kann häufig so programmiert werden, daß er in verschiedenen Adreßbereichen die Steuersignale für unterschiedliche Speicherbausteine ausgibt.
- Unterbrechungssignale
  Neben den im Abschnitt 2.2.2 beschriebenen Unterbrechungssignalen, wie HALT, RESET, die direkt an das Steuerwerk weitergereicht werden, reagiert der Systembus-Controller insbesondere auf den ERROR-Eingang, über den die Peripherie einen Busfehler anzeigen kann (z.B. Paritätsverletzung). Der Controller kann automatisch eine Wiederholung des letzten Buszugriffes, den Aufruf einer Ausnahmebehandlungs-Routine oder den Wechsel in den HALT-Zustand veranlassen. Über andere Eingänge können Mikroprozessoren - insbesondere Mikrocontroller, DSPs und Prozessoren für mobile Geräte - in einen Stromsparmodus (Powerdown) versetzt werden, in dem im Extremfall der gesamte Systemtakt angehalten und die Betriebsspannung herabgesetzt wird.
- Test&Debug-Signale
  Wegen der Komplexität moderner Mikroprozessoren und ihrer Peripheriebausteine ist es heute unerläßlich, die Bausteine im System selbst testen zu können. Die einfachste Lösung, die aber weite Verbreitung gefunden hat, überprüft lediglich die Ein-/Ausgangsschaltungen der Bausteine und ihre Verbindungsleitungen auf den Rechnerplatinen. Dieser Test benötigt lediglich 5 Bausteinanschlüsse und ist unter dem Namen JTAG-Test (Joint Test Action Group) standardisiert worden. Zur Einsparung von Anschlüssen werden diese häufig von den Prozessorherstellern mit einer Doppelfunktion realisiert und können damit alternativ auch für eigene produktspezifische Test- und Überwachungsfunktionen innerhalb der Bausteine (Debugging) benutzt werden. In diesem Modus können dann auch interne Prozessorkomponenten (Register, Speicherzellen,...) beobachtet und manipuliert werden.
- Signale zur Modusauswahl, Identifikation und Benutzer-Ein-/Ausgabesignale
  - Viele anwendungsorientierte Mikroprozessoren (Mikrocontroller, DSPs) können in verschiedenen Betriebsmodi eingesetzt werden, die sich insbesondere in der Art des Systembusses und der Speicherausstattung (interner/externer Speicher) unterscheiden und durch den Entwickler eines Systems unveränderlich festgelegt werden müssen. Dazu werden bestimmte Eingangssignale, die üblicherweise nur während der Rücksetzphase (Reset) des Systems abgefragt werden, auf definierte Pegel gelegt.
  - Zur Erleichterung des Aufbaus von Mehrprozessor-Systemen besitzen Prozessoren z.T. eine Anzahl von Eingangsleitungen (typisch: 3), über die dem Prozessor durch äußere, feste Beschaltung eine eindeutige Identifikationsnummer (ID) zugewiesen werden muß. Diese Nummer dient zur Adressierung der Prozessoren im System und legt häufig auch die Reihenfolge bei Zugriffskonflikten auf den Systembus fest.
  - Viele Mikroprozessoren besitzen statische Ein-/Ausgangsleitungen, deren Zustand vom Benutzer durch spezielle Befehle oder durch den Zugriff auf ein vorgeschaltetes Register eingelesen oder geändert werden können. Diese als User Flags bezeichneten Signale können für die Steuerung einer einfachen Systemkomponente oder zur Ermittlung ihres Zustandes benutzt werden.

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):

- durch spezielle Befehle, wie z.B. TAS (Test and Set), der eine Speicherzelle liest, testet uns auf einen bestimmten Wert setzt,
- durch Angabe eines Präfixes LOCK... vor einem Schreib-/Lesebefehl.

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:

- Die Chip-Select-Logik besitzt für jeden Speicherbereich, der durch die Schnittstelle unterschieden werden soll, ein Register, in dem bei der Initialisierung des Prozessorsystems die Basisadresse des Speicherbereichs und seine Länge eingetragen werden. Die Längenangabe kann meist aus einer Liste von fest vorgegebenen Größen gewählt werden und wird im Register binär-codiert durch wenige Bits (z.B. 4) angegeben. Typische Bereichsgrößen liegen zwischen wenigen Kilobyte bis zu einigen Megabyte. Reale Bus-Controller unterstützen die Ansteuerung von bis zu einem Dutzend verschiedener Speicherbereiche.
  Die Chip-Select-Logik vergleicht (voll-parallel) jede Adresse auf dem internen Adreßbus mit allen in ihren Registern abgelegten Adressen und stellt so fest, in welchem der programmierten Speicherbereiche die angesprochene Speicherzelle liegt. Als Reaktion aktiviert sie - zeitgerecht - das dem gefundenen Bereich zugeordnete Speicherauswahl-Signal CSi (Chip Select). Bei einigen Prozessoren kann zusätzlich durch weitere Bits der Register festgelegt werden, ob das CS-Signal bei jedem Speicherzugriff oder aber nur bei Lese- bzw. Schreibzugriffen ausgegeben werden soll.
  Außerdem unterstützen DSPs häufig den Aufbau getrennter externer Speicher für Befehle und Daten (Harvard-Architektur) durch spezielle Auswahlsignale PMS und DMS (Program Memory Select, Data Memory Select). In den dadurch selektierten Adreßbereichen können wiederum verschiedene Speicherbereiche, wie oben beschrieben, untergebracht werden. Ein drittes Signal BMS (Boot Memory Select) spricht einen Speicherbereich an, in dem Festwertspeicher zur Initialisierung des Systems nach dem Rücksetzen (Reset) untergebracht werden müssen.
- Die Bus-Steuerung besitzt ebenfalls für jeden Speicherbereich ein Steuerregister, in dem für den Speicherbereich die individuellen Informationen über die Art und Arbeitsweise des Systembusses abgelegt werden. Sie wird von der Chip-Select-Logik bei jedem Buszugriff über den angewählten Speicherbereich informiert und erzeugt mit Hilfe des zugeordneten Steuerregisters die entsprechenden Steuersignale. Im Steuerregister findet man typischerweise Bitfelder zur Auswahl der in den vorausgehenden Abschnitten beschriebenen Bus-Betriebsarten:
  - Das mit BW (Bus Width) bezeichnete Bitfeld übernimmt die Steuerung der Datenbusbreite für die verschiedenen Speicherbereiche, wie sie im Abschnitt 2.7.5 beschrieben wurde. Durch die Möglichkeit des Bus-Controllers, die Busbreite per Programm festzulegen, kann auf die im Abschnitt behandelten Steuersignale BW0, BW1 zur Festlegung der Busbreiten verzichtet werden. Beim Zugriff auf 32-bit-Daten in den Speicherbereichen 1 und 2 nach Bild 2.7-21 findet - wegen der Verwendung einer eingeschränkten Datenbusbreite (8, 16 bit) - implizit eine Datenübertragung im Zeit-Multiplexverfahren statt, d.h. die Teile eines Datums werden sequentiell hintereinander in 4 bzw. 2 Buszyklen übertragen.
  - Das Bitfeld MUX (Multiplexing) erlaubt es, für die einzelnen Speicherbereiche zwischen einer Übertragung von Adressen und Daten über getrennte Busse (nicht "gemultiplext") bzw. einen gemeinsamen Adreß-/Datenbus ("gemultiplext") zu wählen. Im letztgenannten Fall kann häufig - in Ergänzung zum o.g. Bitfeld BW - die Busbreite des Multiplexbusses festgelegt werden. Üblich sind Muliplex-Busbreiten von 8, 16 oder 32 bit. Im Bild 2.7-21 wird Speicherbereich 1 im Multiplexbetrieb angesprochen, bei dem die Adressen über die niederwertigen 16 Signale des Adreß-/Datenbusses, die 8-bit-Daten über die niederwertigen 8 Bits übertragen. Die Bussteuerung erzeugt dazu das Signal ALE (Address Latch Enable), mit dem die ausgegebene Adresse in ein Zwischenspeicher-Register (Latch) übernommen wird.
  - Durch das Bitfeld WS (Wait States) kann für jeden Speicherbereich die Anzahl der Wartezyklen festgelegt werden, die bei jedem Zugriff auf diesen Bereich eingefügt werden müssen. Dadurch entfällt die Notwendigkeit, diese Wartezyklen vom jeweiligen Speichermodul über ein externes READY-Signal anfordern zu lassen. Typischerweise können 0 bis 15 Wartezyklen programmiert werden, so daß ohne zusätzlichen Hardware-Aufwand auch relativ langsame Speicherbausteine (oder Peripheriebausteine) eingesetzt werden können.
  - Das Bitfeld R/W (Read/Write) erlaubt den Einsatz von Speicherbausteinen verschiedener Hersteller, die sich u.a. durch die Art und Funktion ihrer Steuersignale unterscheiden. Hier kann z.B. berücksichtigt werden, ob der Speicherbaustein ein kombiniertes Schreib-/Lesesignal (R/W - Read/Write) und ein Daten-Strobesignal (DS) oder aber zwei getrennte Schreib- und Lesesignale (WR - Write, RD - Read) erwartet. Andererseits kann das Zeitverhalten bestimmter Signale oder zwischen mehreren Signalen festgelegt werden, z.B. zwischen dem ALE- und dem R/W-Signal.
  - Neben den beschriebenen Bitfeldern besitzen einige Prozessoren weitere Felder, über die andere Steuersignale der Systembus-Schnittstelle an die Bedürfnisse der unterschiedenen Speicherbereiche angepaßt werden können. Dazu zählen insbesondere Steuerbits, durch die festgelegt werden kann, ob ein Speicherbereich durch externe Speicherbausteine oder aber einen auf dem Prozessorchip integrierten Speicher realisiert werden soll. Auf diese Bits wollen wir hier nicht näher eingehen.

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