6. Zahlendarstellungen und Rechnerarithmetik ... xn
CO
yn
xn-1
yn-1
Σ
Σ
zn
zn-1
y1
x1
...
y0
x0
Σ
Σ
z1
z0
CI
Negative Zahlen, Zweierkomplement Rationale Zahlen, Gleitkommazahlen Halbaddierer, Volladdierer Paralleladdierwerk, von-Neumann-Addierwerk Multiplikation: Barrel-Shifter, Iterative Realisierung Algorithmus von Booth Aufbau einer ALU
202
Darstellung ganzer Zahlen Die einfachste Möglichkeit zur Unterscheidung positiver und negativer Zahlen ist die Interpretation des ersten Bits als Vorzeichen: 0000 0001 0010 0011 0100 0101 0110 0111
= = = = = = = =
0 1 2 3 4 5 6 7
1000 1001 1010 1011 1100 1101 1110 1111
= = = = = = = =
-0 -1 -2 -3 -4 -5 -6 -7
Es gibt zwei verschiedene Darstellungen für 0. 203
Darstellung ganzer Zahlen 2 Entsprechend können mit 8 Bits, also mit einem Byte, ganze Zahlen von -127 bis 127 dargestellt werden: 0000 0000 0000 0001 0000 0010 0000 0011 0000 0100 0000 0101 0000 0110 0000 0111 0000 1000 0000 1001 0000 1010 0000 1011 0000 1100 0000 1101 0000 1110 0000 1111
= = = = = = = = = = = = = = = =
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0001 0000 0001 0001 ..
16 17
..
0111 1111 1000 0000 ..
= =
.. = =
..
1111 1010 1111 1011 1111 1100 1111 1101 1111 1110 1111 1111
-
127 0 ..
= = = = = =
- 122 - 123 - 124 - 125 - 126 - 127 204
Nachteile der Vorzeichendarstellung 1. Die Darstellung negativer Zahlen verändert sich bei Bereichserweiterungen: - 5 als 4-Bit Zahl = 1101 - 5 als 1-Byte Zahl = 1000 0101 - 5 als 2-Byte Zahl = 1000 0000 0000 0101
2. Die Addition einer positiven und einer negativen Zahl funktioniert anders als üblich: Wie kommt das -5 1000 0101 + 12 + 0000 1100 zustande ? -----7
-----------------+ 0 000 0111
3. Null hat zwei verschiedene Darstellungen: 1000 0000 = 0 0000 0000 = 0 205
Einerkomplementdarstellung In der Einerkomplementdarstellung negiert man Zahlen durch bitweises Komplementieren. 0000 0001 0010 0011 0100 0101 0110 0111
= = = = = = = =
0 1 2 3 4 5 6 7
1000 1001 1010 1011 1100 1101 1110 1111
= = = = = = = =
-7 -6 -5 -4 -3 -2 -1 -0
Das erste Bit gibt das Vorzeichen an. Es gibt zwei Darstellungen für Null. 206
Einerkomplement (Definition) Die Bitfolge zn
zn-1
zn-2
...
z1 z0
repräsentiert die Binärzahl - zn * (2n - 1) + zn-1 * 2n-1 + zn-2 * 2n-2 + . . . + z1 * 21 + z0 Eigenschaften: • Symmetrischer Zahlenbereich: [-(2n-1) .. (2n-1)] • Null hat zwei Darstellungen: 0...0 und 1...1 • Negieren durch bitweises Komplementieren • Bereichserweiterung durch Auffüllen mit dem Vorzeichenbit • Addition mit Standardaddierwerk möglich, aber Vorsicht: • Überlauf liegt nur dann vor, wenn an+bn- carryn ∉{0,1} • End-around-carry: carryn zum Ergebnis dazuaddieren! 207
Zweierkomplementdarstellung In der Zweierkomplementdarstellung durchläuft man zunächst die positiven Zahlen, dann die negativen Zahlen in umgekehrter Reihenfolge 0000 0001 0010 0011 0100 0101 0110 0111
= = = = = = = =
0 1 2 3 4 5 6 7
1000 1001 1010 1011 1100 1101 1110 1111
= = = = = = = =
-8 -7 -6 -5 -4 -3 -2 -1
Auch in der Zweierkomplementdarstellung gibt die erste Ziffer das Vorzeichen an. 208
Zweierkomplement am Zahlenkreis 0000
1111 -1
1110
0
0001 1
-2 1101
0010 2
-3
-4
1100
1011
Beachte: Die Zahlen sind modulo 16 in natürlicher Reihenfolge .
4 5
-5
1010
0011
3
6
-6 -7
-8
1001
0100 0101
0110
7 0111
1000
209
Zweierkomplement (Definition) Die Bitfolge zn
zn-1
zn-2
...
z1 z0
repräsentiert die Binärzahl - zn * 2n + zn-1 * 2n-1 + zn-2 * 2n-2 + . . . + z1 * 21 + z0 Eigenschaften: • Asymmetrischer Zahlenbereich: [-2n .. (2n-1)] • Null hat eindeutige Darstellung 0...0. • Negieren durch bitweises Komplementieren und Addition von Eins • Bereichserweiterung durch Auffüllen mit dem Vorzeichenbit • Addition mit Standardaddierwerk möglich, aber Vorsicht: • Überlauf liegt nur dann vor, wenn an+bn- carryn ∉{0,1} 210
Zweierkomplement für n=3
Für n = 3 ergibt sich:
1000 = - 8
1100 = - 4
0000 = 0
0100 = 4
1001 = - 7
1101 = - 3
0001 = 1
0101 = 5
1010 = - 6
1110 = - 2
0010 = 2
0110 = 6
1011 = - 5
1111 = - 1
0011 = 3
0111 = 7
211
Zweierkomplement für n = 31 Für n = 31 ergibt sich: 1000 0000 0000 0000 0000 0000 0000 0000 = -231 = -2.147.483.648 1000 0000 0000 0000 0000 0000 0000 0001 = -2.147.483.647 ... 1111 1111 1111 1111 1111 1111 1111 1110 = -2 1111 1111 1111 1111 1111 1111 1111 1111 = -1 0000 0000 0000 0000 0000 0000 0000 0000 = 0 0000 0000 0000 0000 0000 0000 0000 0001 = 1 0000 0000 0000 0000 0000 0000 0000 0010 = 2 ... 0111 1111 1111 1111 1111 1111 1111 1110 = 2.147.483.646 0111 1111 1111 1111 1111 1111 1111 1111 = 2.147.483.647
212
Negation in Zweierkomplementdarstellung Addiert man zu einer Zahl ihre Komplementärzahl, so erhält man die Zahl 111 ... 1111 111 .... 1111
= - 2n + 2n-1 + ... + 21 + 1 = - 2n + ( 2n - 1) = -1
Eine Zahl plus ihr Komplement ergibt also die Darstellung von -1. Daher negiert man eine Zahl, indem man zu ihrer Komplementärzahl 1 addiert. 213
Grundrechenarten bei Zweierkomplementzahlen Addition +
-5 6
1
Negation 5
in Zweierkomplementdarstellung : in Zweierkomplementdarstellung :
1011 + 0110 0001
Wie gewohnt, aber Vorsicht bei Bereichsüberschreitung
0101
Komplementiere alle Bits, dann addiere 1 1010
-5
in Zweierkomplementdarstellung :
1011
Subtraktion negiere zweiten Operanden, dann addiere 214
Addition von Zweierkomplementzahlen Zifferndarstellung
Zahlenwert
- un * 2n + + ( - vn * 2n
un un-1
...
u1 u 0
+ vn vn-1
...
v1 v0
------------------------------------------------------= wn wn-1 . . . w1 w0 ? n-1 un-1 * 2 + . . . + u1 * 21 + u0 + vn-1 * 2n-1 + . . . + v1 * 21 + v0)
normale Addition
= (- un - vn ) * 2n + un-1 * 2n-1 + . . . + u1 * 21 + u0 + vn-1 * 2n-1 + . . . + v1 * 21 + v0 = - un * 2n - vn * 2n + ( cin * 2n + wn-1 * 2n-1 + = - (un + vn - cin ) * 2n + wn-1 * 2n-1 + = wn
...
...
+ w1 * 21 + w0 )
+ w1 * 21 + w0
Die Addition verläuft also wie bei natürlichen Zahlen. Solange keine Bereichsüberschreitung auftritt, also solange 0 Reserviere Bitfolge 00…0 für die Null • Neues Problem: Nun hat die 1 keine Darstellung mehr. => biased notation: Ausrichtung des Zahlenbereichs des Exponenten, so dass – 00…0 den kleinsten Exponenten, also -2m und – 11…1 den größten Exponenten, also 2m-1 repräsentiert. Es gilt: tatsächlicher Exponent = Exponentdarstellung – 2m Vorteile: – eindeutige übliche Darstellung der Null – normale Kleinerbeziehung auf Gleitkommazahlen 221
Halbaddierer Ein Halbaddierer addiert zwei Binärziffern. An den Eingängen liegen die Ziffern z1 und z2 . An dem Ausgang S liegt die letzte Stelle der Summe, an dem Ausgang C (für Carry) liegt der Übertrag (0 oder 1).
Schaltzeichen z1 z2
Σ/2 CO
S C
Schaltfunktion xx
yy
SS CC
00 00 11 11
00 11 00 11
00 11 11 00
00 00 00 11
Term S = x’ y + x y’ = x xor y C =xy 222
Realisierung des Halbaddierers Aus Ausden denBooleschen Booleschen Termen Termen SS == x’ y + und CC ==xxyy x’ y +xxy’ y’ und lässt lässt sich sichsofort sofort eine eineRealisierung Realisierungdes desHalbaddierers Halbaddierers gewinnen: gewinnen: mit einem XOR-Gatter wird die Schaltung einfacher : S x
x
y
y
S
C
C
223
Volladdierer Ein EinVolladdierer Volladdiereraddiert addiertzwei zweiZiffern Ziffernund undeine eineÜbertragstelle Übertragstelle(Ci (Ci==carry carry in). Am Ausgang S liegt die letzte Ziffer der Summe und am Ausgang in). Am Ausgang S liegt die letzte Ziffer der Summe und am AusgangCo Co (carry (carryout) out)der derÜbertrag. Übertrag. Ein Volladdierer läßt sich mit Hilfe von Halbaddierern konstruieren: x x
y
CO
y
Σ/2 Ci
Co
Co
Σ
Ci CO
CO Σ/2
S Ci = carry in Co = carry out S = Summe
S 224
Paralleladdierwerk Mit Miteiner einerKaskade Kaskadevon vonnnVolladdierern Volladdierernläßt läßtsich sichsomit somitein einAddierwerk Addierwerk für Binärzahlen mit n Stellen realisieren. für Binärzahlen mit n Stellen realisieren. Seien ... x und y = y ... y die zu addierenden Binärzahlen. Seien xx==xxn-1 n-1 ... x00 und y = yn-1 n-1 ... y00 die zu addierenden Binärzahlen.
xn
CO
yn
xn-1
x1
yn-1
Σ
Σ
zn
zn-1
...
y1
x0
y0
Σ
Σ
z1
z0
CI
Nachteil: Der i-te Addierer muß auf das Carry des (i-1)-ten Addierers warten. 225
Übertragsschnellbestimmung Beschleunigung des Addiernetzes durch zusätzliche Hardware zur schnellen Bestimmung des Übertrages (carry-lookahead): Σ4
Idee: Modularisierung, Einführung von weniger Schaltebenen
Bilde Bitgruppen der Größe g = 4 => 16 Bit-Addierer hat 4 Schaltebenen
Σ4
Σ4
Σ4
Σ 4 /2
0
Jedes Modul Σ4 hat 9 Eingänge und 5 Ausgänge. 226
Übertragsschnellschaltung (carry bypass, carry lookahead)
3-stufige Schaltung unter Verwendung mehrstelliger Gatter (Summe von Produkten aus Summen oder Produkten): Ci x0+y0 x0 y0 x1+y1 x1 y1 x2+y2 x2 y2 x3+y3 x3 y3
c0 227
Schaltkreis mit Volladdierern Mit einem zusätzlichen XOR-Glied pro Binärstelle kann man mit Volladdierern Zweierkomplementzahlen sowohl addieren als auch subtrahieren. Für Mode = 1 gelangt das bitweise Komplement von yn yn-1 ... y1 y0 an die Addierer und der 0-te Carry-Eingang erhält eine 1. Mode 0=+ 1=-
... xn
CO
yn
xn-1
yn-1
Σ
Σ
zn
zn-1
y1
x1
...
y0
x0
Σ
Σ
z1
z0
CI
228
Das von Neumann-Addierwerk getaktetes getaktetesParalleladdierwerk Paralleladdierwerkaus ausnnparallel parallelarbeitenden arbeitendenHalbaddierern Halbaddierern und undzwei zwein-Bit n-BitRegistern Registernaaund undbb Struktur des Addierwerks für n=4:
a3
a2
a1
a0
Σ/2
Σ/2
Σ/2
Σ/2
b3
b2
b1
b0
carry
Status 229
Arbeitsweise des Addierwerks • Die Addition von zwei n-Bit Zahlen erfordert maximal n Takte. • Zu Beginn enthalten die Register a und b die zu addierenden Zahlen. • Der i-te Halbaddierer erhält die Registerzellen ai und bi als Eingänge. • Der Summenausgang wird in die Registerzelle ai zurückgeschrieben. Der Übertragsausgang wird in die Registerzelle bi+1 geleitet. • Das Register a speichert demnach Zwischensummen und schließlich die Endsumme, während das Register b die vom Halbaddierer gebildeten Überträge speichert. • Summen und Überträge werden in die Register zurückgeschrieben, bis das Statusregister 0 enthält. 230
Multiplizieren Beispiel 5 x 6:
00101 00101
0
00101
00000 00101 00101 00000 00000
1
00101
1
00101
0
00101
0
+
000011110
= 30 Überlauf Ergebnis 231
Barrel Shifter - Multiplikationswerk x3
x2
x1
x0 y0
steht für
y1
0 Σ
Σ
Σ
Σ
0
y2 Σ
Σ
Σ
Σ
0
y3
z7
Σ
Σ
Σ
Σ
z6
z5
z4
z3
0
z2
z1
z0 232
Iterative Realisierung der Multiplikation doppelt langes Register
n Bits
Akkumulator
2n Bits
Multiplikator Y Rechtsshift
2n Bit-Addierer Kontrolle
Multiplikand X
2n Bits
doppelt langes Register
Linksshift
233
Ablaufdiagramm STOP
ja n Iterationen ?
START Initialisiere Akkumulatorregister mit 0 nein
Y0 = 1?
nein
ja Addiere Multiplikand und Akkumulator und schreibe Resultat in Akkumulator
Linksshift des Multiplikanden und Rechtsshift des Multiplikators
234
1. Optimierung Beobachtungen: • Die obere Hälfte des Multiplikandenregisters ist zu Beginn mit Nullen belegt. • Beim Linksshift werden Nullen nachgeschoben, so dass ich die letzten Ziffern des Produktes nicht mehr ändern. =>
Es genügen ein n Bit-Addierer sowie ein n Bit-Register für den Multiplikanden. Statt den Multiplikanden nach links zu schieben, kann man das Produkt im Akkumulator nach rechts schieben.
235
Modifiziertes Multiplizierwerk doppelt langes Register Rechtsshift
Akkumulator
n Bits
2n Bits
Multiplikator Y Rechtsshift
n BitAddierer
Kontrolle
Multiplikand n Bits 236
Modifiziertes Ablaufdiagramm STOP
START Initialisiere Akkumulatorregister mit 0
ja n Iterationen ?
nein
Y0 = 1?
nein
ja Addiere Multiplikand und linke Hälfte des Akkumulators und schreibe Resultat in linke Hälfte des Akkumulators
Rechtsshift des Akkumulators und Rechtsshift des Multiplikators 237
2. Optimierung Beobachtung: Die linke Hälfte des Akkumulators kann zur Speicherung des Multiplikators verwendet werden, da dieser in dem Maße nach rechts geschoben wird, wie sich das Produkt im Akkumulator nach rechts ausdehnt.
Rechtsshift
Akkumulator
Multiplikator
Kontrolle
n BitAddierer
Multiplikand
2n Bits
n Bits 238
Endgültiges Ablaufdiagramm START
STOP ja
Initialisiere Akkumulatorregister mit Multiplikator
n nein Iterationen ?
Akku_0 = 1?
nein
ja Addiere Multiplikand und linke Hälfte des Akkumulators und schreibe Resultat in linke Hälfte des Akkumulators
Rechtsshift des Akkumulatorregisters 239
Multiplikationsalgorithmus von Booth • Verwendung von Addition und Subtraktion • Einsparung von Additionen/Subtraktionen, wenn möglich • funktioniert auch für Zweierkomplementzahlen Idee: Multiplikation mit 2i ≅ Linksshift des Multiplikanden um i Bits und Addition Multiplikation mit (11...1)2 = 2j - 1 j Bits
≅ Linksshift des Multiplikanden um j Bits, Addition und anschließende Subtraktion Beispiel: Booth: Standard: 10101 * 11111 = 1010100000 10101 = 1010001011
10101 * 11111 = 101010000 + 10101000 + 1010100 + 101010 + 10101 = 1010001011
240
Multiplikationsalgorithmus von Booth 2 benachbarte Multiplikatorbits
Yi Yi-1
Situation
Aktion
00
Folge von Nullen
Shift des Produktregisters
01
Ende einer Folge von Einsen
Addition Multiplikand und Produktreg. + Shift
10
Beginn einer Folge von Einsen
Subtraktion ds Multiplikanden vom Produktreg. + Shift
11
Folge von Einsen
Shift des Produktregisters 241
Akkumulator / Multiplikator 0000 0000 1011 1111 0 - 0110 0000 1010 0000 1101 0000 0101 1111 1 1110 1000 0010 1111 1 1111 0100 0001 0111 1 1111 1010 0000 1011 1 1111 1101 0000 0101 1 1111 1110 1000 0010 1 +0110 0000 0101 1110 0010 1111 0100 0001 0 - 0110 0000 1100 1111 1110 0111 1010 0000 1
Aktion Subtraktion
Multiplikand 0110 0000
Shift (Vorzeichenbit nachschieben) Shift Shift Beispiel (BoothShift Algorithmus) Shift Shift Addition Analyse: 1 Addition & 2 Subtraktionen Shift statt 7 Additionen Subtraktion Einsparungen vor allem bei langen Shift Folgen von Einsen, im Mittel keine Verbesserung 242
Booth funktioniert für Zweierkomplementzahlen • Betrachte
n-1
Multiplikator a = decode2(an…a0) = - an2n + Σ ai2i und Multiplikand b i=0
• Booth betrachtet in jeder Iteration die Bits aiai-1 mit folgender Aktionstabelle: aiai-1
Aktion
00
-
01
Addiere b
10
Subtrahiere b
11
-
=> addiere immer (ai-1 - ai) * b Der Rechtsshift des Zwischenproduktes entspricht einer Multiplikation mit 2 pro Iteration. n
• Booth berechnet somit: Σ (ai-1 - ai) * b * 2i = … = a * b i=0
243
Iterative Realisierung der Division Akkumulator
2n Bits
Dividend (am Ende: Rest)
n Bits
Quotient Linksshift mit Nachschieben geeigneten Bits
2n Bit-Addierer/ Subtrahierer
Kontrolle
Pufferregister Divisor
0 ...............0 2n Bits
Rechtsshift
244
Ablaufdiagramm für die Division
START
Initialisiere Akkumulator mit Dividendem, obere Hälfte des Pufferregisters mit Divisor und untere Hälfte des Pufferregisters mit Null
STOP ja
n+1 nein Subtrahiere Pufferregister von Akkumulator Iterationen und schreibe Resultat in den Akkumulator ? nein
Akkumulator
ja
negativ?
Rechtsshift des Pufferregisters Linksshift des Quotientenregisters mit Nachschieben von Eins
Addiere Pufferregister und Akkumulator (-> ursprünglicher Wert im Akkumulator) Linksshift des Quotientenregisters mit Nachschieben von Null
245
Ein-Bit-ALU Eine Eine1-Bit-Alu 1-Bit-Aluist isteine eineSchaltung, Schaltung,die dieabhängig abhängigvon vonder derStellung Stellungvon von Schaltern die grundlegenden arithmetischen und logischen Schaltern die grundlegenden arithmetischen und logischen Operationen Operationendurchführen durchführenkann. kann.Durch Durchdie dieBerücksichtigung Berücksichtigungeines eines Carry-Bits kann sie mit anderen zu einer Mehr-Bit-Alu Carry-Bits kann sie mit anderen zu einer Mehr-Bit-Aluergänzt ergänztwerden. werden. S0
S1 Yi
Xi
M
Ci
SS0,,SS1 und M bestimmen die 0 1 und M bestimmen die Funktion, Funktion,die diedie dieALU ALU berechnet. berechnet. ••logische logischeFunktionen Funktionen::M=0 M=0 ••arithmetische arithmetischeFunktionen: Funktionen: M=1 M=1 •• Falls FallsM=1 M=1muß mußman mannoch noch unterscheiden zwischen unterscheiden zwischen CC0=0 und C =1. 0=0 und C00=1. Ci+1
Zi
246
Ein-Bit-ALU S0
S1 Yi
Xi
M
Ci
Für FürM=0 M=0ist istdie dieALUALUSchaltung Schaltungäquivalent äquivalent zur zurhier hiergezeichneten. gezeichneten. Für Für SS11== 1, 1,SS00 ==00 gilt gilt z.B. z.B. ZZi i==XXi i ⊕ ⊕ YYi i
Zi
Ci +1
247
Ein-Bit-ALU im arithmetischen Mode S0
S1 Yi
Xi
M
Ci
Für FürM=1 M=1ist istdie dieALU-im ALU-im arithmetischen arithmetischenModus. Modus. Für Für SS11== 1, 1,SS00 ==11 gilt gilt z.B. z.B. ZZi i ==YYi i −− XXi i
Ci +1
Zi
248
Eine vollständige 4-Bit ALU SS00,, SS11und undM Mbestimmen bestimmendie dieFunktion, Funktion,die diedie dieALU ALU berechnen berechnensoll. soll. Sie Siewerden werdenzu zujedem jedemGlied Glieddurchgezogen. durchgezogen.
Y3 X3
Overflow
Y2 X2
1-Bit ALU C4
Y1 X1
1-Bit ALU
Z3
1-Bit ALU C2
C3
Y0 X0
1-Bit ALU C1
Z1
Z2
C0
M S1 S0
Z0
249
Schematische Darstellung der ALU Die Alu führt die arithmetischen und logischen Berechnungen durch. Im Mode wird die Funktion ausgewählt, im X und Y-Register liegen die Argumente, im Z-Register liegt am Ende der Wert. Das Flag-Register zeigt besondere Bedingungen an, z.B. Overflow, Ergebnis negativ, Ergebnis 0, etc. Y-Register X-Register
Mode
ALU
Functionselect
Flag-Register
Z-Register 250