| Inhaltsverzeichnis | |||||
| Übersicht Kapitel 2 | |||||
| |||||
Einfache Mikroprozessoren, insbesondere Mikrocontroller, besitzen meist nur ein einziges Rechenwerk, das für die Ausführung aller arithmetischen und logischen Operationen zuständig ist. Im Abschnitt 2.1 wurde bereits darauf hingewiesen, daß moderne Hochleistungsprozessoren hingegen über eine ganze Anzahl von unabhängig arbeitenden Rechenwerken mit speziellen Aufgaben verfügen (auch Verarbeitungseinheiten genannt, Execution Units). Zum Teil sind häufig benutzte Rechenwerke sogar mehrfach vorhanden. Wir werden im weiteren Verlauf des Kurses unter dem Operationswerk eines Mikroprozessors die Zusammenfassung aller seiner Rechenwerke verstehen. Beispiele von Rechenwerken sind
Im Rahmen dieses Abschnitts werden wir einige der genannten Rechenwerke beschreiben.
2.4.1 Integer-Rechenwerk |
Im Bild 2.4-1 ist der Aufbau eines Rechenwerks für
ganze Zahlen (Integer-Rechenwerk, Integer Unit) und seine Anbindung an
die Prozessorkomponenten skizziert. Die Operanden, die vom Rechenwerk verknüpft
werden, werden aus dem Registersatz (s. Abschnitt 2.4.3)
geladen oder über den internen Prozessor-Datenbus aus dem Speicher geholt.
Das Steuerwerk liefert sämtliche Steuersignale zur Aktivierung der Rechenwerksregister
und zur Ausführung der gewünschten Operationen.
Das Rechenwerk besteht aus der arithmetisch/logischen Einheit (ALU), einigen
Hilfsregistern und dem Statusregister. Wie bereits mehrfach gesagt, deutet der
Name ALU bereits an, daß diese Einheit alle arithmetischen und logischen
Operationen im Prozessor ausführt. Das im Bild 2.4-1 benutzte Symbol zeigt,
daß sie dazu zwei Eingangsbusse und einen Ausgangsbus besitzt. Diese entsprechen
in ihrer Breite dem internen (Daten-)Bus und sind mit diesem verbunden. Daten
bzw. Operanden, die von der ALU (in einem Schritt) verarbeitet werden können,
sind bei Mikrocontrollern 4, 8, 16 oder 32 bit, bei universellen Mikroprozessoren
bei 32 oder 64 bit und bei DSPs 16, 24 oder 32 bit breit.
Vor die Eingänge der ALU sind Hilfsregister geschaltet, die der Zwischenspeicherung
der zu verknüpfenden Operanden dienen. Sie werden auch als Puffer(-Register)
oder temporäre Register (Temporary Registers, Latches) bezeichnet.
Die ALU selbst enthält keine Speicherschaltungen, so daß sie ein
reines Schaltnetz ist. Neben den Dateneingängen besitzt sie weitere Eingänge,
die teils mit den Steuersignalen des Steuerwerkes, teils von bestimmten Bits
des Statusregisters belegt sind. Das Ergebnis einer Operation wird über
den Ausgangsbus in eines der Register des Prozessors, über den externen
Datenbus zu den anderen Komponenten des Systems oder aber in eines der Hilfsregister
der ALU übertragen. Liegt aktuell kein Ergebnis an den ALU-Ausgängen
an, so werden diese vom Steuerwerk in den hochohmigen Zustand versetzt, so daß
der interne Datenbus von anderen Prozessorkomponenten benutzt werden kann. In
Abhängigkeit vom Ergebnis werden außerdem bestimmte Bits des Statusregisters
modifiziert. (Auf das Statusregister wird weiter unten ausführlich eingegangen.)
Eines der erwähnten Hilfsregister (AC/HR) spielt bei den meisten 8-bit-Prozessoren
(und vielen DSPs) eine herausragende Rolle. Es ist das einzige Register, in
dem Rechendaten von der ALU prozessorintern abgelegt werden können. Es
wird bei jeder arithmetischen oder logischen Operation angesprochen und enthält
stets das Ergebnis und, wenn mehr als ein Operand verarbeitet werden sollen,
auch einen der Eingabe-Operanden. Von der Eigenschaft, quasi die Ergebnisse
"aufzusammeln", trägt dieses Register den Namen Akkumulator
(Accumulator - AC).
Bild 2.4-1: Aufbau und Ansteuerung des Rechenwerkes
Einige 8-bit-Prozessoren besitzen zwei Akkumulatoren im Rechenwerk, unter denen durch einen besonderen Zusatz im Befehl einer ausgewählt werden kann. Prozessoren, die mit Akkumulatoren im Rechenwerk arbeiten, werden auch als Akkumulator-Maschinen bezeichnet. Bei modernen 16/32-bit-Prozessoren findet man in der Regel keine ausgewiesenen Akkumulatoren mehr. Ihre Funktion wird von allen oder speziellen Registern des Registersatzes übernommen. Diese speziellen Register werden Datenregister genannt. Häufig sind alle Datenregister auf gleiche Weise in einem Befehl ansprechbar. Der Name "Akkumulator" wird in diesem Fall nur dann für ein Datenregister benutzt, wenn spezielle Befehle ausschließlich auf dieses Register wirken.
Exkurs 2.4-1: Aufbau und Zeitverhalten des Rechenwerks |
|
Bild 2.4-2 zeigt, daß der Akkumulator aus dem eigentlichen Akkumulatorregister AC als Vorspeicherregister und einem Hilfsregister HR aufgebaut ist. Prinzipiell kann der Akkumulator also aus Master-Slave-Flipflops oder aber aus zwei getrennt getakteten Registern aufgebaut werden.
Bild 2.4-2: Aufbau des Rechenwerks und des Akkumulators Dieses kann nun mit der positiven Flanke von T über B1 in den Akkumulator AC übernommen werden. Man sieht hier, daß die Eingabe-Information auf dem Bus B4 für die gesamte Rechenzeit der ALU und die Übernahmezeit des Akkumulators stabil vorliegt.
Bild 2.4-3: Zeitverhalten des Rechenwerkes Aus dieser Beschreibung wird der Grund für den Einsatz des Hilfsregisters deutlich: Die ALU stellt als Schaltnetz das Ergebnis einer Rechenoperation nach der Durchlaufzeit der Signale durch ihre logischen Gatter an den Ausgängen zur Verfügung. Bis zu diesem Zeitpunkt findet man an den ALU-Ausgängen aber auch unvorhersehbare Zustandsübergänge. Soll nun der Akkumulator das Ergebnis der Operation übernehmen, so könnte es ohne Hilfsregister passieren, daß während seiner (endlich langen) Übernahmezeit die ALU bereits den neuen Akkumulatorzustand verarbeitet. Folglich könnte dann ein geänderter Ausgangszustand der ALU am Akkumulator anliegen und endgültig in diesen übernommen werden. Man spricht in diesem Fall von einem kritischen Wettlauf der Signale (Critical Race). Hersteller von Halbleiterschaltungen verlangen daher, daß die Eingangssignale eines Registers oder Speichers wenigstens für eine bestimmte Zeit nach dem Übernahmetakt noch gültig sind. Diese Zeit ist im Bild 2.4-3 mit thold (Haltezeit) bezeichnet. An den Signalen auf Bus B3 sieht man, daß ohne das zusätzliche Hilfsregister diese Forderung nicht erfüllt ist. Es sei hier nur erwähnt, daß es eine große Vielzahl von Varianten für den Aufbau eines Rechenwerks gibt, auf die wir hier nicht eingehen wollen. |
Das Statusregister (Zustandsregister, Condition Code Register - CCR)
besteht aus einzelnen, logisch unabhängigen Bits, die nur aus Gründen
der einfacheren Adressierung zu einem Register verkettet werden. Diese Bits
werden häufig auch als Marken oder Flags ("Flaggen") bezeichnet.
Die Flags werden aus den Operanden und dem Ergebnis einer Operation abgeleitet
und reflektieren damit den "Zustand" des Rechenwerkes nach dieser
Operation. Sie werden aber nicht nur durch die Ausführung von arithmetischen
oder logischen Operationen der ALU verändert, sondern häufig auch
durch andere Befehle, bei denen der logische Zusammenhang zwischen der Operation
und den Flags nicht zu erkennen ist. Zur Vermeidung von unerwünschten Nebeneffekten
muß deshalb der Maschinenprogrammierer stets die Angaben des Herstellers
darüber beachten, welche Flags bei einer Operation beeinflußt werden.
Je nach dem momentanen Wert der Flags kann der Ablauf des augenblicklich ausgeführten
Befehls geändert werden, was sich dann natürlich auch auf den Ablauf
des Maschinenprogramms auswirken kann. Dazu dienen z.B. die Befehle zur bedingten
Programmverzweigung. Diese Befehle werten häufig nicht nur ein einzelnes
Flag aus, sondern auch bestimmte logische Verknüpfungen mehrerer Flags.
Um die Anzahl der benötigten Meldeleitungen vom Statusregister zum Steuerwerk
klein zu halten, werden die Bits des Statusregisters über einen Multiplexer
selektiv zum Steuerwerk durchgeschaltet. Er wird durch Signale des Steuerwerks
gesteuert und gewöhnlich mit Bedingungsmultiplexer oder Testmultiplexer
bezeichnet (vgl. Selbsttestaufgabe 2.2-1.)
Das Statusregister kann, wie jedes andere Register des Prozessors auch, in einem
Programm gelesen, ausgewertet und verändert werden. Bei der Abarbeitung
von Unterprogrammaufrufen oder Programmunterbrechungen kann es somit in den
Arbeitsspeicher gerettet werden und bewahrt dadurch den Prozessorzustand bis
zur Wiederaufnahme des unterbrochenen Programms.
Zur Erleichterung der Adressierung werden übrigens bei einfachen Prozessoren
häufig die Bits des Statusregisters und des Steuerregisters (s.
Abschnitt 2.2) in einem einzigen Register zusammengefaßt. Für
dieses Register wird dann häufig unpräziserweise ebenfalls der Ausdruck
Statusregister benutzt. Bild 2.4-4 zeigt die typischerweise
im Statusregister vorhandenen Flags. Sehr häufig sind einige Bits des Statusregisters
nicht belegt (frei) oder für spätere Erweiterungen des Herstellers
reserviert (res).

Bild 2.4-4: Typische Flags eines Statusregisters
| CF | Das Übertragsbit(Carry Flag) zeigt bei der Addition an, ob ein Übertrag (Carry) aus dem höchstwertigen Bit auftritt, bei der Subtraktion, ob dort ein Übertrag (Borrow) aus höherwertigen Teiloperanden benötigt wird. Die Berechnung von Summen und Differenzen mit einer Wortbreite, die ein Vielfaches der ALU-Breite ausmacht, muß durch die ALU sequentiell in gleichartigen Teiloperationen durchgeführt werden. Dabei wird das Übertragsbit einer Teiloperation als Eingangsinformation für die folgende Teiloperation herangezogen. Darüber hinaus besitzt das Übertragsbit besondere Bedeutung bei der bitweisen Verschiebung von Operanden, auf die am Ende dieses Abschnittes eingegangen wird. |
| AF | Das Hilfs-Übertragsbit(Auxiliary Carry Flag, auch Half-Carry Flag genannt,) zeigt einen Übertrag vom Bit 3 ins Bit 4 des Ergebnisses an. (Seine Gewinnung entspricht der des Übertragsbits für 4-bit-Operanden.) Es wird nur bei Prozessoren benötigt, deren ALU keine BCD-Arithmetik (Binary Coded Decimal) beherrscht. Dort dient es zusammen mit dem Übertragsbit zur Umwandlung eines dualen Ergebnisses in eine BCD-Zahl (vgl. Selbsttestaufgabe 2.4-1, 1., 4.). |
| ZF | Das Nullbit (Zero Flag) zeigt an, ob das Ergebnis der letzten Operation gleich 0 war. Dabei kann es sich um das Laden eines Operanden in ein Register, um eine arithmetische oder logische Operation oder das Dekrementieren eines (Index-)Registers handeln. Die letztgenannte Möglichkeit wird besonders bei der Programmierung von Schleifen benutzt. |
| SF | Das Vorzeichenbit (Sign Flag, Negative Flag - N) zeigt an, daß das Ergebnis negativ ist, also sein höchstwertiges Bit (Most Significant Bit - MSB) den Wert 1 hat. Ganz allgemein spiegelt dieses Flag das höchstwertige Bit eines Operanden wider. |
| OF | Das Überlaufbit (Overflow Flag, auch durch OV bzw. V abgekürzt) zeigt eine Bereichsüberschreitung im Zweierkomplement an. Bei einer Breite des Ergebnisses von n bit wird dieses Bit also gesetzt, wenn das Ergebnis kleiner als -2n-1 oder größer als 2n-1-1 ist. |
| EF | Das Even Flag zeigt an, ob das Ergebnis eine gerade Zahl ist. |
| PF | Das Paritätsbit (Parity Flag) signalisiert, ob das Ergebnis eine ungerade Parität, d.h. eine ungerade Anzahl von '1'-Bits hat. |
Die Flags werden aus den Operanden, dem Ergebnis einschließlich eines
aufgetretenen Übertrags und einigen Signalen des Steuerwerkes durch ein
Schaltnetz bestimmt. Damit befaßt sich die folgende Selbsttestaufgabe.
| Selbsttestaufgabe S2.4-1: (–> Lösungsvorschlag) |
|---|
|
Betrachtet werde eine 8-bit-ALU, die im wesentlichen aus einem Parallel-Addierer/Subtrahierer besteht. Durch ein Steuersignal AS werde angezeigt, ob die augenblicklich ausgeführte Operation eine Addition (AS=0) oder eine Subtraktion (AS=1) zweier Operanden im Zweierkomplement ist. (Die Operanden seien mit A=A7...A0 und B=B7...B0, das Ergebnis mit F=F7...F0 bezeichnet.)
|
In Tabelle 2.4-1 sind die Operationen aufgeführt, die eine Integer-ALU - ein Rechenwerk, das alle arithmetischen Operationen nur auf ganzzahligen Operanden anwendet - im Minimalfall ausführen kann.
Es fällt auf, daß dieser (minimale) Operationsvorrat nicht wesentlich
über die vier Grundrechenarten +, -, ×, / hinausgeht. Viele
der 8-bit-Prozessoren beherrschen nicht einmal die Multiplikation und die Division,
so daß diese wie alle anderen "höheren" mathematischen
Operationen durch einen speziellen Baustein, einen sog. Arithmetik-(Co-)Prozessor,
oder zeitaufwendiger durch ein Programm in vielen Schritten sequentiell berechnet
werden müssen. Im letzten Fall spricht man von einer Emulation in Software.
| Operation | Funktion |
| Arithmetische Operationen | |
| Addieren ohne/mit Übertrag | F := A+B; F := A+B+CF |
| Subtrahieren ohne/mit Übertrag | F := A-B; F := A-B-CF |
| Inkrementieren | F := A+1 |
| Dekrementieren | F := A-1 |
| Multiplizieren (ohne/mit Vorzeichen) | F := A×B |
| Dividieren (ohne/mit Vorzeichen) | F := A/B |
| Komplementieren (im Zweierkomplement) | F := ¬A+1 |
| Logische bitweise Verknüpfungen | |
| Negation | F := ¬A |
| Und | F := A^B |
| Oder | F := AvB |
| Antivalenz | F := A<|>B |
| Schiebe- und Rotationsoperationen | |
| Linksverschieben | F := 2×A modulo 2n |
| Rechtsverschieben | F := [A/2] |
| Linksrotieren ohne Übertragsbit | F := 2×A + An-1 mod 2n |
| Linksrotieren durchs Übertragsbit | F := 2×A + CF mod 2n |
| Rechtsrotieren ohne Übertragsbit | F := [A/2] + A0×2n-1 |
| Rechtsrotieren durchs Übertragsbit | F := [A/2] + CF×2n-1 |
| Transport-Operation | |
| Transferieren | F := A ; F := B |
| F := Konstante | |
| Bezeichnungen: A, B Operanden; F Ergebnis; CF Übertrag; n Länge von A (in bit); ^, v , <|>, ¬ : UND, ODER, Antivalenz, Inversion; ':=' Zuweisung; [ ] ganzzahliger Teil |
|
Beispiel
Zwei 16-bit-Operanden| A = AH,AL = (A15...A8),(A7...A0) und |
| B = BH,BL = (B15...B8),(B7...B0) , |
die jeweils zwei Bytes im Speicher belegen, sollen durch eine 8-bit-ALU mit dem Akkumulator AC addiert (bzw. subtrahiert) werden. Nach der Addition/Subtraktion der niederwertigen Bytes enthält das Übertragsbit den Übertrag, der in die Berechnung des höherwertigen Ergebnisbytes eingeht.
| Schritt | Addition | Subtraktion | Bemerkung |
| 1. | CF:=0 | Rücksetzen des Übertragsbits | |
| 2. | AC:=AL | Laden des L-Bytes von A | |
| 3. | AC:=AC+BL+CF | AC:=AC-BL-CF | Operation mit dem L-Byte von B und CF, |
| 4. | AL:=AC | Abspeichern nach AL | |
| 5. | AC:=AH | Laden des H-Bytes von A | |
| 6. | AC:=AC+BH+CF | AC:=AC-BH-CF | Operation mit dem H-Byte von B und CF |
| 7. | AH:=AC | Abspeichern nach AH | |
Auch die Division kann häufig wahlweise mit vorzeichenlosen Zahlen oder vorzeichenbehafteten Zahlen im Zweierkomplement ausgeführt werden.
| Beispiel | Es seien | A := 01101100 , |
| B := 11101001 . | ||
| Dann folgt: | F :=Ø A = 10010011 , | F := AÙB = 01101000 , |
| F := AÚB = 11101101 , | F := A¹B= 10000101 . |

Bild 2.4-5: Darstellung der Schiebe-Operationen
Neben ihrer logischen Bedeutung besitzen die Schiebeoperationen auch eine arithmetische: Bekanntlich bedeutet eine Verschiebung einer vorzeichenlosen Dualzahl um ein Bit nach links eine Multiplikation mit 2, eine Verschiebung nach rechts eine Division durch 2. Im Bild 2.4-5b wird der Operand als vorzeichenbehaftet angesehen. Um bei der Schiebeoperation das Vorzeichen zu erhalten, wird das höchstwertige Bit in sich selbst zurückgeführt. Man spricht in diesem Fall von einem arithmetischen Rechts-Schieben (Shift Arithmetic Right).
| Selbsttestaufgabe S2.4-2: (–> Lösungsvorschlag) |
|---|
| Es seien A:=10101101 , CF:=0. Geben Sie für alle Schiebe- und Rotations-Operationen das Ergebnis an. |

Bild 2.4-6: Darstellung der Rotations-Operationen
Bei den Operationen Addition oder Subtraktion von ganzen Zahlen tritt in den folgenden Fällen ein Überlauf (Overflow, s.a. das Flag OF in Abschnitt 2.4.1.3 ) auf, d.h. der Zahlenbereich wird auf der einen Seite verlassen und auf der anderen Seite wieder betreten:
Dieses eben beschriebene zyklische Durchschreiten (Wrap-around) führt bei allgemeinen arithmetischen Rechnungen zu einer Überlauf-Ausnahmesituation (Overflow Trap) und muß durch ein geeignetes Behandlungsprogramm bereinigt werden. Bei Anwendungen der digitalen Signalverarbeitung oder im Multimediabereich kann ein Überlauf oft nicht toleriert werden, da er zur Ausgabe eines falschen (z.B. invertierten) Signals oder falscher Werte (z.B. für graphische Anwendungen) führt. Andererseits darf diese Behandlung aus Zeitgründen oft nicht durch Software durchgeführt werden, sondern sie muß in Hardware implementiert sein.
Dazu bieten die entsprechenden Rechenwerke von DSPs und modernen universellen Prozessoren die Möglichkeit der Sättigung (Saturation): Die Ergebnisse werden auf den größten bzw. kleinsten Wert des darstellbaren Zahlenbereichs abgeschnitten, je nachdem, ob der Zahlenbereich nach oben oder unten überschritten wurde. Im o.a. 1. Fall führt das zu der Zahl $FF..FF, im 2. Fall zum Ergebnis $00..00. Der 3. Fall ergibt die korrigierte Summe $7F..FF und der 4. Fall $80..00.
DSPs besitzen häufig ein bestimmtes Bit im Steuerregister, durch das die
Arbeitsweise des Rechenwerks ohne bzw. mit Sättigung aufgabengerecht festgelegt
werden kann. Multimedia-Rechenwerke bieten meist für jede der Operationen
Addition und Subtraktion zwei getrennte Maschinenbefehle für die Ausführung
der Operation ohne oder mit Sättigung der Ergebnisse (vgl.
Abschnitt 3.2).
2.4.2 Der Barrel Shifter |
Bei einfachen Mikroprozessoren kann das Rechenwerk einen Operanden in jedem
Taktzyklus des Prozessors um höchstens eine Bitposition nach links oder
rechts schieben bzw. rotieren. Dies bedeutet, daß das Verschieben/Rotieren
um mehrere Positionen sehr zeitaufwendig durch eine Schleife realisiert werden
muß. Daher besitzen die Rechenwerke von komplexeren Prozessoren die Fähigkeit,
einen Operanden in einem einzigen Taktzyklus um eine beliebige Anzahl von Bitpositionen
zu verschieben/rotieren, die nur durch die Länge des Operanden beschränkt
wird. Diese Operationen werden durch eine Teilkomponente des Rechenwerks ausgeführt,
die als Barrel Shifter (oder Barrel Rotator) bezeichnet
wird. Zur Erhöhung der Fähigkeit, mehrere Operationen parallel auszuführen
zu können, ist der Barrel Shifter bei modernen Mikroprozessoren, insbesondere
den DSPs, z.T. sogar als autonom arbeitendes Rechenwerk realisiert.
Die Grundschaltungen zur Realisierung eines Barrel Shifters bilden Multiplexer,
die prinzipiell jede Eingabeleitung mit jeder Ausgabeleitung verbinden können.
Daraus wird bereits der immense Aufwand an Chipfläche für die benötigten
Schaltgatter und ihre Verbindungsleitungen deutlich. Im folgenden Exkurs wird
beispielhaft ein spezieller Barrel Shifter behandelt, der in einem Taktzyklus
um 0 bis 3 Positionen verschieben kann .
| Selbsttestaufgabe S2.4-3: (–> Lösungsvorschlag) | ||||||
|---|---|---|---|---|---|---|
|
Exkurs 2.4-2: Realisierung eines Barrel Shifters | ||||||||||||||||||||
| Die Skalierung erlaubt es, einen Operanden wahlweise mit den Werten 1, 2, 4 oder 8 zu multiplizieren. Bekanntlich bedeutet eine Multiplikation einer positiven ganzen Zahl mit dem Faktor 2 gerade eine Verschiebung um eine Bitposition nach links, also zu höheren Bitwertigkeiten hin, und dem Auffüllen der untersten Bitstelle mit einer '0'. Daher kann man die Skalierungskomponente durch einen Barrel Shifter als Schaltnetz realisieren, das alle Bits wahlweise um 0, 1, 2 oder 3 Stellen nach links verschiebt. Im Bild 2.4-7 ist eine mögliche Realisierung dieses Barrel Shifters dargestellt. Der Grundbaustein ist ein 4-bit-Multiplexer. Sein Schaltsymbol ist im oberen Teil von Bild 2.4-7 angegeben. Die beiden Steuerleitungen S0 und S1 der Multiplexer werden für alle Bitpositionen miteinander verbunden.
Bild 2.4-7: Realisierung eines Barrel Shifters Ist D=Dn...D0 die Eingabeinformation der Skalierungskomponente, so ist die Ausgabeinformation 3 bit länger, d.h. man kann sie als A=An+3An+2 An+1 An...A0 schreiben.
|
2.4.3 Multiplizier-Akkumulier-Rechenwerk |
Später werden wir zeigen, daß viele Algorithmen der digitalen Signalverarbeitung die Berechnung von Funktionen der Form
d.h. Summen von Produkten (Sums of Products), auszuführen haben. Die Grundoperation, die der obigen Formel zugrunde liegt, ist eine Multiplikation mit anschließender Addition zur jeweils vorher ermittelten Summe. Eine Addition dieser Art wird auch als Akkumulation bezeichnet und die zusammengesetzte Operation als Multiplizier-Akkumulier-Operation (Multiply-Accumulate - MAC). Die Berechnung der beschriebenen Funktionen wird seit einigen Jahren nicht mehr nur von Digitalen Signalprozessoren (DSPs), sondern - insbesondere im Zusammenhang mit Multimedia-Anwendungen - auch von universellen Hochleistungsprozessoren verlangt. DSPs haben Rechenwerke, die speziell auf die schnelle Berechnung der MAC-Operation ausgelegt sind und diese in einem einzigen Prozessorzyklus schaffen. Universelle Prozessoren besitzen dazu oft - neben den anderen Rechenwerken - eine spezielle MAC-Einheit. Im folgenden Bild 2.4-8 ist der prinzipielle Aufbau eines Multiplizier-Akkumulier-Rechenwerks skizziert.

Bild 2.4-8: Aufbau eines Multiplizier-Akkumulier-Rechenwerks
Zwei n-bit-Operanden werden durch einen schnellen Parallelmultiplizierer zu einem 2n-bit-Produkt verknüpft. Das Ergebnis wird einem Eingang der 2n-bit-ALU zugeführt. Auf den zweiten Eingang der ALU wird der Akkumulator zurückgekoppelt, der alle Ergebnisse der ALU auffängt. (Die Rolle des Akkumulators wird bei vielen Prozessoren von einem beliebigen Datenregister wahrgenommen.) Durch die gestrichelte Linie, die um den Multiplizierer herumführt, soll gezeigt werden, daß die ALU auch Operanden ohne vorausgehende Multiplikation verarbeiten kann. Häufig kann außerdem der Akkumulatorinhalt vor der Verknüpfung in der ALU durch einen Barrel Shifter geführt und dort um eine beliebige Anzahl von Bitpositionen verschoben werden. Dies dient z.B. zur Skalierung des Operanden oder zur De-/Normalisierung (s. Abschnitt 2.4.3).
2.4.4 Gleitpunkt-Rechenwerk |
Gerade in technisch-wissenschaftlichen Anwendungen treten häufig Zahlenwerte auf, zwischen denen viele Größenordnungen liegen. Hier ist es zweckmäßig, sich neben den eigentlichen wichtigen ("signifikanten") Ziffern auch die individuelle Größenordnung einer Zahl ("Maßstabsfaktor") zu merken. Dies führt zur Gleitpunkt-Zahlendarstellung. Wir beschränken uns im folgenden auf die Darstellung der Gleitpunktzahlen im Binärsystem. Dann läßt sich eine Gleitpunktzahl Z folgendermaßen darstellen:
Sehr viele mathematische Funktionen mit Gleitpunktzahlen bedingen die Ausführung unterschiedlicher Operationen auf Exponent und Mantisse der Zahlen. So wird ja z.B. die Multiplikation zweier Zahlen durch die Addition der Exponenten und die Multiplikation der Mantissen durchgeführt:
| Z1×Z2 | = [(-1)VZ1 × 2E1 × M1] × [(-1)VZ2 × 2E2 × M2] |
| = (-1)VZ1+VZ2 × 2E1+E2 × (M1 × M2) . |
Die Unterteilung der Gleitpunkt-Datenformate in Exponent und Mantisse spiegelt sich häufig auch im Aufbau eines Gleitpunkt-Rechenwerks (Floating-Point Unit - FPU) wider, wie es in der folgenden Fallstudie beschrieben wird. Zur Beschleunigung der Berechnung mathematischer Funktionen besitzt das Rechenwerk zwei ALUs, die ihre Operationen auf den Exponenten und den Mantissen soweit wie möglich parallel durchführen. Einfachere, ältere Gleitpunkt-Einheiten besaßen nur eine ALU, die die Berechnungen von Exponenten und Mantissen sequentiell hintereinander - und damit sehr zeitaufwendig - durchführen mußte.
Noch bis zur Mitte der 80er Jahre besaßen Mikroprozessoren keine integrierte FPUs. Diese mußten als eigenständige Bausteine mit dem m
P über den Systembus verbunden werden und wurden als Arithmetik-(Co-)Prozessoren bezeichnet.
Fallstudie 2.4-1: Gleitpunkt-Rechenwerk der Intel-Prozessoren |
|
Bild 2.4-9 zeigt den prinzipiellen Aufbau des Gleitpunkt-Rechenwerks, wie es in den Arithmetik-Prozessoren 80287, 80387 und der integrierten FPU des 80486 eingesetzt wurde. Das Rechenwerk unterstützt das IEEE-785-Format für Gleitpunktzahlen, das im Abschnitt 3.1 beschrieben wird.
Bild 2.4-9: Operationswerk einer Arithmetik-Einheit mit zwei ALUs Das Rechenwerk besitzt einen eigenen Satz von Register für die Ablage
von Gleitpunktzahlen, die die Unterteilung der Operanden in Vorzeichen/Exponent
bzw. Mantisse widerspiegeln: 64-bit-Mantisse, 15-bit-Exponent und Vorzeichen
der Mantisse. Zusätzlich werden in einem Festwertspeicher, dem Konstanten-ROM,
wichtige und häufig benötigte Konstanten als Gleitpunktzahlen
abgespeichert und so deren zeitaufwendige Neuberechnung vermieden. Aus
dem Registersatz werden über zwei getrennte Busse (mit 16 bzw. 64
Leitungen) die Operandenteile den Hilfsregistern (HR) der ALUs zugeführt.
Diese ALUs führen dann die geforderten Operationen aus. Die Mantissen-ALU
berechnet ihre Ergebnisse intern mit einer größeren Genauigkeit
(z.B. 68 bit). Die Ergebnisse werden erst vor ihrer Übertragung in
den Registersatz auf das vorgegebene Format gerundet. Beide ALUs tauschen
über besondere Steuerleitungen Informationen aus. Bei der oben angesprochenen
Normalisierung von Gleitpunktzahlen muß die ALU des Exponenten z.B.
wissen, um wie viele Bitpositionen die Mantisse verschoben wurde. Zur
ALU für die Mantissen-Operationen gehört auch eine Rundungslogik,
die das Ergebnis auf das verlangte Format abschneidet. Außerdem
ist ihr ein Barrel Shifter zugeordnet. Da dieser sehr viel Chipfläche
benötigt, wurde er nur einmal im Operationswerk realisiert und mußte
so auch für eine eventuelle Verschiebung des Exponenten mitbenutzt
werden. Dies wird durch die Schaltlogik ermöglicht, die die Bussysteme
beider ALUs verbindet. Die Kopplung beider Bussysteme wird insbesondere
auch für Befehle benötigt, die den Exponenten oder die Mantisse
einer Gleitpunktzahl selbst in eine Gleitpunktzahl umwandeln (vgl.
Abschnitt 3.2).
Durch spezielle Bits im Steuerregister kann für jedes der letztgenannten Ereignisse individuell festgelegt werden, ob es zu einem Trap führen soll oder nicht. Darüber hinaus kann dort die Genauigkeit der von der FPU ausgegebenen Ergebnisse nach dem IEEE-785-Format bestimmt werden. Zusätzlich kann eine von vier verschiedenen Rundungsmöglichkeiten selektiert werden, die im IEEE-754-Standard festgelegt sind (vgl. Abschnitt 3.2). |
2.4.5 Multimedia-Rechenwerke |
Die Breite der Operanden, die von Integer-Rechenwerken verarbeitet (und im Registersatz zwischengespeichert) werden, ist im Laufe der Jahre von 4 bit auf bis zu 64 bit gewachsen (vgl. Bild 1.3-3). Andererseits wird der Einsatz moderner Mikrorechner durch das verstärkte Vordringen von Multimedia-Anwendungen geprägt, die die Darstellung von Graphiken, die Wiedergabe von Video- und Audio-Aufnahmen und die Kommunikation über lokale oder Weitverkehrsnetze integrieren. Diese Anwendungen sind häufig durch relativ "kurze" Daten gekennzeichnet: Im Integer-Bereich kommt man beispielsweise mit 8 bit oder 16 bit, im Gleitpunkt-Bereich mit 32-bit-Zahlen aus. Einerseits bedeutet die Ablage dieser Daten in "langen" Registern mit einer Länge von (32,) 64 oder 80 bit eine "Verschwendung" von (Register-)Speicherplatz. Andererseits bedingt ihre Verarbeitung eine geringe Ausnutzung der Rechenkapazität einer Standard-ALU oder -Gleitpunkt-Einheit. Darüber hinaus verlangt die realistische Bearbeitung und Ausgabe dieser Daten eine hohe Verarbeitungsgeschwindigkeit von diesen Rechenwerken, da sie wiederholt die gleichen Befehle nacheinander auf diese Daten anwenden müssen. Aus diesen Gründen wurden viele moderne, universelle Mikroprozessoren mit besonderen Rechenwerken zur Manipulation von Graphik-, Video- oder Audio-Daten ausgestattet.
Die wohl bekannteste Realisierung eines Rechenwerks für Integer-Daten
ist die MMX-Einheit (MultiMedia
Extension) der Pentium-Prozessoren von Intel und ihrer x86-kompatiblen Konkurrenten
anderer Hersteller. Dieses Rechenwerk verwendet eine ALU, die die Skalierbarkeit
der Operandenbreite von 8, 16, 32 oder 64 bit, das "Packen" von kurzen
Operanden zu einem 64-bit-Datum und die parallele Ausführung gleicher Operationen
auf mehreren solcher Operanden unterstützt. Eine der Hauptanwendungen dieser
Rechenwerke ist das Füllen von Flächen (Rendering) im Bereich
der graphischen Datenverarbeitung. Die gepackten Daten werden in speziellen
64-bit-Registern abgelegt, die im Abschnitt 6.9 beschrieben
werden.
Im Bild 2.4-10 sind die verschiedenen Betriebsarten der
MMX-Einheit skizziert. Wichtig ist, daß die Umschaltung zwischen diesen
Betriebsarten von Befehl zu Befehl funktioniert, also nicht für eine mehr
oder weniger lange Befehlsfolge geschehen muß.

Bild 2.4-10: Die Betriebsarten der MMX-Einheit

Bild 2.4-11: Gepackte Multiplikation mit doppelt-genauem Ergebnis
An dieser Stelle sei noch einmal darauf hingewiesen, daß MMX-Rechenwerke meist spezielle Befehle für die Addition und Subtraktion von gepackten Daten ohne bzw. mit Sättigung der Ergebnisse zur Verfügung stellen (vgl. Abschnitt 2.4.1.4). Im Bild 2.4-12 sind Beispiele für die parallele Addition zweier gepackter Operanden aus 16-bit-Wörtern dargestellt, im Bild 2.4-12a) wird mit Wrap-around gearbeitet, im Bild 2.4-12b) mit Sättigung von vorzeichenlosen Zahlen, im Bild 2.4-12c) mit Sättigung von vorzeichenbehafteten Zahlen.

Bild 2.4-12: Beispiele für die Addition mit Wrap-around und Sättigung
Im Bild 2.4-13 ist eine parallele Vergleichsoperation auf "größer" mit gepackten Operanden aus 16-bit-Wörtern dargestellt. Die Operation setzt vorzeichenlose ganze Zahlen voraus. Das Ergebnis "wahr" (true) wird hier durch den Wert $F..F, das Ergebnis "falsch" (false) durch den Wert $0..0 angegeben. Diese Wahl der Ergebniswerte ermöglicht es, durch Maskierung der Operanden mit Hilfe des Ergebnisses und der logischen Verknüpfungen die jeweils größeren oder kleineren Eingabewerte zu selektieren.

Bild 2.4-13: Parallele Vergleichsoperation mit 16-bit-Wörtern
Neben den beschriebenen Operationen existieren noch einige weitere, die das Zusammensetzen von kurzen zu längeren Operanden (Packen - Packing) und das Zerlegen von langen Operanden in kürzere gestatten. Im Abschnitt 3.2 werden wir MMX-Befehlssätze ausführlicher beschreiben.
Bei modernen x86-kompatiblen Prozessoren, wie dem Pentium III von
Intel oder dem K6/K7 von AMD, wurde die Verarbeitungsweise der eben beschriebenen
skalierbaren Integer-Rechenwerke auf die Behandlung von Gleitpunktzahlen übertragen.
Dazu wurden sie mit Gleitpunkt-Arithmetikeinheiten ausgestattet, die - analog
zur Darstellung in den Bildern 2.4-12b) und c) - zwei
oder vier gepackte Gleitpunktzahlen gleichzeitig verarbeiten können. Diese
Zahlen liegen im 32-bit-Format des IEEE-754-Standards vor und können in
speziellen Registern der Rechenwerke abgelegt werden. Die AMD-Prozessoren packen
zwei Gleitpunktzahlen und benutzen zur Ablage die gleichen acht 64-bit-Register
wie die MMX-Einheiten (s. Abschnitt 2.6). Der Pentium
III hingegen besitzt acht getrennte 128-bit-Register, in die er jeweils vier
Gleitpunktzahlen packen kann. Von AMD werden die beschriebenen Rechenwerke und
ihre Operationen mit dem Begriff 3Dnow! bezeichnet und dadurch schon
ein Hinweis auf eine der Hauptanwendungen gegeben, die im Bereich der 3-dimensionalen
Graphik-Darstellungen liegen. Intel hingegen verwendet die Bezeichnung ISSE,
was für Internet Streaming SIMD Extension steht und auf die Bedeutung
der Technik für die Verarbeitung von kontinuierlich fließenden Daten
im Internet hinweist. Weitere Anwendungen kommen aus dem weiten Bereich der
digitalen Signalverarbeitung.
Der Vorrat an Operationen, die ein Multimedia-Gleitpunkt-Rechenwerk mit gepackten
Daten ausführen kann, umfaßt die arithmetischen Operationen Addition,
Subtraktion, Multiplikation und Division sowie die bitweise ausgeführten
logischen Verknüpfungen Und, Oder, Antivalenz, Inversion und manchmal auch
die negierte Und-Verknüpgung (NAND). Dazu kommt meist die Operation Quadratwurzel-Ziehen
(Square Root). Z.T. wird für die Division und das Wurzelziehen nur
der erste Iterationsschritt durchgeführt. Je nach gewünschter Genauigkeit
müssen die weiteren Stellen danach in einer Schleife berechnet werden.
Die Operationen "Mittelwertbildung", "Ermittlung des Maximums" bzw. "Ermittlung
des Minimums", die Vergleiche auf '=0', '> 0', '< 0' werden jeweils elementeweise auf einem Paar von gepackten Daten ausgeführt.
Daneben wird eine Reihe von Operationen unterstützt, die dem Transport
der Daten, dem Packen bzw. Entpacken von Daten, dem Vertauschen der gepackten
Zahlen sowie der Konversion der Daten zwischen den Darstellungen als Integer-
oder Gleitpunkt-Zahlen dienen. Auf die Befehle eines Multimedia-Gleitpunkt-Rechenwerks
werden wir im Abschnitt 3.2 näher eingehen.
| Inhaltsverzeichnis | |||||
| Übersicht Kapitel 2 | |||||
| |||||