Arithmetische Schaltungen 2
Transcription
Arithmetische Schaltungen 2
Outline Addierer Multiplizierer Block RAM Rechenschaltungen 2 Marc Reichenbach und Michael Schmidt Informatik 3 / Rechnerarchitektur Universität Erlangen Nürnberg 06/12 1 / 36 Outline Addierer Multiplizierer Block RAM Gliederung Addierer (Fortsetzung) Multiplizierer Block RAM 2 / 36 Outline Addierer Multiplizierer Block RAM Problem RCA • alle Volladdierer arbeiten zwar parallel, ABER • Ausbreitung der Carrys erfolgt schrittweise (Stufe für Stufe) • d.h. für Addition von n-Bit Zahlen wird Zeit proportional zu n benötigt, bis Ergebnis korrekt ist → Delay reduzieren, durch effizientere Addierer-Schaltungen (Carry-Look-Ahead Addierer ) 3 / 36 Outline Addierer Multiplizierer Block RAM Carry-Look-Ahead Addierer • Reduziert die Zeit, die für die Bestimmung der Carrys notwendig ist • an Position i liegt ein Carry vor, wenn • es eine Stelle j < i gibt, wo das Carry erzeugt wird und • alle Stellen dazwischen, das Carry weiterleiten • ein Carry wird an einer Stelle i erzeugt, wenn ai und bi auf ’1’ gesetzt sind • ein Carry wird an dieser Stelle eliminiert, falls ai und bi auf ’0’ gesetzt sind 4 / 36 Outline Addierer Multiplizierer Block RAM Carry-Look-Ahead Addierer • das führt zu folgenden Definitionen, die für 0 ≤ i < n gelten: • gi = ai ∧ bi (Position i erzeugt Carry) • pi = ai ∨ bi (Position i gibt anliegendes Carry weiter) • es gilt für 1 ≤ i < n: Carry an Position i, wenn Carry an Position j < i erzeugt und dazwischen weitergeleitet wird: ci = i−1 W j=0 gj ∧ i−1 V ! pk k=j+1 5 / 36 Outline Addierer Multiplizierer Block RAM Carry-Look-Ahead Addierer • die Berechnung der Summen erfolgt wie zuvor durch • s0 = a0 ⊕ b0 • si = ai ⊕ bi ⊕ ci • sn = c n • ABER, die Formel für ci erlaubt parallele Berechnung der Carrys (nur von a und b abhängig) • somit auch s parallel berechenbar 6 / 36 Outline Addierer Multiplizierer Block RAM Carry-Look-Ahead Addierer • Strukturplan 4-Bit CLA: A3 B3 A2 B2 A1 B1 A0 B0 FA' FA' FA' FA' S3 C4 S2 S1 S0 C3 p g C2 p g C1 p 4-Bit Carry Look Ahead p3 g3 2 2 C0 1 1 0 g0 7 / 36 Outline Addierer Multiplizierer Block RAM Carry-Look-Ahead Addierer • Baumstruktur 4-Bit CLA: 8 / 36 Outline Addierer Multiplizierer Block RAM Carry-Look-Ahead Addierer • Verzögerungszeit des CLA wird durch Tiefe des Baumes bestimmt • für Addition von n-Bit Operanden werden n-Bit AND- und OR-Gatter benötigt • diese sind durch AND2- (bzw. OR2-) Gatter als Baum mit logarithmischer Tiefe realisierbar • Laufzeit CLA daher O(log (n)) • Nachteil CLA: erhöhter Ressourcenverbrauch (Speed vs. Area) 9 / 36 Outline Addierer Multiplizierer Block RAM Addierer-Realisierung im FPGA • naive Implementierung: Volladdierer aus 2 Halbaddierern und Abbildung auf 2 LUTs • Problem: Carry-Delay für jede Bitstelle über zwei LUTs • deshalb Abbildung auf spezielle Look-Ahead Schaltung im FPGA • Wichtig: 6= Carry-Look-Ahead Addierer !!! → FPGA stellt nur Ressourcen für schnelle Carry-Weiterleitung zur Verfügung (entspricht also RCA-Schaltung) 10 / 36 Outline Addierer Multiplizierer Block RAM Addierer-Realisierung im FPGA • Propagate-Signal entspricht Ergebnis des ersten Halbaddierers (XOR-Gatter) • wenn Propagate nicht gesetzt ist, dann ist A = B → A oder B kann direkt als Generate-Signal verwendet werden • d.h. für Carry-Ausgang wird Propagate als Steuersignal für Multiplexer verwendet • Carry-Eingang durchschalten, wenn Propagate = ’1’ • A (oder B) durchschalten, wenn Propagate = ’0’ 11 / 36 Outline Addierer Multiplizierer Block RAM Addierer-Realisierung im FPGA • resultierende Schaltung: 12 / 36 Outline Addierer Multiplizierer Block RAM Addierer-Realisierung im FPGA • Spartan3E enthält dedizierte XOR-Gatter (XORCY) und Multiplexer (MUXCY) zur effizienten Realisierung der Schaltung • spezielle Routing-Pfade für schnelle Carry-Ausbreitung • geringes Carry-Delay pro Bitstelle, da nur 2:1 Multiplexer • Frage: Ist eine CLA-Implementierung auf einem FPGA sinnvoll? 13 / 36 Outline Addierer Multiplizierer Block RAM Addition in VHDL • Realisierung der Addition und Subtraktion in VHDL mit “+“ und “-“ Operator • Synthesetool bildet diese Operationen auf die gezeigte Addiererlogik im FPGA ab (bei ASIC von Bibliothek abhängig!) • zusätzliche Bibliotheken für Operationen auf std_logic_vector benötigt • empfohlen: ieee.numeric_std (standardisiert) • nicht empfohlen: ieee.std_logic_unsigned, ieee.std_logic_arith (nicht standardisiert) 14 / 36 Outline Addierer Multiplizierer Block RAM Einschub: Numeric_Std unsigned unsigned() to_integer() to_unsigned(... , length) std_logic_vector() std_logic_vector integer std_logic_vector() unsigned() to_signed(... , length) signed to_integer() 15 / 36 Outline Addierer Multiplizierer Block RAM Addition in VHDL l i b r a r y ieee ; use i e e e . std_logic_1164 . a l l ; use i e e e . numeric_std . a l l ; e n t i t y numops i s p o r t ( a , b : i n s t d _ l o g i c _ v e c t o r ( 7 downto 0 ) ; add , s u b : out s t d _ l o g i c _ v e c t o r ( 7 downto 0 ) ) ; end numops ; a r c h i t e c t u r e b e h a v i o r o f numops i s begin add <= s t d _ l o g i c _ v e c t o r ( u n s i g n e d ( a ) + u n s i g n e d ( b ) ) ; s u b <= s t d _ l o g i c _ v e c t o r ( u n s i g n e d ( a ) − u n s i g n e d ( b ) ) ; end b e h a v i o r ; 16 / 36 Outline Addierer Multiplizierer Block RAM Festkomma-Multiplizierer • Realisierung über Addition partieller Produkte 1010 * 1101 ----------------= 1010 + 0000 + 1010 + 1010 ----------------=10000010 → Ressourcen-intensiv 17 / 36 Outline Addierer Multiplizierer Block RAM Festkomma-Multiplizierer • Hardware-Realisierung: • Partielle Produkte über AND-Gatter • Addition der partiellen Produkte über Addierer • Aufwand für m × n - Multiplikation • m × n AND-Gatter • m × (n − 1) Addierer • Realisierung im FPGA über gezeigte Addiererschaltung mit AND-Funktion in der LUT 18 / 36 Outline Addierer Multiplizierer Block RAM Multiplizierer im FPGA • Alternative im FPGA (wenn vorhanden): Hard-Multiplizierer • Spartan3E enthält sogenannte MULT18X18SIO Komponenten • Vorteile: platzsparend, schnell • Realisierung der Multiplikation über Zweierkomplement zweier 18 Bit Operanden 19 / 36 Outline Addierer Multiplizierer Block RAM MULT18X18SIO-Komponente 20 / 36 Outline Addierer Multiplizierer Block RAM MULT18X18SIO-Komponente • Komponente enthält optional • Eingangsregister für 18 Bit Operanden A und B • Ausgangsregister für 36 Bit Ergebnis P • über Attribute AREG , BREG und PREG bei direkter Instanziierung festlegbar • spezielle Routing-Pfade (BCIN, BCOUT ) für effiziente Kaskadierung mehrerer Multiplizierer 21 / 36 Outline Addierer Multiplizierer Block RAM Multiplikation in VHDL • Realisierung wieder über “*“ Operator möglich mit Bibliothek ieee.numeric_std für std_logic_vector l i b r a r y ieee ; use i e e e . std_logic_1164 . a l l ; use i e e e . numeric_std . a l l ; e n t i t y numops i s p o r t ( a , b : i n s t d _ l o g i c _ v e c t o r ( 7 downto 0 ) ; p : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ) ; end numops ; a r c h i t e c t u r e b e h a v i o r o f numops i s begin p <= s t d _ l o g i c _ v e c t o r ( u n s i g n e d ( a ) ∗ u n s i g n e d ( b ) ) ; end b e h a v i o r ; 22 / 36 Outline Addierer Multiplizierer Block RAM Multiplikation in VHDL • die Abbildung auf FPGA-Ressourcen kann über Synthese-Optionen beeinflusst werden • bei Abbildung auf MULT18X18SIO Komponenten entscheidet Art der VHDL Beschreibung über Verwendung der optionalen Register • Beispiel: wenn Multiplikation in Taktabfrage verwendet wird, dann wird PREG aktiviert 23 / 36 Outline Addierer Multiplizierer Block RAM Multiplikation in VHDL • Alternativ kann Hard-Multiplizierer direkt eingebunden werden l i b r a r y UNISIM ; use UNISIM . vcomponents . a l l ; −− . . . MULT18X18SIO_inst : MULT18X18SIO g e n e r i c map( AREG => 1 , −− A k t i v i e r u n g R e g i s t e r P o r t A BREG => 1 , −− A k t i v i e r u n g R e g i s t e r P o r t B B_INPUT => "DIRECT" , −− "DIRECT" o d e r "CASCADE" PREG => 1 ) −− A k t i v i e r u n g R e g i s t e r P o r t P ... 24 / 36 Outline Addierer Multiplizierer Block RAM Multiplikation in VHDL ... p o r t map( BCOUT => BCOUT, −− 18− B i t K a s k a d i e r −Ausgang P => P , −− 36− B i t M u l t i p l i z i e r e r −E r g e b n i s A => A , −− 18− B i t M u l t i p l i z i e r e r −Operand B => B , −− 18− B i t M u l t i p l i z i e r e r −Operand BCIN => BCIN , −− 18− B i t K a s k a d i e r −E i n g a n g CEA => CEA , −− C l o c k E n a b l e P o r t A CEB => CEB , −− C l o c k E n a b l e P o r t B CEP => CEP , −− C l o c k E n a b l e P o r t P CLK => CLK , −− C l o c k RSTA => RSTA , −− R e s e t P o r t A RSTB => RSTB , −− R e s e t P o r t B RSTP => RSTP ) ; −− R e s e t P o r t P 25 / 36 Outline Addierer Multiplizierer Block RAM Block RAM (BRAM) • On-chip Speicher auf FPGAs wichtig für effiziente Datenpufferung • Spartan3E enthält sogenannte RAMB16 Komponenten (Anzahl abhängig vom konkreten Typ) • verwendbar als RAM, ROM, Schieberegister,... • Zusammenschaltung der BRAMs zu Speicher-Modul mit “beliebiger“ Adress- und Datenbreite 26 / 36 Outline Addierer Multiplizierer Block RAM Block RAM (BRAM) • RAMB16 Komponenten kann 16 Kb Daten speichern (+ optional 2 Kb für Parität) • ist dual-port fähig → zwei getrennte Zugriffsports zu einem physikalischen Speicher 27 / 36 Outline Addierer Multiplizierer Block RAM BRAM-Beschreibung in VHDL • wieder direkte Einbindung von RAMB16 Komponenten möglich l i b r a r y UNISIM ; use UNISIM . vcomponents . a l l ; −− . . . RAMB16_S18_S18_inst : RAMB16_S18_S18 g e n e r i c map( INIT_A => X" 00000 " , −− I n i t P o r t A R e g i s t e r INIT_B => X" 00000 " , −− I n i t P o r t B R e g i s t e r SRVAL_A => X" 00000 " , −− Wert P o r t A nach SSR SRVAL_B => X" 00000 " , −− Wert P o r t B nach SSR WRITE_MODE_A => "WRITE_FIRST" , −− o r "READ_FIRST " , . . . WRITE_MODE_B => "WRITE_FIRST" , −− o r "READ_FIRST " , . . . SIM_COLLISION_CHECK => "ALL" , −− o r "NONE " , . . . −− I n i t i a l i s i e r u n g BRAM−I n h a l t INIT_00 => X" 0 0 . . . 0 " , INIT_01 => X" 0 0 . . . 0 " , ... ) ... 28 / 36 Outline Addierer Multiplizierer Block RAM BRAM-Beschreibung in VHDL p o r t map( DOA => DOA, −− 16− B i t D a t e n a u s g a n g A DOB => DOB, −− 16− B i t D a t e n a u s g a n g B DOPA => DOPA, −− 2− B i t P a r t i t a e t s a u s g a n g A DOPB => DOPB, −− 2− B i t P a r t i t a e t s a u s g a n g B ADDRA => ADDRA, −− 10− B i t A d r e s s e i n g a n g A ADDRB => ADDRB, −− 10− B i t A d r e s s e i n g a n g B CLKA => CLKA , −− C l o c k A CLKB => CLKB , −− C l o c k B DIA => DIA , −− 16− B i t D a t e n e i n g a n g A DIB => DIB , −− 16− B i t D a t e n e i n g a n g B DIPA => DIPA , −− 2− B i t P a r i t a e t s e i n g a n g A DIPB => DIPB , −− 2− B i t P a r i t a e t s e i n g a n g B ENA => ENA, −− E n a b l e P o r t A ENB => ENB, −− E n a b l e P o r t B SSRA => SSRA , −− S y n c h r o n e r S e t / R e s e t P o r t A SSRB => SSRB , −− S y n c h r o n e r S e t / R e s e t P o r t B WEA => WEA, −− W r i t e E n a b l e P o r t A WEB => WEB) ; −− W r i t e E n a b l e P o r t B ... 29 / 36 Outline Addierer Multiplizierer Block RAM BRAM-Beschreibung in VHDL • verschiedene Komponenten-Instanziierungen möglich (Datenblatt) • alternativ kann Verhalten in VHDL beschrieben werden → Synthesetool bildet Beschreibung auf RAMB16 Komponenten ab → Abbildung auch auf verteilten Speicher (LUTs) möglich (durch Syntheseoptionen definieren) 30 / 36 Outline Addierer Multiplizierer Block RAM BRAM-Beschreibung in VHDL • Beispiel für allgemeine dual-port BRAM-Beschreibung (XST User Guide) −− S c h n i t t s t e l l e n −D e f i n i t i o n e n t i t y rams_16 i s port ( c l k a : in std_logic ; clkb : in std_logic ; ena : i n s t d _ l o g i c ; enb : i n s t d _ l o g i c ; wea : i n s t d _ l o g i c ; web : i n s t d _ l o g i c ; a d d r a : i n s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) ; a d d r b : i n s t d _ l o g i c _ v e c t o r ( 5 downto 0 ) ; d i a : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; d i b : i n s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; doa : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; dob : out s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ) ; end rams_16 ; 31 / 36 Outline Addierer Multiplizierer Block RAM BRAM-Beschreibung in VHDL a r c h i t e c t u r e s y n o f rams_16 i s t y p e ram_type i s a r r a y ( 6 3 downto 0 ) o f s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; −− S h a r e d V a r i a b l e f u e r S c h r e i b z u g r i f f u e b e r 2 P o r t s s h a r e d v a r i a b l e RAM: ram_type ; begin ... 32 / 36 Outline Addierer Multiplizierer Block RAM BRAM-Beschreibung in VHDL ... −− D e f i n i t i o n P o r t A process ( clka ) begin i f c l k a ’ e v e n t and c l k a = ’ 1 ’ then i f ena = ’ 1 ’ then i f wea = ’ 1 ’ then RAM( t o _ i n t e g e r ( u n s i g n e d ( a d d r a ) ) ) := d i a ; end i f ; doa <= RAM( t o _ i n t e g e r ( u n s i g n e d ( a d d r a ) ) ) ; end i f ; end i f ; end p r o c e s s ; ... 33 / 36 Outline Addierer Multiplizierer Block RAM BRAM-Beschreibung in VHDL ... −− D e f i n i t i o n P o r t B process ( clkb ) begin i f c l k b ’ e v e n t and c l k b = ’ 1 ’ then i f enb = ’ 1 ’ then i f web = ’ 1 ’ then RAM( t o _ i n t e g e r ( u n s i g n e d ( a d d r b ) ) ) := d i b ; end i f ; dob <= RAM( t o _ i n t e g e r ( u n s i g n e d ( a d d r b ) ) ) ; end i f ; end i f ; end p r o c e s s ; end s y n ; 34 / 36 Outline Addierer Multiplizierer Block RAM BRAM-Beschreibung in VHDL • Vorteil allgemein gültige Beschreibung: Wiederverwendbarkeit (generisches Design → Übung) • Beschreibung anpassbar (siehe XST User Guide) • mögliche Initialisierung des BRAM-Inhaltes: ... t y p e ram_type i s a r r a y ( 6 3 downto 0 ) o f s t d _ l o g i c _ v e c t o r ( 1 5 downto 0 ) ; s h a r e d v a r i a b l e RAM: ram_type := ( X" 0200 " , X" 0140 " , . . . , X" 0000 " ) ; begin ... 35 / 36 Outline Addierer Multiplizierer Block RAM Literatur Bücher • Entwurf von digitalen Schaltungen und Systemen mit HDLs und FPGAs, Frank Kesel, Ruben Bartholomä, 2. Auflage, Oldenbourg Wissenschaftsverlag GmbH, 2009, ISBN 978-3-486-58976-4 • Spartan-3 Generation FPGA User Guide, UG331 (v1.6), December, 2009 • VHDL-Synthese, Jürgen Reichardt, Bernd Schwarz, 5. Auflage, Oldenbourg Wissenschaftsverlag GmbH, 2009, ISBN 978-3-486-58987-0 • Introduction to Circuit Complexity, Heribert Vollmer, Springer-Verlag Berlin Heidelberg, 1999, ISBN 3-540-64310-9 • XST User Guide, UG627 (v12.4), December, 2010 36 / 36