| 4.1 Systemsteuerbausteine |  | 4.3 Interrupt-Controller |

## 4.2 Busarbiter

### 4.2.1 Einleitung

In den vorhergehenden Kapiteln wurde bereits mehrfach erwähnt, daß in komplexen Mikrorechner-Systemen in der Regel mehrere Komponenten existieren, die selbständig auf den Systembus zugreifen können. Sie wurden zusammenfassend als Bus Master bezeichnet. Zu ihnen gehören z.B. Coprozessoren und DMA-Controller (s. Abschnitt 4.4). In vereinfachter Form zählt dazu aber auch die Auffrischlogik eines DRAM-Controllers, der sich mit dem µP den Zugriff zum Arbeitsspeicher teilt. (Weitere Controller werden Sie in diesem und dem folgenden Kapitel kennenlernen.)
Diese Bausteine fordern vom Prozessor über das HOLD-Signal den Zugriff zum Systembus an und bekommen über das HOLDA-Signal die Bestätigung, daß der Prozessor den Bus freigegeben, d.h. seine Ausgangstreiber hochohmig geschaltet hat. Während der Busfreigabe ist der Prozessor u.U. unbeschäftigt (idle), was nur dadurch vertretbar ist, daß die Busbelegung durch die anderen Bus Master einen relativ geringen Zeitanteil benötigt. Denn charakteristisch für diese Bausteine ist, daß sie stark eingeschränkte Prozessorfunktionen besitzen und nur zeitweise auf den Bus zugreifen müssen. Zwischen ihren Zugriffen liegen stets mehr oder weniger große Pausen, die dem µP die ungestörte Benutzung des Systembusses ermöglichen.
Anders ist die Lage, wenn in einem System mehrere Prozessoren arbeiten. Ein sehr großer Prozentsatz aller Prozessorzyklen bedingt den Zugriff zum Systembus. Deshalb bedeutet es eine wesentliche Verminderung der Prozessorleistung, wenn alle Prozessoren nur über den gemeinsamen Systembus Daten transportieren. Daher besitzt ein Prozessor in einem Multiprozessor-System (Multiprocessor System) in der Regel ein lokales Bussystem, über das er allein mit seinem "privaten" Arbeitsspeicher und seinen individuellen Schnittstellen Daten austauschen kann. (Genauer muß man in diesem Fall also von einem Multimikrorechner-System sprechen.) Die Kommunikation zwischen den verschiedenen Prozessoren des Systems geschieht über eine gemeinsame Komponente. Das können z.B. parallele oder serielle Schnittstellen, ein gemeinsamer Bus oder aber auch ein gemeinsamer Speicher sein. Die letztgenannte Möglichkeit ist sicher eine der am häufigsten realisierte. Sie ist im Bild 4.2-1 beispielsweise für acht Mikrorechner (µR ) skizziert.
Wie oben angedeutet, bestehen die Mikrocomputer (µR0,..,µR7) aus einem Mikroprozessor (µP), einem Speicher (SP) und ihren individuellen Schnittstellen (I/O). Sie werden durch Tristate-Treiber (TR) mit dem Systembus verbunden bzw. von ihm getrennt. In seinem lokalen System kann jeder Prozessor unabhängig und parallel zu den anderen Prozessoren arbeiten. Am Systembus ist der gemeinsame Speicher (Shared Memory) angeschlossen. Es können an ihm aber auch zusätzliche Schnittstellen hängen, die von allen Prozessoren gemeinsam betrieben werden.
In jedem µR existiert ein Baustein, der den Zugriff zum Systembus regelt, indem er die Tristate-Treiber zwischen seinem lokalen Bus und dem Systembus an- oder abschaltet. Dieser - in starker Vereinfachung - Bus Arbiter (BA "Schiedsrichter") genannte Steuerbaustein fordert bei Bedarf die ausschließliche Benutzung der gemeinsamen Systemkomponenten an. Diese Anforderung kann er z.B. an einen Prioritätsdecoder, der bei gleichzeitigen Zugriffswünschen für eine eindeutige Entscheidung sorgen muß. Dieser Decoder kann – wie im Bild 4.2-1 - als externe, zentrale Komponente vorgesehen oder aber dezentral in den Arbitern der Mikrorechner/Mikroprozessoren integriert sein. Bei modernen Prozessoren ist der Arbiter (inklusive Prioritätsdecoder) häufig auf dem Prozessorchip integriert und erlaubt die einfache Kopplung von wenigen Prozessoren (typisch bis zu 8).
In der Regel darf ein Prozessor den Buszugriff solange behalten, bis ein Prozessor mit höherer Priorität diesen verlangt. Nach Durchführung der Datenübertragung zieht der ausgewählte µR seine Busanforderung selbständig zurück. Daraufhin kann der Buszugriff an die nächste Komponente weitergereicht werden.

Bild 4.2-1: Aufbau eines Multimikrorechner-Systems

### 4.2.2 Verschiedene Systembus-Zuteilungsverfahren

Es existieren mehrere Verfahren, die Buszuteilung unter den anfordernden µRn vorzunehmen.

- Beim ersten, im Bild 4.2-1 zugrunde gelegten Verfahren fordert – jeder Arbiter über seinen Ausgang (Bus Request Output) den Zugriff von einem zentralen Prioritätsdecoder an. Dieser hat die Aufgabe, nach einem fest vorgegebenen Algorithmus unter mehreren, gleichzeitig den Bus anfordernden Prozessoren genau einen auszuwählen. (Im eigentlichen Sinne stellt er also den "Schiedsrichter" dar.) Von ihm wird jedem Arbiter über seinen Eingang (Bus Grant) mitgeteilt, ob und wann ihm der Zugriff gewährt wird. Ein Arbiter gibt den Systembus dadurch wieder frei, daß er sein -Signal deaktiviert, also auf H-Potential legt. Dieses Verfahren wird – wie bereits früher erwähnt - als unabhängige Anforderung (Independent Request) bezeichnet.
  Der Prioritätsdecoder kann auf unterschiedlichste Art realisiert werden. Bei der einfachsten Art steigt mit der Nummer der Anforderungsleitungen (0,.., 7) auch die Priorität der angeschlossenen Komponenten. Bei einer anderen Art rotiert die Reihenfolge der Komponentenprioritäten zyklisch und sorgt somit für eine faire Zuteilung des Busses unter den anfordernden Prozessoren.

  Selbsttestaufgabe 4.2-1: (–>Lösungsvorschlag)
  Zeichnen Sie das Schaltnetz eines Prioritätsdecoders mit vier Eingängen Ei und vier Ausgängen Ai (i=0,..,3). Ein weiterer Eingang (Chip Enable) erlaube es, alle Ausgänge des Decoders auf L-Potential zu zwingen. Der Ausgang Ai soll im aktivierten Zustand des Bausteins genau dann im '1'-Zustand sein, wenn Ei=1 ist und Ej=0 für alle j>i, j=0,..,3 sind. Geben Sie die logischen Funktionen für die Ai an. Erweitern Sie nun zwei Decoder nach a) zu einem einzigen Decoder mit 8 Eingängen und 8 Ausgängen.

- Das zweite dezentrale Verfahren, das im Bild 4.2-2 dargestellt ist, wurde bereits im Abschnitt 2.3 als Daisy-Chain-Verfahren beschrieben.

  Bild 4.2-2: Daisy Chain aus Busarbitern

  Hier werden alle Arbiter kettenförmig miteinander verbunden. Der Zuteilungseingang des ersten Arbiters (z.B. Arbiter 0) wird mit Masse verbunden. Diesem Arbiter wird dadurch die höchste Priorität zugewiesen. Bei allen anderen Arbitern wird der -Eingang mit dem -Ausgang des linken Nachbarn beschaltet. Liegt aktuell keine Busanforderung seines µPs vor, so gibt jeder die ihm eventuell vom linken Nachbarn angebotene Zugriffsberechtigung über den Ausgang an seinen rechten Nachbarn weiter. Dies ist im Bild symbolisch durch das Oder-Gatter dargestellt. Auf diese Weise besitzt von allen momentan den Zugriff anfordernden Komponenten jeweils die am weitesten links stehende die höchste Priorität.

Das Daisy-Chain-Verfahren braucht erheblich mehr Zeit zur Buszuteilung als das Independent-Request-Verfahren, da das Bestätigungssignal alle Arbiter durchlaufen muß und in jedem verzögert wird. Außerdem ist die Zuteilungszeit dadurch von der Lage des anfordernden Arbiters in der Kette abhängig.
Gemeinsam ist beiden beschriebenen Verfahren, daß jeder Arbiter des Systems über einen (bidirektionalen) Ein-/Ausgang an einer Steuerleitung hängt. Diese zeigt an, ob aktuell auf den Systembus zugegriffen wird oder nicht. Jeder ausgewählte Mikrorechner greift erst dann auf den Bus zu, wenn er durch ein H-Signal auf der -Leitung feststellt, daß dieser nicht mehr benutzt wird. Dadurch ist der zuletzt aktive Systembus-Master in jedem Fall in der Lage, einen augenblicklich durchgeführten Datentransfer korrekt zu Ende zu führen, auch wenn er danach durch einen anderen Arbiter vom Systembus verdrängt wird. Der "neue" zugriffsberechtigte Arbiter legt nun selbst die -Leitung auf L-Potential und zeigt dadurch allen anderen µRn die Belegung des Busses an. Somit ist gewährleistet, daß es nicht zu Zugriffskonflikten auf dem Systembus kommen kann.

### 4.2.3 Prinzipieller Aufbau eines Busarbiters

Im Bild 4.2-3 ist der Aufbau eines Busarbiters und seine Einbindung zwischen lokalem Bus und Systembus grob skizziert.
Der Arbiter besteht im wesentlichen aus zwei synchronen Schaltwerken, die unabhängig voneinander vom Takt des lokalen Busses bzw. des Systembusses getrieben werden. Der letztgenannte Takt hat die Aufgabe, im Gesamtsystem aus asynchron arbeitenden µCs für exakt definierte Zeitabläufe zu sorgen.
Für jeden µP erscheinen die Zugriffe auf den Systembus wie gewöhnliche Zugriffe auf seinen lokalen Bus, d.h. insbesondere, daß es keine speziellen Steuersignale zur Unterscheidung beider Zugriffsziele gibt. Durch einen Adreßdecoder wird anhand der vom µP ausgegebenen Adresse untersucht, wo das Ziel (bzw. die Quelle) des eingeleiteten Buszyklus liegt. Wird ein Ziel außerhalb des µRs erkannt, wird über das Anforderungssignal des Adreßdecoders die µP-Schnittstelle des Arbiters angesprochen.
Im Extremfall, bei dem ein Prozessor des Systems über keine lokalen Komponenten verfügt, muß der -Eingang seines Arbiters konstant auf L-Potential gelegt werden. Hier führt dann jeder Buszyklus zu einer Anforderung des Systembusses.
Die µP-Schnittstelle reicht die Anforderung an die Komponente des Arbiters weiter, deren Aufgabe die Erzeugung der Systembussteuersignale ist. Wie oben beschrieben, wird nun in Abhängigkeit vom gewählten Verfahren der Zugriff zum Systembus angefordert bzw. gewährt und zwar über die Signale:

- bzw. beim Independent-Request-Verfahren,
- bzw. beim Daisy-Chain-Verfahren.

Bild 4.2-3: Aufbau eines Busarbiters

Sobald der Arbiter über das Signal die Freigabe des Busses feststellt, werden durch das Signal EN (Enable) die Treiber zum lokalen Bus aktiviert. Diese sind für die Steuerleitungen und den Adreßbus unidirektional, für den Datenbus bidirektional ausgelegt. Die Richtungssteuerung für den Datenbus wird durch das Signal DIR (Direction) vorgenommen, das aus dem Lese-/Schreibsignal R/ in der µP-Schnittstelle abgeleitet wird.
Während der Wartezeit auf die Systembuszuteilung (, die u.U. relativ lange dauern kann,) und der Beendigung der Datenübertragung der Prozessor bzw. seine Systembus-Schnittstelle diee ausgegebene Adresse konstant auf dem lokalen Bus zur Verfügung. Dazu fügt er/sie gegebenenfalls fortlaufend Wartezyklen ein. Durch das -Signal der angesprochenen Systembuskomponente, das über einen der Steuerbus-Treiber übertragen wird, erfährt der Prozessor von der Ausführung des Datentransfers. Einfache Prozessoren können erst danach ihre Arbeit fortsetzen, komplexere können natürlich intern gespeicherte Befehle und Daten während der Wartezeit weiter verarbeiten. Obwohl also der Systembus einen eigenen Takt zur Synchronisation seiner spezifischen Steuersignale besitzt, wird der eigentliche Datentransfer von jedem Prozessor autonom durchgeführt, synchronisiert durch seinen eigenen Takt.

### 4.2.4 Weitere spezielle Arbiter-Funktionen

Zum Schluß dieses Abschnittes werden noch einige speziellere Möglichkeiten typischer Arbiter erklärt.

- Durch einen IOB-Eingang (I/O Bus) kann wahlweise zwischen der Behandlung von Zugriffen zum Speicher und zu den Ein-/Ausgabe-Schnittstellen unterschieden werden. Die Beschaltung des IOB-Eingangs muß dazu bereits bei der Systementwicklung festgelegt werden. Die zur Unterscheidung beider Zugriffsarten benötigte Information wird der µP-Schnittstelle des Arbiters über das Signal M/ (Memory/IO) zugeführt. Liegt IOB auf H-Potential, so werden beide Zugriffsarten gleich ausgeführt. Ist IOB auf L-Potential, so werden nur Speicherzugriffe zum Systembus weitergereicht. Zugriffe auf Ein-/Ausgabe-Schnittstellen werden jedoch stets lokal ausgeführt. Während dieser Zeit kann der Systembus deshalb von anderen Prozessoren benutzt werden.
- Der ANYRQ-Eingang (Any Request) ermöglicht es, die von der externen Prioritätsschaltung festgelegte Reihenfolge der µR für einzelne Arbiter außer Kraft zu setzen. Wird der Eingang (fest) mit H-Potential beschaltet, so gibt der Arbiter auch dann den Buszugriff frei, wenn ein Prozessor mit niedriger Priorität dies verlangt. Diese Anforderung kann von allen Arbitern mit niedrigerer Priorität über eine bidirektionale Steuerleitung (Common Bus Request) gestellt werden.
  Faktisch wird dadurch jedem Arbiter mit einem H-Potential am ANYRQ-Eingang die niedrigste Priorität zugewiesen. Legt man bei diesem Arbiter den -Eingang konstant auf L-Potential, so wird der Systembus automatisch nach jedem seiner Zugriffe auf den Systembus freigegeben.
- Über einen CRQEN-Anschluß (Common Request Enable) kann die eben beschriebene Aufhebung der Priorität für einzelne Arbiter zeitweise unwirksam gemacht werden, so daß programmgesteuert zwischen der niedrigsten und einer anderen Priorität umgeschaltet werden kann. Dazu muß der Eingang mit einer Steuerleitung verbunden werden, deren Zustand der Prozessor gezielt verändern kann. (Im Abschnitt 4.6 werden sie mit den Parallelports Bausteine kennenlernen, die solche Leitungen zur Verfügung stellen.)

| 4.1 Systemsteuerbausteine |  | 4.3 Interrupt-Controller |