Paralleladdierer mit Übertragsvorausberechnung

4-Bit-Carry-Look-Ahead-Addierer mit Carry-In und Carry-Out

Der Paralleladdierer mit Übertragsvorausberechnung bzw. Carry-Look-Ahead-Addierer (kurz: CLA-Addierer) ist eine logische Schaltung zur Addition mehrstelliger Binärzahlen (siehe auch Addierwerk).

Der CLA-Addierer addiert zwei n-stellige Binärzahlen, verfügt also über 2·n Eingänge, sowie in der Regel über einen weiteren Übertragseingang. Da das Ergebnis einen etwaigen Übertrag enthalten kann, gibt es n+1 Ausgänge. Der Vorteil des CLA-Addierers ist, dass die Verzögerung der Schaltung nur logarithmisch zur Zahl seiner Eingänge ist, bei zugleich nur linearer Zahl an Logikgattern gemessen an der Zahl seiner Eingänge. Seine Komplexität beträgt in der Landau-Notation ausgedrückt also O ( log ( n ) ) {\displaystyle {\mathcal {O}}(\log(n))} für die Schaltungsverzögerung und O ( n ) {\displaystyle {\mathcal {O}}(n)} für die Schaltungsgröße. Der CLA-Addierer ist also ähnlich schnell wie ein Conditional-Sum-Addierer, dessen Verzögerung ebenfalls O ( log ( n ) ) {\displaystyle {\mathcal {O}}(\log(n))} beträgt, und braucht zugleich ähnlich einem Carry-Ripple-Addierer nur O ( n ) {\displaystyle {\mathcal {O}}(n)} wenige Bauteile. Conditional-Sum-Addierer brauchen im Vergleich mit dem CLA-Addierer jedoch O ( n log 2 ( 3 ) ) {\displaystyle {\mathcal {O}}(n^{\log _{2}(3)})} mehr Bauteile, Carry-Ripple-Addierer weisen eine exponentiell größere Verzögerung von O ( n ) {\displaystyle {\mathcal {O}}(n)} auf. Der CLA-Addierer ist dagegen asymptotisch schnell und günstig zugleich.

Idee

Ein Addierwerk kann einen Großteil seiner Berechnungen auch dann durchführen, wenn der eingehende Übertrag noch nicht vorliegt. Dazu werden die beiden Summanden zunächst ohne Berücksichtigung desselben addiert. Am Ergebnis kann dann direkt abgelesen werden, welche Wirkung der eingehende Übertrag auf den ausgehenden haben wird. Die Tabelle stellt den Zusammenhang am Beispiel eines 4-Bit Addierers dar.

Zusammenhang zwischen ein- und ausgehenden Überträgen eines 4-Bit Addierwerks
Summe ohne Berücksichtigung
des eingehenden Übertrags
eingehender ausgehender Bemerkung
Übertrag
00000 bis 01110 beliebig 0 Der eingehende Übertrag wird absorbiert.
01111 0 0 Der eingehende Übertrag wird unverändert propagiert.
1 1
10000 bis 11110 beliebig 1 Ein Übertrag wird immer generiert.

Jedes Addierwerk zeigt an einem speziellen Ausgang an, ob es den eingehenden Übertrag absorbieren, propagieren oder einen solchen generieren wird. Dieser spezielle Ausgang ersetzt den Übertragsausgang eines gewöhnlichen Addierwerks. Der tatsächliche Übertrag kann dann aus dieser Information und dem eingehenden Übertrag leicht berechnet werden. Der große Vorteil dieses speziellen Ausgangs ist, dass er mit wenigen Logikgattern hierarchisch zusammengefasst werden kann, ohne dass die Summe erneut berechnet oder der tatsächliche Übertrag bekannt sein muss, wie nachfolgende Tabelle zeigt.

Zusammenfassung zweier Addierwerke zu einem breiteren Addierwerk
höherwertiges
Addierwerk
niederwertiges
Addierwerk
zusammengefasstes
Addierwerk
absorbiert beliebig absorbiert
generiert beliebig generiert
propagiert absorbiert absorbiert
generiert generiert
propagiert propagiert

Funktionsweise

Der CLA-Addierer ist eine spezielle Anwendung einer Parallelen Präfix Berechnung PP n {\displaystyle \operatorname {PP} _{n}^{\circ }} welche sich durch eine Schaltung mit Kosten O ( n ) {\displaystyle {\mathcal {O}}(n)} und Verzögerung O ( log ( n ) ) {\displaystyle {\mathcal {O}}(\log(n))} implementieren lässt. Um die raffinierte Anwendung der Parallelen Präfix Berechnung leichter verständlich zu machen, wird zunächst ihre Anwendung am Beispiel eines schnellen Inkrementers dargelegt.

Schneller Inkrementer nach CLA-Art

Ein Inkrementer Inc n {\displaystyle \operatorname {Inc} _{n}} addiert zu einer n {\displaystyle n} -stelligen Binärzahl den Wert 1 {\displaystyle 1} und hat n {\displaystyle n} Eingänge sowie n {\displaystyle n} Ausgänge und einen weiteren Ausgang für einen etwaigen Übertrag beim höchsten Stellenwert.

Inc n : { 0 , 1 } n { 0 , 1 } n + 1 {\displaystyle \operatorname {Inc} _{n}\colon \{0,1\}^{n}\to \{0,1\}^{n+1}}
Inc n ( x n 1 x 0 ) = ( y n y 0 ) {\displaystyle \operatorname {Inc} _{n}(x_{n-1}\ldots x_{0})=(y_{n}\ldots y_{0})}

Ein Übertrag von Stelle i {\displaystyle i} zu i + 1 {\displaystyle i+1} tritt dabei nur dann auf, wenn alle x 0 = = x i = 1 {\displaystyle x_{0}=\ldots =x_{i}=1} sind, d. h. wenn die x 0 x i {\displaystyle x_{0}\ldots x_{i}} den Übertrag propagieren. Daher gilt beim Inkrementer für jedes Ergebnisbit y i + 1 = 1 {\displaystyle y_{i+1}=1} genau dann, wenn entweder x 0 x i {\displaystyle x_{0}\ldots x_{i}} propagieren oder x i + 1 = 1 {\displaystyle x_{i+1}=1} für 0 i < n {\displaystyle 0\leq i<n} .

Mittels einer Parallelen Präfix Berechnung PP n {\displaystyle \operatorname {PP} _{n}^{\wedge }} kann man für alle i {\displaystyle i} die Funktionen „ x 0 x i {\displaystyle x_{0}\ldots x_{i}} propagieren“ = x 0 x 1 x i {\displaystyle =x_{0}\wedge x_{1}\wedge \ldots \wedge x_{i}} zugleich berechnen, indem man ausnutzt, dass die logische UND Funktion {\displaystyle \wedge } eine assoziative zweistellige Verknüpfung auf den binären Zahlen ist.

Parallele Präfix Berechnung

Zu jeder assoziativen zweistelligen Verknüpfung : A × A A {\displaystyle {\circ }\colon A\times A\to A} auf einer Menge A {\displaystyle A} ist ihre n {\displaystyle n} -stellige Parallele Präfix Funktion PP n {\displaystyle \operatorname {PP} _{n}^{\circ }} wie folgt definiert:

PP n : A n A n {\displaystyle \operatorname {PP} _{n}^{\circ }\colon A^{n}\to A^{n}}
PP n ( x n 1 x 0 ) = ( y n 1 y 0 ) {\displaystyle \operatorname {PP} _{n}^{\circ }(x_{n-1}\ldots x_{0})=(y_{n-1}\ldots y_{0})} mit y i = x i x 0 {\displaystyle y_{i}=x_{i}\circ \ldots \circ x_{0}} für 0 i < n {\displaystyle 0\leq i<n}

Als Schaltung lässt sich PP 2 n {\displaystyle \operatorname {PP} _{2n}^{\circ }} rekursiv aus PP n {\displaystyle \operatorname {PP} _{n}^{\circ }} konstruieren:

PP 1 ( x 0 ) = ( y 0 ) = ( x 0 ) {\displaystyle \operatorname {PP} _{1}^{\circ }(x_{0})=(y_{0})=(x_{0})}

Für PP 2 n ( x 2 n 1 , , x 0 ) = ( y 2 n 1 , , y 0 ) {\displaystyle \operatorname {PP} _{2n}^{\circ }(x_{2n-1},\ldots ,x_{0})=(y_{2n-1},\ldots ,y_{0})} sei ( y n 1 , , y 0 ) = PP n ( x 2 n 1 x 2 n 2 , , x 1 x 0 ) {\displaystyle (y'_{n-1},\ldots ,y'_{0})=\operatorname {PP} _{n}^{\circ }(x_{2n-1}\circ x_{2n-2},\ldots ,x_{1}\circ x_{0})} dann gilt:

y 2 i + 1 = y i {\displaystyle y_{2i+1}=y'_{i}} für 0 i < n {\displaystyle 0\leq i<n}
y 2 i = y i 1 x 2 i {\displaystyle y_{2i}=y'_{i-1}\circ x_{2i}} für 0 < i < n {\displaystyle 0<i<n}
y 0 = x 0 {\displaystyle y_{0}=x_{0}}

Beispiel: für n = 2 {\displaystyle n=2} gilt folglich PP 2 ( x 1 , x 0 ) = ( y 1 , y 0 ) = ( x 1 x 0 , x 0 ) {\displaystyle \operatorname {PP} _{2}^{\circ }(x_{1},x_{0})=(y_{1},y_{0})=(x_{1}\circ x_{0},x_{0})}

CLA-Addierer

Seien a 0 a n 1 {\displaystyle a_{0}\ldots a_{n-1}} und b 0 b n 1 {\displaystyle b_{0}\ldots b_{n-1}} die Ziffern der beiden zu addierenden Zahlen und c 1 {\displaystyle c_{-1}} der Eingangsübertrag. Mit c i {\displaystyle c_{i}} bezeichnet man das Übertragsbit von Stelle i {\displaystyle i} zu Stelle i + 1 {\displaystyle i+1} . Dann gilt für das i {\displaystyle i} -te zu berechnende Summenbit s i = a i {\displaystyle s_{i}=a_{i}} {\displaystyle \oplus } b i c i 1 {\displaystyle b_{i}\oplus c_{i-1}} . Sofern alle Übertragsbits c i {\displaystyle c_{i}} bekannt sind, lassen sich die s i {\displaystyle s_{i}} parallel berechnen, mit konstanter Schaltungsverzögerung und linearen Bauteilkosten.

Um die c i {\displaystyle c_{i}} zu berechnen, reicht es nicht wie beim Inkrementer allein zu prüfen, ob der Eingangsübertrag propagiert wird. Denn ein Übertrag wird an der i {\displaystyle i} -ten Stelle propagiert, wenn entweder a i = 1 {\displaystyle a_{i}=1} oder b i = 1 {\displaystyle b_{i}=1} sind, weiterhin wird ein Übertrag generiert, wenn a i = b i = 1 {\displaystyle a_{i}=b_{i}=1} .

Man schreibt p i = p i ( a , b ) {\displaystyle p_{i}=p_{i}(a,b)} falls die i {\displaystyle i} -te Stelle einen Übertrag propagiert:

p i = a i b i {\displaystyle p_{i}=a_{i}\oplus b_{i}} für 0 i < n {\displaystyle 0\leq i<n}

Weiter schreibt man g i + 1 = g i + 1 ( a , b ) {\displaystyle g_{i+1}=g_{i+1}(a,b)} falls die i {\displaystyle i} -te Stelle einen Übertrag generiert:

g i = a i b i {\displaystyle g_{i}=a_{i}\wedge b_{i}} für 0 i < n {\displaystyle 0\leq i<n}

Sowohl Propagieren als auch Generieren lassen sich ohne Kenntnis der Überträge c j , j i {\displaystyle c_{j},j\leq i} berechnen!

Um alle Überträge c i {\displaystyle c_{i}} für 0 i < n {\displaystyle 0\leq i<n} zugleich effizient zu berechnen, definiert man eine assoziative Verknüpfung (Beweis Assoziativität durch Nachrechnen) : { 0 , 1 } 2 × { 0 , 1 } 2 { 0 , 1 } 2 {\displaystyle \circ \colon \{0,1\}^{2}\times \{0,1\}^{2}\to \{0,1\}^{2}} die man in einer parallelen Präfix-Berechnung einsetzen kann:

( g , p ) ( c , p ) = ( g p c , p p ) {\displaystyle (g',p')\circ (c,p)=(g'\vee p'\wedge c,p\wedge p')}

Die beiden Komponenten erklären sich wie folgt. Es ist der Übertrag c i = 1 {\displaystyle c_{i}=1} , wenn die i {\displaystyle i} -te Stelle generiert oder wenn die i {\displaystyle i} -te Stelle propagiert und die i 1 {\displaystyle i-1} -te Stelle einen Übertrag hat, also wenn g i p i c i 1 {\displaystyle g_{i}\vee p_{i}\wedge c_{i-1}} . Aufeinander folgende Stellen i , i 1 {\displaystyle i,i-1} propagieren gemeinsam einen Übertrag, wenn p i p i 1 = 1 {\displaystyle p_{i}\wedge p_{i-1}=1} ist. Die Verknüpfung {\displaystyle \circ } eignet sich daher, um alle c i {\displaystyle c_{i}} wie folgt zu berechnen; die d i {\displaystyle d_{i}} sind dabei reine Hilfsvariablen:

( c i , d i ) = ( g i , p i ) ( g 0 , p 0 ) ( c 1 , 1 ) {\displaystyle (c_{i},d_{i})=(g_{i},p_{i})\circ \ldots \circ (g_{0},p_{0})\circ (c_{-1},1)} , oder anders ausgedrückt:
( ( c n 1 , d n 1 ) , , ( c 1 , d 1 ) ) = PP n + 1 ( ( g n 1 , p n 1 ) , , ( g 0 , p 0 ) , ( c 1 , 1 ) ) {\displaystyle ((c_{n-1},d_{n-1}),\ldots ,(c_{-1},d_{-1}))=\operatorname {PP} _{n+1}^{\circ }((g_{n-1},p_{n-1}),\ldots ,(g_{0},p_{0}),(c_{-1},1))}

Mit den nun vorliegenden Zwischenergebnissen lässt sich schließlich die Summe s {\displaystyle s} von a {\displaystyle a} und b {\displaystyle b} einfach berechnen. Es gilt:

s i = p i c i 1 {\displaystyle s_{i}=p_{i}\oplus c_{i-1}} für 0 i < n {\displaystyle 0\leq i<n}
s n = c n 1 {\displaystyle s_{n}=c_{n-1}}

Literatur

  • Jörg Keller, Wolfgang J. Paul: Hardware Design. Formaler Entwurf digitaler Schaltungen Teubner 1995/2005, ISBN 3-519-23047-X.
  • Ausführliche Darstellung bei der Hochschule Flensburg