Der Bus ist die gesuchte Komponente, um Binär-Wort-Quellen mit Binärwort-Senken zu verbinden. Er baut auf dem Begriff der "Leitung" auf:
Eine Leitung ist ein Medium, um Binärwörter räumlich zu übertragen. Sie hat spätestens
dann einen "Wert" (ein Binärwort), wenn eine Komponente angeschlossen ist, die die Leitung "treibt",
d.h. mit einem Binärwort beschickt (z.B. der Datenausgang eines Registers). Um Konflikte zu vermeiden, darf
zu jedem Zeitpunkt höchstens eine Komponente die Leitung treiben. Wird die Leitung nicht getrieben, kann ihr
Wert undefiniert sein oder einen in der Hardware festgelegten Standardwert annehmen (abhängig von der Hardware-Realisierung).
Beliebig viele Komponenten dürfen den Wert der Leitung gleichzeitig übernehmen (z.B. Register über
ihre Dateneingänge).
Abhängig
von der Ebene der Betrachtung kann man entweder davon ausgehen, daß die Leitung ohne Verzögerung arbeitet
oder aber, daß Werteänderungen eine typische Zeitdauer benötigen, um von einem Punkt der Leitung
zu einem anderen zu gelangen.
Eine Leitung der Breite n ist als n parallele Leitungen der Breite 1 realisiert, von denen jede genau ein Bit überträgt.
Übliche Hardwarerealisierungen von Leitungen der Breite 1 sind Kupfer- oder Golddrähte außerhalb
von integrierten Schaltungen und Metall- oder Polysiliziumbahnen innerhalb. Bits werden auf diesen Leitungen als
elektrische Spannungen kodiert. Deswegen wäre es fatal, falls mehr als eine Komponente eine Leitung triebe,
denn es würden Kurzschlüsse auftreten, die die Hardware zerstören könnten.
Der Bus als eine erweiterte Leitung ermöglicht es, die Anzahl der notwendigen Leitungen zu reduzieren.
Daß dieses notwendig ist, zeigt das folgende Beispiel: Vier Register sollen so
verbunden werden, daß jedes Register den Wert jedes anderen aufnehmen kann. Mit den üblichen
Leitungen an Datenein- und -ausgang (wie in 2.1.1 Register) müßte
die Verkabelung so aussehen:
Um n Register paarweise miteinander zu verbinden, sind bei dieser Art von "Verkabelung" offenbar (n+1)*n = (1 + 1 + (n-1))*n Leitungen notwendig: Jedes der n Register hat eine Leitung am Datenausgang. Jedes der n Register hat eine Leitung am Dateneingang; der Wert auf dieser Leitung stammt von je einem Multiplexer. Dieser Multiplexer wählt einen der Werte der n-1 anderen Register aus, hat also n-1 Eingangsleitungen.
Man beachte, daß bei Registern der Breite m jede Leitung wieder aus m parallelen Ein-Bit-Leitungen besteht! Insgesamt ist die "Verdrahtung" schon für dieses Beispiel relativ aufwendig und die Anzahl der benötigten Leitungen steigt quadratisch mit der Anzahl der zu verbindenden Komponenten an! Bei einem modernen Mikroprozessor mit 32 oder mehr Registern ist es dann wahrscheinlich gleichgültig, mit welcher Technik der Halbleiterfertigung man die Register und ihre Verbindungsleitungen erzeugt - immer würden die Leitungen mehr Platz einnehmen, als die Register, die "Straßen" mehr Platz belegen als die "Häuser"! Das ist, zumindestens solange die Chips keine Schönheitsrekorde aufstellen sollen, für sich genommen nicht so schrecklich wie es klingt. Jedoch bedeutet mehr Platz für Leitungen natürlich auch mehr Platz für die gesamte Schaltung, und die Größe einer integrierten Schaltung ist der mit Abstand wichtigste Kostenfaktor. Tatsächlich ist es nahezu gleichgültig, welche Strukturen auf einem Chip erzeugt werden, hauptsächlich ihre Fläche, also die Minimalgröße des einzelnen Chips, treibt die Kosten in die Höhe. Auch außerhalb der Chipgehäuse, also z.B. auf der Hauptplatine eines Computers, ist Flächenbedarf, aus naheliegenden Gründen, ein wichtiger Kostenfaktor, neben z.B. der Wahl der Bauteile oder der Anzahl der "Durchkontaktierungen" (Verbindungen von einer Platinenebene auf eine andere).
Einen Vorteil der gewählten Verdrahtung wollen wir nicht verschweigen: Jedes der vier Register kann pro Taktzyklus einen beliebigen der Werte der anderen Register aufnehmen; es kann also z.B. Register 1 (R1) den Wert von Register 4 aufnehmen, R2 den von R3, R3 den von R2 und R4 ebenfalls den von R2.
Wenn diese Funktionalität nicht notwendig ist, sondern nur ein neuer Wert pro Taktzyklus zur Verfügung
stehen soll, den allerdings beliebig viele der Register übernehmen können, kommt (endlich) der Bus ins
Spiel.
Das Beispiel mit den vier Registern sieht mit einem gemeinsamen Bus für die Daten als erster Ansatz so aus:
Der
Bus besteht aus einer (senkrechten) Hauptleitung, die den einen Wert transportiert, der zwischen Registern
übertragen werden soll, und "Stichleitungen", die die Binärwörter von den Datenausgängen
liefern bzw. zu den Dateneingängen bringen. Das Hauptmerkmal des Busses, und der Grund für seine "Sparsamkeit"
in Platzfragen, ist die gemeinsame Hauptleitung; es ist klar, daß so nur ein Wert zur Zeit übertragen
werden kann und verhindert werden muß, daß mehr als ein Register zu einem Zeitpunkt den Bus treibt.
Weil die Register immer ihren Wert aussenden, werden sie an den Ausgängen mit Tri-State-Gattern
versehen. Die (nicht gezeigte) Ansteuerungslogik für die Tri-State-Gatter muß dafür sorgen, daß
höchstens ein Register den Bus treibt; das verwendete Signal heißt häufig output enable (oe)
Die gezeigte Lösung kann aber noch weiter vereinfacht/verkleinert werden:
Daß der neue
Aufbau zunächst aufwendiger erscheint, liegt daran, daß wir nun die rechteckigen Symbole für 2-auf-1-Multiplexer
eingezeichnet haben, von deren Existenz wir schon bei der aufwendigen Verdrahtung zu Beginn
stillschweigend ausgegangen sind. Alle Register müssen nämlich über einen zusätzlichen write
enable-Eingang (we) verfügen, um sicherzustellen, daß diejenigen Register, die in einem
Taktzyklus keinen neuen Wert aufnehmen sollen, ihren alten Wert behalten (in dem sie durch den Multiplexer den
alten Wert erneut zur Speicherung übergeben bekommen).
Die behauptete Vereinfachung ergibt sich dadurch, daß „aktive" Register entweder den Bus treiben (und
ihren eigenen Wert erneut übernehmen) oder den Wert des Busses übernehmen, aber niemals die beiden Leitungen
zum Bus gleichzeitig benutzen. Damit können die beiden Stichleitungen, die jedes Register mit dem Bus verbinden,
zu einer zusammengefaßt werden.
Wir wissen nun, daß jedes Register zwei Steuereingänge besitzt, die sein Verhalten regeln:
write enable |
output enable |
Verhalten |
inaktiv | inaktiv | Register behält seinen Wert bei Aktivierung des Taktsignals; verändert nicht den Wert des Busses |
aktiv | inaktiv | Register übernimmt Wert des Busses bei Aktivierung des Taktsignals; verändert nicht den Wert des Busses |
beliebig | aktiv | Register behält seinen Wert bei Aktivierung des Taktsignals; treibt unabhängig vom Takt den Bus |
Um
Selbstverständliches nicht dauerhaft optisch mitzuschleppen, soll das Register-Symbol auf allen folgenden
Bildern und in allen folgenden applets für ein "erweitertes Register" inklusive Logik für
write enable und output enable stehen. Das Bild der vier durch einen Bus verbundenen Register reduziert
sich also zu dem links gezeigten.
Carsten Kelling 1996 (); letzte Änderung: 17. September 1997 |