Skripte DHBW

Vorlesungsskripte aus dem DHBW-Studium

Addierwerke in der arithmetisch logischen Einheit (ALU)

aus der Vorlesung Rechnertechnik vom 21.03.2018


(x1,x2,x3)=(0,1,0)x1x2x3(x_1, x_2, x_3) = (0, 1, 0) \quad \overline{x_1} \wedge x_2 \wedge \overline{x_3}
(x1,x2,x3)=(1,0,1)x1x2x3f(x1,x2,x3)=x1x2x3x1x2x3(x_1, x_2, x_3) = (1,0,1)\quad x_1 \wedge \overline{x_2} \wedge x_3 \Rightarrow f_{(x_1, x_2, x_3)} = \overline{x_1} \wedge x_2 \wedge \overline{x_3} \wedge x_1 \wedge \overline{x_2} \wedge x_3

Mit den Schaltsymbolen

ergibt sich folgende Schaltung:
Halbaddiererschaltung
Abbildung 4: Halbaddiererschaltung

Konstruktion der arithmetischen logischen Einheit (ALU)

Die arithmetisch logische Einheit besteht in der Regel aus Hardware zur Berechnung der vier Grundrechenarten und Logik-Hardware zur bitweisen Verknüpfung von Operanden.

Die Arithmetik der Gleitpunktzahlen ist auf die Arithmetik der Festpunktzahlen zurückführbar; z.B. indem die Exponenten so angepasst werden, dass die Mantissen ganzzahlig werden.

Es verwundert zunächst, dass mit einem Rechner, der nur Hardware für die Grundrechenarten besitzt, auch komplizierte Funktionen wie z.B. Sinus, Cosinus oder Logarithmen berechnet werden können. Solche Funktionen werden mit Hilfe von numerischen Verfahren wie z.B. Potenzreihenentwicklungen oder Tschebyscheff-Approximationen auf die Grundrechenarten zurückgeführt und die Algorithmen in Software-Bibliotheken hinterlegt.

Addierwerke (Subtrahierwerke)

Die Addition von Dualzahlen verläuft analog der Addition der Dezimalzahlen mit Bildung eines Übertrags (Carry, CC) und eines Restes (RR).

xx 00 11 11 11
yy - 11
CC 11 11 11 00 \leftarrow
RR 11 00 00 00

Für die erste Stelle wird ein Schaltnetz mit den Eingängen XX und YY sowie den Ausgängen CC und RR konstruiert.

Die entsprechende Wahrheitstabelle sieht wie folgt aus:

XX YY CC RR
00 00 00 00
00 11 00 11
11 00 00 11
11 11 11 00

also C=xyC = x \wedge y und R=xyxyR = \overline{x} \wedge y \lor x \wedge \overline{y}.

Das zugehörige Schaltnetz ist ein Halbaddierer.
Halbaddierer Schaltbild
Abbildung 5: Schaltbild eines Halbaddierers

Für die zweite und folgenden Stellen konstruiere man ein Schaltnetz mit den Eingängen XX, YY und CnC_n sowie den Ausgängen RR und Cn+1C_{n + 1}.

Wahrheitstabelle für einen Volladdierer

XX YY CnC_n Cn+1C_{n + 1} RR
00 00 00 00 00
00 00 11 00 11
00 11 00 00 11
00 11 11 11 00
11 00 00 00 11
11 00 11 11 00
11 11 00 11 00
11 11 11 11 11

Entsprechendes Schaltnetz
Schaltnetz Volladdierer
Abbildung 6: Schaltnetz eines Volladdierers

Um aus Halb- und Volladdierern ein Addierwerk aufzubauen, müssen die Summanden und die Summe in Registern gespeichert werden. Register sind aus 1-Bit Speicher, sogenannte Flip-Flops, aufgebaut. Das einfachste Flip-Flop ist das RS-Flip-Flop mit einem Set-Eingang (S) und einem Reset-Eingang (R).

Wahrheitstabelle für ein RS-Flip-Flop

RR SS QQ Q\overline{Q}
00 00 QQ Q\overline{Q} stabile Speicherfunktion
00 11 11 00 set
11 00 00 11 reset
11 11 00 00 unzulässige Eingänge

Entsprechende Schaltung
Schaltung für einen RS-Flip-Flop
Abbildung 7: Schaltung für einen RS-Flip-Flop

Nun sollen Flip-Flops nicht zu jeder Zeit set- oder reset-Signale bearbeiten, sondern nur zu fest definierten Zeitpunkten. Zum Beispiel wird ein Operand, der auf den Leitungen des Datenbusses anliegt, zu einem bestimmten Zeitpunkt in ein Register übernommen.

Die Zeitpunkte, zu denen set- oder reset-Signalen bearbeitet werden, werden durch einen Taktgeber (Clock) bestimmt, welcher ein Taktsignal generiert.

Um set- und reset-Signale wirksam werden zu lassen, wenn das Taktsignal den Wert 11 hat, wird die Schaltung des RS-Flip-Flops wie folgt erweitert:

Sei xx ein allgemeines (Daten-) Signal:
Schaltnetz eines D-Flip-Flops
Abbildung 8: Schaltnetz eines D-Flip-Flops

anschaulich: Beispiel für den Signalverlauf von Clock, Flip-Flop-Eingang XX und Flip-Flop-Ausgang QQ:
Signalverlauf am D-Flip-Flop
Abbildung 9: Signalverlauf an einem D-Flip-Flop

Es kann nun ein Addierwerk aus Halb- und Volladdierern und zwei Registern aufgebaut werden.

Dieses Addierwerk arbeitet wie folgt: Zunächst werden die beiden Summanden in die Register XX und YY geladen. Für die Berechnung der lokalen Überträge C0C_0 bis CnC_n vergeht in jedem Addierer einer einzelnen Bit-Stelle eine gewisse Verzögerungszeit tvt_v. Die Summe der beiden Summanden steht erst nach der Zeit (n+1)tv(n + 1) \cdot t_v stabil an den Ausgängen R0R_0 bis Rn1R_{n - 1} an, da im pessimistischen Fall ein Übertrag durch alle Addierer hindurchgereicht werden muss. Da das Ergebnis nach einer Taktzeit von den Ausgängen R0R_0 bis Rn1R_{n - 1} in ein Register geladen wird, gilt für die Dauer eines Taktes
T>(n+1)tv, T > (n + 1) \cdot t_v,

da TT so groß sein muss, dass alle Verknüpfungen sicher durchgeführt werden. Die Additionszeit dieses Addierwerks ist somit unabhängig davon, wieviele Bitstellen der Summanden mit 11 belegt sind. Die Addition dauert für Zahlen der Länge n2\frac{n}{2} genau so lang wie für Zahlen der Länge nn.

Der von-Neumann-Addierer

Der von-Neumann-Additionsalgorithmus führt zu einem schnelleren Addierwerk, bei dem im Mittel weniger Durchschaltzeiten notwendig sind.

Der Algorithmus läuft wie folgt ab:

  1. Lade Summanden in XX- und YY-Register.
  2. Bilde komponentenweise die Summe aus XiX_i und YiY_i (Bitstellen Xi mit i=0,,n1X_i \ \text{mit} \ i = 0, \ldots, n - 1) und speichere das Ergebnis in XiX_i.
    Bilde komponentenweise die Überträge aus XiX_i und YiY_i und speichere diese in Yi+1Y_{i + 1}.
  3. Ist irgendeine Bitstelle YiY_i im Register YY ungleich 0 (0\neq 0), so fahre bei Punkt 2. fort.

Sind alle YiY_i gleich 0, so terminiert der Algorithmus und die Summe steht im XX-Register.

Beispiel:

0. Durchlauf X(0)X^{(0)} 001101010 \, 0 \, 1 \, 1 \, 0 \, 1 \, 0 \, 1
Y(0)Y^{(0)} 000110010 \, 0 \, 0 \, 1 \, 1 \, 0 \, 0 \, 1
1. Durchlauf X(1)X^{(1)} 001111000 \, 0 \, 1 \, 1 \, 1 \, 1 \, 0 \, 0
Y(1)Y^{(1)} 001000100 \, 0 \, 1 \, 0 \, 0 \, 0 \, 1 \, 0 \leftarrow
2. Durchlauf X(2)X^{(2)} 000011100 \, 0 \, 0 \, 0 \, 1 \, 1 \, 1 \, 0
Y(2)Y^{(2)} 010000000 \, 1 \, 0 \, 0 \, 0 \, 0 \, 0 \, 0 \leftarrow
3. Durchlauf X(3)X^{(3)} 010011100 \, 1 \, 0 \, 0 \, 1 \, 1 \, 1 \, 0
Y(3)Y^{(3)} 000000000 \, 0 \, 0 \, 0 \, 0 \, 0 \, 0 \, 0 \leftarrow

Fertig, weil alle Yi=0Y_i = 0.

Abschätzung der Additionszeit beim von-Neumann-Addierer

Im schlechtesten Fall sind zur Addition von zwei nn-stelligen Dualzahlen nn Durchläufe des Algorithmus erforderlich, da ein Übertrag mit jedem Durchlauf um mindestens eine Stelle im YY-Register “nach links” wandert und rechts eine 00 nachgezogen wird.

⚠️ Die mittlere Anzahl an Durchläufen ist jedoch wesentlich geringer. ⚠️

Dazu folgende Überlegung:
Zu Beginn der Addition sind im XX- und YY-Register im Mittel n2\frac{n}{2} Bitstellen mit 11 belegt.

Betrachte dazu n=2n = 2:
Anzahl möglicher Eingangszustände:

x1x_1 x0x_0
00 00
00 11
11 00
11 11

Gesamtzahl der Einsen: 44
Anzahl möglicher Zahlen: 22=42^2 = 4
somit: mittlere Anzahl der Einsen pro Zahl ist: 44=1=n2\frac{4}{4} = 1 = \frac{n}{2}.

n=4n = 4

x3x_3 x2x_2 x1x_1 x0x_0
00 00 00 00
00 00 00 11
00 00 11 00
00 00 11 11
00 11 00 00
00 11 00 11
00 11 11 00
00 11 11 11
11 00 00 00
11 00 00 11
11 00 11 00
11 00 11 11
11 11 00 00
11 11 00 11
11 11 11 00
11 11 11 11

bei n=42n=24=16n = 4 \rightarrow 2^n = 2^4 = 16 mögliche Zahlen
Gesamtzahl der Einsen: 3232
mittlere Anzahl der Einsen pro Zahl: 322n=3216=2\frac{32}{2^n} = \frac{32}{16} = 2

günstigster Fall:

X(0)X^{(0)} 01010101
Y(0)Y^{(0)} 10101010
X(1)X^{(1)} 11111111
Y(1)Y^{(1)} 00000000 \leftarrow

weniger günstiger Fall:

X(0)X^{(0)} 01010101
Y(0)Y^{(0)} 01000100
X(1)X^{(1)} 00110011
Y(1)Y^{(1)} 10001000 \leftarrow
X(2)X^{(2)} 10111011
Y(2)Y^{(2)} 00000000 \leftarrow

schlechtester Fall:

X(0)X^{(0)} 01010101
Y(0)Y^{(0)} 00110011
X(1)X^{(1)} 01100110
Y(1)Y^{(1)} 00100010 \leftarrow
X(2)X^{(2)} 01000100
Y(2)Y^{(2)} 01000100 \leftarrow
X(3)X^{(3)} 00000000
Y(3)Y^{(3)} 10001000 \leftarrow
X(4)X^{(4)} 10001000
Y(4)Y^{(4)} 00000000 \leftarrow

Aus den Tabellen erkennt man, dass sich die Anzahl der mit 11 belegten Bitstellen im YY-Register bei jedem Durchlauf im Mittel halbiert.

Frage: Wieviele Durchläufe werden bei nn-stelligen Dualzahlen im Mittel benötigt?