3.8 Sequentieller Multiplizierer 159 Nachfolgende Abbildung zeigt den (unvollständigen) Aufbau einer Schaltung zur Implementierung des gezeigten Multiplikationsverfahrens. b) Vervollständigen Sie die Schaltung so, dass sie vorzeichenlose Binärzahlen multipliziert. ¥-1 :# : ¥1 Steuerung Multiplikator 3.7 Multiplizierer n 141 aämäiää Init/>>1 a- Sequentielle Multiplikation vorzeichenloser Zahlen 0..n-1 Schaltung zur 0..n-1 PR In Mit einer sequentiellen Schaltung kann der Hardwareaufwand deutlich reduziert werden. Die nächste Abbildung skizziert eine sequentielle Schaltung, die zur Multiplikation von n..2n n..2n-1 vorzeichenloser Zahlen der Wortbreite n = 4 verwendet werden kann: MR y3 y2 y1 y0 Add ⇒ PR n 0 0 2n PR0 0 x3 x2 x1 x0 Addierer MR Multiplikand 0 0 Produkt Das Multiplikand-Register MR ist n = 4 Bit breit, das Produkt-Register PR ist 2n + 1 = 9 Bit breit. PR0 ist das niederwertigste Bit des im Produktregister gespeicherten Werts. Der Ablauf ist wie folgt: • Zunächst wird der Multiplikand im Multiplikand-Register MR und der Multiplikator in den unteren n Bits des Produkt-Registers abgelegt. Die restlichen Bits des Produktregisters werden mit 0 initialisiert. • Anschließend wird iterativ n = 4 mal folgendes ausgeführt: • Wenn PR0 = 1, dann • wird der in MR stehende Wert zu den Bits PR7 ... PR4 des Produktsregisters addiert; ein ggf. auftretender Überlauf wird in PR8 abgelegt; anschließend • wird das gesamte Produktregister um eine Stelle nach rechts geschoben; dabei wird von links mit Nullen aufgefüllt. • Wenn PR0 = 0, dann • wird keine Addition durchgeführt, sondern lediglich das gesamte Produktregister um eine Stelle nach rechts geschoben; dabei wird wieder von links mit Nullen aufgefüllt. • Nach n = 4 Iterationen (=Runden) steht im Produktregister das Ergebnis. 160 c) 3 Arithmetische Schaltungen Vervollständigen Sie nachfolgend abgebildeten Zustands-Automaten so, dass er den Multiplizierer wie gewünscht steuert. Nehmen Sie an, dass Sie zur Detektion des Schleifen-Abbruchs das Signal Runde_n zur Verfügung haben, das Ihnen anzeigt, ob Sie bereits alle Runden durchlaufen haben (Runde_n = 1) oder noch don't × nicht (Runde_n = 0). Wert Änis Oo öisfi = an immer - . 1 Initialisierung clk_mkand= 0 0 multiplexer= 0 init/>>1= 0 clk_produkt= clk_produkt= multiplexer= 4¥ 1 × init/>>1= 7 Ende clk_mkand= clk_produkt= multiplexer= init/>>1= 2 Initialisierung clk_mkand= 1 1 - . 3 Addieren clk_mkand= clk_produkt= 1 clk_produkt= multiplexer= 0 multiplexer= init/>>1= 0 Runden 6 Schieben 0 clk_mkand= PRO 8 ⇒ -0 5 Schieben 0 clk_mkand= 0 > 1 0 c) 4 Addieren clk_mkand= 0 clk_produkt= multiplexer= multiplexer= init/>>1= init/>>1= Runden immer 0 init/>>1= 0 c) PRO clk_produkt= care egal = > " " " " -0ft PRO 1 = 1 immer 3.8 Sequentieller Multiplizierer 161 Multiplexer-basierte Implementierung der Steuerung Für den Fall n = 4 soll die Steuerung wie folgt implementiert werden: clk_mkand clk_produkt multiplexer Kombinatorische Schaltung init/>>1 3 ... clk ... D0 Q0 D2 Q2 D3 Q3 D4 Q4 2 2 3 PR0 Das Zustandsregister speichert die Information über • den aktuellen Zustand (d.h. in welchem Zustand des Zustandsdiagramms sich die Steuerung gerade befindet) und • den Rundenzähler (d.h. welche Iterations-Runde gerade ausgeführt wird). a) In welchen Bits des Zustandsregisters wird • der aktuelle Zustand und • die aktuelle Runde gespeichert? Zustand Runde : : Bib Bib 2. 4.3 1,0 162 3 Arithmetische Schaltungen b) Tragen Sie in nachfolgende Abbildung die Eingangswerte des Multiplexers ein, die die Ausgangs-Funktion der Steuerung implementieren. Womit muss der Steuereingang des Multiplexers verbunden werden? Aktueller Zustand 3 ( 0000 )4 0000 4 1100 4 0010 4 Uno 4 00×1 4 01×1 4 OOXX 4 0 1 2 3 clk_mkand 3 2 clk_produkt 1 multiplexer 0 init/>>1 4 5 6 7 4 3.8 Sequentieller Multiplizierer c) 163 Tragen Sie in nachfolgende Abbildung diejenigen Eingangswerte ein, welche die Zustands-Übergangs-Funktion aller unbedingter Verzweigungen implementieren. Aktueller Zustand 3 ( 001 010 ) 0 3 1 3 2 3 100 3 101 3 110 Folge 1 3 4 - zustand 0 5 3 6 3 111 2 3 7 3 d) Tragen Sie in nachfolgende Abbildung ein Schaltung ein, die den Folgezustand 0 ⇒ 101 des Zustands 2 liefert. PRO 1,1 = PRO = 1 011 ⇒ ± PR0 > d 1 2 , 0 3 Folgezustand von Zustand 2 164 e) 3 Arithmetische Schaltungen Tragen Sie in nachfolgende Abbildung eine Schaltung ein, die im Zustand 5 den Eingang Runde um 1 erhöht und den neuen Rundenwert am Ausgang bereitstellt (00 ! 01, 01 ! 10, 10 ! 11, 11 ! 00). In Zuständen 6= 5 soll die am Eingang angelegte Runde an den Ausgang durchgereicht werden. Zustand (Bit 2 ... 0) 3 101,2 f. Ito ggf 81oiwomunftmtand.si y.no , MAI Runde (Bit 4, 3) f) 2 i 2 Neue Runde (Bit 4, 3) Tragen Sie in nachfolgende Abbildung eine Implementierung des Runde_nDetektors ein, der in Runde 1, 2 und 3 den Ausgang auf Low-Pegel legt und in Runde 4 auf High-Pegel (Runde 1 , 01, Runde 2 , 10, Runde 3 , 11, Runde 4 , 00). Runde (Bit 4,3) 2 II. i 1 Runde_n 3.8 Sequentieller Multiplizierer 165 g) Tragen Sie in nachfolgende Abbildung eine Multiplexer-basierte Schaltung ein, die in Abhängigkeit der Eingänge Runde_n und PR0 den auf Zustand 6 folgenden Zustand am Ausgang ausgibt. Runde_n 1 7-8 Ä PR0 h) 3 Folgezustand von Zustand 6 1 Tragen Sie in nachfolgende Abbildung eine Schaltung ein, die den auf Zustand 6 folgenden Zustand mit Hilfe eines Inverters und zweier ODER-Gatter bestimmt und am Ausgang ausgibt. Runde_n → 1 PR0 1 Runden Runden Runde kl -0 = - U Oft -1 3 10 1 µ✓ - z PRO pro 0 = = Folgezustand von Zustand 6 101 1 011 111 166 3 Arithmetische Schaltungen ROM-basierte Implementierung der Steuerung In diesem Abschnitt soll die Multiplizierer-Steuerung mit nachfolgend abgebildeter ROMbasierten Schaltung implementiert werden. clk_mkand clk_produkt multiplexer init/>>1 Q0 Q1 Q2 Q3 Q4 ROM 5 4 3 2 1 0 clk D0 D1 D2 D3 D4 8 7 6 5 4 3 2 1 0 PR0 1 Initialisierung clk_mkand= 0 immer 2 Initialisierung clk_mkand= 1 PR0 = 1 3 Addieren clk_mkand= 0 clk_produkt= 0 clk_produkt= 1 clk_produkt= 0 multiplexer= 0 multiplexer= 0 multiplexer= 1 init/>>1= 0 init/>>1= 0 init/>>1= 0 Runde_n = 0 && PR0 = 0 immer PR0 = 0 6 Schieben clk_mkand= 0 5 Schieben clk_mkand= 0 4 Addieren clk_mkand= 0 clk_produkt= 1 clk_produkt= 0 clk_produkt= 1 multiplexer= X multiplexer= X multiplexer= 1 init/>>1= 1 init/>>1= 1 immer immer Runde_n = 1 7 Ende clk_mkand= 0 clk_produkt= 0 Runde_n = 0 && PR0 = 1 multiplexer= X init/>>1= X immer init/>>1= 0 3.8 Sequentieller Multiplizierer a) 167 Welche Organisation hat das ROM? 64×9 Bit Im ROM wird durch die Adress-Bits 0, 1 und 2 der Zustand festgelegt, durch die Adress-Bits 3 und 4 der Rundenzähler, der die Anzahl der Iterationen mitzählt. Zum Start der Multiplikation wird das Zustandsregister mit [Q0, Q1] = [0, 0] und [Q2, Q3, Q4] = [0, 0, 1] initialisiert, d.h. Runde 00, Zustand 001. b) Geben Sie den ROM-Inhalt an, der zur Implementierung der Zustände 1 und 2 benötigt wird. Daten Adresse PR0 c) Zustand 00 001 1 00 001 0 00 010 1 00 010 Zust. 1 Zust. 2 Runde ÷ Ausgang Folgerunde Folgezust. 0000 00 010 0000 00 010 1100 00 101 1100 00 011 Geben Sie den Inhalt des ROM-Speichers für Zustand 3 an. PR0 Zust. 3 Runde Zustand Ausgang Folgerunde Folgezust. 00 100 1 00 1 01 011 0010 01 100 1 10 011 0010 10 100 1 11 011 0010 11 100 0110010 168 3 Arithmetische Schaltungen d) Geben Sie den Inhalt des ROM-Speichers für Zustand 4 an. Zust. 4 e) PR0 Runde 1 00 100 0110 00 101 1 01 100 0110 01 101 1 10 100 0110 10 101 1 11 100 UNO 11 101 Zustand Ausgang Folgerunde Folgezust. Geben Sie den Inhalt des ROM-Speichers für Zustand 5 an. PR0 Zust. 5 Runde Zustand Ausgang Folgerunde Folgezust. 0 00 101 00×1 01 0 01 101 10 0 10 101 00×1 00×1 11 110 110 0 11 101 Von 00 110 110 110 1 00 101 00×1 01 1 01 101 10 1 10 101 00×1 00×1 11 1 11 101 00×1 00 110 110 110 3.8 Sequentieller Multiplizierer f) 169 Geben Sie den Inhalt des ROM-Speichers für Zustand 6 an. PR0 Zust. 6 Runde 0 00 0 01 0 Zustand 110 Ausgang 01×1 10 110 110 01×1 01×1 0 11 110 01×1 1 1 00 01 110 1 10 110 ^ 11 Folgerunde 00 01 10 11 11001×111 01×1 110 01×110 00 01×1 01 Folgezust. 111 101 101 101 111 011 011 011 g) Geben Sie den Inhalt des ROM-Speichers für Zustand 7 an. PR0 Zust. 7 Runde Zustand Ausgang Folgerunde 9881%88%88 Folgezust. nun 170 3 Arithmetische Schaltungen Multiplikation vorzeichenbehafteter Zahlen Zur Multiplikation vorzeichenbehafteter Zahlen (2er-Komplement) kann auf die Schaltung für vorzeichenlose Multiplikation zurückgegriffen werden, wenn negative Zahlen zuerst negiert werden, das Vorzeichen separat berechnet wird (XOR) und das Ergebnis ggf. noch invertiert wird. Es gibt jedoch auch noch andere Verfahren wie z.B. den sog. Baugh-WooleyMultiplizierer. Dieser ist sehr ähnlich wie der kombinatorische Multiplizierer für vorzeichenbehaftete Zahlen aufgebaut, verwendet jedoch an einigen Stellen ein NICHTUND-Gatter statt eines UND-Gatters sowie einen zusätzlichen Halbaddierer für die höherwertigste Ergebnis-Stelle. Multiplikation von Gleitkomma-Zahlen • Zur Multiplikation von Gleitkommazahlen müssen die Mantissen inkl. führender ‘‘1,’’ als Festkommazahlen multipliziert werden. • Die Exponenten werden addiert. Der Offset ‘‘k’’ ist nach der Addition doppelt berücksichtigt und muss deswegen vom Ergebnis noch einmal subtrahiert werden. • Zur Re-Normalisierung wird die Ergebnis-Mantisse nach rechts geschoben und zum Exponenten die Anzahl der geschobenen Stellen addiert. 3.9 Subtraktion 171 3.9 Subtraktion Allgemein Bezeichnungen: Minuend - Subtrahend = Differenz Die Subtraktion zweier Zahlen wird stellenweise ausgeführt. Dabei kann es vorkommen, dass ein größerer Wert von einem kleineren Wert subtrahiert werden muss. Um dies zu bewerkstelligen, kann aus der nachfolgenden Stelle ein Wert geborgt werden. Beispiel: 11 2 + 1 1 + 1 11 4 3 2 1 - 1 2 3 4 = 3 0 8 7 • 4 und wieviel ist 1? ) geht nicht ) 1 von 10-er Stelle borgen ) aus 1 wird 11 • 4 und wieviel ist 11? ) 7 • Durch das Borgen steht an der Zehner-Stelle jetzt nur noch eine 1 statt einer 2 • 3 und wieviel ist 1? ) geht nicht ) 1 von 100-er Stelle borgen ) aus 1 an der Zehner-Stelle wird 11 • 3 und wieviel ist 11? ) 8 • Durch das Borgen steht an der Hunderter-Stelle jetzt nur noch eine 2 statt einer 3 • 2 und wieviel ist 2? ) 0 • 1 und wieviel ist 4 ) 1 Statt beim Borgen die Minuenden-Stellen zu verkleinern, kann die Subtrahenden-Stelle vergrößert werden (wie Übertrag). 4 3 2 1 - 1 2 3 4 0 1 1 = 3 0 8 7 Das Ergebnis ist das gleiche, da die Differenz zwischen Minuenden-Stelle und Subtrahenden-Stelle gleich bleibt. Beim Borgen über mehrere Stellen hinweg kann einem dieses Vorgehen jedoch leichter fallen. 172 : a) T c) 3 Arithmetische Schaltungen Subtrahieren Sie 11 - 6 = 5 im Binärsystem bei einer Wortbreite n = 4. b) Subtrahieren Sie 12 - 5 = 7 im Binärsystem bei einer Wortbreite n = 4. Subtrahieren Sie 14 - 11 = 3 im Binärsystem bei einer Wortbreite n = 4. 3.9 Subtraktion 173 Halb-Subtrahierer Ein Halb-Subtrahierer ist ein Schaltung, die ein Eingangs-Bit yi von einem Eingangs-Bit xi subtrahiert. Das Ergebnis ist ein Differenz-Bit di und ein Borge-Bit bi (b = borgen = engl. borrow). Eingang xi Eingang yi Borgen bi Differenz di 0 0 1 1 0 1 0 1 0 1 0 0 0 1 1 0 Die Differenz di entspricht der XOR-Verknüpfung der Eingänge; bi hat den Wert 1, wenn der Minuend 0 ist und der Subtrahend 1 ist. xi yi xi yi HS bi bi di di Halbsubtrahierer können Binärzahlen nur halb subtrahieren: Der Halbsubtrahierer an Stelle i erkennt zwar, ob er ein Bit von Stelle i + 1 borgen musste, kann jedoch selbst nicht berücksichtigen, ob der Halbsubtrahierer an Stelle i 1 von ihm selbst ein Bit borgen musste. 3.10 Dividierer 174 157 3 Arithmetische Schaltungen Voll-Subtrahierer Voll-Subtrahierer Im Gegensatz zum Halbsubtrahierer kann ein Vollsubtrahierer berücksichtigen, ob die Im Gegensatz Stelle zum Halbsubtrahierer kann ein Vollsubtrahierer berücksichtigen, ob die vorangegangene i 1 ein Bit borgen musste. vorangegangene Stelle i 1 ein Bit borgen musste. a) Vervollständigen Sie nachfolgende Wertetabelle eines Vollsubtrahierers. a) Vervollständigen nachfolgende Wertetabelle eines Vollsubtrahierers. Tabelle, die in die GrafikSie eingebettet wurde: xi yi bi 0 0 0 0 0 1 1 1 1 0 1 0 11 1 1 0 1 1 11 00 1 0 0 00 1 1 0 1 00 00 1 1 0 00 00 1 1 1 bi di O 0 00 01 : 1 1 1 1 b) Tragen Sie in nachfolgende Abbildung (links) eine Implementierung einer Vollsubtrahierer-Schaltung ein. b) Tragen Sie in nachfolgende Abbildung (links) eine Implementierung einer Ripple-Borrow-Subtrahierer Vollsubtrahierer-Schaltung ein. a) Berechnen Siex537 - 48 im Dezimalsystem. y i i b) Berechnen Sie c) ¥ xi yi Vervollständigen Sie nachfolgende Wertetabelle eines b idc 3.10 Dividierer CI di . Er . bi-1 bi VS di bi-1 3.9 Subtraktion 175 Ripple-Borrow-Subtrahierer Beim Ripple-Borrow Subtrahierer werden n Vollsubtrahierer so verschaltet, dass sich damit die Differenz d = x y zweier n Bit breiter Zahlen berechnen lässt. xn-1 x2 … yn-1 xi bi x1 y2 … yi xi VS bi-1 bi y1 yi xi VS bi-1 di dn-1 x0 bi di yi xi VS bi-1 di d2 … y0 bi yi VS bi-1 0 di d1 d0 Betrachten Sie den Zahlenring für vorzeichenlose Zahlen. 1111 0000 1110 0001 15 1101 0 14 1 13 1100 1011 12 3 11 4 10 6 8 0100 Richtung steigender Werte 0101 7 1001 0110 1000 5 0011 5 9 1010 a) 0010 2 0111 Nehmen Sie an, die Eingangswerte des entworfenen Ripple-Borrow-Subtrahierers sind vorzeichenlos. Welches Zahlenformat hat die Differenz d? Welche Funktion hat das ‘‘Borrow Out’’? 176 3 Arithmetische Schaltungen Betrachten Sie den Zahlenring für Zahlen im Zweier-Komplement: 1111 0000 1110 0001 -1 1101 0 -2 1 -3 1100 -4 3 negativ 1011 -5 4 1010 0011 positiv -6 0100 5 -7 -8 7 1001 6 0101 0110 1000 7 0010 2 0111 b) Funktioniert der Subtrahierer auch mit dem Zweier-Komplement? Wenn ja: Wie kann man einen Überlauf feststellen? Wenn nein: Warum nicht? 3.9 Subtraktion 7 c) 177 Tragen Sie in nachfolgende Abbildung eine Schaltung ein, die einen Überlauf von Zahlen im Zweierkomplement feststellt. xn-1 yn-1 dn-1 u