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