9 Modellierung digitaler Filter
Die digitale Signalverarbeitung ist eine Kernfunktion in Anwendungen, die von der Daten-
kommunikation, der Sprach-, Audio-, und biomedizinischen Signalverarbeitung bis hin zur
Automatisierungstechnik und Robotertechnik reichen. Umfangreiche Beispielübersichten
zu Anwendungsbereichen der digitalen Signalverarbeitung sind z.B. in [70], [71], [72], [73]
dargestellt. Programmierbare digitale Signalprozessoren (DSP) waren bisher die wesentli-
chen Vertreter der Hardware-Plattformen mit sequentieller Befehlsabarbeitung. Mit der
Verfügbarkeit von FPGAs, die Taktfrequenzen von über 100 MHz und mehreren Millionen
Gatteräquivalente anbieten, nimmt deren Einsatz in der Signalverarbeitung zu. Insbesonde-
re auch die parallele Implementierung einer großen Anzahl von Multiplizierer-
Akkumulator-Blöcken (MAC-Einheiten) stützt die Anwendungsvorteile der FPGAs für
rechenintensive Algorithmen (Xilinx Spartan-6 [91]; Altera Stratix III [82]).
Eine der häufigsten Anwendungen in der digitalen Signalverarbeitung ist die Filterung von
Signalen zur Unterdrückung von Störanteilen oder zur Selektion von Spektralanteilen. Die
synthesefähige Modellierung der zwei Hauptklassen von digitalen Filtern wird in diesem
Kapitel vorgestellt: Finite Impulse Response Filter (FIR-Filter) und Infinite Impulse Res-
ponse Filter (IIR-Filter) [74]. Exemplarische Entwurfsbeispiele demonstrieren, wie paral-
lele oder sequentielle Filterstrukturen mit VHDL im RTL-Codierstil auf FPGA-Hardware
abgebildet werden. Die Modelle für diese digitalen Filter können auch als Entwurfsmuster
für Arithmetik-Implementierungen in anderen Signalflussanwendungen genutzt werden.
Hier sei auf die digitale Bildverarbeitung mit linearen Filtern hingewiesen, die auf Nach-
barschaftsoperationen mit strukturierenden Elementen in Form von Bewertungsmatrizen
beruhen, wie sie z.B. für die Objektkantenerkennung zum Einsatz kommen [76], [77].
Ausgangspunkt der Filtermodellierung sind Darstellungen mit zeitdiskreten Differenzen-
gleichungen und mit z-Übertragungsfunktionen im Frequenzbereich. Grundlage für die
VHDL-Beschreibungen bildet die vorzeichenbehaftete Festkommaarithmetik auf Basis des
2er-Komplements. Als Zahlendarstellung kommt hierbei das Q-Format mit Vorzeichen und
Bruchzahlenanteil für Werte im Intervall -1 < x < 1 zum Einsatz. Das Q-Format hat sich
bei der Softwareentwicklung für Festkomma-DSPs aufgrund der begrenzten Multiplikati-
onsergebnisse bewährt und lässt sich mit dem Signaltyp signed der Bibliothek
ieee.numeric_std umsetzen (vgl. Kap. 5.4 u. Kap. 5.5) [37], [42]. Gegenüber einer
Ganzzahlendarstellung mit dem Signaltyp integer liefert eine Implementierung des Q-
Formats zusätzlich eine Einarbeitung in die Vektorbreitendimensionierung von Funktions-
blockschnittstellen und Operatoren, wie sie beim Entwurf komplexer Signalverarbei-
tungssysteme mit dem Simulator und VHDL-Codegenerator „Xilinx System Generator for
DSP“ genutzt werden [83].
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
240 9 Modellierung digitaler Filter
Dieses Kapitel gibt dem Leser die Methoden an die Hand, mit denen Signalflussanwendun-
gen je nach Datenrate in kompakte RTL-Modelle umgesetzt werden. Vorgestellt werden
Modellierungstechniken, die Symmetrieeigenschaften nutzen, um die Signallaufzeiten der
Arithmetikstufen zu verkürzen. Die Integration von Pipelining-Registerstufen wird als
Maßnahme zur Steigerung der Taktfrequenz für parallele Filterstrukturen demonstriert. Zur
Vermeidung von Überlaufeffekten der 2er-Komplementzahlen wird eine Skalierung des
Filterübertragungsverhaltens durchgeführt. Die Erweiterung des Q-Formats mit so genann-
ten Guard-Bits, die temporäre Integerergebnisanteile aufnehmen, liefert einen zusätzlichen
Überlaufschutz.
Die Zahlenrepräsentation im Q-Format unterstützt die Umsetzung der Erkenntnisse, die
durch Analysen der Auswirkungen einer Wortlängenwahl auf die Genauigkeit der Signal-
verarbeitung gewonnen werden. Es wird davon ausgegangen, dass der Leser Kenntnisse zu
Grundlagen des Filterentwurfs und zu den Darstellungsformen im Zeit- und Frequenzbe-
reich hat [70], [72].
Der erste Abschnitt behandelt die Realisierung von Filtern mit endlicher Reaktionszeit
(FIR-Filter), die aufgrund ihres linearen Phasengangs eine verzerrungsfreie Übertragung
bieten, wie sie für Audio- und nachrichtentechnische Anwendungen erforderlich ist. Dieser
spezielle Phasengang geht auf die Symmetrie der Filterkoeffizienten zurück, die durch das
Filterentwurfsverfahren bedingt ist und für eine Ressourcen sparende Implementierung von
parallelen Strukturen genutzt wird.
Der zweite Abschnitt stellt eine VHDL-Repräsentation von Filtern mit nicht endlichem
Einschwingverhalten (IIR-Filter) vor. Diese Filter besitzen aufgrund der internen Signal-
rückführungen Frequenzgänge, die im Vergleich zu FIR-Filtern bei gleicher Filterordnung
steilere Übergänge zwischen Sperr- und Durchlassbereich aufweisen. Ein zweistufiges
Skalierungsverfahren wird vorgestellt und auf zwei Filtermodelle mit Symmetrievorteilen
angewandt.
Der folgende Abschnitt 9.1 nimmt einen größeren Raum ein, da zur Einführung einige
Grundlagen der Filtermodellierung vorangestellt werden:
– Parallele FIR-Filterstrukturen mit den typischen Summen von Produkten.
– Die Zahlendarstellung im Q-Format für die binäre Addition und Multiplikation.
– Eine Skalierung mit normierten Koeffizienten zur Vermeidung von Überlaufeffekten.
– Eine Schnittstellensynchronisation zur Kopplung von unterschiedlichen Taktbereichen.
Als didaktisches Konzept wird die ausführliche Darstellung von VHDL-Modellen für die
Direktform und die Linear-Phasen-Struktur verfolgt. Diese eignen sich insbesondere als
Erprobungsbeispiele für die Modellierung von mehrstufiger Arithmetik mit gekoppelten
Prozessen, die die Arithmetik mit lokalen Variablen abbilden. Mit diesen parallelen Filter-
strukturen wird das Instrumentarium eines synthesefähigen VHDL-Entwurfs, das in den
vorherigen Kapiteln mit Einzelbeispielen eingeführt wurde, für Arithmetikanwendungen in
einem komplexeren Zusammenhang dargestellt und erweitert. Dabei werden Vektor-Arrays
zur Modellierung der parallelen Funktionselemente und der verketteten Stufen eingesetzt,
die sich mit for loops und Aggregaten bearbeiten lassen. Der Abschnitt zum Entwurf
der parallelen FIR-Filterstrukturen schließt mit der für die praktische Anwendung relevan-
ten transponierten Form.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
241 9.1 FIR-Filter
9.1 FIR-Filter
Dieser Abschnitt stellt parallele Filterstrukturen vor, die auf die Verarbeitung von Signalen
mit Abtastraten bis hin zur Systemtaktfrequenz ausgerichtet sind. Es ist dabei das Ziel, dass
mit jedem neuen in die Eingangsregisterstufe aufgenommenen Signalwert auch ein aktuali-
sierter Ausgangswert zur Verfügung gestellt wird. Für geringere Datenraten, wie z.B. in der
Audiosignalverarbeitung mit 48 kHz, bieten sich sequentiell ablaufende Berechnungen an,
die weniger Hardwareressourcen benötigen, da sie eine einzige Multiplizierer-Akku-
mulator-Einheit in aufeinander folgenden Rechenzyklen mehrfach nutzen. Hierzu zeigt
dieser Abschnitt zum Abschluss den Ansatz als Prozessorelement mit Arithmetik-
Datenpfad, Block-RAM-Speichermodulen [84] und einem Automaten als Steuerpfad.
Die Finite Impulse Response Filter mit endlicher Reaktion auf einen Eingangspuls nutzen
nur den aktuellen Eingangssignalabtastwert x[n] und eine bestimmte Anzahl N von vorhe-
rigen Eingangswerten x[n-k], um den aktuellen Ausgangswert y[n] zu berechnen. Damit
gehören sie zu den nicht rekursiven Filtern, die über keine Signalrückkopplungen verfügen.
Die allgemeine Beschreibung von FIR-Filtern ist im Zeitbereich durch die Differenzenglei-
chung Gl. 9-1 gegeben, die jeden Eingangssignalwert x[n] mit einem speziellen Koeffizien-
ten ck gewichtet. Die Anzahl der zu speichernden vorherigen Eingangssignalwerte x[n-k] ist
die Filterordnung N, sodass insgesamt für jede Ausgangssignalaktualisierung L=N+1 Pro-
dukte zu addieren sind (L ist die Filterlänge).
Gl. 9-1
N
0kk ]kn[xc]n[y
9.1.1 Parallele FIR-Filterstrukturen
Zur analytischen Auswertung zeitdiskreter Systeme erfolgt die Transformation in den z-
Bereich (vgl. Gl. 9-2), sodass eine Übertragungsfunktion H(z) das transiente Verhalten
eines Filters beschreibt.
Gl. 9-2
N
0k
kk )z(X)z(H)z(X)zc()z(Y
Als Übertragungsfunktion H(z) für FIR-Filter ergibt sich ein Polynom (vgl. Gl. 9-3) im
Zeitverschiebungsoperator z-k=e-k(jω+σ)T, der eine zeitliche Rechtsverschiebung um kT
Abtastintervalle bewirkt, wobei T=1/fa die Abtastperiode angibt [74].
Gl. 9-3 N
N)1N(
1N2
21
10
0 zczc...zczczc)z(H
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
242 9 Modellierung digitaler Filter
Diese Addition der mit Koeffizienten gewichteten und verzögerten Eingangssignalwerte
repräsentiert die Direktform in Bild 9-1. Die Kette der N Verschiebungsoperatoren bildet
darin ein N-stufiges Schieberegister, das mit der Abtastfrequenz fa getaktet wird. Nachdem
ein aktualisierter Eingangswert x[n] mit einer Breite von j Bit bereitgestellt wurde, ist die-
ser nach N positiven Taktflanken in der letzten Registerstufe verfügbar. Die Blöcke mit den
Koeffizienten ck der Bitbreite l repräsentieren die L Multiplikationen, die die L Produkte
P[k] mit der Bitbreite m=j+l liefern. Für die Hardware-Implementierung der Summe von L
Produkten stehen auf Bitebene Volladdierer als ASIC-Bibliothekselemente bzw. FPGA-
Makros mit zwei Summanden zur Verfügung, sodass in FPGAs m-Bit-Ripple-Carry-
Addierer realisiert werden (vgl. Abschnitte 2.3, 3.2.1, 7.3.1) [78], [79], [84]. Eine einzeilige
VHDL-Codierung der Addition aller Summanden P[k] oder eine for loop führen also
im Synthese-Ergebnis zur Verkettung von N Addierern mit je zwei Summanden (vgl. Bild
9-1b). Diese mit der Filterordnung N wachsende Addiererkette dominiert dann die Signal-
laufzeit von den Registerstufen x[n-k] zum Ausgang y[n].
Bild 9-1: a) FIR-Filter in Direktform mit Ordnung N=4; b) Addiererkette; c) balancierter Addierer-
baum mit ld(N+1)=3 Addiererstufen
Die Signallaufzeit in solchen Summen lässt sich durch paarweise Addition der Produkte
und weitere paarweise Verknüpfungen der Addiererausgänge zu einem balancierten
Addiererbaum deutlich verringern (vgl. Bild 9-1c). So reduziert sich die maximale Anzahl
der verketteten Addiererstufen von N auf ld(N+1)=3.32log(N+1). Der Operator kenn-
zeichnet darin die Rundung auf den nächst größeren Integerwert (ceiling). Ein vollständig
symmetrischer Aufbau mit gleich langen Signalwegen von den Registerausgängen x[n-k]
+
+
+
+
P[0] P[1] P[2] P[3] P[4]
y[n]
+
P[0] P[1] P[2] P[3] P[4]
+
+
+
y[n]
Pipelining-
register
l Bit Koeffizienten
+
-1
Z
-1
Z
-1
Z
-1
Z
C0 C1 C2 C3 C4
x[n] x[n-1] x[n-2] x[n-3] x[n-4]
P[4]P[3]P[2]P[1]P[0]
j
m
y[n]
m + g
a)
c)b)
Register zum
Laufzeitaus-
gleich
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
243 9.1 FIR-Filter
über alle Pfade bis zum Ausgang y[n] ergibt sich für ungerade Filterordnungen N in den
Spezialfällen mit N+1=L=2p (p ganz).
Als weitere Maßnahme zur Erhöhung der Systemtaktfrequenz dienen Pipeliningregister, die
das Arithmetikschaltnetz in Abschnitte mit ähnlichen Signallaufzeiten aufteilen sollen (vgl.
Kap. 6.4.2.2). So kann z.B. die Additionsebene der Produktpaare im balancierten
Addiererbaum von den folgenden Addiererstufen separiert werden (vgl. Bild 9-1b, c). Eine
Entkopplung der Addiererstufen ist bei großen Filterordnungen N>12 ggf. nur in Gruppen
erforderlich, da die Multipliziererebene je nach Vektorbreite eine vielfach größere Signal-
laufzeit einbringt als eine Addiererstufe. Jede Pipeliningstufe erhöht die Latenz, mit der
sich eine Eingangsaktualisierung x[n] am Ausgang y[n] verzögert auswirkt. Wenn die
Pipeliningstufen gefüllt sind, steht allerdings mit jedem Takt ein aktualisiertes Ergebnis am
Ausgang zur Verfügung.
Die Register zum Laufzeitausgleich (vgl. Bild 9-1b u. c) sind nur für den Fall in die Pfade
mit weniger Arithmetikelementen zu integrieren, dass die aktualisierten Eingangswerte x[n]
mit einer Abtastrate 1/T eintreffen, die dem Systemtakt 1/TCLK entspricht, mit dem das
Schieberegister und die Pipeliningstufen getaktet werden. An den Eingängen der Addierer-
stufen müssen nämlich Werte anliegen, die den gleichen zeitlichen Ursprung aufweisen.
Bei geringeren Datenraten (T >>TCLK) liegen zwischen den Aktualisierungszeitpunkten kT,
zu denen das Schieberegister gefüllt wird, sehr viele Systemtakte TCLK. Während des Inter-
valls kT bleiben die gespeicherten Eingangswerte x[n-k] und die Produkte P[k] konstant,
sodass für diese keine weitere Zwischenspeicherung im Addiererbaum erforderlich ist.
Auch aus Sicht der deutlich kleineren Anzahl an erforderlichen Pipeliningregistern und
Registern für den Laufzeitausgleich sowie der geringeren Latenz ist der balancierte
Addiererbaum einer Addiererkette vorzuziehen. Die folgende Tabelle 9-1 gibt im Vergleich
die zu implementierenden Pipeliningregister (PR) und Register für den Laufzeitausgleich
(LAR) für zwei Fälle an: a) Pipeliningstufe nur hinter den Addierern der Produkte und b)
komplettes Pipelining des Addiererschaltnetzes.
Anzahl Addiererkette Balancierter Addiererbaum
Addierer N N
Addiererstufen N 3.32log(N+1)
Register a)
Latenz: 1 Takt 1 PR, N-1 LAR N gerade: N/2 PR, 1 LAR;
N ungerade: (N+1)/2 PR
Register b)
Latenz N-1 PR, (N-1)N/2 LAR
N-1 Takte
N-1 PR , für N+1 = 2p
3.32log(N+1) Takte
Tabelle 9-1: Hardware-Ressourcen für die Realisierung des Addiererschaltnetzes eines FIR-Filters
der Ordnung N mit u. ohne Pipelining; PR Pipeliningregister, LAR Register zum Laufzeitausgleich
Neben diesen bisher erläuterten makroskopischen Struktureigenschaften des FIR-Filters
bestimmen die gewählten Wortlängen für das Eingangssignal x[n], die Koeffizienten ck und
die weiterverarbeiteten Produkte P[k] den Hardwarebedarf und die Signallaufzeiten in den
Arithmetikschaltnetzen. Als Dimensionierungskriterien kommen hier die jeweils anwen-
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
244 9 Modellierung digitaler Filter
dungsspezifischen Anforderungen an die Signalauflösung und an das angestrebte Übertra-
gungsverhalten des Filters im Durchlass- und Sperrbereich hinzu (vgl. Kap. 9.1.3).
In vielen praktischen Anwendungen sind linearphasige FIR-Filter erforderlich, die aufgrund
der von der Frequenz unabhängigen Gruppenlaufzeit τg=NT/2 eine verzerrungsfreie Über-
tragung bieten. Diese sind nur mit einem symmetrischen Koeffizientensatz realisierbar, der
z.B. über die Fenstermethode aus einem ideal rechteckförmig vorgegebenen Referenzfre-
quenzgang gewonnen wird. Im Fall der positiven Symmetrie sind die Koeffizienten ck zu
einer Symmetrieachse spiegelsymmetrisch, sodass nur eine Hälfte des Koeffizientensatzes
als Konstanten oder als RAM-Speicherplätze implementiert werden muss [70], [72], [74].
Auf Basis dieser Symmetrie nach Gl. 9-4 lassen sich alle wesentlichen Filtercharakteristi-
ken wie Tiefpass, Hochpass, Bandpass und Bandsperre realisieren. Als Einschränkung gilt,
dass FIR-Filter mit ungerader Ordnung N keine Hochpassfilter unterstützen. Die Frequenz-
gänge solcher Hochpassfilter sind bei der Nyquistfrequenz fNy=fa/2 an der oberen Fre-
quenzbereichsgrenze durch eine Verstärkung > 0 charakterisiert. Linearphasige Filter mit
ungerader Ordnung weisen jedoch bei fNy gerade eine Nullstelle auf [70], [75].
Gl. 9-4
Entsprechend zum kleineren Koeffizientensatz soll eine verringerte Anzahl an Multiplizie-
rern erreicht werden, um HW-Ressourcen im Arithmetikschaltnetz einzusparen. Die Über-
tragungsfunktion H(z) nach Gl. 9-3 lässt sich dazu durch Ausklammern gleicher Koeffi-
zienten ck mit weniger Produkten kürzer formulieren:
Gl. 9-5 2N
2N)1N(1
1N0
0 zc...)zz(c)zz(c)z(H Typ1, N gerade
Gl. 9-6 )zz(c...)zz(c)zz(c)z(H 2)1N(2)1N(2)1N(
)1N(11
N00
Typ2, N ungerade
Jeweils die Summe x[n-k]+x[n-(N-k)] von zwei gespeicherten Signalwerten geht in die
Multiplikationen ein, sodass die daraus resultierende Linear-Phasen-Struktur wie in Bild
9-2 mit etwa der Hälfte der Multiplizierer auskommt. Für gerade Filterordnungen (Typ 1)
verbleiben N/2+1 Multiplikationen, wobei immer die Multiplikation mit dem Koeffizienten
cN/2 separat aus der Mitte der Registerkette mit x[n-N/2] gespeist wird. Im Fall ungerader
Filterordnungen (Typ 2) sind (N+1)/2 Multiplikationen zu realisieren. Da die Anzahl der
Addierer und damit auch die der Addiererstufen gleich bleibt, ergibt sich ein schmalerer
balancierter Addiererbaum mit ld(N+1)-1 Stufen.
Ein weiterer Vorteil für den Hardware-Aufwand entsteht dadurch, dass nun im Fall
des Symmetrietyps 1 die Hälfte der Addierer vor den Multiplizierern nur noch die Signal-
vektoren mit der Breite j+1 addieren muss und die verbleibende Hälfte im balancierten
Addiererbaum die Produkte mit m=j+1+l Bits zusammenfasst. Durch die kürzere Ripple-
Positive Koeffizientensymmetrie mit Symmetrieachse bei N/2:
ck = cN-k mit k = 0, 1, 2, …, N/2 für N gerade; N/2+1 Koeff.
mit k = 0, 1, 2, …, (N-1)/2 für N ungerade; (N+1)/2 Koeff.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
245 9.1 FIR-Filter
Carry-Kette der Addierer vor den Multiplizierern kann sich eine Reduzierung der Sig-
nallaufzeiten des Arithmetikschaltnetzes ergeben.
Bild 9-2: Linear-Phasen-Struktur für N=6 mit (N/2+1) Multiplizieren u. balanciertem Addiererbaum
Eine dritte Strukturvariante für FIR-Filter erhält man mit dem Transponierungstheorem für
Signalflussgraphen, ohne dass die Übertragungseigenschaften des Filters verändert werden
[75]. Diese transponierte Form folgt aus der Direktform nach Bild 9-1 durch folgende
Schritte (vgl. Bild 9-3):
Vertauschen von Ein- und Ausgang.
Umkehr der Richtung aller Übertragungszweige.
Ersatz der Addierer durch Verzweigungen und umgekehrt.
Bild 9-3: FIR-Filter in transponierter Form; Filterordnung N=4
Den Hauptvorteil der transponierten Form liefert die zweifache Nutzung der Verzögerungs-
register, die hier auch die Entkopplung der Addiererstufen übernehmen. Der Aufbau der
transponierten Form ist durch die Verkettung von N Addiererstufen gekennzeichnet, die die
Ergebnisse vorausgehender Stufen mit jeweils einer Multiplikation x[n]ck kombinieren. Es
ist also kein balancierter Addiererbaum zu modellieren und ein Pipelining liegt auch schon
vor. Da die Registerstufen die Summe von Produkten aufnehmen, werden hier für die
Grundstruktur mehr D-FFs benötigt als im Fall der Direktform. Linearphasige Filter in
+ -1
Z
-1
Z
-1
Z
-1
Z
C4 C3 C2 C1 C0
x[n]
P[0]P[1]P[2]P[3]P[4]
j
m
l Bit Koeffizienten
y[n]+ + +
q
x[n] x[n-6]
+
+
+
+
Pipelining-
register
l Bit Koeffizienten
-1
Z
C0 C1 C2
x[n-1] x[n-2] x[n-3] x[n-4]
P[3]P[2]P[1]P[0]
j
m
y[n]
-1
Z
-1
Z
-1
Z
-1
Z
x[n-5]
++
-1
Z
C3
j+1
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
246 9 Modellierung digitaler Filter
transponierter Form erfordern keinen veränderten Aufbau, da alle Multiplikationen auf das
gleiche Eingangsignal x[n] wirken und aufgrund der Koeffizientensymmetrie je nach
Symmetrietyp N/2 bzw. (N+1)/2 Produkte gemeinsam in zwei Hälften der Addiererkette
genutzt werden können.
Die prinzipiell vorteilhaft erscheinende Verteilung nur eines einzigen Eingangssignals x[n]
an die Multiplizierer führt jedoch zu einem großen Fanout der treibenden Eingangsstufe:
Die Ausgänge der Eingangssynchronisationsregister werden durch die Vielzahl der
Verteilleitungen und der Multiplizierereingänge stark kapazitiv belastet, sodass die Signal-
laufzeit auf den Verdrahtungsressourcen des FPGAs zusätzlich zu den Schaltnetzverzöge-
rungen der Arithmetikpfade ins Gewicht fallen kann [8], [78].
Ein umfangreiches und weiterführendes Kompendium zur Implementierung von Kompo-
nenten der digitalen Signalverarbeitung mit FPGAs ist in [80] zusammen mit dem mathe-
matischen Entwurfshintergrund enthalten. Die dort vorgeschlagenen VHDL- und Verilog-
Modelle sind für FIR-Filter niedriger Ordnung mit Integer-Arithmetik formuliert und be-
rücksichtigen insbesondere spezielle Zahlendarstellungen für die Synthese mit Altera
Werkzeugen [82]. Ein Schwerpunktthema bildet die Implementierung der Summe von
Produkten (Sum Of Product) mit der „Distributed Arithmetic“ (DA)-Technologie, die auf
LUT-basierte FPGA-Strukturen zugeschnitten ist: Für FIR-Filter mit konstanten Koeffi-
zienten lassen sich durch Neuordnung der Summe nach Gl. 9-1 sequentielle Berechnungen
ableiten, die mit Bit-Schieberegistern, LUT-basierten Koeffiziententabellen und einem
Akkumulator realisiert werden. Diese Lösungen zeichnen sich insbesondere durch extrem
kurze Signallaufzeiten aus. Die Latenz kann je nach paralleler oder rein sequentieller Aus-
prägung höher ausfallen, als im Fall der diskreten Realisierung, wie sie im Folgenden vor-
gestellt wird. Ein DA-Entwurfsbeispiel unter Einsatz des Xilinx Core Generators behandelt
das Kapitel 7.4.2 [87].
9.1.2 Zahlendarstellung im Q-Format
Signale und Variablen in digitalen Systemen auf Basis von FPGA- und ASIC-Hardware-
Plattformen werden mit VHDL auf Bitvektorebene modelliert. Für die unsigned and
signed Vektordatentypen sind die arithmetischen Operatoren +, - und * in der Bibliothek
ieee.numeric_std definiert. Damit stehen dann Integerzahlen und rein gebrochene
Zahlendarstellungen, d.h. die Fractional-Zahlen, sowie deren Kombination für die 2er-
Komplementarithmetik zur Verfügung.
Für eine Integerdarstellung als Bitstring mit der Wortlänge B+1 und einem Binärpunkt ( )
gilt [74], [75]:
xBin = bB bB-1 ... b1 b0 mit b (0,1).
Negative Zahlen sind durch ein Vorzeichenbit bB=1 gekennzeichnet und die größte dar-
stellbare Zahl ist xDezmax=2B-1. Die äquivalente Dezimalzahl zu xBin ergibt sich aus:
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
247 9.1 FIR-Filter
Gl. 9-7
1B
0i
ii
BBDez 2b2bx
Für Fractional-Zahlen im Q-Format gilt ein Bitstring mit der Form:
xBin = bB bB-1 ... b1 b0 mit b (0,1) und einem Vorzeichenbit bB =1 für xDez < 0.
Dieses QB-Format repräsentiert Zahlen im Intervall -1 xDez < 1 mit:
Gl. 9-8
B
1i
iiBBDez 2bbx
Bewährt hat sich die Fractional-Darstellung im Q-Format für die Eingangs- und Ausgangs-
signale, Koeffizienten sowie Rechengrößen in digitalen Systemen, da Multiplikationser-
gebnisse im Bereich -1 ≤ xDez < 1 begrenzt bleiben und betragsmäßig in Richtung des LSBs
b0=2-B streben. Die QB-Notation angewandt auf Vektordatentypen sagt aus, dass die Binär-
darstellung B Bits rechts des impliziten Binärpunktes enthält. Dies ist hier in einer beispiel-
haften Schreibweise dargestellt, die zur Erklärung der Vektorbreitenwahl und von Ergeb-
niszahlendarstellungen in den folgenden Abschnitten genutzt wird:
QB: sign bit B significant bits = sign msb … lsb z.B. für das Signal x[sign. B-1 : 0]
Ein internes Signal X mit B+1=12 Bits, das der Anwender im Q11-Format sieht, ist dann
deklariert als:
signal X: signed(B downto 0); -- Generic B : postive := 11
Nur der Anwender hat diese Betrachtungsweise des QB-Formates und bringt die entspre-
chend konsistent skalierten Eingangsgrößen und Koeffizienten in die Deklarationen,
Testbenches und Schnittstellen der FPGA-Plattform ein. Der VHDL-Simulator und das
Synthesewerkzeug hingegen nehmen die Größen so wie angeboten und arbeiten mit der
Binärdarstellung des Integerstrings, der zur Gl. 9-7 gehört. Die Ergebnisse der 2er-
Komplementarithmetik sind auf Bitebene selbstverständlich unabhängig von der speziellen
Interpretation als Q-Formatgrößen, da es sich um eine spezifische Sicht der Bitpositionen
handelt. Die Darstellung der Gl. 9-8 geht nämlich aus der in Gl. 9-7 durch B-Schiebevor-
gänge nach rechts hervor.
Ein B+1=5-Bit-Filterkoeffizient im Q4-Format hat z.B. folgende Deklaration:
constant C0: signed(4 downto 0):= 01011; -- 0.6875 = 11/16
Für zwei exemplarische Wortlängen sind in Tabelle 9-2 einige Kennwerte der Zahlendar-
stellung des Q-Formates zusammengestellt. Der maximale Quantisierungsfehler 2-(B+1), der
beim Runden von LSB-Bitpositionen auftritt, wird auch als Präzision bezeichnet. Eine
Vektorverkürzung durch Abschneiden von niederwertigen Bitpositionen führt hingegen zu
unsymmetrischen Wertveränderungen [74]:
positive Größen mit Wertverkleinerung um maximal 2-B,
negative Größen mit Betragszunahme um maximal 2-B.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
248 9 Modellierung digitaler Filter
Tabelle 9-2: Q-Formatkennwerte für Q7- und Q11-Zahlendarstellungen.
9.1.2.1 Addition mit vorzeichenrichtiger Erweiterung der Summanden
Für eine überlauffreie Realisierung von 2er-Komplement-Summen und die Interpretation
von Multiplikationsergebnissen sind auch Kombinationen aus dem Q-Format und der
Integerdarstellung erforderlich. Eine Addition zweier QB-Größen A und C, die jeweils den
positiven Maximalwert 1-2-B annehmen können, liefert maximal den Wert 2-2-B+1, der
aufgrund des Integeranteils nicht im QB-Format allein darstellbar ist. Der Ergebnisvektor
SUM ist also um eine Bitstelle breiter zu wählen, die den Integeranteil (Übertrag) aufnimmt
(vgl. Bild 9-2). Da Signal- und Variablenzuweisungen auf beiden Seiten der Zuweisung den
gleichen Datentyp und die gleiche Vektorbreite aufweisen müssen, sind die Summanden A
und C zusätzlich mit einer vorzeichenrichtigen Erweiterung an die Breite des Summenvek-
tors SUM anzupassen [78]:
... signal A, C: signed(7 downto 0); -- inputs
signal SUM: signed(8 downto 0); -- result
begin
SUM <= (A(A’left) & A) + (C(C’left) & C) after 5 ns;
Das Attribut A’left definiert das linke Element aus dem Vektor A und liefert den Index
des MSBs zur Zeit der Compilierung, sodass jeweils eine Verkettung mit dem Vorzeichen-
bit erfolgt [13], [37]. Die Klammern um die erweiterten Summanden sind notwendig, da
der Additionsoperator stärker bindet als der Verkettungsoperator [37].
Zur Kennzeichnung der mehrfachen Vorzeichenbits und deren Bedeutung für die Aufnah-
me der ganzzahligen Summenanteile dient hier die symbolische Schreibweise der Bitpositi-
onen:
SUM[sign. 7 : 0] = SUM[sign,guard. 6 : 0] = A[sign,sign. 6 : 0] + C[sign,sign. 6 : 0]
Die in SUM angegebene Bitposition „guard“ stellt ein Sicherheitsbit dar, das den Übertrag
aus der Summe der Fractional-Anteile von A und C aufnimmt. Geht man vom maximalen
Wertebereich der Summanden aus, so sind bei n Summanden im Ergebnisvektor insgesamt
3.32log(n) Guard-Bits einzurichten.
Wortlänge, Vektorlänge B+1 8 Bit 12 Bit
Quantisierungstufe (LSB) D = 2-B 2-7 = 0.0078125 2-11 = 0.000488281
Größte positive Zahl (1 – 1LSB) 1 – 2-B 0.9921875 0.999511718
Kleinste negative Zahl -1 -1 -1
Dynamik = Max/Min 2B – 1 2B 128 –1 = 127 2048 –1 = 2047
Maximaler Quantisierungsfehler D/2 = 2-(B+1) 0.00390625 0.00024414
Abschneiden niederwertiger Bits -D= -2-B -0.0078125 -0.000488281
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
249 9.1 FIR-Filter
9.1.2.2 Binäre Multiplikation
Auch bei der Multiplikation ist die Vektorbreite des Ergebnisses auf die der Faktoren anzu-
passen. Eine Multiplikation mit einem QB1-Multiplikanden und einem QB2-Multiplikator
ergibt ein QB3-Ergebnis. Darin stehen B3=B2+B1 Bits rechts vom impliziten Binärpunkt
und der gesamte Vektor enthält B3+2 Bits [8], [70], [73]. Eine Q-Format-Multiplikation
liefert nämlich zwei Vorzeichenbits, von denen das linke Bit ein „echtes“ Vorzeichen ist
und das rechte Bit vor dem Binärpunkt als Guard-Bit genutzt werden kann. Zu den folgen-
den Codezeilen lässt sich zur Verdeutlichung wieder eine symbolische Beschreibung der
Bitpositionen angeben.
...
constant COEFF: signed(7 downto 0) := x"7f"; -- 127/128 multiplier Q7
signal STAGE: signed(11 downto 0); -- multiplicand Q11
signal MUL: signed(19 downto 0); -- result Q18
begin
MUL <= STAGE * COEFF after 6 ns;
Der Ergebnisvektor ist also so breit zu wählen, wie die Summe der Vektorbreiten auf der
rechten Seite. In Filterstrukturen bilden die Multipliziererergebnisse die Summanden für die
Addiererbäume, sodass das zweite Vorzeichen einen Beitrag zur vorzeichenrichtigen Er-
weiterung liefert und zugleich für eine Addition die Position eines Guard-Bits vorbereitet.
MUL[sign,sign. 17 : 0] = MUL[sign,guard. 17 : 0] =
STAGE[sign. 10 : 0] * COEF[sign. 6 : 0]
Ein Überlaufschutz der 2er-Komplementarithmetik lässt sich für interne Signale allein mit
Guard-Bits korrekt realisieren. In der Direktform nach Bild 9-1 ist die maximale Breite
m+g des Summenvektors Y[n] für den Fall angegeben, dass ohne Skalierung für jedes
Produkt P[k] der Maximalwert 1 angenommen werden muss. Die Erweiterung um g Guard-
Bits ergibt sich zu ld(N+1)-1, da die Produktbreite m schon ein Guard-Bit berücksichtigt.
Dies führt jedoch zu einer Worst-Case-Auslegung der Vektorbreiten mit einem unnötig
erhöhten Bedarf an HW-Ressourcen für die Addiererlogik, die Pipelining-Flipflops und die
Verdrahtung. Im Fall von konstanten Filterkoeffizienten ist die Begrenzung der Signalwerte
durch eine Skalierung der Koeffizienten zusammen mit einer Absicherung auf Basis weni-
ger Guard-Bits effizienter realisierbar. Dieser Entwurfsweg wird im nächsten Abschnitt für
die ausgewählten FIR-Filterstrukturen vorgestellt.
Die Entscheidung zur Hardware-Struktur, in der der Multiplikationsoperator realisiert wird,
kann über Parameter des jeweiligen Synthesewerkzeugs gesteuert werden. In FPGAs stehen
dedizierte Multiplizierer mit festgelegter maximaler Operanden- und Ergebnisbreite zur
Verfügung, die für eine minimale Signallaufzeit ausgelegt sind. Ebenso lassen sich
Multiplizierer mit den Look-Up-Tabellen und der Carry-Logik realisieren [78], [82], [84].
Zur Veranschaulichung der HW-Struktur, die den parallelen Array-Multiplizierern in
FPGAs zu Grunde liegt, dient hier ein Beispiel für eine binäre, vorzeichenbehaftete Multi-
plikation von Zahlen im Q-Format (vgl. Bild 9-4) [8], [78]. Die handschriftliche Multiplika-
tion von Dezimalzahlen gibt dafür das Schema vor: Teilprodukte, die durch Multiplikation
des Multiplikanden mit den einzelnen Stellen des Multiplizierers entstehen, werden sukzes-
sive addiert. Die Hardware-Struktur der binären Multiplikation in Bild 9-4 setzt sich im
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
250 9 Modellierung digitaler Filter
Wesentlichen aus verketteten 2er-Komplement-Additionen zusammen. Die zu addierenden
Teilprodukte entstehen hier durch Bewertung des Multiplikanden mit der jeweiligen Bit-
stelle des Multiplizierers, wobei mit dessen LSB begonnen wird. Eine Bitstelle mit „1“
reproduziert den Multiplikanden und eine „0“ erzeugt einen Null-Summanden. Je nach
Position der Bitstelle im Multiplizierer ist der Multiplikand entsprechend oft nach links zu
schieben, um das Gewicht der bewertenden Bitstelle zu berücksichtigen.
Damit die Additionen überlauffrei erfolgen, ist jeweils eine Vorzeichenerweiterung der
Summanden durchzuführen, die in Bild 9-4 kursiv gekennzeichnet sind. Überträge der
Summen über die Länge der Summanden hinaus sind solange zu verwenden bis sich keine
Änderung bei den führenden Summenbits mehr ergibt (vgl. 2. Teilsumme). Dabei ist die
vorzeichenrichtige Erweiterung der Summanden zu beachten. Eine besondere Stellung
nimmt in diesem Beispiel das 5. Teilprodukt ein, da das MSB des Multiplizierers als Vor-
zeichenbit eine 2er-Komplementbildung des Multiplikanden verlangt (01110). Abschlie-
ßend ist der Binärpunkt so zu platzieren, dass die Länge des Fractional-Anteils der Summe
der QB-Formate aus den beiden Faktoren entspricht. Das 10 Bit breite Ergebnis enthält ein
Q8-Format und die beiden Vorzeichenbits der positiven Zahl.
Bild 9-4: Binäre Multiplikation von negativen Zahlen im Q4-Format; Summen von Teilprodukten
bilden ein Q8-Ergebnis mit zwei Vorzeichenbits
9.1.3 Filterskalierung und Beispielfilter
Mit der Filterskalierung durch Modifikation der Filterkoeffizienten sollen Überlaufeffekte
in den Addierern der Produkte verhindert werden. Findet nämlich ein Übertrag auf das
Vorzeichenbit statt, so wird der jeweilige 2er-Komplement-Zahlenbereich überschritten und
positive Werte werden zu negativen Werten verfälscht bzw. umgekehrt. Dies führt zu Sig-
nalverzerrungen, die zusätzliche harmonische Frequenzanteile erzeugen und sogar die
Grundschwingung auslöschen können. Überlaufeffekte, die z.B. durch versetzte Sinuskup-
pen erkennbar sind, zeigt das Ausgangsignal yn eines Sinusgenerators mit einer 2 kHz
Grundschwingung in Bild 9-5. Ein 12-Bit-Vektor bildet das Intervall [-1 , +1) auf den Be-
reich 800Hex ≤ yn < 7FF Hex ab.
Multiplikand * Multiplizierer
-0.875 * (-0.6875)
04375
61250
065625
700000
0765625
5250000
0.6015625
1. Teilprodukt
2. Teilprodukt
1. Teilsumme
3. Teilprodukt
2. Teilsumme
4. Teilprodukt
3. Teilsumme
5. Teilprodukt
1.0010 * 1.0101
110010
000000
11110010
11001000
110111010
000000000
1110111010
0011100000
00.10011010
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
251 9.1 FIR-Filter
Bild 9-5: Simulation eines Sinusgenerators; 0.5 ms Periodendauer, 48 kHz Abtastfrequenz, Über-
laufeffekte
Die Herleitungen aller Skalierungsvorschriften basieren darauf, dass zentrale Summations-
knoten wie in Bild 9-1a überlauffrei arbeiten sollen [70], [74], [75]. Der hier gewählte
Skalierungsansatz verlangt, dass das Ausgangssignal y[n] bei begrenztem Eingangssignal
│x[n]│≤ 1 innerhalb des 2er-Komplement-Zahlenbereiches bleibt. Aus Gl. 9-1 ergibt sich
für │y[n]│die folgende Betragsungleichung, da auf der rechten Seite keine Kompensation
von negativen und positiven Summanden erfolgen kann:
Gl. 9-9
N
0kk ]kn[xc]n[y
Im abzusichernden Worst-Case wird │x[n]│ maximal 1, so dass gilt:
Gl. 9-10
N
0kkc]n[y
Wird die rechte Seite in Gl. 9-10 mit modifizierten Koeffizienten kleiner 1 eingestellt, dann
bleibt der Summationsknoten des FIR-Filters in Direktform überlauffrei. Die so genannte
L1-Norm ergibt sich aus der Betragssumme der Koeffizienten:
Gl. 9-11
N
0kk1 cL
Die einzelnen Koeffizienten werden mit 1/L1 multipliziert. Damit einher geht eine verklei-
nerte Filterverstärkung, sodass die Ausnutzung des mit der gewählten Vektorbreite verfüg-
baren Signalhubs und das Verhältnis Signal/Quantisierungsrauschen verschlechtert werden.
Diese Effekte können bei der L1-Norm verstärkt auftreten, da sie von drei üblichen Skalie-
rungsverfahren den konservativsten Ansatz darstellt [75]. Falls in der jeweiligen Anwen-
dung im unteren Aussteuerungsbereich ein störendes Quantisierungsrauschen nachweisbar
ist, das durch Runden oder Abschneiden von Multiplikationsergebnissen entsteht, sind
Untersuchungen mit den anderen Skalierungsvarianten durchzuführen.
Es ist insbesondere zu beachten, dass die bei der Herleitung der Skalierungsvorschriften
angenommenen zentralen Summationsknoten weder in FPGAs noch in Software mit Fest-
Überlauf
Überlauf
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
252 9 Modellierung digitaler Filter
kommaarithmetik für digitale Signalprozessoren so realisierbar sind. Nach Bild 9-1 liegen
immer Ketten von Addierern vor, sodass die Skalierung nur für den letzten Summations-
punkt gilt. Die Überlauffreiheit der inneren Additionen ist gesondert zu prüfen. Dieser
Sachverhalt wird im Rahmen der VHDL-Modellierung und der Diskussion der Syntheseer-
gebnisse behandelt.
Als Beispielfilter für die VHDL-Modellierungen wird ein Tiefpass mit der Filterordnung
N=22 (Typ 1), einer Eckfrequenz fc=10 kHz für eine Abtastfrequenz von fa=48 kHz ge-
nutzt. Die Koeffizientenberechnung erfolgte mit der MATLAB-Funktion fir1, der das
Fensterentwurfsverfahren zugrunde liegt und die eine Gewichtung der symmetrischen
Koeffizienten mit dem Hamming-Fenster implementiert. Für die Skalierung mit der L1-
Norm hat sich die Betragssumme der Koeffizienten zu L1=1.5009 ergeben.
In der Frequenzgangdarstellung |H(f)| nach sind neben dem genauen Verlauf auch die Fre-
quenzgänge für 8 Bit und 12 Bit breite Koeffizienten angegeben. Um den Einfluss einer
Festkommadarstellung der Koeffizienten mit begrenzter Wortlänge aufzuzeigen, wurden
diese zuerst in eine binäre Form mit 8 Bit bzw. 12 Bit und anschließend zurück in eine
Gleitkommadarstellung gewandelt. In der Fixed-Point Toolbox von MATLAB steht dafür
die Funktion quantize zur Verfügung, die eine parametrisierbare Quantisierung der
Koeffizienten durchführt, zu denen das Filter-Visualisierungswerkzeug FVTool bzw. die
Funktion fvtool die modifizierten Frequenzgänge darstellt [85].
Bild 9-6: Mit L1 skalierte Frequenzgänge |H(f)| des FIR-Tiefpassfilters; VHmax=1/L1=0.663; N=22,
fc=10 kHz, fa=48 kHz
0 5 10 15 20
10-4
10-3
10-2
10-1
100
f/kHz
|H(f
)|
8 Bit Koeffizienten
12 Bit Koeffizienten
fc
0.5/1.50091/1.5009
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
253 9.1 FIR-Filter
Die 12-Bit-Koeffizienten werden für die VHDL-Modellierung genutzt, da sie für die Ziele
dieser Einführung in die Filtermodellierung einen akzeptablen Kompromiss zwischen aus-
reichender Frequenzganggenauigkeit und realistischem Bedarf an FPGA-Ressourcen lie-
fern.
Die Koeffizienten des Tiefpasses erscheinen direkt in der symmetrischen Impulsantwort
(x[n]=1 für n=0), da ein einzelner Wert x[n]=1 durch die Registerkette des FIR-Filters
getaktet wird und so die Produkte sukzessive den Ausgang y[n] bestimmen (vgl. Bild 9-7).
Als Referenz für die VHDL-Simulationen wird die Sprungantwort dienen, die die sukzessi-
ve Summation der Koeffizienten repräsentiert und damit proportional zum zeitlichen Integ-
ral der Impulsantwort verläuft. Am stationären Endwert der Sprungantwort (x[n]=1 für alle
n) ist die auf 1/L1 reduzierte Verstärkung des Tiefpasses ablesbar. Eine Übersteuerung des
Scheitelwerts von y[n]max=0.721 für n=13 (t=271 µs) liegt auch nicht vor. Der Aussteue-
rungsbereich lässt sich verbessern, indem der Scheitelwert y[n]max der nicht skalierten
Sprungantwort oder andere L-Normen zur Skalierung genutzt werden [74]. Die Verbin-
dungslinien zwischen den jeweils N+1 diskreten Werten in Bild 9-7 dienen nur zur Unter-
scheidung der beiden Systemantworten, sie sollen nicht als Interpolation verstanden wer-
den. Erstellt wurden die Systemantworten mit den MATLAB-Funktionen impz, stepz
und plot.
Bild 9-7: Mit L1 skalierte Impuls- und Sprungantwort des Tiefpassfilters; ymax=0.721, N=22, fc=10
kHz, fa=48 kHz
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
x 10-4
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Am
pli
tud
e
t/s
Sprungantwort
Impulsantwort
1/L1 = 0.6663
0.721096
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
254 9 Modellierung digitaler Filter
9.1.4 VHDL-Modelle paralleler FIR-Filterstrukturen
Zu den im ersten Abschnitt erläuterten FIR-Filterstrukturen erfolgt in diesem Abschnitt die
Beschreibung von VHDL-Modellen, deren Entwurf die Inhalte aus den Kapiteln 3 und 5
vertieft und erweitert. Der Schwerpunkt der Modellierungstechnik für die parallelen Struk-
turen ist auf eine Wiederverwendbarkeit für den weiten Bereich der digitalen Signalverar-
beitung ausgerichtet. Die Ausführungen zur Abbildung von Algorithmen auf FPGA-
Hardware und der vorgestellte Codierstil stehen unter folgenden Leitlinien:
Transfer der auf Übertragungsfunktionen oder Differenzengleichungen basierenden
Systembeschreibung in getaktete und kombinatorische Prozesse.
Einsatz von Arrays und Variablen mit Vektordatentypen zur Arithmetikmodellierung in
wenigen kombinatorischen Prozessen, sodass die Anzahl der internen Koppelsignale ge-
ring bleibt. Dies unterstützt einerseits die Übersichtlichkeit der Codiermuster für Filter
und anderseits wird damit die Effizienz der VHDL-Simulation erhöht.
Nutzung von for loop-Konstrukten in einem kompakten Coderahmen zur Steuerung
des Synthesecompilers mit dem Ziel der Verkettung von Registern, Addierern und
Multiplizierern.
Anwendung von Integerarithmetik zur Vektor-Arrayindizierung und zur Abarbeitungs-
kontrolle innerhalb der for loop-Konstrukte.
Überprüfung der Implikationen des Codierstils auf die Struktur der Syntheseergebnisse
und auf das FPGA-Timing.
Aufzeigen von geeigneten Strukturerweiterungen mit Pipeliningstufen zur Steigerung
der erreichbaren Taktfrequenz mit Blick auf eine minimale Latenz.
Zum Vergleich der hier vorgestellten Modelle schließt dieser Abschnitt deshalb auch ab mit
einer Übersicht zu exemplarischen Synthese- und Implementierungsergebnissen, die den
Bedarf an FPGA-Ressourcen wie Daten-Flipflops und Look-Up-Tabellen sowie die reali-
sierbaren Taktfrequenzen aufzeigen.
9.1.4.1 Kopplung von unterschiedlichen Taktbereichen
Eingebettet sind die FIR-Filtermodelle in ein Freigabekonzept, das eine für die Praxis typi-
sche Kopplung von unterschiedlichen Taktbereichen beschreibt. Die erforderliche Synchro-
nisation zwischen den Taktbereichen zur Vermeidung von metastabilen Zuständen in den
Datenpfadregistern erfolgt mit dem Aufbau nach Bild 9-8. Für die Taktbereiche sind hier
exemplarisch folgende Frequenzen gewählt worden:
Die Abtastsignalerfassung erfolgt durch einen Audiocodec, der mit fI=12 MHz arbeitet,
sodass das Delta-Sigma-ADU-Verfahren mit Überabtastung betrieben werden kann
[70]. Abtastfrequenz: 1/T=fa=48 kHz.
Das Steuerinterface auf der FPGA-Seite, das den Codec im Slavebetrieb mit fI=12 MHz
versorgt, nimmt den Abtastwert als seriellen Bitstrom auf und stellt diesen als parallelen
20-Bit-Signalvektor X (h=20) zur Verfügung. Mit der Abtastperiode T=1/fa=20.83 µs
erzeugt das Interface einen Freigabepuls READY, der die Aktualisierung des Signal-
vektors X anzeigt und eine Dauer von 1/fI=83.33 ns hat.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
255 9.1 FIR-Filter
Das digitale Filter und die ggf. vorhandenen weiteren Signalverarbeitungsstufen werden
durch das Signal CLK mit fCLK=48 MHz getaktet.
Bild 9-8: Synchronisation zwischen den Taktbereichen fI=12 MHz und fCLK=48 MHz mit Freigabe-
pulsverkürzung für die Filter-Direktform nach Bild 9-1; h=20, j=12, m=24
Die Dauer des Freigabepulses READY ist um den Faktor fCLK/fI=4 zu verkürzen, damit auf
der höheren Frequenzebene von fCLK das Abtastsignal X mit dem synchronisierten Freiga-
bepuls RD_S nur einmal in die Registerkette der Direktform nach Bild 9-1 eingetaktet wird.
Mit mehrfach eingetakteten, gleichen X-Werten findet quasi eine Interpolation zwischen
den Abtastzeitpunkten mit gleichen Werten statt, sodass die Registerkette z.B. bei Sprung-
anregung schon nach weniger als N*T Abtastzyklen gefüllt ist. Dies bewirkt eine scheinba-
re Erhöhung der Abtastfrequenz fa, woraus eine Verschiebung der wirksamen Filtereckfre-
quenz fc hin zu höheren Werten resultiert. Mit der Beziehung für die Koeffizienten eines
idealen Tiefpasses auf Basis der Fensterentwurfsmethode lässt sich dies verdeutlichen (vgl.
Gl. 9-12) [70], [72]:
Gl. 9-12 k)Tkf2sin(c ck ; k;0k
Tf2c ck ; 0k
Bei unveränderten Koeffizienten ck und demnach jeweils konstantem Argument der Sinus-
funktion steigt das realisierte fc mit reduziertem T. Da das Filter mit der Ordnung N=22 für
fCLK/fI=4 schon nach 6 Abtastzyklen gefüllt ist, lässt sich der Anstieg der Eckfrequenz mit
Gl. 9-12 auf fc*22/6 abschätzen. Plausibel wird die vergrößerte Eckfrequenz fc auch durch
die Grenzbetrachtung, die komplette Registerkette nach Bild 9-1 in einem Abtastschritt mit
einem Wert X=1 (7FFHex , j=12) zu füllen. Das Filter berechnet dann die Summe der Koef-
fizienten ck, sodass für den unskalierten Fall ein Einsverstärker entsteht, der als Allpass
keine Eckfrequenz hat.
Dem digitalen Filter ist in Bild 9-8 ein Übernahmeregister vorgeschaltet, das den kombina-
torischen Pfad bestehend aus der Multiplikation mit c0 zusammen mit der Addiererkette
von vorausgehenden Stufen entkoppelt (vgl. Bild 9-1 u. Abschnitt 6.4.2). Im Anschluss an
den Puls RD_S ist die Registerkette aktualisiert und die Berechnung des Filterausgangs
ADDA hat innerhalb einer Periode des Taktsignals CLK zu erfolgen. Das Ergebnis ADDA
wird von einem Übergaberegister Y aufgenommen, das durch den Puls FIR_EN freigege-
ben wird, der gegenüber dem Puls RD_S um einen Takt (CLK) verzögert ist. Dieses
Q
QSET
CLR
D
Q
QSET
CLR
D
Q
QSET
CLR
D
&0
0
0
X
Digitales
FilterCEQ
QSET
CLR
D
CE Q
QSET
CLR
D
CE
Y
CLK
READY
TEMP_1
TEMP_2
RD_S
ADDA
FIR_EN
h m h
CLK
j
RD_S
Pulsverkürzung
Übernahmeregister
Übergaberegister
fCLK = 48 MHz
X u. READY periodisch mit
fa = 48 kHz,
synchronisiert auf
fI = 12 MHz
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
256 9 Modellierung digitaler Filter
Übergaberegister entkoppelt die Filterarithmetik von den Eingangsstufen der ggf. folgenden
Signalverarbeitungsmodule bzw. vom Codec-Interface. Die verzögerte Freigabe des Über-
gaberegisters realisiert die sprungförmige Übertragungseigenschaft des FIR-Filters (vgl. Gl.
9-1). Eine gemeinsame Freigabe aller Register durch den Puls RD_S führt nämlich dazu,
dass die Aktualisierung des Ausgangs Y um eine Abtastperiode T verspätet erfolgen würde.
Durch diese Kapselung des Filters (vgl. Bild 9-8) liegt ein lokalisierbarer längster Signal-
laufzeitpfad in der Filterstruktur vor, sodass die Timingeigenschaften der verschiedenen
Filterstrukturen isoliert analysiert und miteinander verglichen werden können.
Als Ersatz für ein Codec- und ein Interfacemodell dient eine Testbench, die die Filterstimu-
li CLK und READY sowie die Sprunganregung X generiert (vgl. Code 9-1). Darin ist die
höchste Frequenz fCLK mit einem generic parametrisiert, sodass alle niedrigeren Zeit-
kennwerte daraus ableitbar sind. Der Prozess CODEC erzeugt das Zeitraster der Abtastpe-
riode T als Vielfaches der Taktperiode 1/fCLK in einer WHILE LOOP mit N+2 READY-
Pulsen. Es sind N+1 READY-Pulse erforderlich, damit nach N Abtastperioden die Sprung-
antwort stationär ist, da dann das Übergaberegister und die Registerkette des Filters mit
dem Wert X gefüllt sind. Jeder Durchlauf des Prozesses dauert in der Summe der beiden
wait for-Verzögerungen T=20.83 µs. Mit der flexiblen generic-Arithmetik lässt sich
das Zeitraster der READY-Pulsdauer 1/fI=4/fCLK innerhalb der WHILE LOOP-Zyklen
präzise einstellen. Nach Abschluss der WHILE LOOP bleibt der X-Pegel konstant und es
werden keine weiteren READY-Pulse mehr gesendet. Die Filterregisterkette führt demzu-
folge keine Schiebevorgänge mehr aus und der stationäre Endwert des Filters bleibt erhal-
ten. Als „Device Under Test“ (DUT) ist hier die Direktform FIR_DIRECT_AK instanziiert,
die im folgenden Abschnitt als erstes Filtermodell vorgestellt wird.
-- Testbench simuliert Codec und Interfacekomponente
-- Codec liefert X mit 20 Bit Signalauflösung library IEEE;
use IEEE.std_logic_1164.all;
entity FIR_TB is -- keine externen Schnittstellen
generic( PERIODE48MHZHALBE: time:= 10.41666667 ns;-- 1/(2fclk)
VB: positive := 20; -- Vektorbreite h
N: positive := 22); -- Filterordnung
end entity FIR_TB;
architecture FIR_FILTER of FIR_TB is
component FIR_DIREKT_AK -- Direktform mit Addiererkette
generic(DAC_WIDTH: positive; ADC_WIDTH: positive; -- Vektorbreite h
N: positive ); -- Filterordnung
port
(CLK: in bit; -- Taktsignal 48 MHz
RESET_N: in bit; -- active-low
RD: in bit; -- Anzeige eines aktualisierten Abtastwertes X
XN: in bit_vector(ADC_WIDTH -1 downto 0); -- Signal aus dem ADC
YN: out bit_vector(DAC_WIDTH -1 downto 0) -- Signal zum DAC
);
end component;
signal CLK, CLR_N, READY: bit; -- Stimuli
signal X, Y: bit_vector(VB -1 downto 0); -- Codec-Schnittstellen Q(VB-1)
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
257 9.1 FIR-Filter
begin
CLOCK: process -- 48 MHz Takt
begin
CLK <= '0'; wait for PERIODE48MHZHALBE;
CLK <= '1'; wait for PERIODE48MHZHALBE;
end process CLOCK;
RESET: process
begin
CLR_N <= '0';
wait for (PERIODE48MHZHALBE * 2); -- low active reset
CLR_N <= '1';
wait; -- keine Veränderung nach unbedingtem wait
end process RESET;
CODEC: process -- N + 2 READY-Pulse im Abstand T=1/(48 kHz)
variable NUM: integer range 0 to N +2; -- zählt die Abtastwerte X
begin
NUM := 0; -- Zählt die Abtasterte x
WHILE ( NUM <= N + 1) LOOP
READY <= '1';
X <=x"7ffff"; -- 20 Bit Sprunganregung mit maximal positivem Pegel
wait for (PERIODE48MHZHALBE *2 *4); -- Pulsdauer 1/12 MHz
READY <= '0';
wait for ((PERIODE48MHZHALBE * 2000) - (PERIODE48MHZHALBE * 2 * 4));
-- 48 kHz Abtastperiode
NUM := NUM + 1;
END LOOP;
wait; -- unbedingter Halt nach N + 2 Abtastperioden T
end process CODEC;
DUT: entity work.FIR_DIRECT_AK(PARALLEL) -- Instanziierung des Filters
generic map(DAC_WIDTH => VB, ADC_WIDTH => VB, N => N)
port map(CLK => CLK, RESET_N => CLR_N, RD => READY, XN => X, YN => Y);
end FIR_FILTER; -- named association of ports: formal => actual
Code 9-1: Testbench FIR_TB generiert die Filteransteuerung mit dem Takt CLK, der Freigabe
READY und der positiven Sprunganregung X=7FFFFHex
9.1.4.2 Basismodell der Direktform
Das Basismodell für die FIR-Filter nach Code 9-2 realisiert eine Direktform mit
Addiererkette. Dieses Modell dient vorab zur Erläuterung der Invarianten aller nachfolgend
vorgestellten FIR-Filterstrukturen:
Synchronisation und Kopplung der Taktbereiche.
for loop zur Mehrfachgenerierung von verketteten und parallelen Funktionselemen-
ten auf Basis von Array-Typen.
Simulationsergebnisse der Sprungantwort im Vergleich zu den MATLAB-Referenzen.
Auswirkung der Vektorbreitenwahl auf die quantitativen Eigenschaften der Berech-
nungsergebnisse.
Abgleich des Codierstils für die Filterarithmetik mit den zu erwartenden Syntheseer-
gebnissen der Addiererbäume.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
258 9 Modellierung digitaler Filter
Prozesse gliedern das Modell ausgehend von den Strukturen in Bild 9-1a und Bild 9-8:
Der Prozess PULSE_SHORTER fasst alle Daten-Flipflops der Pulsverkürzung und der
Pulsverzögerung zusammen.
Der Prozess STAGES modelliert die Registerkette und die Schiebevorgänge, wobei das
Übernahmeregister die erste Stufe bildet.
Die Filterarithmetik mit der Summe der N+1 Produkte ist im kombinatorischen Prozess
MULL_ADD mit Variablen formuliert.
Die Ausgangsschnittstelle bildet das Übergaberegister im Prozess A_REG.
Die symbolischen Signalverzögerungen in den getakteten Prozessen passen mit 3 ns
besser zu den Flipflop-Timingeigenschaften aktueller FPGAs als die z.B. in Kap. 6 an-
gegebenen Werte [84].
Die Deklarationen von Vektorarray-Typen mit Integerindizierung unterstützen hier die
Modellierung der Signalverarbeitung in mehrstufigen Systemen. Parametrisiert ist die Ele-
mentanzahl jeweils in Abhängigkeit von der Filterordnung N nach den Angaben in Ab-
schnitt 9.1.1. Die Vektorbreiten für die Registerkette STAGE und die Koeffizienten
COEFF sind beide als Q11-Vektoren (j=l=12) gewählt worden (vgl. Abschnitt 9.1.3). Dem-
entsprechend müssen die Produktvariablen PRODUCTS mit Q22 in folgender Form als
24-Bit-Vektoren formuliert werden (vgl. Abschnitt 9.1.2.2, Breite m in Bild 9-1):
PRODUCTS(I)[sign,sign. 21:0] = PRODUCTS(I)[sign,guard. 21:0]
Diese Vektorbreite hat hier auch die Addierervariable ADD (m=24) im Prozess
MUL_ADD, die so mit dem Guard-Bit zusätzlich zur Filterskalierung einen Überlaufschutz
bietet, da Werte im Intervall -2 ≤ ADD ≤ 2 - 1 LSB darstellbar sind (1 LSB=2-22).
-- FIR Filter in Direktform, fc = 10 kHz, Abtastfrequenz 48 kHz -- Addiererkette für N = 22, skaliert mit L1 = 1.5009
library IEEE;
use IEEE.std_logic_1164.all; -- unterstützt Type Casting
use IEEE.numeric_std.all; -- liefert Vektortyp signed
entity FIR_DIRECT_AK is
generic(DAC_WIDTH: positive := 20; ADC_WIDTH: positive := 20; -- h
N: positive := 22); -- Filterordnung N gerade
port
(CLK: in bit; -- Taktsignal 48 MHz
RESET_N: in bit; -- asynchron, active-low
RD: in bit; -- Abtastwert aktualisiert
XN: in bit_vector(ADC_WIDTH-1 downto 0); -- Signal aus dem ADC
YN: out bit_vector(DAC_WIDTH-1 downto 0) -- Signal zum DAC
);
end FIR_DIRECT_AK;
architecture PARALLEL of FIR_DIRECT_AK is
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
259 9.1 FIR-Filter
type STAGE_TYPE is array(0 to N) of signed(11 downto 0); -- Registerkette
type COEFF_TYPE is array(0 to N/2) of signed(11 downto 0); -- Koeffizienten
type PRODUCTS_TYPE is array(0 to N) of signed(23 downto 0);-- Produkte
--
signal STAGE: STAGE_TYPE; -- Registerkette mit Übernahmestufe; j Bits Q11
signal COEFF: COEFF_TYPE; -- Koeffizienten mit pos. Symmetrie; l Bits Q11
signal ADDA: signed(23 downto 0); -- letzter Addierer; m Bits, 2sign.Q22
signal TEMP_1, TEMP_2,RD_S, FIR_EN: bit; -- Freigabesignalkette
begin -- Koeffizienten alternativ auch als Hex-Werte
COEFF(0) <= "000000000011"; -- x"003"; 0.00148587755162
COEFF(1) <= "000000000010"; -- 0.00104312227618
COEFF(2) <= "111111111011"; -- -0.00254297568453
COEFF(3) <= "111111110101"; -- -0.00546703115960
COEFF(4) <= "000000000110"; -- 0.00272867876211
COEFF(5) <= "000000100010"; -- 0.01672858094360
COEFF(6) <= "000000001110"; -- 0.00662913854437
COEFF(7) <= "111110111011"; -- -0.03347988549507
COEFF(8) <= "111110101010"; -- -0.04193952517288
COEFF(9) <= "000001100100"; -- 0.04901745208684
COEFF(10) <= "000110011011"; -- 0.20050124258743
COEFF(11) <= "001000110111"; -- 0.27687297947153
PULSE_SHORTER: process(CLK,RESET_N) -- 3 D-FFs
begin
if RESET_N = '0' then
TEMP_1 <= '0'after 3 ns;
TEMP_2 <= '0'after 3 ns;
FIR_EN <= '0'after 3 ns;
elsif CLK='1' and CLK'event then
TEMP_1 <= RD after 3 ns; -- Ready des Codec-Interfaces
TEMP_2 <= TEMP_1 after 3 ns;
FIR_EN <= RD_S after 3 ns;
end if;
end process PULSE_SHORTER;
RD_S <= TEMP_1 and (not TEMP_2) after 3 ns; -- verkürzter, synchroner Puls
--
STAGES: process(CLK)
begin
if CLK='1' and CLK'event then -- Registerkette mit synchronem Reset
if RESET_N='0' then
for I in 0 to N loop
STAGE(I) <= (others=>'0') after 3 ns;
end loop;
elsif RD_S = '1' then -- Enable Shifting
-- Laden des Übernahmeregisters, nur sign und 11 significant bits
STAGE(0)<= signed(to_stdlogicvector(XN(19 downto 8))) after 3 ns;
for I in N downto 1 loop
STAGE(I) <= STAGE(I-1) after 3 ns;-- shifting
end loop;
end if;
end if;
end process STAGES;
MUL_ADD: process(COEFF,STAGE) -- Filterarithmetik
variable PRODUCTS: PRODUCTS_TYPE; -- Multiplizierer, m Bits
variable ADD: signed(23 downto 0); -- Addierer, m Bits
begin
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
260 9 Modellierung digitaler Filter
MUL: for I in 0 to N loop -- N+1 Multiplizierer
if (I <= (N/2)) then
PRODUCTS(I) := STAGE(I) * COEFF(I);
else
PRODUCTS(I) := STAGE(I) * COEFF(N-I);
end if;
end loop;
ADD := PRODUCTS(0)(23 downto 0); -- Variableninitialisierung
AKKU: for I in 1 to N loop -- N stufige Addiererkette ab P(1)
ADD := ADD + PRODUCTS(I);
end loop;
ADDA <= ADD after 3 ns; -- Übergabe der letzten Addiererstufe
end process MUL_ADD;
A_REG: process(CLK, RESET_N) -- Übergaberegister
begin
if RESET_N ='0' then
YN <= (others => '0') after 3 ns;
elsif CLK='1' and CLK'event then
if FIR_EN = '1' then -- Ausgangsfreigabe
YN <= to_bitvector(std_logic_vector(ADDA(22 downto 3))) after 3 ns;
end if; -- Inneres Type Casting mit IEEE.numeric_std.all;
end if; -- Äussere Typkonvertierung mit IEEE.std_logic_1164.all;
end process A_REG;
end PARALLEL;
Code 9-2: FIR-Direktform mit Addiererkette realisiert durch eine Akkumulatorvariable. Synchroni-
sation und Pulsverkürzung CLK(fCLK ). N=22, Tiefpass mit fc=10 kHz, fa=48 kHz
Bei der Wahl der Addiererbreite mit Q22 ist zu beachten, dass die Weiterverarbeitung der
kompletten Produktbreite in der Addiererkette eine hohe Präzision liefert, jedoch den Be-
darf an FPGA-Ressourcen (LUTs) erheblich anwachsen lässt. Eine Verkürzung des Pro-
duktvektors durch Abschneiden oder Rundung der niederwertigen Bits auf eine Wortlänge
von 13 Bit im Q11-Format:
PRODUCTS(I)[sign,sign. 21:11)]
führt dazu, dass ein Quantisierungsrauschen eingeprägt wird, das bei geringer Filteraus-
steuerung als messbarer Störpegel ins Gewicht fallen kann [70], [75]. Je nach Anwendung
sind also vorweg MATLAB-Simulationen durchzuführen, die den Einfluss der jeweiligen
Produkt-Wortlängenverkürzung auf den Signal-Rauschabstand analysieren [70].
Die als Signale deklarierten Filterkoeffizienten COEFF sind durch Rundung auf 12 Bit aus
16-Bit Werten hervorgegangen. Da hier feste Werte zugewiesen werden, ergeben sich keine
anderen Syntheseergebnisse als im Fall einer Konstanteninitialisierung im Deklarationsteil
der Architektur mit z.B.:
constant COEFF(1): COEFF_TYPE := x"002"; -- 0.00104312227618
Aufgrund der Koeffizientensymmetrie sind nur N/2+1=12 Arrayelemente und Wertzuwei-
sungen erforderlich, die auch mit hexadezimalen Werten erfolgen können.
Aus den drei Signalzuweisungen im getakteten Prozess PULSE_SHORTER entstehen die
drei D-FFs der Pulsverkürzerschaltung und der Pulsverzögerung nach Bild 9-8. Die Ver-
wendung des Signals TEMP_1 auf der linken und rechten Seite von Zuweisungen in einem
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
261 9.1 FIR-Filter
getakteten Prozess ist hier korrekt und erzeugt so die Verkettung zweier D-FFs (vgl. Kap.
3.3.3 und Kap. 5.3).
Im getakteten Rahmen des Prozesses STAGES basiert die Schieberegisterfunktion wieder
auf Leseoperationen von Prozessausgangssignalen, die in einer for loop angeordnet
sind. Deren implizit deklarierter Schleifenzählindex I übernimmt die Indizierung von Ar-
ray-Elementen. Der Synthesecompiler löst die Schleifendurchläufe in parallele Zuweisun-
gen auf und setzt so sukzessive die N Stufen der Registerkette des FIR-Filters zusammen.
Mit der ersten Registerstufe STAGE(0) wird das Übernahme- bzw. Entkopplungsregister
nach Bild 9-8 generiert, das nur mit den oberen 12 Bit des im Typ konvertierten Eingangs-
vektors X geladen wird. Aufgrund der hier als Beispiel gewählten Codec-Schnittstelle
werden die unteren, niederwertigen 8 Bit des X-Vektors abgeschnitten, sodass an der posi-
tiven Sprunganregung ein Beitrag in Höhe von lediglich (28-1)2-19=0.00049 fehlt. Eine
aufsteigende Indexzählrichtung liefert für die Verkettung der Register äquivalente Ergeb-
nisse, da in beiden Fällen alle Zuweisungen getriggert durch die positive Taktflanke parallel
erfolgen.
Der Rechts-Schiebevorgang in der Registerkette kann auch mit einer direkten Verkettung
der Array-Elemente durch eine einzige parallele Zuweisung auf alle Elemente formuliert
werden (vgl. Abschnitt 3.3.3). Die Initialisierung im synchronen Reset enthält ein Aggregat
für den 12-Bit-Vektor und ein übergeordnetes Aggregat für alle N+1 Array-Elemente [37]:
STAGES: process(CLK) -- Registerkette, Array-Element-Verkettung
begin
if CLK='1' and CLK'event then
if RESET_N ='0' then
STAGE <= (others => (others =>'0')) after 3 ns; -- Aggregate
elsif RD_S = '1' then -- enable right shift
STAGE <= signed(to_stdlogicvector(XN(19 downto 8))) &
STAGE(0 to N-1) after 3 ns;
end if;
end if;
end process STAGES;
Der Prozess STAGES zeigt zusätzlich ein Entwurfsmuster für die bedingte Abfrage eines
synchronen Resets und einer Freigabe durch das synchronisierte Signal RD_S. Bisher war
aus Sicht der Xilinx FPGA-Ressourcen ein asynchroner einem synchronem Reset vorzuzie-
hen, da nur für den asynchronen Reset ein separater Eingang der Daten-Flipflops zur Ver-
fügung stand. Ein synchroner Reset konnte nur durch Erweiterung des Übergangsschaltnet-
zes an den Dateneingängen der Flipflops wirksam werden, was zu einem Mehrbedarf an
Look-Up-Tabellen geführt hat. Mit Einführung der Spartan-3-FPGAs und seit der Version
ISE 7.1i des Implementierungswerkzeuges werden nun beide Reset-Arten an einen gemein-
samen separaten D-FF-Eingang geführt [48], [81].
Der kombinatorische Prozess MULL_ADD modelliert die Filterarithmetik im Stil einer
Verhaltensbeschreibung, wie es auch in sequentiellen Programmiersprachen üblich ist. Der
Einsatz von Variablen zusammen mit den Array-Typen ist gerade für diese verdichtete
Codierung in einem einzigen kombinatorischen Prozess vorgesehen. Um näher an der
Struktur in Bild 9-1 zu bleiben, sind im Code 9-2 zwei sequentielle Schritte dargestellt. Die
erste for loop mit dem Label MUL erzeugt die N+1 parallellen Produkte, wobei N/2
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
262 9 Modellierung digitaler Filter
Koeffizienten aufgrund der Symmetrie für die PRODUCTS(I) mit I>N/2 wiederholt genutzt
werden.
Für die Addiererkette in der for loop mit dem Label AKKU ist ein kompakter Akkumu-
lator gewählt worden, da nur der letzte Ergebniswert der Variable ADD für die Speicherung
im Übergaberegister relevant ist und alle Zwischenwerte der Kette nicht an anderer Stelle
im Prozess verarbeitet werden müssen. Auf diese Art wird für die Kette auch ein Array von
Addierervariablen eingespart. Nicht übersehen werden darf die erforderliche Variableniniti-
alisierung zu Beginn der Bearbeitungsschleife. Variablen ist ein Wert zuzuweisen, bevor
ein erster Lesevorgang stattfindet, da ansonsten ein nicht angestrebtes Gedächtnis in Form
eines Latches inferiert wird, das aus den D-FF-Ressourcen mit kombinatorischer Beschal-
tung des Takteingangs entsteht (vgl. Kap. 3.4). Diese Fehler könnten bei der VHDL-
Simulation unerkannt bleiben, bei sorgfältiger Beachtung der Details in den Synthesere-
ports fallen jedoch spätestens die deutlichen Latch-Warnhinweise auf.
Eine vereinfachte Variante des Prozesses MULL_ADD zur Zusammenführung der beiden
for loop-Konstrukte ohne separates Array für die Produkte zeigt der folgende Codeab-
schnitt:
ADD := STAGE(0) * COEFF(0); -- Variableninitialisierung
MUL_AKKU: for I in 1 to N loop -- Addiererkette ab I = 1
if (I <= (N/2)) then
ADD := ADD + STAGE(I) * COEFF(I);
else
ADD := ADD + STAGE(I) * COEFF(N-I);
end if;
end loop;
Das Übergaberegister A_REG, das im Szenario nach Abschnitt 9.1.4.1 mit dem Codec-
Interface gekoppelt ist, speichert den auf 20 Bit verkürzten Ergebniswert ADDA (m=24),
kurz bevor der verzögerte Freigabepuls FIR_EN wieder auf '0' wechselt (vgl. Bild 9-8). Das
zweite Vorzeichen ADDA(23) kann wegfallen, da die konservative Filterskalierung nach
Gl. 9-11 mit L1=1.5009 die Überlauffreiheit des letzten Addierers in der Kette garantiert. Es
muss sogar entfernt werden, da ansonsten ein halbierter Wert an das Codec-Interface über-
geben würde. Die unteren, abgeschnittenen drei Bit ADDA(2 downto 0)repräsentieren
einen relativen Anteil von maximal (vgl. Tabelle 9-2):
Gl. 9-13 Δ = ((1 - 2-22) – (1 - 2-19))/( 1 - 2-22) ≈ 2-19
Zur Typkonvertierung von der Arithmetikebene zurück auf die bit_vector-Schnittstelle
sind zwei Schritte erforderlich, die durch die eingebundenen Bibliotheken unterstützt wer-
den (vgl. Kap. 0, 5.4 u. 12). Der erfahrene Entwickler wird eine Stufe umgehen, indem er
alle Schnittstellen der Entwurfskomponenten und der Testbenches direkt mit dem mehrwer-
tigen Typ std_logic_vector codiert. Damit ergibt sich eine bessere Kompatibilität
der VHDL-Module, da die Post-Layout-Simulationsmodelle durchgängig Schnittstellen mit
dem Typ std_logic_vector bzw. std_logic anbieten und alle IP-Cores aus dem
Xilinx Core Generator (vgl. Abschnitt 7.4.2) [87] oder kommerziell erworbene Module
ebensolche Schnittstellen enthalten.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
263 9.1 FIR-Filter
Die VHDL-Simulation der Sprungantwort Y des FIR-Filtermodells nach Code 9-2 mit der
Anregung X=7FFFFHex=(219 -1) (oder 1-2-19 im Q19-Format) zeigt Bild 9-9. Mit dem For-
mat der Analogdarstellung bietet der Simulator ModelSim [59] eine Visualisierung von
Signalzeitverläufen, die einen qualitativen Vergleich mit den MATLAB-Ergebnissen er-
leichtert (vgl. Bild 9-7). Der Simulator stellt vorzeichenbehaftete Integer-werte oder Hex-
Werte dar, da die Strategie des Q-Formates nur der Entwurfssichtweise des Entwicklers
entspricht. Ein Vergleich des Filterausgangsignals Y mit der Sprungantwort nach Bild 9-7
zeigt, dass Abweichungen der Maximal- und Endwerte lediglich auf der 4. Nachkommast-
elle vorliegen (vgl. Tabelle 9-3), die sich mit den auf Q11 reduzierten Koeffizienten erklä-
ren lassen.
Bild 9-9: Sprungantwort Y des FIR-Filtermodells mit Addiererkette nach Code 9-2. Differenz DIFF
zweier Modelle mit unterschiedlichen Vektorbreiten der Addiererstufen. N+1 Freigabepulse READY
Zur quantitativen Bewertung der Auswirkungen einer reduzierten Addiererbreite mit 13
statt mit 24 Bit sind in Bild 9-9 zusätzlich die Simulationsergebnisse einer erweiterten
Testbench FIR_TB_COMP dargestellt, die zwei FIR-Modelle instanziiert und deren Diffe-
renz DIFF=Y-Y_S berechnet. Im Prozess MUL_ADD (vgl. Code 9-2) des zweiten FIR-
Modells (Y_S) wurde dazu eine modifizierte AKKU for loop realisiert, die schmalere
Addierer instanziiert, um den FPGA-Ressourcenbedarf zu reduzieren:
ADD := PRODUCTS(0)(23 downto 11); -- Verkürzung der Produkte auf Q11
for I in 1 to N loop -- Addiererkette mit weniger FPGA-Ressourcen
ADD := ADD + PRODUCTS(I)(23 downto 11); -- Verkürzung auf 13 Bit inkl. 2sign
end loop;
Die Abweichung DIFF in Bild 9-9 wächst an, da das FIR-Modell mit dem Ausgang Y_S
aufgrund der reduzierten Addiererbreite mit Q11 kleinere Beiträge akkumuliert. Die maxi-
male relative Abweichung für dieses Beispielfilter beträgt nach Tabelle 9-3 etwa 1%. Im
Gegenzug dazu werden für das FIR-Filter nach Code 9-2 mit reduzierter Addiererbreite nur
1222 statt 1548 Look-Up-Tabellen (LUT) eingesetzt.
DIFF
Y
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
264 9 Modellierung digitaler Filter
Tabelle 9-3: Quantitativer Vergleich zweier FIR-Modelle nach Code 9-2 mit unterschiedlichen
Addiererbreiten; Referenz |Ymax|=219-1=524287Dez , vgl.Bild 9-9
Zur Überprüfung des Codierstils im FIR-Filtermodell nach Code 9-2 ist in Bild 9-10 das
Syntheseergebnis für ein Spartan-3-FPGA als komprimiertes Abbild des RTL-Schaltplans
dargestellt, der vom XST-Compiler des Werkzeugs ISE 13.4 erzeugt wurde [81]. Aller-
dings muss zu Identifizierung der FIR-Strukturen zusätzlich der ISE-FPGA-Editor genutzt
werden, da im RTL-Schematic ab der Version ISE 12.4 keine vollständige Verdrahtung der
Arithmetikoperatoren mehr offengelegt wird.
Bild 9-10: Syntheseergebnis der Addiererkette für die Produkte PRODUCTS(I) (Pi) nach Code 9-2.
XC3S400-5PQ208 FPGA; ISE 13.4, Signallaufzeit 41.81 ns (23.9 MHz) im Pfad mit dem Produkt
PRODUCTS(0) und N=22 Addiererstufen
Die Struktur des Syntheseergebnisses, das dem Bild 9-10 zugrunde liegt, zeigt:
Aus der for loop der Akkumulatorvariablen ADD (Label AKKU im Code 9-2)
ergibt sich eine N stufige Addiererkette, da die Schleifenbearbeitung für den Synthese-
compiler eine Anweisung zur parallelen Inferenz von Einzelelementen darstellt, die zur
Übersetzungszeit ausgewertet wird.
Für das hier analysierte Beispielfilter sind statt der N+1=23 Multiplizierer nur 21 expli-
zite Produkte (Pi) gebildet worden, da die Koeffizienten c1=c21=002Hex nur an einer Bit-
Stelle eine ’1’ enthalten (vgl. Code 9-2). Die folgende Codezeile wurde für I=1
PRODUCTS(I) := STAGE(I) * COEFF(I);
+
++
+
+
P22
ADDA
P0 P2 P4 P5P3 P6
+
P20P19 P21
+
P1
+ + +
…
Ausgangssignal Y Y_S DIFF = Y – Y_S
Produkt- u. Addiererbreite Q22 Q11 -
Stationärer Endwert 55455Hex
349269Dez
54600Hex
345600Dez
E55Hex
3669Dez
Endwert/Referenz 0.66618 0.65918 0.006998
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
265 9.1 FIR-Filter
durch den Synthesecompiler in eine Verkettung mit 12 Sign-Bits und 12 Fractional-Bits
umgewandelt
PRODUCTS(1) := STAGE(1)(11) & ... STAGE(1)(11)&
STAGE(1)(10) & ...STAGE(1)(0) & ’0’;
Diese Zeile repräsentiert eine 1-Bit-Linksschiebeoperation der Registerstufe STAGE(1)
und eine vorzeichenrichtige Erweiterung mit dem MSB STAGE(1)(11) auf 24 Bit.
Die von der Post-Place & Route-Timinganalyse des ISE 13.4 Werkzeugs angezeigte,
maximal zulässige Taktfrequenz von 23.9 MHz liegt weit unter dem Wert von fCLK=48
MHz, der für das Codec-Filter-Szenario nach Abschnitt 9.1.4.1 vorgegeben war. Es sind
also VHDL-Modelle zu entwickeln, die zu Addiererstrukturen mit einer minimalen An-
zahl von Addiererstufen führen.
Das FIR-Filtermodell nach Code 9-2 stellt die Grundlage für weitere Entwurfsschritte dar,
die auf einen balancierten Addiererbaum mit exakt 3.32log(N+1) Addiererstufen abzielen.
9.1.4.3 Direktform mit symmetrisch balanciertem Addiererbaum
Für die Direktform des FIR-Filters ist ein balancierter Addiererbaum anzustreben, da nur
mit diesem Addiereraufbau die kürzesten Signallaufzeiten und der geringste Registerauf-
wand für den Fall mit Pipeliningstufen zu erreichen sind (vgl. Abschnitt 9.1.1). Ziel ist eine
Filter-Modellierung für den Typ 1 nach Gl. 9-5 mit gerader Filterordnung N.
Als Grundlage für die weiteren Schritte wird in diesem Abschnitt ein VHDL-Modell erläu-
tert, das zu den Spezialfällen N+1=L=2p (N ungerade; L Filterlänge) einen vollständig
symmetrischen, balancierten Addiererbaum liefert, dessen p=ld(L) Addiererstufen jeweils
2p-1
,…, 8, 4, 2, 1 Addierer enthalten. Der Prozess MUL_ADD in Code 9-3 passt direkt
zum Code 9-2, der lediglich durch ein Array für die Addierer-Variablen ADD(I) und ein
generic AAST=p zu ergänzen ist, das die Anzahl der Addiererstufen angibt:
type ADD_TYPE is array(0 to N-1) of signed(23 downto 0);-- 2sign, Q22
Die erste Addiererstufe mit L/2 Addierern verknüpft paarweise die gewichteten Ausgänge
der Registerkette (for loop ADD_ST1). Die weiteren Stufen entstehen aus der iterati-
ven Kopplung von Ausgängen der vorgelagerten Addiererstufen (for loop BAB).
MUL_ADD: process(COEFF,STAGE)
variable PRODUCTS: PRODUCTS_TYPE; -- N+1=L Multiplizierer-Array, m Bits
variable ADD: ADD_TYPE; -- N Addierer-Array , m Bits
variable INDEX: integer range 0 to (N+1)/2; -- reduziert Baumbreite
variable K: integer range 0 to N; -- Offset Addierer-Index
variable P: integer range 0 to N; -- Offset Summanden-Index
begin
MUL: for I in 0 to N loop -- N ungerade
if (I <= (N -1)/2) then
PRODUCTS(I) := STAGE(I) * COEFF(I);-- L Multiplizierer
else
PRODUCTS(I) := STAGE(I) * COEFF(N-I);
end if;
end loop;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
266 9 Modellierung digitaler Filter
ADD_ST1: for I in 0 to (N-1)/2 loop -- 1. Addiererstufe: L/2 Addierer
ADD(I) := PRODUCTS(I*2) + PRODUCTS(I*2 + 1);
end loop;
INDEX := 1;
K := (N +1)/2;
P := 0;
BAB: for J in 0 to (AAST - 1) - 1 loop -- 2. bis Stufe ld(L)
INDEX := INDEX * 2;
for I in 0 to ((N+1)/2)/INDEX -1 loop
ADD(I + K) := ADD(I*2 + P) + ADD(I*2 + P +1);
end loop;
P := K;
K := K + ((N+1)/2) / INDEX;
end loop;
ADDA <= ADD(N-1) after 6 ns;-- Ergebnis an Übergaberegister
end process MUL_ADD;
Code 9-3: Prozess zur iterativen, gepaarten Addierer-Kopplung für L=2 p, N ungerade
Für die Variablen zur Schleifensteuerung (BAB) in Code 9-3 gilt:
Der Schleifenindex J zählt die Addiererstufen von der 2. bis zur letzten p=ld(L).
Der Index I der inneren Schleife zählt die Addierer in einer Stufe.
Die Anzahl der Addierer in einer Stufe ist durch 2er-Potenzen gegeben und wird durch
den Wert INDEX=2, 4,…, L/2 von Stufe zu Stufe reduziert.
Mit dem Index P wird der erste Addiererausgang aus der vorausgehenden Stufe indi-
ziert. Zusammen mit I werden so die Arrayelemente angesprochen, die die Summanden
bilden.
Der Index K benennt das erste Addiererergebnis aus der aktuellen Addiererstufe. Für
die nächste Stufe wird K mit der Anzahl der Addierer in der bearbeiteten Stufe aktuali-
siert.
Die Wirkung dieser Indizes, die den Aufbau eines balancierten Addiererbaums steuern,
verdeutlicht das Syntheseergebnis in Bild 9-11. Die Laufzeitpfade in dieser Filterrealisie-
rung sind durch symmetrische Schaltnetze bestimmt, die jeweils aus einem Block-
Multiplizierer und p=ld(L) Addieren bestehen.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
267 9.1 FIR-Filter
Bild 9-11: Balancierter Addiererbaum als Syntheseergebnis des Prozesses nach Code 9-3 mit ISE
11.1; L=16, p=4. Indizes der iterativen Addierer-Kombination.; Signallaufzeit 18.1 ns mit ISE 13.4
Die beispielhaft vorgegebene Taktfrequenz fCLK=48 MHz (vgl. Abschnitt 9.1.4.1, Bild 9-8)
wird mit dem Ergebnis 55.2 MHz der Implementierung mit ISE 13.4 erreicht. Zur weiteren
Verkürzung der Signallaufzeit kann eine Pipeliningstufe z.B. hinter der ersten Addierer-
stufe (ADD(0) - ADD(L/2 -1)) eingeführt werden, sodass zwei Schaltnetzbereiche entste-
hen:
– L Multiplizierer gekoppelt mit der ersten Addiererstufe, bestehend aus L/2 Addierern.
– p-1=3 Addiererstufen mit L/2-1=7 Addierern.
Der Prozess MUL_ADD aus Code 9-3 wird dazu in einen getakteten Prozess
MUL_ADD_REG und einen kombinatorischen Prozess BAB aufgeteilt (vgl. Code 9-4). Da
die Variablen PRODUCTS(I) im getakteten Rahmen zuerst eine Zuweisung erhalten, bevor
P14
P15
P0
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
P13
ADD0
ADD1
ADD2
ADD3
ADD4
ADD5
ADD6
ADD7
1. Addiererstufe
2. Addiererstufe
ADD8
3. AddiererstufeADD9
ADD10
ADD11
ADD12
ADD13 ADD14
4. Addiererstufe
J = 0, K = 8, P = 0
Index = 2
I = 0
I = 0
J = 1, K = 12, P = 8
Index = 4
J = 2, K = 14, P = 12
Index = 8
I = 1
I = 0
I = 1
I = 2
I = 3
YN
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
268 9 Modellierung digitaler Filter
sie gelesen werden, bilden sie die erste Ebene des Übergangsschaltnetzes für die Pipeline-
register ADDS(I), ohne dass sie zu Flipflops synthetisiert werden (vgl. Kapitel 3.6.1). Die
Pipelineregister übernehmen als interne Koppelsignale im kombinatorischen Prozess BAB
die Initialisierung der ersten L/2 Variablen ADD(I). Zur Freigabe der Pipelinestufe dient
der Puls FIR_EN aus der Freigabekette nach Bild 9-8, die um ein D-Flipflop zu verlängern
ist, damit der so um 1/fCLK verzögerte Puls FIR_EN das Übergaberegister im Prozess
A_REG freigeben kann. Mit jeder Pipelinestufe ist also auch die zugehörige Freigabekette
zum Laufzeitausgleich durch ein Flipflop zu ergänzen.
MUL_ADD_REG: process(CLK, RESET_N)
variable PRODUCTS: PRODUCTS_TYPE; -- Multiplizierer, m Bits
begin
if RESET_N = '0' then
for I in 0 to (N-1)/2 loop
ADDS(I) <= (others => '0') after 3 ns;
end loop;
elsif (CLK'event and CLK = '1') then
if (FIR_EN = '1') then
for I in 0 to N loop -- N = 15
if (I <= (N -1)/2) then
PRODUCTS(I) := STAGE(I) * COEFF(I);-- N+1 Multiplizierer
else
PRODUCTS(I) := STAGE(I) * COEFF(N-I);
end if;
end loop;
for I in 0 to (N-1)/2 loop -- 1. Stufe (N+1)/2 Register
ADDS(I) <= PRODUCTS(I*2) + PRODUCTS(I*2 + 1) after 3 ns;
end loop;
end if;
end if;
end process MUL_ADD_REG;
BAB: process(ADDS)
variable ADD: ADD_TYPE; -- Addierer Register, m Bits
variable INDEX: integer range 0 to (N+1)/2; -- reduziert Baumbreite
variable K: integer range 0 to N; -- Offset Addierer-Index
variable P: integer range 0 to N; -- Offset Summanden-Index
begin
for I in 0 to (N-1)/2 loop
ADD(I) := ADDS(I); -- Register-Übergabe an Summanden der 2. Stufe
end loop;
...
end process BAB;
Code 9-4: Synthese eines balancierten Addierbaums mit Pipelinestufe ADDS(I); L=16, p=4
Die Timinganalyse liefert für eine Implementierung mit 16 Block-Multiplizierern eine
maximale Signallaufzeit von 10.46 ns (95.6 MHz) im zweiten Schaltnetzbereich zwischen
ADDS(0) – YN. Bei der Implementierung mit LUT-basierten Multiplizierern entsteht der
längste Signallaufzeitpfad mit 11.14 ns im ersten Schaltnetzbereich zwischen den Registern
STAGE(10) − ADDS(5). Dieser Halbierung der Signallaufzeit steht ein Mehraufwand von
maximal 8*24=192 Daten-Flipflops (2.4% des Xilinx Spartan-3-FPGAs XC3S400) gegen-
über.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
269 9.1 FIR-Filter
9.1.4.4 Direktform mit unsymmetrisch balanciertem Addiererbaum
Im allgemeinen Fall L≠2p (p in |N) treten in den 3.32log(L) Addiererstufen unsymmetri-
sche Addierergruppierungen auf. Diese werden im Folgenden analysiert, um für die auto-
matische Generierung der Addiererstufen mit for loop-Konstrukten geeignete Steuerbe-
dingungen zu entwickeln. Die Entwicklungsschritte der VHDL-Modelle werden sukzessive
mit Überprüfung der jeweiligen Syntheseergebnisse vorgestellt.
In FIR-Filtern mit gerader Ordnung N (vgl. Gl. 9-5) bleibt bei der Summanden-Paarbildung
der ersten Addiererstufe (AST) immer eins der L Produkte übrig, sodass dieses Produkt in
einer der nächsten Stufen als Summand aufgenommen werden muss. Hinzu kommt, dass
die Addiererstufen nicht mehr eine gerade Anzahl von Addierern enthalten, die einer 2er-
Potenz entspricht. Demnach treten Addiererfolgestufen auf, denen eine ungerade Anzahl
von Summanden angeboten wird. Der für eine Summanden-Paarbildung nicht nutzbare
Addiererausgang muss also in einer der nächsten Addiererstufen ein Summandenpaar un-
terstützen. Beispiele für diese Unsymmetrien und deren Handhabung verdeutlichen Bild
9-12 und Bild 9-13.
Bild 9-12: Addiererbaum für ein FIR-Filter mit der Ordnung N=10, N/2 ungerade. Stufe 2 nimmt
Produkt P10 auf. Ausgang Ai+2 kann erst in Stufe 4 als Ai+4 verarbeitet werden
Mit einer ungeraden Anzahl N/2 von Addierern in der ersten Stufe ergibt sich die Konfigu-
ration, dass das Produkt PN schon in der 2. Stufe ein Summandenpaar mit einem
Addiererausgang aus der 1. Stufe bilden kann (vgl. P10 in Bild 9-12). Eine zweite Struktur-
eigenschaft ist festzustellen, sofern eine tiefer gelegene Addiererstufe eine ungerade Anzahl
von Addieren aufweist und das Produkt PN schon verarbeitet worden ist. Dann ist nämlich
ein Addiererausgang über die folgende Stufe hinaus als Summand zu übergeben. In Bild
9-12 gilt dies für den Addiererausgang Ai+2 aus der 2. Stufe, der in der 4. Stufe zur Weiter-
verarbeitung als Ai+4 mit Ai+3 verknüpft wird. Die Aufnahme eines weitergereichten
Addiererausgangs erfolgt also immer in einer Stufe, der eine Stufe mit ungerader Anzahl
von Addierern vorausgeht, um die Ergänzung eines Summandenpaars zu erreichen.
Damit jede Stufenauswertung mit einer leicht berechenbaren Indizierung der Summanden
arbeiten kann, findet dieses Weiterreichen von Addiererergebnissen durch Variablenzuwei-
++ + + +
Ai+5
P0 P2 P4 P6 P8 P10
+
+
+ +
+
P1 P3 P5 P7 P9
Ai
Ai+1 A
i+2
Ai+3 A
i+4
AST
1.
2.
3.
4.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
270 9 Modellierung digitaler Filter
sungen statt, die einen Positionstausch im Variablen-Array bedeuten (vgl. Ai+4=Ai+2 in Bild
9-12). Das Addierer-Array ist deshalb größer auszulegen (vgl. Code 9-5).
Eine weitere Struktureigenschaft der Addiererbäume für gerade N ist im Fall N/2 gerade
festzuhalten. In Bild 9-13 ist dies exemplarisch mit einem Produkt PN=P12 dargestellt, das
nicht in der 2. Stufe sondern in der folgenden 3. Stufe von einem Addierer Ai+4 erfasst wird.
Die Aufnahme des Produktes führt also jeweils die Stufe durch, die wie auch in Bild 9-12
eine ungerade Anzahl von Addiererausgängen als Eingänge erhält. Je nach Filterordnung N
und resultierender Struktur kann die Verarbeitung des Produktes PN bis zum letzten
Addierer verschoben werden.
Bild 9-13: Addiererbaum für ein FIR-Filter mit der Ordnung N=12, N/2 gerade. Produkt P12 kann
erst in Stufe 3 als Summand aufgenommen werden
Zusammenfassend lassen sich drei Strukturmerkmale beim Aufbau eines unsymmetrisch
balancierten Addiererbaumes für gerade Filterordnungen N hervorheben:
Das separate Produkt PN wird für N/2 ungerade in der 2. Addiererstufe verarbeitet, die
nur eine ungerade Anzahl N/2 von Addiererausgängen angeboten bekommt.
Für N/2 gerade kann das separate Produkt PN in der Stufe aufgenommen werden, die
als erste eine ungerade Anzahl von Addiererausgängen angeboten bekommt.
Nach Aufnahme des separaten Produktes PN können weitere Stufen mit ungerader
Anzahl von Addiererausgängen auftreten. Der nicht für eine Paarbildung nutzbare
Summand wird an die folgende Stufe weitergereicht und dazu auf einen Pseudo-
Addiererausgang umbenannt. Dieser Vorgang der Umbenennung kann über mehrere
Stufen erfolgen, sodass eine größere Anzahl (>N) der Addierer-Arrayelemente zu dekla-
rieren ist.
Der VHDL-Code der entity FIR_DIRECT_BAB mit Modellierung des balancierten
Addiererbaumes in einem einzigen Prozess für N=22 und N/2 ungerade ist als Code 9-5
auf den folgenden Seiten komplett dargestellt, um die Lesbarkeit der Zusammenhänge zu
unterstützen.
++ + + +
Ai+5
P0 P2 P4 P6 P8 P10
+
+
+ +
+
P1 P3 P5 P7 P9
Ai Ai+1 Ai+2
Ai+3 Ai+4
+
P11 P12
+
AST
1.
2.
3.
4.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
271 9.1 FIR-Filter
-- FIR Filter in Direktform, fc = 10 kHz , Abtastfrequenz 48 kHz -- Allgemeine Lösung für unsymmetrisch balanciert. Addiererbaum, N=22 gerade
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all; -- liefert signed u. unsigned typen
entity FIR_DIRECT_BAB is
generic
( DAC_WIDTH: positive := 20; ADC_WIDTH: positive := 20;
N: positive := 22 ; -- Filterordnung N gerade
AAST: positive := 5); -- Anzahl Addiererstufen Γld(N+1) port
(CLK: in bit; -- Taktsignal, fCLK = 48 MHz
RESET_N: in bit; -- asynchron, active-low
RD: in bit; -- Abtastwert aktualisiert
XN: in bit_vector(ADC_WIDTH-1 downto 0); -- Signal aus dem ADC
YN: out bit_vector(DAC_WIDTH-1 downto 0)); -- Signal zum DAC
end FIR_DIRECT_BAB;
architecture PARALLEL of FIR_DIRECT_BAB is
type STAGE_TYPE is array(0 to N) of signed(11 downto 0); -- Registerkette
type COEFF_TYPE is array(0 to N/2) of signed(11 downto 0);--Koeffizienten
type PRODUCTS_TYPE is array(0 to N) of signed(23 downto 0); -- Produkte
type ADD_TYPE is array(0 to N -1 + AAST -3) of signed(23 downto 0);
--
signal STAGE: STAGE_TYPE; -- Registerstufen mit Übernahmereg. j Bits
signal COEFF: COEFF_TYPE; -- Positive Symmetrie; l Bits
signal ADDA: signed(23 downto 0); -- letzte Addiererstufe, Q 22, 2sign Bits
signal TEMP_1, TEMP_2,RD_S, FIR_EN: bit ; -- Freigabepulse
begin -- Koeffizienten-Array Q11-Elemente
COEFF(0) <= "000000000011"; -- 0.00148587755162
COEFF(1) <= "000000000010"; -- 0.00104312227618 nur shift u. sign-ext.
COEFF(2) <= "111111111011"; -- -0.00254297568453
COEFF(3) <= "111111110101"; -- -0.00546703115960
COEFF(4) <= "000000000110"; -- 0.00272867876211
COEFF(5) <= "000000100010"; -- 0.01672858094360
COEFF(6) <= "000000001110"; -- 0.00662913854437
COEFF(7) <= "111110111011"; -- -0.03347988549507
COEFF(8) <= "111110101010"; -- -0.04193952517288
COEFF(9) <= "000001100100"; -- 0.04901745208684
COEFF(10) <= "000110011011"; -- 0.20050124258743
COEFF(11) <= "001000110111"; -- 0.27687297947153
PULSE_SHORTER: process(CLK,RESET_N)
begin
if RESET_N = '0' then
TEMP_1 <= '0'after 3 ns; TEMP_2 <= '0'after 3 ns;
FIR_EN <= '0'after 3 ns;
elsif CLK='1' and CLK'event then
TEMP_1 <= RD after 3 ns; -- Ready des Codec-Interface
TEMP_2 <= TEMP_1 after 3 ns;
FIR_EN <= RD_S after 3 ns; -- Freigabe des Übergabereg.
end if;
end process PULSE_SHORTER;
RD_S <= TEMP_1 and (not TEMP_2) after 3 ns; -- verkürzter Puls STAGES: process(CLK) -- Register mit Array-Element-Verkettung
begin
if CLK='1' and CLK'event then
if RESET_N ='0' then
STAGE <= (others => (others =>'0')) after 3 ns; -- Array-Aggregat
elsif RD_S = '1' then -- enable right shift
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
272 9 Modellierung digitaler Filter
STAGE <= signed(to_stdlogicvector(XN(19 downto 8))) &
STAGE(0 to N-1) after 3 ns;
end if;
end if;
end process STAGES;
MUL_ADD: process(COEFF,STAGE) -- Komplette Filterarithmetik
variable PRODUCTS: PRODUCTS_TYPE; -- Multiplizierer, Q22, 2 sign Bits
variable ADD: ADD_TYPE; -- Addierer, m Bits: Q22, 2 sign Bits
variable AANZ: integer range 0 to N/2; -- Anzahl Addierer pro Stufe
variable K: integer range 0 to N -1 + AAST -3; -- Offset Addierer-Index
variable P: integer range 0 to N; -- Offset Summanden-Index
variable REST, PRODN: integer range 0 to 1; -- zusätzliche Strukturmerkmale
begin
MUL: for I in 0 to N loop -- N+1 Multiplizierer
if (I <= N/2) then
PRODUCTS(I) := STAGE(I) * COEFF(I);
else
PRODUCTS(I) := STAGE(I) * COEFF(N-I);
end if;
end loop;
ADD_ST1: for I in 0 to N/2 -1 loop -- 1. Addiererstufe N/2 Addierer
ADD(I) := PRODUCTS(I*2) + PRODUCTS(I*2 + 1);
-- PRODUCTS(N) separates Produkt fehlt hier für N gerade
end loop;
K := N/2;-- Offset nach 1. Addiererstufe mit N/2 Addierern
P := 0;
AANZ := N/2;
PRODN := 0; -- separates Produkt nicht erfasst
BAB: for J in 0 to (AAST - 1) - 1 loop -- 2. bis Stufe Γld(N+1) REST := AANZ rem 2; -- ungerade Anzahl von Summanden?
AANZ := AANZ/2 + REST; -- ggf. Addierer f. separates Produkt
for I in 0 to AANZ - 1 loop
if ((REST > 0) and (PRODN = 0) and (I = AANZ -1)) then
ADD(I + K) := ADD(I*2 + P) + PRODUCTS(N);
PRODN := 1; -- separates Produkt erfasst
elsif ((REST > 0) and (PRODN = 1) and (I = AANZ -1)) then
ADD(I + K) := ADD(I*2 + P); -- Ausgang weiterreichen
else
ADD(I + K) := ADD(I*2 + P) + ADD(I*2 + P +1); -- Addierer
end if;
end loop;
P := K;
K := K + AANZ;
end loop;
ADDA <= ADD(P) after 6 ns; -- Ergebnis des BAB
end process MUL_ADD;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
273 9.1 FIR-Filter
A_REG: process(CLK, RESET_N)
begin
if RESET_N ='0' then
YN <= (others => '0') after 3 ns;
elsif CLK='1' and CLK'event then
if FIR_EN = '1' then -- Ergebnis in Übergaberegister
YN <= to_bitvector(std_logic_vector(ADDA(22 downto 3))) after 3 ns;
end if; -- Inneres Type Casting mit IEEE.numeric_std.all;
end if; -- Äussere Typkonvertierung mit IEEE.std_logic_1164.all;
end process A_REG;
end PARALLEL;
Code 9-5: FIR-Direktform mit balanciertem Addiererbaum N=22, N/2 ungerade. Synchronisation
und Pulsverkürzung CLK(fCLK). Tiefpass mit fc=10 kHz, fa=48 kHz
Ein zusätzliches Generic AAST ist im Code 9-5 enthalten, das die Anzahl ld(L) der
Addiererstufen kennzeichnet. Die Addierervariable ADD ist ein Array vom Typ
ADD_TYPE, dessen Länge zur Handhabung der Addierer-Umbenennungen um den Wert
AAST-3 vergrößert ist:
type ADD_TYPE is array(0 to N -1 + AAST -3) of signed(23 downto 0);
Der Worst-Case-Wert AAST ist um 3 zu reduzieren, da
– die erste Stufe die Produktpaare addiert,
– die letzte Stufe nur einen Addierer enthält und
– eine Stufe das separate Produkt PRODUCTS(N) aufnimmt.
Der Prozess MUL_ADD, der den balancierten Addiererbaum modelliert, ist in drei for
loops gegliedert, die die Produkte (MUL), die 1. Addiererstufe (ADD_ST1) und den
balancierten Addiererbaum (BAB) iterativ aufbauen. Diese separate Codierung erleichtert
die spätere Integration einer Pipelinestufe hinter der 1. Addiererstufe.
Für die Variablen zur Schleifensteuerung gilt hier im Abschnitt mit dem Label BAB wie im
Code 9-3 zum Idealfall mit L=2p (vgl. Bild 9-11):
Der Schleifenindex J zählt die Addiererstufen von der 2. bis zur letzten ld(N+1).
Der Index I der inneren Schleife zählt die Addierer in einer Stufe.
Die Anzahl AANZ der Addierer in einer Stufe wird von Stufe zu Stufe reduziert.
AANZ := AANZ/2 + AANZ rem 2
Die Rechnung mit dem Operator rem (vgl. Tabelle 5-2) zum Integerdivisionsrest liefert
die nun geraden bzw. ungeraden Werte.
Mit dem Index P wird der erste Addiererausgang aus der vorausgehenden Stufe indi-
ziert. Zusammen mit I werden so die Arrayelemente angesprochen, die die Summanden
bilden.
Der Index K benennt das erste Addiererergebnis aus der aktuellen Addiererstufe. Für
die nächste Stufe wird K mit der Anzahl der Addierer AANZ der bearbeiteten Stufe ak-
tualisiert.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
274 9 Modellierung digitaler Filter
Entsprechend zu den identifizierten Strukturmerkmalen wird die Bearbeitung des unsym-
metrisch balancierten Addiererbaums zusätzlich durch die Variablen REST und PRODN
gesteuert (vgl. Label BAB im Code 9-5):
Der rem Remainder-Operator liefert den Rest der Integerdivision AANZ/2. Mit
REST=1 ist also angezeigt, dass eine ungerade Anzahl AANZ von Addiererausgängen
für die Additionen in einer Stufe zur Verfügung stehen. Demnach ist unter dieser Be-
dingung das separate Produkt zu addieren oder eine Addierer-Umbenennung durchzu-
führen.
Zu Beginn des Abschnittes BAB ist das separate Produkt PRODUCTS(N) noch nicht
aufgenommen, sodass gilt PRODN=0. Sofern dann die Bedingung REST=1 erfüllt wird,
kann das separate Produkt in einem Addierer mit einem Ausgang einer vorgelagerten
Stufe summiert werden (vgl. Bild 9-13). Diesen Status zeigt die Variable PRODN=1 an,
sodass in den weiteren Stufen unter der Bedingung REST=1 eine Addierer-
Umbenennung stattfinden kann.
Als weitere Bedingung für die oben beschriebene Reaktion auf die Strukturmerkmale ist
der jeweils höchste Indexwert AANZ-1 in der inneren for loop aufgeführt. Durch
die Abweichung vom Idealfall mit L=2p treten nämlich die Symmetriestörungen am
rechten Rand des balancierten Addiererbaumes auf, dort wo die unvollständigen Ver-
zweigungsbereiche mit den Produkten P4, P8, P16, … liegen. Aufgrund der gewählten
Addierer-Indizierung, die die Addierer einer Stufe von links nach rechts mit inkremen-
tierten Indizes versieht (vgl. Bild 9-11), ist so eine einfache Identifikation der Addierer
mit den Unsymmetriemerkmalen gegeben.
Zur Kontrolle der Indexrechnungen kann aus einer VHDL-Simulation (ModelSim [59]) nur
der Vergleich eines korrekten Ausgangssignalverlaufes mit der MATLAB-Referenz und die
Prüfung selektierter interner Signale herangezogen werden. Die Auswertung der Indizes
erfolgt nämlich zur Übersetzungszeit, da die for loops quasi die Instanziierung und
Kopplung von Logik-, Arithmetikelementen und Registern steuern. Über das Wave-
Simulationsfenster lassen sich deshalb auch nur die Endwerte der Größen AANZ, K, P,
REST und PRODN prüfen, die mit der Menue-Kette View → Locals zur Anzeige kommen,
wenn der jeweilige Prozess selektiert wird.
Zur Verdeutlichung des Timings der Freigabeimpulsverkürzung (vgl. Bild 9-8) zeigt Bild
9-14 ein Intervall aus der VHDL-Simulation der Sprungantwort Y, die mit dem 23sten
READY-Puls in den stationären Zustand Y=55455Hex übergeht (vgl. Tabelle 9-3). Zum
Zeitpunkt t1 erreicht die Sprunganregung X die Registerstufe STAGE(22) mit der symboli-
schen Laufzeitverzögerung von 3 ns. Diesen Schiebevorgang von STAGE(21) nach STA-
GE(22) gibt der verkürzte und synchronisierte Puls RD_S frei. Zum Zeitpunkt t2 wird die
Filterarithmetik durch die nun vollständig gefüllte Registerkette angesteuert und reagiert
mit dem aktualisierten Ausgang ADDA=0x2AA2AB nach einer Verzögerung von 6 ns.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
275 9.1 FIR-Filter
Der gegenüber RD_S um einen Takt verzögerte Puls FIR_EN gibt im Zeitpunkt t3 das
Übergaberegister frei, sodass der 24-Bit-Vektor ADDA an den 20-Bit-Vektor Y übergeben
wird. Diese Vektorverkürzung, bei der ein Sign-Bit und drei niederwertige Bits abgeschnit-
ten werden, ist im Folgenden dargestellt:
ADDA = 2AA2ABHex = 0 010 1010 1010 0010 1010 1 011Bin
Y = 55455Hex = 0101 010 1 0100 010 1 010 1Bin
Bild 9-14: Sprungantwort Y und Freigabepulse des FIR-Filtermodells nach Code 9-5, N=22
Das Syntheseergebnis zum Filtermodell nach Code 9-5 entspricht vollständig der symmet-
rischen Zielstruktur mit ld(22+1)=5 Addiererstufen (vgl. Bild 9-15). Zur Verdeutlichung
der Schleifenindexrechnung des Addiererbaums sind zusätzlich einige Addierervariablen
eingetragen, deren Indizes in dieser Form jedoch nicht mehr im Syntheseergebnis erkenn-
bar sind. Aufgrund von N=22 und N/2 ungerade wird das separate Produkt P22 in der 2.
Stufe aufgenommen. Da die 3. Stufe eine ungerade Anzahl von Ausgängen aufweist, erfolgt
eine Zuweisung des Ausgangs ADD(19) in der 4. Stufe auf den Pseudo-Addierer ADD(21)
(Symbolpunkt), der in der 5. Stufe mit ADD(20) zum Ergebnis ADDA kombiniert wird.
Bild 9-15: Syntheseergebnis für den im Code 9-5 modellierten Addiererbaum mit symmetrischen
Teilbereichen. N=22, max. 5 Addiererstufen; ISE 13.4, maximale Signallaufzeit 20.83 ns (48 MHz)
im Pfad mit einem Multiplizierer und 5 Addiererstufen; STAGE(15)(6) – YN(19)
t1
t2
t3
++ + + + + + + + + +
+
P22
ADDA
P0 P2 P4 P6 P8 P10 P12 P14 P16 P18 P20
+ + + +
+
+ ++ + +
ADD(19)
ADD(0)
ADD(21)ADD(22)
ADD(20)
ADD(11)
ADD(17)
ADD(10)
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
276 9 Modellierung digitaler Filter
Wenn jedoch die Syntheseergebnissse zu einer kompakten RTL-Modellierung von umfang-
reichen Funktionen innerhalb eines einzigen Prozesses die Symmetrieforderungen nicht
erfüllen sollten, dann kann eine Separierung in mehrere Prozesse die symmetrische Struktu-
rierung unterstützen. Mit der Vorläuferversion des Synthesecompilers XST ISE 8.2i ist in
[67] mit Beispielen für gekoppelte getaktete und kombinatorische Prozesse gezeigt worden,
dass so die Syntheseziele erreicht werden.
Zur Demonstration einer solchen Prozesskopplung wird nachfolgend der kombinatorische
Prozess MUL_ADD in Code 9-5 aufgespalten, sodass Variablen durch interne Signale zu
ersetzen sind. Die entity FIR_DIRECT_BAB_P im Code 9-6 enthält nun einen getak-
teten Prozess MUL_ADD, der die Multiplizierer-Addiererstufe mit Pipelineregistern ab-
schließt, sowie den kombinatorischen Prozess BAB, der die übrigen Addierstufen be-
schreibt. Die Kopplung der Prozesse MUL_ADD und BAB erfolgt über das Signal-Array
ADDS und über das separate Produkt PROD (N gerade). Eine Variableninitialisierung
erzeugt im Prozess BAB die Aufnahme der Registerausgänge durch den Addiererbaum.
-- FIR Filter in Direktform, fc = 10 kHz , Abtastfrequenz 48 kHz
-- Balancierter Addiererbaum für N gerade; eine Pipelinestufe
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity FIR_DIRECT_BAB_P is
generic
(DAC_WIDTH: positive := 20; ADC_WIDTH: positive := 20;
N: positive := 22 ; -- Filterordnung N; N/2 ungerade
AAST: positive := 5); -- Anzahl Addiererstufen = Γld(N+1) port
(CLK: in bit; -- Taktsignal fclk = 48 MHz
RESET_N: in bit; -- active-low
RD: in bit; -- Abtastwert aktualisiert
XN: in bit_vector(ADC_WIDTH-1 downto 0); -- Signal aus dem ADC
YN: out bit_vector(DAC_WIDTH-1 downto 0) -- Signal zum DAC
);
end FIR_DIRECT_BAB_P;
architecture PARALLEL of FIR_DIRECT_BAB_P is
type STAGE_TYPE is array(0 to N) of signed(11 downto 0); -- Registerkette
type COEFF_TYPE is array(0 to N) of signed(11 downto 0); -- Koeffizienten
type PRODUCTS_TYPE is array(0 to N) of signed(23 downto 0); -- Produkte
type ADD_TYPE is array(0 to N -1 + AAST -3) of signed(23 downto 0);
type ADDS_TYPE is array(0 to N/2 -1) of signed(23 downto 0);-- 2sign.Q22
--
signal ADDS: ADDS_TYPE; -- Pipelinestufe
signal STAGE: STAGE_TYPE; -- Registerkette mit Übernahmestufe j Bits
signal COEFF: COEFF_TYPE; -- Positive Symmetrie; l Bits
signal ADDA, PROD : signed(23 downto 0); -- separates Produkt, m Bits
signal TEMP_1, TEMP_2,RD_S, FIR_EN, A_REG_EN: bit ;-- zusätzlicher Puls
--
begin
COEFF(0) <= "000000000011"; -- 0.00148587755162
COEFF(1) <= "000000000010"; -- 0.00104312227618 kein Multiplizierer
COEFF(2) <= "111111111011"; -- -0.00254297568453
COEFF(3) <= "111111110101"; -- -0.00546703115960
COEFF(4) <= "000000000110"; -- 0.00272867876211
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
277 9.1 FIR-Filter
COEFF(5) <= "000000100010"; -- 0.01672858094360
COEFF(6) <= "000000001110"; -- 0.00662913854437
COEFF(7) <= "111110111011"; -- -0.03347988549507
COEFF(8) <= "111110101010"; -- -0.04193952517288
COEFF(9) <= "000001100100"; -- 0.04901745208684
COEFF(10) <= "000110011011"; -- 0.20050124258743
COEFF(11) <= "001000110111"; -- 0.27687297947153
PULSE_SHORTER: process(CLK,RESET_N)
begin
if RESET_N = '0' then
TEMP_1 <= '0'after 3 ns;
TEMP_2 <= '0'after 3 ns;
FIR_EN <= '0'after 3 ns;
A_REG_EN <= '0' after 3 ns;
elsif CLK='1' and CLK'event then
TEMP_1 <= RD after 3 ns; -- Ready des Codec-Interface
TEMP_2 <= TEMP_1 after 3 ns;
FIR_EN <= RD_S after 3 ns;
A_REG_EN <= FIR_EN after 3 ns; -- zusätzlicher Puls
end if;
end process PULSE_SHORTER;
RD_S <= TEMP_1 and (not TEMP_2) after 3 ns; -- verkürzter Puls
STAGES: process(CLK)
begin
if CLK='1' and CLK'event then --
if RESET_N='0' then
STAGE <= (others => (others=>'0')) after 3 ns;
elsif RD_S = '1' then -- ADC aktualisiert
STAGE <= signed(to_stdlogicvector(XN(19 downto 8))) &
STAGE(0 to N -1) after 3 ns;
end if;
end if;
end process STAGES;
MUL_ADD: process(CLK, RESET_N) -- Pipelinestufe
variable PRODUCTS: PRODUCTS_TYPE; -- Multiplizierer, m Bits
begin
if RESET_N = '0' then
ADDS <= (others => (others => '0')) after 3 ns;-- Array-Aggregat
PROD <= (others => '0') after 3 ns;
elsif (CLK'event and CLK = '1') then
if (FIR_EN = '1') then
for I in 0 to N loop
if (I <= N/2) then
PRODUCTS(I) := STAGE(I) * COEFF(I);-- N+1 Multiplizierer
else
PRODUCTS(I) := STAGE(I) * COEFF(N-I);
end if;
end loop;
for I in 0 to N/2 -1 loop -- 1. Addiererstufe (N+1)/2 Addierer
ADDS(I) <= PRODUCTS(I*2) + PRODUCTS(I*2 + 1) after 3 ns;
end loop;
PROD <= PRODUCTS(N) after 3 ns;-- separates Produktregister
end if;
end if;
end process MUL_ADD;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
278 9 Modellierung digitaler Filter
BAB: process(ADDS,PROD) -- kombinatorischer Prozess
variable PRODUCTS: PRODUCTS_TYPE; -- Multiplizierer, m Bits
variable ADD: ADD_TYPE; -- Addierer Register, m Bits
variable AANZ: integer range 0 to (N)/2; -- Anzahl Addierer pro Stufe
variable K: integer range 0 to N + AAST - 3; -- Offset Addierer-Index
variable P: integer range 0 to N; -- Offset Summanden-Index
variable REST, PRODN: integer range 0 to 1; -- Zusätzliche Strukturmerkmale
begin
for I in 0 to N/2 - 1 loop
ADD(I) := ADDS(I); -- Initialisierung; Übergabe der 1. Addiererstufe
end loop;
K := N/2; AANZ := N/2;
P := 0; PRODN := 0;
for J in 0 to (AAST - 1) - 1 loop -- 2. bis ld(N+1)'te Stufe
REST := AANZ rem 2;
AANZ := AANZ/2 + REST;
for I in 0 to AANZ - 1 loop
if ((REST > 0) and (PRODN = 0) and (I = AANZ -1)) then
ADD(I + K) := ADD(I*2 + P) + PROD;
PRODN := 1; -- separates Produkt erfasst
elsif ((REST > 0) and (PRODN = 1) and (I = AANZ -1)) then
ADD(I + K) := ADD(I*2 + P); -- nur weiterreichen
else -- Addier
ADD(I + K) := ADD(I*2 + P) + ADD(I*2 + P +1);
end if;
end loop;
P := K;
K := K + AANZ;
end loop;
ADDA <= ADD(P) after 6 ns; -- Ergebnis in letzter Addiererstufe
end process BAB;
A_REG: process(CLK, RESET_N)
begin
if RESET_N ='0' then
YN <= (others => '0') after 3 ns;
elsif CLK='1' and CLK'event then
if A_REG_EN = '1' then -- Aufnahme in die Übergabestufe
YN <= to_bitvector(std_logic_vector(ADDA(22 downto 3))) after 3 ns;
end if; -- Inneres Type Casting mit IEEE.numeric_std.all;
end if; -- Äusseres Typkonvertierung mit IEEE.std_logic_1164.all;
end process A_REG;
end PARALLEL;
Code 9-6: FIR-Direktform mit balanciertem Addiererbaum N=22, N/2 ungerade und Pipelinestufe
ADDS; separates Produkt PROD. Tiefpass mit fc=10 kHz, fa=48 kHz
Zwei separate Addierer-Arraytypen sind deklariert worden, um die jeweils erforderliche
Elementanzahl sichtbar zu machen:
type ADD_TYPE is array(0 to N -1 + AAST -3) of signed(23 downto 0); --BAB
type ADDS_TYPE is array(0 to N/2 -1) of signed(23 downto 0); -- Register
Insgesamt sind mehr als N=22 Arrayelemente deklariert, die jedoch nicht alle eine Addie-
rer-Synthese implizieren, da die Variablen als Rechenzwischengrößen zur Übersetzungszeit
auf die tatsächlich erforderliche Anzahl von Arithmetikelementen reduziert werden.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
279 9.1 FIR-Filter
Das symmetrische Syntheseergebnis in Bild 9-16 bestätigt die Koppelwirkung von internen
Signalen, die an eine Variableninitialisierung weitergereicht werden. Der längste Signal-
laufzeitpfad liegt hinter der Pipelinestufe im Addiererbaum mit AAST-1=4 Stufen: 11.95
ns; ADDS(1)(0) – YN(19).
Bild 9-16: Syntheseergebnis des Addiererbaums mit Pipelinestufe nach Code 9-6. N=22 Addierer;
ISE 13.4, maximale Signallaufzeit 11.95 ns (83.6 MHz) im Pfad mit vier Addiererstufen
9.1.4.5 Linear-Phasen-Struktur
Für die meisten Anwendungen in denen die hohe Datenrate eine parallele Filterstruktur
erfordert, ist die Linear-Phasen-Struktur der Direktform vorzuziehen, da die gebräuchlichs-
ten Entwurfsverfahren (Fenster- und Optimalmethode) symmetrische Koeffizienten berech-
nen [74], [75]. Im Fall gerader Filterordnungen N verringert sich dadurch die Zahl der
Multiplizierer von N+1 auf nur noch N/2+1. Diese signifikante Einsparung an
Multiplizierern reduziert den Bedarf an Look-Up-Tabellen für ein Filter auf unter 70%.
Für die Linear-Phasen-Struktur nach Bild 9-2 sind im Fall gerader N folgende Strukturei-
genschaften zu nennen, die den Entwurf des VHDL-Modells in Code 9-7 bestimmen:
Von den N+1 Elementen der Registerkette werden in der ersten Addiererstufe N zu-
sammengefasst, sodass das mittlere Arrayelement STAGE(N/2) nicht verarbeitet wird.
Hinter der Multipliziererebene liegt also ein separates Produkt PRODUCTS(N/2) vor,
das direkt aus der Registerkette gespeist wird.
Liegt nun mit N/2+1 insgesamt eine gerade Anzahl von Produkten vor, so kann das
separate Produkt in der zweiten Addiererstufe aufgenommen werden. Ansonsten findet
für N/2 gerade die Verarbeitung des separaten Produktes in einer der nächsten Addierer-
stufen statt, die mit einer ungeraden Anzahl von Eingängen gespeist wird.
Ein wesentliches Merkmal des VHDL-Entwurfes nach Code 9-7 besteht darin, dass der
kombinatorische Prozess MUL_ADD im ersten sequentiellen Schritt (Label MUL) die
Arrayelemente der Registerkette mit einer vorzeichenrichtigen Erweiterung addiert (vgl.
Abschnitt 9.1.2.1). Da die Registerkette wie bei einer Sprungantwort komplett mit dem
Maximalwert |X|=7FFHex gefüllt sein kann, muss ein Guard-Bit den Übertrag aus der Addi-
tion aufnehmen. Daraus ergibt sich für die Produkte eine Deklaration als 25-Bit-Vektor im
Q22-Format mit 1 Sign-Bit und 2 Guard-Bits:
MUL[sign,guard,guard. 21:0] = STAGE_ADD[sign,guard. 10:0] * COEF[sign. 10:0]
P0 P2 P4 P6 P8 P10 P12 P14 P16 P18 P20
ADDS(0)
++ + + + + + + + + +
+
P22
ADDA
+ + + +
+
+ ++ + +
ADD(19)
ADDS(10)
ADD(21)ADD(22)
ADD(20)
ADD(11)
ADD(17)
PRODADDS(5)
Pipelining-register
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
280 9 Modellierung digitaler Filter
Die zweite Addiererstufe (Label ST2) fasst die in der Breite reduzierten Produkte mit der
Addierer-Arrayvariablen ADD zusammen. Ein Guard-Bit der Produkte reicht aus, da nur
der Koeffizient cN/2=2fcT ohne Skalierung maximal 1 werden kann (vgl. Gl. 9-12) und
dieser im separaten Produkt auch nur mit einem Register verknüpft ist. Für die Diskussion
zur Überlauffreiheit der internen Addierer sind lediglich die Addierer am rechten Rand der
Linear-Phasen-Struktur in Bild 9-17 relevant. Die fünf rechten Register bringen durch die
Summen einen Maximalwert von 5 ein und für die Koeffizienten gilt:
Hohe Eckfrequenz fc → 1/2T: cN/2 strebt gegen 1, die betragsmäßig relevanten Koeffi-
zienten cN/2-1 und cN/2-2 liegen im Bereich < 0.2.
Niedrige Eckfrequenz fc << 1/2T: Alle genannten Koeffizienten nehmen geringe und
vergleichbare Werte < 0.4 an.
Als Ergebnis dieser Abschätzung kann man also sicher sein, dass insbesondere für die
Additionen der 2. Stufe ein Guard-Bit ausreicht, da der Wertebereich -2 ≤ ADD < 2−1 LSB
auch ohne Skalierung nicht voll ausgeschöpft wird.
-- FIR Filter in Linear-Phasen-Struktur, fc = 10 kHz, Abtastfrequenz 48 kHz -- Ordnung N gerade; N/2 +1 Multiplizierer; balancierter Addiererbaum
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity FIR_RM_BAB is
generic
( DAC_WIDTH: positive := 20; ADC_WIDTH: positive := 20;
N: positive := 22 ; -- Filterordnung N gerade
AAST: positive := 5); -- Anzahl Addiererstufen = ld(N+1)
port
(CLK: in bit; -- Taktsignal 48 MHz
RESET_N: in bit; -- asynchron, active-low
RD: in bit; -- Abtastwert aktualisiert
XN: in bit_vector(ADC_WIDTH-1 downto 0); -- Signal aus dem ADC
YN: out bit_vector(DAC_WIDTH-1 downto 0) -- Signal zum DAC
);
end FIR_RM_BAB;
architecture PARALLEL of FIR_RM_BAB is
type STAGE_TYPE is array(0 to N) of signed(11 downto 0); -- Registerkette
type COEFF_TYPE is array(0 to N/2) of signed(11 downto 0);--Koeffizienten
type PRODUCTS_TYPE is array(0 to N/2) of signed(24 downto 0);--Q22,3 sign
type ADD_TYPE is array(0 to N/2 + AAST - 3) of signed(23 downto 0);
signal STAGE: STAGE_TYPE; -- Register mit Aufnahmestufe j Bits
signal COEFF: COEFF_TYPE; -- Positive Symmetrie; l Bits
signal ADDA: signed(23 downto 0); -- letzte Addiererstufe, Q 22, 2sign Bits,
signal TEMP_1, TEMP_2,RD_S, FIR_EN: bit ; -- Freigabepulse
begin
COEFF(0) <= "000000000011"; -- 0.00148587755162
COEFF(1) <= "000000000010"; -- 0.00104312227618 kein Multiplizierer
…
COEFF(11) <= "001000110111"; -- 0.27687297947153
PULSE_SHORTER: process(CLK,RESET_N)
begin
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
281 9.1 FIR-Filter
if RESET_N = '0' then
TEMP_1 <= '0'after 3 ns;
TEMP_2 <= '0'after 3 ns;
FIR_EN <= '0'after 3 ns;
elsif CLK='1' and CLK'event then
TEMP_1 <= RD after 3 ns; -- Ready des Codec-Interface
TEMP_2 <= TEMP_1 after 3 ns;
FIR_EN <= RD_S after 3 ns; -- Freigabe des A_REG
end if;
end process PULSE_SHORTER;
RD_S <= TEMP_1 and (not TEMP_2) after 3 ns; -- verkürzter Puls
STAGES: process(CLK) -- Registerkette
begin
if CLK='1' and CLK'event then
if RESET_N='0' then
STAGE <= (others => (others=>'0')) after 3 ns; -- Array-Aggregat
elsif RD_S = '1' then -- ADC aktualisiert
STAGE <= signed(to_stdlogicvector(XN(19 downto 8))) &
STAGE(0 to N -1) after 3 ns;
end if;
end if;
end process STAGES;
-- Filterarithmetik in einem kombinatorischen Prozess
MUL_ADD: process(COEFF,STAGE)
variable PRODUCTS: PRODUCTS_TYPE; -- Q22, 3 sign Bits
variable ADD: ADD_TYPE; -- Q22, 2 sign Bits
variable AANZ: integer range 0 to N/2; -- Anzahl Addierer pro Stufe
variable K: integer range 0 to N; -- Offset Addierer-Index
variable P: integer range 0 to N; -- Offset Summanden-Index
variable REST, PRODN: integer range 0 to 1; -- zusätzliche Strukturmerkmale
begin
MUL:for I in 0 to N/2 -1 loop -- N/2 gerade oder ungerade
PRODUCTS(I) := ((STAGE(I)(STAGE(I)'left) & STAGE(I)) +
(STAGE(N-I)(STAGE(N-I)'left) & STAGE(N-I))) * COEFF(I);
end loop;
PRODUCTS(N/2) := (STAGE(N/2)(STAGE(N/2)'left) & STAGE(N/2))
* COEFF(N/2); -- immer separat für gerade N
PRODN := (N/2) rem 2; -- PRODN = 1 ergänzt AANZ auf gerade
AANZ := (N/2)/2 + PRODN; -- Produkt in 2.Stufe aufnehmen
ST2:for I in 0 to AANZ -1 loop -- Variable ADD ab 2. Addiererstufe
ADD(I) := PRODUCTS(I*2)(23 downto 0) + PRODUCTS(I*2 + 1)(23 downto 0);
end loop;
K := AANZ;
P := 0;
BAB:for J in 0 to (AAST - 1) - 2 loop -- 3. bis Γld(N+1)'te Stufe REST := AANZ rem 2;
AANZ := AANZ/2 + REST;
for I in 0 to AANZ - 1 loop
if ((REST > 0) and (PRODN = 0) and (I = AANZ -1)) then
ADD(I + K) := ADD(I*2 + P) + PRODUCTS(N/2)(23 downto 0);
PRODN := 1; -- separates Produkt erfasst
elsif ((REST > 0) and (PRODN = 1) and (I = AANZ -1)) then
ADD(I + K) := ADD(I*2 + P); -- nur weiterreichen
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
282 9 Modellierung digitaler Filter
else
ADD(I + K) := ADD(I*2 + P) + ADD(I*2 + P +1); -- Addierer
end if;
end loop;
P := K;
K := K + AANZ;
end loop;
ADDA <= ADD(P) after 6 ns; -- Ergebnis der letzten Addiererstufe
end process MUL_ADD;
A_REG: process(CLK, RESET_N)
begin
…
end process A_REG;
end PARALLEL;
Code 9-7: Linear-Phasen-Struktur mit balanciertem Addiererbaum. N=22, N/2+1 Multiplikatio-
nen. Synchronisation und Pulsverkürzung. Tiefpass mit fc=10 kHz, fa=48 kHz
Der weitere Addiererbaum ist ab der 3. Stufe (Label BAB) so formuliert wie im Code 9-5.
Der Indexgrenzwert ist entsprechend auf AAST-2 verkleinert und der Index-Offset ist
durch den aktualisierten Wert AANZ ebenfalls angepasst.
Die Struktur der symmetrischen Paarbildungen in den Addiererstufen, die einen balancier-
ten Addierebaum ausmachen, zeigt auch das Syntheseergebnis nach Bild 9-17 (vgl. Bild
9-15). Der Synthesecompiler XST in der Version ISE 13.4 liefet dieses Ergebnis auch für
die Modellierung der kompletten Filterarithmetik in einem kombinatorischen Prozess
MUL_ADD, ohne dass eine Prozessaufspaltung erfolgen muss.
Bild 9-17: Syntheseergebnis der Linear-Phasen-Struktur nach Code 9-7. Der Koeffizient c1 enthält
nur ein Bit mit 1. N=22; ISE 13.4, maximale Signallaufzeit 20.22 ns (49.45 MHz), Stage(0)(2) -
YN(19)
Zur Verbesserung der erreichbaren Taktfrequenz wird im nächsten Schritt mit Code 9-8 ein
vollständiges Pipelining vorgestellt, dem hier eine Aufspaltung des Prozesses MUL_ADD
in drei getaktete Teilprozesse zu Grunde liegt. Variablen werden deshalb nur noch für die
Instanziierungsindizes der for loops genutzt.
PRODUCTS(0)
++ + + + + + + + + +
+
St0 St22
+ + + +
+
+ +
+ + +ADD(8)
ADD(0)
ADD(10)
ADDA
ADD(5)
ADD(6)
c2c0 c5c4c3 cN/2c10c9c6 c7 c8
St21 St2 St20 St19 St4 St18 St17 St6 St16 St15 St8 St14 St13 St10 St12 StN/2
ADD(9)
ADD(7)
ADD(3)
PRODUCTS(N/2)
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
283 9.1 FIR-Filter
Die sukzessive Freigabe der insgesamt AAST+1=6 Pipelinestufen generiert ein Schie-
beregister mit der Impulskette EN, das durch den verkürzten Enable-Puls RD_S im
Prozess PULSE_SHORTER angesteuert wird.
Der Prozess ADD1 bildet die Summen SUM aus den Elementen der Registerkette
STAGE, wobei diese N/2 Addierer nur 13 Bit breit sind. Das separate Arrayelement
STAGE(N/2) ist hier integriert, damit die Struktur für ein komplettes Pipelining aufge-
baut wird. Das resultierende Register SUM(N/2) dient dann dem Laufzeitausgleich, da
kein Addierer von der Multiplikation mit cN/2 zu entkoppeln ist.
Die zweite Pipelinestufe inferiert der Prozess MUL mit N/2+1 Multiplikationen PRO-
DUCTS.
Der Prozess BAB fasst die Produkte in der zweiten Addiererstufe zusammen und reali-
siert die weiteren Stufen des balancierten Addiererbaumes. Je nach Filterordnung mit
N/2 gerade oder ungerade wird das separate Produkt PRODUCTS(N/2) in der zweiten
Addiererstufe oder in einer der folgenden Stufen des Addiererbaums verarbeitet (vgl.
Abschnitt 9.1.4.4). Die for loop mit dem Index J synthetisiert drei Pipeliningstufen,
die jeweils mit einem separaten Enable-Puls freigegeben werden. Aus der Anforderung
an die Synthesefähigkeit des Codes ergibt sich die in Code 9-8 realisierte Schachtelung:
Die Indexgrenzen müssen zur Übersetzungszeit Konstanten sein und dürfen daher
nicht in Abhängigkeit von Signalen stehen. Also wäre auch eine Enable-Bedingung
außerhalb der for loop mit dem Index I zulässig, da die Grenze AANZ für die
Anzahl der Addierer eine Stufe sequentiell vorab ausgewertet wird:
if EN(J+3) = '1' then
for I in 0 to AANZ - 1 loop
...
end loop;
end if;
Die VHDL-Simulation zeigt in den Fällen mit nicht korrekt geschachtelter Enable-
Bedingung lediglich für die letzten drei Addiererstufen „undefined“ Signalwerte.
-- FIR Filter in Linear-Phasen-Struktur, fc = 10 kHz, Abtastfrequenz 48 kHz -- Ordnung N gerade; N/2 +1 Multiplizierer; balancierter Addiererbaum
-- Pipelineregister für alle Addierer-Stufen und Multiplizierer
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity FIR_RM_BAB_VP is
generic
( DAC_WIDTH: positive := 20; ADC_WIDTH: positive := 20;
N: positive := 22 ; -- Filterordnung N ungerade
AAST: positive := 5); -- Anzahl Addiererstufen = Γld(N+1) port
( CLK: in bit; -- Taktsignal 48 MHz
RESET_N: in bit; -- asynchron, active-low
RD: in bit; -- Abtastwert aktualisiert
XN: in bit_vector(ADC_WIDTH-1 downto 0); -- Signal aus dem ADC
YN: out bit_vector(DAC_WIDTH-1 downto 0) ); -- Signal zum DAC
end FIR_RM_BAB_VP;
architecture PARALLEL of FIR_RM_BAB_VP is
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
284 9 Modellierung digitaler Filter
type STAGE_TYPE is array(0 to N) of signed(11 downto 0); -- Register
type COEFF_TYPE is array(0 to N/2) of signed(11 downto 0);
type SUM_TYPE is array(0 to N/2) of signed(12 downto 0); -- 1. Stufe
type PRODUCTS_TYPE is array(0 to N/2) of signed(24 downto 0);--Q22,3 sign
type ADD_TYPE is array(0 to N/2 + AAST - 3 - 1) of signed(23 downto 0);
signal STAGE: STAGE_TYPE; -- Registerstufen mit Aufnahmestufe j Bits
signal COEFF: COEFF_TYPE; -- Positive Symmetrie; l Bits
signal SUM: SUM_TYPE; -- 1. Addiererstufe
signal PRODUCTS: PRODUCTS_TYPE; -- Multiplizierer, m Bits
signal ADD: ADD_TYPE; -- Addierer Register; Stufe 2 bis 4
signal TEMP_1, TEMP_2,RD_S: bit ;
signal EN: bit_vector(AAST downto 0); -- Enable-Pulse für jede Stufe
begin
COEFF(0) <= "000000000011"; -- 0.00148587755162
COEFF(1) <= "000000000010"; -- 0.00104312227618 kein Multiplizierer
COEFF(2) <= "111111111011"; -- -0.00254297568453
...
COEFF(11) <= "001000110111"; -- 0.27687297947153
PULSE_SHORTER: process(CLK)
begin
if CLK='1' and CLK'event then
if RESET_N = '0' then
TEMP_1 <= '0' after 3 ns;
TEMP_2 <= '0' after 3 ns;
EN <= (others => '0') after 3 ns;
else
TEMP_1 <= RD after 3 ns; -- Ready des Codec-Interface
TEMP_2 <= TEMP_1 after 3 ns;
EN <= EN(AAST-1 downto 0) & RD_S after 3 ns; -- Ready-Kette
end if;
end if;
end process PULSE_SHORTER;
RD_S <= TEMP_1 and (not TEMP_2) after 3 ns; -- verkürzter Eingangspuls
STAGES: process(CLK) -- Registerkette
begin
if CLK='1' and CLK'event then
if RESET_N='0' then
STAGE <= (others => (others => '0')) after 3 ns;
elsif RD_S = '1' then -- Aktualisierung
STAGE <= signed(to_stdlogicvector(XN(19 downto 8))) &
STAGE(0 to N -1) after 3 ns;
end if;
end if;
end process STAGES;
ADD1: process(CLK) -- 1. Addierer-Pipeline-Stufe
begin
if CLK'event and CLK = '1' then
if RESET_N = '0' then
SUM <= (others => (others =>'0')) after 3 ns;
elsif EN(0) = '1' then
for I in 0 to N/2 -1 loop -- N/2 gerade oder ungerade
SUM(I) <= ((STAGE(I)(STAGE(I)'left) & STAGE(I)) +
(STAGE(N-I)(STAGE(N-I)'left) & STAGE(N-I))) after 3 ns;
end loop; -- immer separat für gerade N
SUM(N/2) <= (STAGE(N/2)(STAGE(N/2)'left)) &
STAGE(N/2) after 3 ns;
end if;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
285 9.1 FIR-Filter
end if;
end process ADD1;
MUL: process(CLK) -- Produkt-Pipeline-Stufe
begin
if CLK'event and CLK = '1' then
if RESET_N = '0' then
PRODUCTS <= (others => (others =>'0')) after 3 ns;
elsif EN(1) = '1' then
for I in 0 to N/2 loop -- N/2 gerade o. ungera. Anzahl Mult.
PRODUCTS(I) <= SUM(I) * COEFF(I)after 3 ns;
end loop;
end if;
end if;
end process MUL;
BAB: process(CLK) -- Addierer-Pipeline-Stufen
variable AANZ: integer range 0 to N/2; -- Anzahl Addierer pro Stufe
variable K: integer range 0 to (N/2 + AAST -3); -- Offset Addierer-Index
variable P: integer range 0 to (N/2 + AAST -3); -- Offset Summanden-Index
variable REST, PRODN: integer range 0 to 1; -- zusätzliche Strukturmerkmale
begin
if CLK'event and CLK = '1' then
P := 0;
PRODN := (N/2) rem 2; -- PRODN = 1 ergänzt AANZ auf gerade
AANZ := (N/2)/2 + PRODN; -- Produkt in 2.Stufe aufnehmen
K := AANZ;
if EN(2) = '1' then
for I in 0 to AANZ -1 loop -- Variable ADD ab 2. Stufe
ADD(I) <= PRODUCTS(I*2)(23 downto 0) +
PRODUCTS(I*2 + 1)(23 downto 0) after 3 ns;
end loop;
end if;
for J in 0 to (AAST - 1) - 2 loop -- 3. bis Γld(N+1)'te Stufe REST := AANZ rem 2;
AANZ := AANZ/2 + REST;
for I in 0 to AANZ - 1 loop
-- Indexgrenzen nicht unter Einfluss von Signalen
if EN(J+3) = '1' then -- Enable innerhalb der loop
if ((REST > 0) and (PRODN = 0) and (I = AANZ -1)) then
ADD(I + K) <= ADD(I*2 + P) +
PRODUCTS(N/2)(23 downto 0) after 3 ns;
PRODN := 1; -- separates Produkt erfasst
elsif ((REST > 0) and (PRODN = 1) and (I = AANZ -1)) then
ADD(I + K) <= ADD(I*2 + P) after 3 ns; -- weiterreichen
else
ADD(I + K) <= ADD(I*2 +P) + ADD(I*2 + P + 1) after 3 ns;
end if;
end if;
end loop;
P := K; K := K + AANZ;
end loop;
--YN <= to_bitvector(std_logic_vector(ADD(P)(22 downto 3))) after 3 ns;
end if;
end process BAB;
YN <= to_bitvector(std_logic_vector(ADD(N/2)(22 downto 3))) after 3 ns;
end PARALLEL;
Code 9-8: Linear-Phasen-Struktur mit Pipelining aller Stufen. Tiefpass mit fc=10 kHz, fa=48 kHz,
N=22
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
286 9 Modellierung digitaler Filter
Für die Selektion der letzten Addiererstufe ADD(Kmax) und deren Übergabe an den Aus-
gang YN muss der Aufbau des unsymmetrisch balancierten Addiererbaums bekannt sein,
damit der zuletzt gültige Indexwert Kmax vorliegt, der den Ausgangsaddierer indiziert. Zwei
Varianten zur Signalkopplung sind im Code 9-8 vorgeschlagen:
Der letztgültige Index K kann durch manuelle Auswertung der Indexberechnungen oder
einen äquivalenten C-Code gewonnen werden. Dieser Wert wird in einer unbedingten
Signalzuweisung außerhalb des getakteten Prozesses BAB genutzt, sodass die letzte
Pipelinestufe den Ausgang YN treibt.
Innerhalb des Prozesses BAB ist der Indexwert Kmax als Variable verfügbar und kann
über die aktualisierte Variable P außerhalb der for loop gelesen werden. Mit der
Signalzuweisung an YN innerhalb des getakteten Rahmens entsteht jedoch ein weiteres
Register YN, das die Latenz des Pipelinesystems von 6 auf 7 Takte erhöht.
Grundsätzlich vermieden werden sollen jedoch Codierversuche, die die Instanziierungsva-
riablen P oder K an ein Signal übergeben, um dieses außerhalb des Prozesses BAB zu
lesen. Die beiden Beispiele im folgenden Code-Ausschnitt sind nach den Erklärungen in
den Abschnitten 3.3.1 und 3.6 nicht konform mit den Syntheserichtlinien für getaktete
Prozesse [20]. Mit der ersten Variante entsteht durch die Signalzuweisung innerhalb der
if-Anweisung ein Register LST, dessen Breite durch die vom Synthesecompiler durchge-
führte Bit-Codierung des Integersignals bestimmt ist. Zu der außerhalb der if-Anweisung
gelesenen Variable P in der zweiten Signalzuweisung inferiert der Compiler ebenso ein
Register, das mit dem Signalnamen P gekennzeichnet ist.
...
K := K + AANZ; end loop;
LST <= P; -- 1. Integer-Signal LST als Register
end if;
--LST <= P; -- 2. Integer-Variable P als Register
end process BAB;
YN <= to_bitvector(std_logic_vector(ADD(LST)(22 downto 3))) after 3 ns;
...
In beiden Fällen wird statt einer Auswertung von Signalverknüpfungen zur Übersetzungs-
zeit eine Schaltung erzeugt, die die Signalleitungen des Ausgangs YN über Multiplexer aus
den Addiererstufen ADD(11) und ADD(0) selektiert. Zwei D-FFs P(0) und P(1) steuern
diese Multiplexer. Eine weitere Untersuchung solcher ungeeigneter Syntheseergebnisse ist
nicht sinnvoll. Es wird hier wiederholt deutlich, dass ein synthesegerechter Codierstil die
Entwurfssicherheit erheblich unterstützt, zumal die VHDL-Simulation auch in den beiden
oben beschriebenen Fällen korrekte Signalverläufe liefert.
Zusätzlich zur Überprüfung der Syntheseergebnisse ist insbesondere bei großen Designs
eine Timingsimulation zum Nachweis der Entwurfsfunktionalität unerlässlich. Diese beruht
auf einem strukturellen VHDL-Modell, das die Entwurfswerkzeuge aus dem Place & Rou-
te-Ergebnis für die FPGA-Zieltechnologie ableitet. Nachbildungen der physikalischen
Signalverzögerungen von Logik- und Verdrahtungsressourcen gehen als Generics über ein
Standard-Delay-Format (SDF-Datei) [60] in die Simulation ein. Dieses Format ist im Vital-
Standard [61] fixiert, der eine Industrievereinbarung zur Timingsimulation von ASICs
repräsentiert. Neben den synthetisierten Funktionen und dem Timing des synchronen Ent-
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
287 9.1 FIR-Filter
wurfs zeigt eine Timingsimulation damit tatsächliche Worst-Case-Signalverzögerungen der
Zieltechnologie auf.
Zur Sprungantwort der Linear-Phasen-Struktur demonstriert die Timingsimulation in Bild
9-18 den Übergang in den stationären Endwert Y=55455Hex (vgl. Tabelle 9-3). Jeweils zum
Ende der Freigabepulse RD_S und EN(5 downto 0) erfolgt die sukzessive Aktualisierung
der Pipelinestufen. Die funktionale Kette wird mit Blick auf das Syntheseergebnis Bild
9-19 nachvollziehbar. Sobald die letzte Registerstufe STAGE(22) mit dem Pegel 7FFHex der
Sprunganregung gefüllt ist, finden die letzten Pegeländerungen in den Registern statt, die
den linken Rand der Filterstruktur bilden. Gegenüber der positiven Signalflanke CLK sind
diese Transitionen der D-Flipflopausgänge um ca. TPD=3 ns verzögert (vgl. Abschnitt
6.4.2.2). Eine zusätzliche Verzögerung weist der Filterausgang Y auf, da hier eine Laufzeit
von den D-FFs des Registers ADD(11) bis zu den FPGA-Pins vorliegt.
Bild 9-18: Timingsimulation der Linear-Phasen-Struktur mit vollständigem Pipelining nach Code
9-8. Aktualisierung des Ausgangsignals Y mit dem stationären Endwert der Sprungantwort. CLK mit
fCLK=48 MHz, N=22
Die hier genutzte Impulskette EN für die Freigabeeingänge der Register (CE-Input) bietet
einen einfachen Steuerungsmechanismus für Datenpfade mit Pipeline-Struktur. Mit einem
einzigen Steuerbit, das die Impulskette anregt, kann die Pipeline zum Füllen eingeschaltet
werden und nach dem Abschalten des Steuerbits läuft die Pipeline leer. Dabei bleiben dann
alte Registerinhalte erhalten, die beim Neustart überschrieben werden. Zur parallelen An-
zeige der gültigen Pipelineausgangssignale ist die Impulskette dazu noch um ein D-FF zu
verlängern.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
288 9 Modellierung digitaler Filter
Bild 9-19: Syntheseergebnis der Linear-Phasen-Struktur mit vollständigem Pipelining nach Code
9-8. N=22; ISE 13.4, maximale Signallaufzeit 5.44 ns (183 MHz)
Der Addiererbaum im Syntheseergebnis nach Bild 9-19 entspricht wieder genau dem Auf-
bau der Zielstruktur in Bild 9-15. Zur Vereinfachung ist die Multiplikation mit dem in
diesem Beispiel speziellen Koeffizienten c1=c21=002Hex nicht dargestellt (vgl. S.264). Ein
Register zum Laufzeitausgleich (gepunktete Ovale) ist automatisch auch für das
Pseudoaddierersignal ADD(10) synthetisiert worden, das durch die Bedingung für einen
weiterzureichenden Addiererausgang erzeugt wurde. Eine Umstellung auf den synchronen
Reset der Pipelineregister hinter den Multiplizierern hat für die Signale PRODUCTS die
automatische Auswahl der „Registered-Multiplier“-Synthesemakros verusacht [81], in
denen 18×18 Multipliziererblöcke direkt mit einem Register gekoppelt sind, sodass dann
die maximale Laufzeit im Addiererpfad PRODUCTS(2)(5) – ADD(1)(18) auftritt.
Dem Leser sind mit diesen Abschnitten die Entwurfsmethoden erläutert worden, mit denen
er den Codierstil gezielt auf die Strukturierung der Syntheseergebnisse von parallelen
Arithmetikeinheiten ausrichten kann.
Für die Modellierung von kompakten kombinatorischen Prozessen und die Aufteilung
einer Entity in gekoppelte Prozesse liegen detaillierte Entwurfsmuster vor, die die syn-
thesegerechte Nutzung von Variablen als Rechengrößen sowie Instanziierungsindizes in
for loops aufzeigen.
Auf die Separation von Funktionselementen in gekoppelte Prozesse als Instrument zur
Steuerung der Syntheseergebnisse ist hingewiesen worden.
Die auf die Strukturierung der Syntheseergebnisse ausgerichtete Codierung lässt deren
Implikationen für die Signallaufzeitpfade klarer werden.
Die Bedeutung einer Timingsimulation im Rahmen des Entwurfsablaufs ist zu beachten,
da nur sie die für die FPGA-Implementierung relevanten Syntheseergebnisse präzise er-
fasst.
Eine Systematik zur Modellierung von balancierten Addiererbäumen ist vorgestellt
worden.
++ + + + + + + + + +
+
St0 St22
+ + + +
+
+ +
+ + +
ADD(8)
ADD(0)
ADD(10)
ADD(11)
ADD(5)
ADD(6)
c2c0 c5c4c3 cN/2c10c9c6 c7 c8
St21 St2 St20 St19 St4 St18 St17 St6 St16 St15 St8 St14 St13 St10 St12 StN/2
ADD(9)
ADD(7)
SUM(0) SUM(N/2)
Pipelining-
register
ADD(3)
PRODUCTS(0) PRODUCTS(N/2)
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
289 9.1 FIR-Filter
9.1.4.6 Transponierte Form mit reduzierter Anzahl der Multiplizierer
Der wesentliche Vorteil einer transponierten Form des FIR-Filters nach Bild 9-3 gegenüber
den Varianten der Direktform resultiert aus der Kettenstruktur, die direkt ein Pipelining der
Addiererstufen liefert. Damit entfällt der Entwurfsaufwand für die spezielle Strukturierung
eines balancierten Addiererbaums. Geht man von einer Einbettung des Filters in eine Ein-
gangs- und Ausgangsynchronisation wie in Bild 9-20 aus, so ist der längste Laufzeitpfad
durch eine der Kopplungen aus einem Multiplizierer und einem Addierer bestimmt. Diese
Signalpfade sind im Gegensatz zu den aus der Direktform abgeleiteten Strukturen unabhän-
gig von der Filterordnung N.
Bild 9-20: Eingangssynchronisation zwischen den Taktbereichen fI=12 MHz und fCLK=48 MHz
(CLK), Freigabeimpulsverkürzung und Ausgangssynchronisation der letzten Addiererstufe einer
transponierten Form nach Bild 9-3; h=20, j=12, m=24
Die Steuerung des Filters mit der Struktur nach Bild 9-20 sorgt dafür, dass der Puls RD_S
den Filtereingang aktualisiert und mit dem verzögerten Puls FIR_EN die Berechnungser-
gebnisse in die Registerkette aufgenommen werden. Nur mit dieser Zweistufigkeit lässt
sich die sprungförmige Reaktion eines FIR-Filters nach Gl. 9-1 erreichen.
Das Filtermodell in Code 9-9 kommt mit drei Arrays für die Koeffizienten, die Produkte
und die Addiererregister aus. Drei einfache Prozesse bilden die komplette Funktionalität
der transponierten Form ab:
Das durch den Prozess TAKE_OVER generierte Übernahmeregister speichert den
aktuellen Abtastwert X mit der Freigabe durch RD_S.
Diese Variante einer Linear-Phasen-Struktur enthält nur N/2+1 Multiplikationen der
Koeffizienten mit dem Eingangswert XD, aus denen im separaten Prozess MULT L
Produkte gebildet werden. Zur Entkopplung der Multiplikationen von den Addierern
kann dieser Prozess auch durch einen getakteten Rahmen ergänzt werden, wobei die
Freigabekette um ein D-FF zu erweitern ist.
Der Prozess ADD_STAGES füllt die Pipelineregister ADD der Addiererstufen mit dem
höchsten Index beginnend von links und bildet das Übergaberegister mit der letzten Stu-
fe ADD(0). Da die for loop verkettete Funktionselemente instanziiert, findet der
Ladevorgang aller Register ADD mit der Freigabe durch FIR_EN parallel statt. Die
Q
QSET
CLR
D
Q
QSET
CLR
D
Q
QSET
CLR
D
&0
0
0
X
Digitales
FilterCEQ
QSET
CLR
D
CE Q
QSET
CLR
D
CE
Y
CLK
READY
TEMP_1
TEMP_2
RD_S
ADD(0)
FIR_EN
h m h
CLK
j
XD
Pulsverkürzung
Übernahmeregister Übergaberegister
ADD(0)+
X u. READY periodisch mit
fa = 48 kHz,
synchronisiert auf
fI = 12 MHz
fCLK = 48 MHz
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
290 9 Modellierung digitaler Filter
Addierer übernehmen das Guard-Bit der Multiplikationen, sodass zusätzlich zur Skalie-
rung mit der L1-Norm eine Betragsreserve zur Vermeidung von Überläufen vorliegt
(vgl. Abschnitt 9.1.4.5).
-- FIR Filter in transponierte Form, fc = 10 kHz , Abtastfrequenz 48 kHz -- N = 22 gerade, N/2 + 1 symmetrische Koeffizienten
-- Reduzierte Anzahl der Multiplizierer
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity FIR_TRANSPOSED is
generic
( DAC_WIDTH: positive := 20; ADC_WIDTH: positive := 20;
N: positive := 22 ); -- Filterordnung N = 22
port
(CLK: in bit; -- Taktsignal 48 MHz
RESET_N: in bit; -- active-low
RD: in bit; -- Abtastwert aktualisiert
XN: in bit_vector(ADC_WIDTH-1 downto 0); -- ADC Signal
YN: out bit_vector(DAC_WIDTH-1 downto 0) -- Signal zum DAC
);
end FIR_TRANSPOSED;
architecture PARALLEL of FIR_TRANSPOSED is
type COEFF_TYPE is array(0 to N/2) of signed(11 downto 0); -- Q11
type PRODUCTS_TYPE is array(0 to N) of signed(23 downto 0); -- Q22,2 sign
type ADD_TYPE is array(0 to N) of signed(23 downto 0); -- Q22,2 sign
signal PRODUCTS: PRODUCTS_TYPE; -- Multiplizierer, m Bits
signal COEFF: COEFF_TYPE; -- Positive Symmetrie; l Bits
signal ADD: ADD_TYPE; -- Addierer Register, m Bits
signal XD: signed(11 downto 0); -- Übernahmeregister, Q 11, j Bits
signal TEMP_1, TEMP_2,RD_S, FIR_EN: bit ; -- Freigabepulse
begin
COEFF(0) <= "000000000011"; -- 0.00148587755162
COEFF(1) <= "000000000010"; -- 0.00104312227618 kein Multiplizierer
COEFF(2) <= "111111111011"; -- -0.00254297568453
COEFF(3) <= "111111110101"; -- -0.00546703115960
COEFF(4) <= "000000000110"; -- 0.00272867876211
COEFF(5) <= "000000100010"; -- 0.01672858094360
COEFF(6) <= "000000001110"; -- 0.00662913854437
COEFF(7) <= "111110111011"; -- -0.03347988549507
COEFF(8) <= "111110101010"; -- -0.04193952517288
COEFF(9) <= "000001100100"; -- 0.04901745208684
COEFF(10) <= "000110011011"; -- 0.20050124258743
COEFF(11) <= "001000110111"; -- 0.27687297947153
PULSE_SHORTER: process(CLK,RESET_N)
begin
if RESET_N = '0' then
TEMP_1 <= '0'after 3 ns;
TEMP_2 <= '0'after 3 ns;
FIR_EN <= '0'after 3 ns;
elsif CLK='1' and CLK'event then
TEMP_1 <= RD after 3 ns; -- Ready des Codec-Interface
TEMP_2 <= TEMP_1 after 3 ns;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
291 9.1 FIR-Filter
FIR_EN <= RD_S after 3 ns; -- Freigabe der Addiererstufen
end if;
end process PULSE_SHORTER;
RD_S <= TEMP_1 and (not TEMP_2) after 3 ns; -- verkürzter Puls
TAKE_OVER: process(CLK) -- Übernahmeregister
begin
if CLK='1' and CLK'event then
if RESET_N = '0' then
XD <= (others=>'0') after 3 ns;
elsif RD_S = '1' then
XD <= signed(to_stdlogicvector(XN(19 downto 8))) after 3 ns;
end if;
end if;
end process TAKE_OVER;
MULT: process(COEFF,XD) -- Mit Ressourcen-Sharing
variable MUL: signed(23 downto 0);
begin
for I in 0 to N/2 loop
MUL := XD * COEFF(I); -- N/2 + 1 Multiplikationen
PRODUCTS(I) <= MUL after 6 ns; -- 0, 1,..., N/2
if I < N/2 then
PRODUCTS(N-I) <= MUL after 6 ns; -- N,...,N/2+1
end if;
end loop;
end process MULT;
ADD_STAGES: process(CLK) -- inkl. Übergaberegister
begin
if CLK='1' and CLK'event then
if RESET_N ='0' then
ADD <= (others => (others => '0')) after 3 ns;
elsif FIR_EN = '1' then -- parallele Aufnahme in Addiererstufen
ADD(N) <= PRODUCTS(N) after 3 ns;-- Produktaufnahme
for I in N-1 downto 0 loop
ADD(I) <= ADD(I+1) + PRODUCTS(I) after 3 ns;
end loop;
end if;
end if;
end process ADD_STAGES;
YN <= to_bitvector(std_logic_vector(ADD(0)(22 downto 3))) ;
end PARALLEL;
Code 9-9: FIR-Filter in transponierter Form mit reduzierter Anzahl der Multiplizierer. Tiefpass mit
fc=10 kHz, fa=48 kHz, N=22
Ein Detail zum Signallaufzeitverhalten demonstriert die Timingsimulation in Bild 9-21 mit
dem ersten Takt der Abtastwertaktualisierung einer Sprungantwort. Im Anschluss an die
positive Taktflanke zum Zeitpunkt t1 wird das Übergaberegister XD mit 7FFHex gefüllt. Die
Multiplikation mit c4 und die Addition der Registerstufe ADD(4) verursachen Verzögerun-
gen, sodass die Vorbereitungseingänge der Daten-Flipflops ADD_4_in über die kürzeren
Signalpfade zum Zeitpunkt t2 angesteuert werden. Bis zum Zeitpunkt t3 treten dynamische
Hazards [6] auf, die ihre Ursache in den Multipliziererlaufzeiten und den Ripple-Carry-
Effekten der Addition haben. Danach sind die D-FF-Eingänge lange vor dem Setup-
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
292 9 Modellierung digitaler Filter
Zeitfenster (TS=0.46 ns für XC3S400-5) der nächsten positiven Taktflanke stationär. Der
Ausgang ADD_4_out der Registerstufe ADD(4) hat die Dateneingänge zum Zeitpunkt t4
übernommen. Die hier ablesbare D-FF Verzögerung von ca. TPD=3.1 ns ist wesentlich
größer als die Datenblattangabe TCKO=0.63 ns, da das dargestellte Taktsignal CLK vom
Eingangspuffer über das Takt-Verteilnetzwerk erst an die D-FFs der CLBs gelangen muss.
Da die Multiplizierer nach der ersten Anregung durch XD für alle weiteren Rechenschritte
der Sprungantwort stationäre Ausgänge aufweisen, treten Verzögerungen nur noch durch
die Ripple-Carry-Addierer auf. Die Vorbereitungseingänge ADD_4_in reagieren deshalb in
kürzerem Zeitabstand zur zweiten positiven Taktflanke (vgl. t5) auf den aktualisierten Aus-
gang der vorausgehenden Stufe ADD(5) (vgl. Bild 9-22).
Bild 9-21: Timingsimulation der Startphase einer Sprungantwort der transponierten Form nach
Code 9-9 dargestellt für die Addiererstufe ADD(4). Signal CLK mit fCLK=48 MHz (20.83 ns)
Einen Ausschnitt aus dem Syntheseergebnis der transponierten Form nach Code 9-9 zeigt
Bild 9-22 mit den ersten vier und den letzten sechs Stufen der Kettenstruktur. Das im Pro-
zess MULT vorgegebene Ressourcen-Sharing der Multiplikationsergebnisse für das sym-
metrische Filter ist in den ersten Stufen erkennbar:
– Das Produkt P_2 nutzen die Stufen ADD_2 und ADD_20
– Das Produkt P_3 nutzen die Stufen ADD_3 und ADD_19
Darüber hinaus geht das Produkt P_4 in die Stufen ADD_22 und ADD_0 ein, da in diesem
speziellen Filterbeispiel die Koeffizienten c0 und c4 ähnliche Bitmuster aufweisen, die sich
nur um den Faktor zwei unterscheiden. Eine jeweils geeignete Anzahl von Bits zur vorzei-
chenrichtigen Erweiterung erzeugt die erforderliche Stellenpositionierung. Die zweite Stufe
ADD_21 enthält aufgrund des Koeffizienten c1, mit nur einer besetzten Bitposition, keinen
Multiplizierer. Ein Summand wird deshalb direkt mit Vorzeichenerweiterung aus dem
Eingangswert XD abgeleitet.
t2t1 t3
t4
t5
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
293 9.1 FIR-Filter
Bild 9-22: Ausschnitt aus dem Syntheseergebnis der transponierten Form mit reduzierter Anzahl der
Multiplizierer nach Code 9-9. N=22, max. Signallaufzeit 12.29 ns (81.36 MHz). Werkzeug Synplify-
Pro 8.8 [86]; ISE 13.4, max. Signallaufzeit 11.3 ns (88.49 MHz) im Pfad XD(2) – ADD(4)(22)
un1_
XD[2
3:8]
* + -
un1_
XD_1
[23:
7]
* + -
un1_
XD_4
[23:
9]
* + -
ADD_
22_[
22:0
]
Run
27_a
dd[2
:23]
+
un87
_add
[2:2
3]
+
ADD_
1_[2
2:0]
R
ADD_
21_[
22:0
]
Run
30_a
dd[2
:24]
+
un33
_add
[2:2
4]
+
un45
_add
[2:2
4]
+
un78
_add
[2:2
3]
+
un81
_add
[2:2
4]
+
un84
_add
[2:2
4]
+
un90
_add
[2:2
4]
+AD
D_0_
[22:
3]
R
ADD_
2_[2
2:0]
R
ADD_
3_[2
2:0]
R
R R
ADD_
20_[
22:0
]
R
ADD_
4_[2
2:0]
R
ADD_
5_[2
2:0]
R
ADD_
19_[
22:0
]
[22:
0]
ADD_
16_[
22:0
][2
2:0]
[23:
9]XD[1
1:0]
[11:
0]
FIR_
EN
CLK
un1_
rese
t_nYN
[19:
0]
[22:
3]
[23]
[23]
[23]
[23]
[23]
[23]
[23]
[23]
[23:
9]
[11] [11
]
[11]
[11] [11
]
[11]
[11]
[11]
[11]
[11]
[11:
0]
[11]
[11]
[11]
[11]
[11]
[11]
[11]
[11]
[11]
[11]
[11:0
]
[2:2
3] [0]
[2:23
] [0]
[23]
[23]
[23]
[23]
[23]
[23]
[23]
[23:8
]
[23]
[23]
[23]
[23]
[23]
[23]
[23:
7]
[23]
[23]
[23]
[23:
4]
[23]
[23]
[23]
[23] [23]
[23] [23]
[23:
9]
[23]
[23]
[23]
[23]
[23]
[23]
[23:
7]
[23]
[23]
[23]
[23]
[23]
[23]
[23]
[23:
8]
[23]
[23] [23] [23
]
[23]
[23]
[23] [23]
[23:
9]
[2:2
3] [0]
[11:
0]
[23:
8]10
11
[11:0
]
[23:7
]10
101
[11:0
]
[23:
9]01
1
[22:
0]Q[
22:0
]
D[22
:0]
E
[22:
1]
[2:2
3]
[22:
1]
[2:2
3][2
2:0]
Q[22
:0]
D[22
:0]
E
[22:0
]Q[
22:0
]D[
22:0
]
E
[22:
0]
[2:2
4]
[22:
0]
[2:2
4]
[22:
0]
[2:2
4]
[22:
1]
[2:2
3]
[22:0
]
[2:2
4]
[22:
0]
[2:2
4][2
2:0]
[2:2
4][2
2:3]
Q[19
:0]
[2:2
1]D[
19:0
]
E
[22:0
]Q[
22:0
]
[2:24
]D[
22:0
]
E
[22:
0]Q[
22:0
]
[2:2
4]D[
22:0
]
E
[22:
0]Q[
22:0
]
[2:2
4]D[
22:0
]
E
[22:
0]Q[
22:0
][2
:24]
D[22
:0]
E
[22:0
]Q[
22:0
]
[2:2
4]D[
22:0
]
E
[22:
0]Q[
22:0
]D[
22:0
]
E
[22:
0]Q[
22:0
]D[
22:0
]
E
XD[1
1:0]
XD[1
1:0]
un1_
XD_4
[23:
9]
P_4
P_3
P_2
XD[1
1:0]
P_3
P_2
P_3
P_7
P_7
ADD_
16_[
22:0
]AD
D_15
_[22
:0]
P_4
P_4
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
294 9 Modellierung digitaler Filter
9.1.4.7 Systolische FIR Filter
Reglmäßige Hardwarestrukturen, so wie sie z.B. in FIR-Filtern verwendet werden, sind aus
der Technik paralleler Rechnerstrukturen unter der Bezeichnung "Systolisches Array" wohl
bekannt. Die in Bild 9-23 dargestellte Struktur einer systolischen FIR-Filterzelle für eine
Implementierung der FIR Direktform hat die folgende Eigenschaften:
Die durch das Freigabesignal EN gesteuerte Übernahme des Samples X_IN erfolgt
mit dem Abtasttakt nach jeweils M Systemtakten.
Der Addiererausgang SUM_OUT der Zelle besitzt ein Pipelineregister zur Ent-
kopplung langer Laufzeitpfade.
Ebenfalls zur Vermeidung langer Laufzeitpfade wird hinter dem Multiplizierer ei-
ne Pipelinestufe eingebaut.
Die VHDL Realisierung dieser Zelle zeigt Code 9-10.
+
Z-1
Z-1
COEFF
X_IN X_OUT
SUM_IN SUM_OUT
x
PROD
SAMPLE
Z-M
EN
Bild 9-23: Zellstruktur eines systolischen FIR-Filters
library IEEE;
use IEEE.std_logic_1164.all; -- unterstützt Type Casting
use IEEE.numeric_std.all; -- liefert Vektortyp signed
entity SYSTOLIC_CELL is
generic(X_WIDTH: positive :=12; -- Bitbreite des Eingangssignals
C_WIDTH: positive :=12); -- Bitbreite der Koeffizienten
port
(CLK: in bit; -- Taktsignal
RESET_N: in bit; -- synchron, active-low
EN: in bit; -- Enable
COEFF: in signed(C_WIDTH-1 downto 0); -- Koeffizient
X_IN: in signed(X_WIDTH-1 downto 0); -- Eingangssignal der Zelle
SUM_IN: in signed(X_WIDTH+C_WIDTH-1 downto 0); -- Summationseingang
X_OUT: out signed(X_WIDTH-1 downto 0); -- Ausgangssignal der Zelle
SUM_OUT: out signed(X_WIDTH+C_WIDTH-1 downto 0) -- Summationsausgang
);
end SYSTOLIC_CELL;
architecture PIPELINED of SYSTOLIC_CELL is
signal PROD: signed(X_WIDTH+C_WIDTH-1 downto 0);-- Pipelined Prod. mit 2 VZ
signal SAMPLE: signed(X_WIDTH-1 downto 0); -- Sample der Zelle
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
295 9.1 FIR-Filter
begin
P1: process(CLK)
begin
if CLK='1' and CLK'event then -- Registerkette mit synchronem Reset
if RESET_N='0' then
SAMPLE <= (others=>'0') after 3 ns;
PROD <= (others=>'0') after 3 ns;
SUM_OUT <= (others=>'0') after 3 ns;
elsif EN='1' then -- bedingte Uebernahme des Sample
SAMPLE <= X_IN after 3 ns;
else
PROD <= SAMPLE * COEFF after 3 ns;
SUM_OUT <= SUM_IN + PROD;
end if;
end if;
end process P1;
X_OUT <= SAMPLE;
end PIPELINED;
Code 9-10: FIR-Zelle eines systolischen Filters
Ein systolisches FIR-Filter N-ter Ordnung kann nun aus N+1 in Reihe geschalteter Zellen
aufgebaut werden (vgl. Code 9-11). Die Vorteile derartiger Filter lassen sich wie folgt
beschreiben:
Sehr hohe maximale Taktfrequenz erreichbar, da arithmetische Laufzeitpfade im-
mer nur durch einen einzelnen Addierer bzw. Multiplizierer gehen.
Die Struktur arbeitet sicher, solange das Verhältnis M des Systemtaktes zur Ab-
tastrate größer als N+2 ist. In diesem Fall vergeht vor dem Eintreffen eines neuen
Samples eine ausreichende Anzahl von Takten, um jeweils einen Multiplizierer
und die komplette Addiererkette durchlaufen zu können.
In modernen FPGAs, die sogenannte DSP-Slices besitzen, werden die Pipelinere-
gister automatisch in die Multiplizierer bzw. Addierer integriert (vgl. die gestri-
chelten Linien in Bild 9-23). Bei einigen FPGAs werden neben Addierer und
Multiplizierer auch die Eingangsregister in einem DSP48E- oder DSP48A1-Slice
zusammengefasst [91] [92]. Womit für das komplette FIR-Filter N+1 DSP-Slices
aber ausser der Freigabelogik des Prozesses PULSE_SHORTER keine weitere
Hardware erforderlich ist.
Das in Code 9-11 dargestellte FIR-Filter ist in Anlehnung an Code 9-5 aufgebaut. Im Un-
terschied dazu wird die FIR-Struktur hier jedoch aus N+1 Komponenteninstanziierungen
innerhalb einer for generate Schleife gebildet. Um für das hier vorliegende symmetri-
sche FIR-Filter das Koeffizientenarray klein zu halten, enthält die Instanziierungsschleife
des Labels GEN zwei bedingte Abfragen bei den Labels GEN1 und GEN2, die darüber
entscheiden ob der Laufindex I kleiner gleich bzw. grösser als N/2 ist. In letzterem Fall ist
für die I-te Zelle nicht der Koeffizient mit dem Index I sondern der mit dem Index N-I
auszuwählen.
-- Systolisches FIR Filter mit Pipelined Multiplizierern und Addierern,
-- fc = 10 kHz, Abtastfrequenz 48 kHz
-- Addiererkette für N = 22, skaliert mit L1 = 1.5009
library IEEE;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
296 9 Modellierung digitaler Filter
use IEEE.std_logic_1164.all; -- unterstützt Type Casting
use IEEE.numeric_std.all; -- liefert Vektortyp signed
entity FIR_SYSTOLIC is
generic(DAC_WIDTH: positive := 20; ADC_WIDTH: positive := 20; -- h
N: positive := 22); -- Filterordnung N gerade
port
(CLK: in bit; -- Taktsignal 48 MHz
RESET_N: in bit; -- asynchron, active-low
RD: in bit; -- Abtastwert aktualisiert
XN: in bit_vector(ADC_WIDTH-1 downto 0); -- Signal aus dem ADC
YN: out bit_vector(DAC_WIDTH-1 downto 0) -- Signal zum DAC
);
end FIR_SYSTOLIC;
architecture PARALLEL of FIR_SYSTOLIC is
component SYSTOLIC_CELL is
generic(X_WIDTH: positive :=12; -- Bitbreite des Eingangssignals
C_WIDTH: positive :=12); -- Bitbreite der Koeffizienten
port
(CLK: in bit; -- Taktsignal
RESET_N: in bit; -- synchron, active-low
EN: in bit; -- Enable
COEFF: in signed(C_WIDTH-1 downto 0); -- Koeffizient
X_IN: in signed(X_WIDTH-1 downto 0); -- Eingangssignal der Zelle
SUM_IN: in signed(X_WIDTH+C_WIDTH-1 downto 0); -- Summationseingang
X_OUT: out signed(X_WIDTH-1 downto 0); -- Ausgangssignal der Zelle
SUM_OUT: out signed(X_WIDTH+C_WIDTH-1 downto 0) -- Summationsausgang
);
end component;
type COEFF_TYPE is array(0 to N/2) of signed(11 downto 0); -- symm. Koeff.
type STAGE_TYPE is array(0 to N+1) of signed(11 downto 0); -- Registerkette
type ADD_TYPE is array(0 to N+1) of signed (23 downto 0); -- Addiererkette
signal COEFF: COEFF_TYPE;
signal STAGE: STAGE_TYPE;
signal ADDA: ADD_TYPE;
signal TEMP_1, TEMP_2,RD_S: bit; -- Freigabesignalkette
begin -- Koeffizienten alternativ auch als Hex-Werte
COEFF(0) <= "000000000011"; -- x"003"; 0.00148587755162
COEFF(1) <= "000000000010"; -- 0.00104312227618
COEFF(2) <= "111111111011"; -- -0.00254297568453
COEFF(3) <= "111111110101"; -- -0.00546703115960
COEFF(4) <= "000000000110"; -- 0.00272867876211
COEFF(5) <= "000000100010"; -- 0.01672858094360
COEFF(6) <= "000000001110"; -- 0.00662913854437
COEFF(7) <= "111110111011"; -- -0.03347988549507
COEFF(8) <= "111110101010"; -- -0.04193952517288
COEFF(9) <= "000001100100"; -- 0.04901745208684
COEFF(10) <= "000110011011"; -- 0.20050124258743
COEFF(11) <= "001000110111"; -- 0.27687297947153
PULSE_SHORTER: process(CLK,RESET_N) -- 3 D-FFs
begin
if RESET_N = '0' then
TEMP_1 <= '0'after 3 ns;
TEMP_2 <= '0'after 3 ns;
elsif CLK='1' and CLK'event then
TEMP_1 <= RD after 3 ns; -- Ready des Codec-Interfaces
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
297 9.1 FIR-Filter
TEMP_2 <= TEMP_1 after 3 ns;
end if;
end process PULSE_SHORTER;
RD_S <= TEMP_1 and (not TEMP_2) after 3 ns; -- verkürzter, synchroner Puls
STAGE(0) <= signed(to_stdlogicvector(XN(19 downto 8)));
ADDA(0) <= (others=>'0');
-- Instanziiere N+1 Systolische Zellen
GEN: for I in 0 to N generate
GEN1: if (I<=N/2) generate
CELL_A: SYSTOLIC_CELL
generic map(X_WIDTH=>12, C_WIDTH=>12)
port map(
CLK => CLK, RESET_N => RESET_N, EN => RD_S,
COEFF =>COEFF(I), X_IN => STAGE(I), SUM_IN => ADDA(I),
X_OUT => STAGE(I+1), SUM_OUT => ADDA(I+1)
);
end generate GEN1;
GEN2: if (I>N/2) generate
CELL_B: SYSTOLIC_CELL
generic map(X_WIDTH=>12, C_WIDTH=>12)
port map(
CLK => CLK, RESET_N => RESET_N, EN => RD_S,
COEFF =>COEFF(N-I), X_IN => STAGE(I), SUM_IN => ADDA(I),
X_OUT => STAGE(I+1), SUM_OUT => ADDA(I+1)
);
end generate GEN2;
end generate GEN;
-- Kopiere letzten Addiererausgang N nach YN
YN <= to_bitvector(std_logic_vector(ADDA(N+1)(22 downto 3))) after 3 ns;
end PARALLEL;
Code 9-11: Systolisches FIR-Filter mit symmetrischen Koeffizienten. Tiefpass mit fc=10 kHz, fa=48
kHz, N=22
Eine Halbierung des Aufwands an DSP-Slices ist für symmetrische Filter dadurch erreich-
bar, dass in jeder FIR-Zelle jeweils zwei Samples der Verzögerungskette vor der Multipli-
kation mit dem gemeinsamen Koeffizienten addiert werden. Diese zusätzliche Funktionali-
tät lässt sich durch Aktivierung eines sogenannten Pre-Adders z.B. innerhalb der
DSP48A1-Slices von Spartan 6 FPGAs realisieren [91].
Die Pipelinestruktur der systolischen Filter macht den Einsatz von FPGAs der Reihen
Spartan-6 und Virtex-6 erforderlich, die über geeignete DSP48-Slices verfügen, da nur
diese die zusätzlichen D-FF-Ressourcen bieten. Eine komplette Integration in DSP48-Slices
schont so die übrigen Slice-Ressourcen und Signallaufzeiten bis unter 5 ns sind realisierbar.
Allerdings ist zu beachten, dass die Aktualisierungsrate um den Faktor N+2 kleiner als die
Taktfrequenz sein muss, also kein reines Pipelinesystem vorliegt. Eine Implementierung
mit FPGAs der Spartan-3-Reihe erfordert zu umfangreiche D-FF-Ressourcen, sodass die
systolischen Filter nicht in der folgenden Übersichtstabelle Tabelle 9-4 enthalten sind.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
298 9 Modellierung digitaler Filter
9.1.4.8 Vergleich der Implementierungsergebnisse und Timinganalysen
Dieser Abschnitt stellt die charakteristischen Kennwerte der Implementierungsergebnisse
und der Timinganalysen zu den präsentierten FIR-Filtermodellen mit paralleler Struktur
vor. Eingesetzt wurde das Synthese- und Implementierungswerkzeug ISE 13.4 [48], das
den Synthesecompiler XST [81] nutzt.
Folgende Synthese- und Implementierungsoptionen sind eingestellt worden:
– Synthese: Optimization Goal: Speed; Optimization Effort: High; No Register Balancing
– Mapping: Map Effort High; Optimization Strategy Speed
– Place & Route: Effort Level High
Für das Spartan-3-XC3S400 FPGA fasst Tabelle 9-4 ausgewählte Implementierungskenn-
werte aus den Synthese- und Map-Reports sowie aus der Post-P&R-Timinganalyse zusam-
men:
– Synthese-Report: Anzahl und Breite der Addierer und Multiplizierer (Spalten 3 u. 4)
– Timinganalyse: Längste Signallaufzeit tDelay (Spalte 5)
– Map-Report: Anzahl der Look-Up-Tabellen und der Daten-Flipflops (Spalten 6 u. 7)
Tabelle 9-4: Implementierungskennwerte der parallelen FIR-Filterstrukturen für das Beispielfilter
mit N=22. Balancierter Addiererbaum BAB. Linear-Phasen-Struktur (_RM_) u. transponierte Form
mit Embedded- Multiplizierern; Mapping Strategy Speed
Für die Implementierung der Multiplikationen stehen in den Xilinx FPGAs zwei Ressour-
cen zur Wahl [84]:
Entity-Name Modellierung Add.-Stufen Multipliz. tDelay/ns LUT D-FF
FIR_DIREKT_AK
Code 9-2
Akku-Variable 22; Kette
19 24-Bit-Add.
3 23-Bit-Add
16 Block
5 12x12 Bit
LUT
41.81
786 299
FIR_DIREKT_BAB
Code 9-5
Balancierter
Addiererbaum
5; BAB
15 24-Bit-Add.
7 23-Bit-Add.
16 Block
5 12x12 Bit
LUT
20.83
739 299
…_BAB_P
Code 9-6
BAB
Register ∑P
5; BAB
15 24-Bit-Add.
7 23-Bit-Add.
16 Block
5 12x12 Bit
LUT
11.95
589 532
FIR_RM_BAB
Code 9-7
Red. Mult
BAB
5; BAB
11 13-Bit-Add.
7 23-Bit-Add.
4 24-Bit-Add.
11 Block
20.22
379 299
FIR_RM_BAB_P
Sync. Reset
Red. Mult.
Produktregister
BAB
5; s. o. 11 registered
Block
13.3
379
313
FIR_RM_BAB_VP
Code 9-8
Sync. Reset
Red. Mult.
Pipeline
BAB
5; BAB
11 13-Bit-Add.
11 24-Bit-Add.
11 registered
Block
5.44
383
711
FIR_TRANSPOSED
Code 9-9
Red. Mult.
Pipeline impliz.
22
22 24-Bit-Add.
11 Block 11.3
505
537
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
299 9.1 FIR-Filter
LUT-basierte Multiplizierer, die als Summe von Teilprodukten synthetisiert werden und
je nach codierter Vektorbreite den LUT-Bedarf erheblich beeinflussen.
Embedded-Multiplizierer mit 18-Bit-Operanden und einem 36-Bit-Ergebnis.
Die Auswahl dieser Multiplizierer wird über die Syntheseeinstellungen des ISE-Werkzeugs
im Abschnitt Synthesis-HDL-Options mit den Parametern LUT bzw. Block gesteuert. Mit
der Compiler-Version ISE 13.4 wurden für die Übersicht in Tabelle 9-4 die Block-
Multiplizierer gewählt. Nach Ausschöfpung der im FPGA XC3S400 verfügbaren 16 dedi-
zierten Embedded-Multiplizierer, werden deshalb weitere Multiplizierer in LUT-Technolo-
gie implementiert. Bei ausschließlicher Wahl der LUT-Implementierung ergibt sich für das
Filtermodell nach Code 9-2 eine ca. doppelte Anzahl des LUT-Bedarfs und eine um etwa
5% höhere Verzögerungszeit im längsten Signallaufzeitpfad.
Zur Reduzierung des Bedarfs an LUT-Ressourcen ist die Linear-Phasen-Struktur gegenüber
der Direktform klar vorzuziehen, da nur N/2+1 Multiplizierer zu implementieren sind. Bei
der Nutzung von Block-Multiplizierern müssen die LUT-Ressourcen im Wesentlichen nur
noch für die Addierer eingesetzt werden. Im Vergleich zur transponierten Struktur bietet die
Linear-Phasen-Struktur in diesen Implementierungen eine zusätzliche LUT-Einsparung, da
lediglich die Hälfte der 22 Addierer zur Addition von 24 Bit breiten Produkten benötigt
wird.
Das vollständige Pipelining der Linear-Phasen-Struktur FIR_RM_BAB_VP erfordert den
größten Einsatz an Daten-Flipflops. Die Anzahl der D-FFs lässt sich für die einzelnen Fil-
termodelle durch eine Codeanalyse grob abschätzen. Dazu werden die Vektorbreiten der
Signale auf den linken Seiten der Signalzuweisungen in getakteten Prozessen addiert. Be-
sonderheiten der jeweiligen Implementierung führen zu Abweichungen der tatsächlichen
Flipflopanzahl:
Die konstanten Filterkoeffizienten führen mit ihren spezifischen Bitkombinationen
dazu, dass nicht alle Produktbits variable Signalpegel darstellen. Die '0'-Bits am LSB-
bzw. MSB-Rand der Koeffizienten blenden Beiträge der zu bewertenden Signalpfade
aus‚ sodass für konstante '0'- Pegel keine Pipeline-D-FFs zu inferieren sind. Diese
Optimierung wird durch den Syntheseparameter „Equivalent Register Removal“ unter-
stützt. Falls einzelne Signalbits eine Wertzuweisung erfahren, jedoch durch Vektorab-
schnittselektion nicht weiterverwendet werden, können D-FFs ebenso eingespart wer-
den.
Andererseits werden D-FFs dupliziert, wenn der Fanout den vorgegebenen Grenzwert
von z.B. 500 überschreitet. Dies gilt beispielsweise im Filtermodell FIR_TRANS-
POSED für das Clockenable-Bit FIR_EN, das 23×24 D-FFs freigibt.
Die vorgestellte Systematik zur Modellierung des balancierten Addiererbaumes liefert
einen entscheidenden Beitrag zur Erhöhung der maximal nutzbaren Taktfrequenz. Pipeline-
stufen sind ein geeignetes Mittel, Logikabschnitte mit kürzeren Signallaufzeiten zu erzeu-
gen:
Die Ergebnisse für die Entities FIR_DIREKT_BAB und FIR_DIREKT_BAB_P zeigen
nahezu eine Halbierung der maximalen Signallaufzeit für die Pipeline-Struktur.
Durch ein Pipelining aller Stufen lässt sich die Signallaufzeit der Linear-Phasen-
Struktur bis auf die Addiererlaufzeit reduzieren (vgl. Entity FIR_RM_BAB_VP). Als
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
300 9 Modellierung digitaler Filter
Kompromiss zwischen Laufzeitvorteil und Bedarf an D-FF Ressourcen ist die Entity
FIR_RM_BAB_P zu erkennen, in der nur die Produkte als Pipelinestufe realisiert sind.
Im Fall eines synchronen Resets entsteht dafür kein Mehrbedarf an D-FFs aus den Sli-
ces/CLBs, da die Registered-Multipliers D-FF-Ressourcen zusätzlich zur Verfügung
stellen, die ansonsten ungenutzt bleiben. Der längste Laufzeitpfad wird in dieser Struk-
tur durch die 4 Stufen des restlichen Addiererbaumes gebildet.
Für dieses Filterbeispiel (N=22) konnten bei Verwendung des Synthesecompilers XST (ISE
13.4) keine signifikanten Einflüsse einer Variation der Mapping-Parameters Optimization
Strategy Speed/Area festgestellt werden.
Als Resümee ist die transponierte Form für Audio-Signalverarbeitungsanwendungen zu
empfehlen:
Die einfache VHDL-Modellierung einer Kettenstruktur kann ausgehend von Code 9-9
sogar auf einen einzigen Prozess verdichtet werden.
Durch die Implementierung der Speicherelemente zwischen den Arithmetikeinheiten
liefert dieses Pipelining direkt kurze Signallaufzeitpfade, wobei die Filterordnung kei-
nen Einfluss auf die Struktur des Pipelining hat.
Der LUT- und D-FF-Ressourcenbedarf ist jedoch gegnüber der Linear-Phasen-Struktur
mit einer Pipelinestufe erhöht.
Voraussetzung für die Realisierbarkeit der transponierten Form ist eine Direktform, deren
Speicherkette von einer Signalquelle gespeist wird. Deshalb sei hier auch auf einen An-
wendungsbereich hingewiesen in dem diese Voraussetzung nicht erfüllt ist. Im Fall von
Echtzeit-Bildverarbeitungsanwendungen liegen bei den linearen Filtern auf Basis von
Nachbarschaftsoperationen auch FIR-Strukturen vor [76], [77]. Allerdings findet die Mat-
rixbewertung von Bild-Pixeln eines Pixelstromes so statt, dass Pixel aus aufeinander fol-
genden Bildzeilen in die Summe der Produkte einfließen. Es sind also mehrere Schiebere-
gister als Signalquelle für die FIR-Arithmetik zu realisieren, die nicht von einem zusam-
menhängenden Abtastwertestrom gespeist werden. Zur Verarbeitung der unterschiedlichen
Signalquellen eignet sich dann die FIR-Direktform mit balanciertem Addiererbaum, für die
hier Codeentwürfe ausführlich hergeleitet worden sind.
9.1.5 Sequentielle FIR-Struktur mit MAC-Einheit
In Filteranwendungen mit geringer Datenrate, die der Filterauswertung innerhalb der Ab-
tastperiode eine ausreichend große Anzahl von Taktzyklen der Systemfrequenz zur Verfü-
gung stellen, kann eine sequentielle FIR-Struktur realisiert werden. Durch die sequentielle
Mehrfachnutzung einer einzigen Multiplizier-Akkumulatoreinheit (MAC-Einheit) lassen
sich bei erheblich reduziertem Bedarf an LUT-Ressourcen höhere Filterordnungen imple-
mentieren. Die sequentielle Arbeitsweise erlaubt es auch, anstelle der Registerkette ein
FPGA-internes RAM für die Abtastwerte zu nutzen, sodass D-FFs eingespart werden und
aufgrund der räumlich dichteren Speicheranordnung auch weniger Verdrahtungsressourcen
erforderlich sind [84].
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
301 9.1 FIR-Filter
Nachfolgend wird ein sequentielles FIR-Filter SEQ_FIR für die Filterordnung N=64 vorge-
stellt, das als Prozessorelement mit einem Datenpfad und einem Steuerpfad [41] strukturiert
ist (vgl. Bild 7-1 u. Bild 9-25). Die Schnittstellen sind kompatibel zum Audiocodec-
Szenario in Bild 9-8 gewählt, wobei das separate Übernahmeregister entfällt und das
Übergaberegister durch den Steuerpfad freigegeben wird.
Die entity MAC_FIR akkumuliert in jedem Abtastzyklus L=N+1 Produkte. Zusätz-
lich zur MAC-Einheit MAC ist ein getaktetes Sättigungsmodul SAT integriert, das die
Akku-Ergebnisse überlauffrei auf den Darstellungsbereich des 20 Bit breiten Interface-
vektors YN begrenzt.
Einen Ringpuffer zur Speicherung der Abtastwerte enthält die entity
RAM_S_65_16. Den Speicher RAM_SAMP mit der Tiefe L adressiert ein gesteuerter
Zähler ADR_CNT_SAMP, der im Anschluss an jeden RAM-Schreibvorgang für L Le-
sezyklen dekrementiert wird. Das instanziierte Block-RAM steht als Xilinx-
Bibliotheksmodul RAMB4_S16 mit 256×16 Bit zur Verfügung [64], sodass entschieden
wurde, die Abtastwerte in der MAC-Einheit mit einer Breite von j=16 zu verarbeiten.
In der entity ROM_C_65_16 sind die konstanten, 16 Bit breiten Filterkoeffizienten
im Speicher ROM_COEF abgelegt, der mit dem Core Generator für eine Größe von
65×16 Bit erzeugt wurde [84]. Der gesteuerte Adresszähler ADR_CNT_COEF selek-
tiert die Koeffizienten in L=65 Lesevorgängen. Die Festkomma-Koeffizienten sind mit
der MATLAB Filter Design Toolbox (FDATool [85]) für einen Tiefpass mit den Para-
metern N=64, fa=48 kHz und fc=10 kHz erzeugt worden und über die Initialisierungs-
datei (rom_coef.coe) in den Core Generator-Entwurfsablauf des ROMs eingeflossen
(vgl. Bild 9-24)
In diesem System bilden die getakteten Komponenten Adresszähler, ROM bzw. RAM
und das Akkumulatorregister eine dreistufige Pipeline, die der Mealy-Automat
FSM_FIR kontrolliert. Dazu steuert der Automat die Adresszähler so, dass die MAC-
Einheit die L Produkte x[n-k]*ck sukzessive akkumuliert, nachdem die Aktualisierung
des RAMs mit einem neuen Abtastwert x[n] erfolgt ist. Nach der Übernahme des Er-
gebnisses in das Register YN des Sättigungsmoduls löscht der Automat das Akkumula-
torregister und wartet auf den nächsten verkürzten Ready-Impuls ADC_FULL.
Bild 9-24: Mit ymax=1.1 skalier-
te Impuls- und Sprungantwort
des Tiefpassfilters. N=64, fc=10
kHz, fa=48 kHz; Gruppenlaufzeit
τg=N/(2 fa)=0.67ms
0 0.2 0.4 0.6 0.8 1.0 1.2-0.1
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
t/ms
Am
pli
tud
e
Impulsantwort
Sprungantwort 1/1.1
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
302 9 Modellierung digitaler Filter
Bild 9-25: Sequentielles FIR-Filter SEQ_FIR mit den Datenpfadkomponenten MAC-Einheit, Koeffi-
zienten-ROM und Abtastwerte-RAM sowie mit einem Steuerpfad. Taktsignal CLK mit fCLK=48 MHz;
N=64; vgl. Code 9-15
SA
T
FS
M_F
IR
AD
R_
CN
T_
SA
MP
RA
M_
SA
MP
AD
DR
EG
AD
R_
CN
T_C
OE
F
RO
M_C
OE
F
AD
C_F
ULL
WE
_R
_S
EN
_C
NT
_S
ST
AT
US
RD C
LK
RE
SE
T
EN
_C
NT
_C
CE
CN
T_
C_
MA
X
AD
RA
DR
_C
8D
O
16
CL
R_
RE
GE
N_
MA
C
CE
8
AD
R_S
AD
R
WE
RE
SE
T
DI
EN
DO
` 1´
XN
20
16
X(1
9:
4)
SA
MP
_I
16
CO
EF
_I
SA
MPC
OE
F
16
1R
CE
PR
OD
32
A B
38
38
AD
DY
MU
L
YN
CE
2
EN
_R
EG
EN
_S
AT
RO
M_
C_6
5_
16
MA
C_F
IR
RA
M_S
_65
_1
6
1R
1R
1R
20
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
303 9.1 FIR-Filter
9.1.5.1 Multiplizierer-Akkumulatoreinheit
Der Akkumulator Y im Prozess MAC der entity MAC_FIR (vgl. Code 9-12) enthält
Γld(L)=7 Guard-Bits, damit auch im Worst-Case von L=65 Produkten, die alle maximal
den Wert 1-1 LSB annehmen, kein Überlauf auftritt. Diese Maßnahme soll hier demonstrie-
ren, wie für einen Akkumulator z.B. in einem adaptiven Filter, dessen Koeffizienten durch
einen Optimierungsalgorithmus bestimmt werden, ein Überlauf sicher vermieden wird.
Y[37:0] = Y[sign,guard, …,guard. 29:0] = Y + COEF[sign. 14:0]*SAMP[sign. 14:0]
Auf der rechten Seite der Zuweisung an den Akkumulator Y ist für die Faktoren des Pro-
duktes keine Vorzeichenerweiterung realisiert, da in einer Addition nur einer der Summan-
den die zur linken Seite passende Vektorbreite aufweisen muss. Der Simulationscompiler
ModelSim und das Synthesewerkzeug ISE führen also eine Vorzeichenerweiterung des
zweiten Summanden implizit durch.
Als weitere Sicherungsmaßnahme ist die Reduzierung der Vektorbreite des Akkumulators
Y von 38 Bit auf 20 Bit des Codec-Interfaces mit einer Sättigungsfunktion SAT ergänzt.
Diese prüft zusätzlich die Übereinstimmung der Guard-Bits mit dem Vorzeichenbit. Ein
einfaches Abschneiden der Guard-Bits führt nämlich für den Fall, dass diese Integeranteile
transportieren, zur Signalverfälschung mit Polaritätswechsel. Um dies zu verhindern, wer-
den die Integeranteile identifiziert und nur der zulässige positive bzw. der negative Aus-
steuerungsgrenzwert wird an YN zugewiesen.
In der Timingsimulation des Filters SEQ_FIR nach Bild 9-26 findet der Pegelanstieg ge-
genüber dem in Bild 9-9 verzögert statt, da mit der Ordnung N die Gruppenlaufzeit
τg=NT/2 angestiegen ist. Erst nach 66 READY-Pulsen (statt L=65) wird die Sprungantwort
stationär, da die Timingsimulation ein Anlaufverhalten zeigt, bei dem der erste READY-
Puls und die ROM-Adressen nicht verarbeitet werden. Die Koeffizienten sind mit
1.1 < L1=1.937 so skaliert worden, dass der Maximalwert 1 erreicht wird.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.numeric_std.all;
entity MAC_FIR is
generic(WIDTH : positive:= 8);
port
( CLK, CLR_REG, EN_REG, EN_SAT: in std_logic;
COEF : in std_logic_vector(2*WIDTH -1 downto 0); -- 16 Bit
SAMP : in std_logic_vector(2*WIDTH -1 downto 0); --
YN : out std_logic_vector(19 downto 0) -- Codec Interface
);
end entity MAC_FIR;
architecture MAC_SAT of MAC_FIR is
signal Y : signed(37 downto 0); -- 7 Guard-Bits & 31 Bit im Q30-Format
begin
MAC : process(CLK)
begin
if (CLK = '1' and CLK'event) then
if (CLR_REG = '1') then Y <= (others => '0') after 3 ns;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
304 9 Modellierung digitaler Filter
elsif (EN_REG = '1') then
Y <= Y + signed(COEF) * signed(SAMP) after 3 ns;-- 32 Bit Produkt
end if; -- 7 Guard-Bits nehmen N+1 max. Produkte auf
end if;
end process MAC;
SAT: process(CLK) -- Sättigung und Übergaberegister des Zyklusergebnisses
begin
if (CLK = '1' and CLK'event) then
if (EN_SAT = '1') then
if ((Y(37 downto 30) = 0) or (Y(37 downto 30) = -1)) then
YN <= std_logic_vector(Y(30 downto 11)) after 3 ns;
elsif ((Y(37) = '0' and Y(36 downto 30) /= "0000000")) then
YN <= x"7ffff" after 3 ns; -- positive Grenze
else --((Y(37) = '1') and (Y(36 downto 30) /= "1111111"))
YN <= x"80000" after 3 ns; -- negative Grenze
end if;
end if;
end if;
end process SAT;
end architecture MAC_SAT;
Code 9-12: Multiplizierer-Akkumulator entity MAC_FIR für N=64 und Sättigungsfunktion
Bild 9-26: Timingsimulation der skalierten Sprungantwort des sequentiellen Filters (vgl. Code 9-15
u. Code 9-1). N=64, fa=48 kHz, fc=10 kHz. Spitzenwert 7F470Hex (0.994Dez) bei t=743 µs , stationä-
rer Endwert 74551Hex (0.90885Dez) im Q19-Format (vgl.Bild 9-24)
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
305 9.1 FIR-Filter
9.1.5.2 Ringpuffer für die Abtastwerte
Zur Speicherung der Abtastwerte wurde ein Adressierungsablauf gewählt, bei dem der
Ringpuffer (RAMB4_S16 im Code 9-13) nach einem System-Reset mit jedem READY-
Puls von der Adresse Null an mit Abtastwerten aufgefüllt wird. Eine Beispielsequenz in
Bild 9-27 verdeutlicht für N=3, dass der Ringpuffer nach L=N+1 Schreibvorgängen gefüllt
ist und alle folgenden Abtastwerte den jeweils ältesten Wert überschreiben. Durch diese
Speicherung wird das Übernahmeregister nach Bild 9-8 ersetzt. Zwischen den Schreibvor-
gängen sind die L Produkte x[n-k]*ck zu bilden, wobei c0 immer mit dem aktuellsten Ab-
tastwert x[n] und cN mit dem ältesten Abtastwert x[n-N] zu multiplizieren ist (vgl. Gl. 9-1).
Ausgehend von dieser Betrachtung hat sich folgende Adresszählerstrategie für die Schreib-
und Lesevorgänge als geeignet herausgestellt, da sie nur wenige Steuereingriffe eines Au-
tomaten erfordert:
Der Ringpuffer-Adresszähler (Prozess ADR_CNT_SAMP im Code 9-13) dekrementiert
beginnend mit der letzen Schreibposition, zu der auch der erste Lesezugriff gehört.
Nach N Dekrementen für die Lesevorgänge der Abtastwerte x[n-1] bis x[n-N] wird die
RAM-Adresse fixiert, da dies die Schreibposition des nächsten aktuellen Abtastwertes
ist. Im Laufe des Zyklus findet jeweils an der unteren Zählgrenze ein Überlauf auf den
Maximalwert N=64 statt.
Das Koeffizienten-ROM wird parallel dazu mit einem einfachen Inkrementer adressiert,
der für die Lesevorgänge der Koeffizienten ck von k=0 bis k=N=64 zählt. Direkt an-
schließend führt er einen Überlauf auf k=0 aus, sodass für den nächsten aktuellen Ab-
tastwert x[n] der Koeffizient c0 zur Verfügung steht (vgl. Prozess ADR_CNT_COEF im
Code 9-14).
Bild 9-27: Beispielsequenz für die Kombination der Koeffizienten mit den im Ringpuffer sukzessive
gespeicherten Abtastwerten; N=3
In dieser Implementierung nach Code 9-13 liefert die Instanziierung eines Xilinx Biblio-
theksmoduls den Ringpuffer (RAMB4_S16) mit 256×16 Bit [64]. Drei unterschiedliche
Methoden zur Instanziierung von FPGA-basiertem RAM bzw. ROM sind in [48] mit dem
jeweiligen Nutzen für die Code-Wiederverwendbarkeit auf den verschiedenen FPGA-
Architekturen und für die Simulationsgeschwindigkeit gegenübergestellt (vgl. Abschnitt
7.4.1). Hier sei daran erinnert, dass sich diese Block-RAM-Komponenten taktsynchron
verhalten. Die resultierende Latenz ist beim Entwurf des Steuerautomaten zu berücksichti-
gen:
Wird eine Leseadresse ADDR angelegt, so steht das Datum erst mit der nächsten Takt-
flanke am Ausgang DO zur Verfügung.
0
1
2
3
0
1
2
3
X[4]
X[1]
X[2] X[2]
X[3] X[3]
X[4]
X[5]
Samples Koeffiz.
c0
c1
c2
c30
1
2
3
X[0]
X[1]
X[2]
X[3]
N+1 N+2 N+3
c0
c1
c2
c3
c0
c1
c2
c3
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
306 9 Modellierung digitaler Filter
Bei einem Schreibvorgang sind parallel die Freigabe WE, die Adresse ADDR und das
Datum DI anzulegen, um das Datum DO mit der nächsten Taktflanke zu speichern und
am Ausgang lesen zu können.
Zur Instanz RAM_SAMP ist keine generic map erforderlich, da eine
Defaultinitialisierung des RAMs mit Null vorliegt. Während des Schreibzyklus der ersten L
Abtastwerte liefern deshalb nur diese einen Beitrag zur Summe der Produkte. Zusammen
mit dem 8-Bit-Adresszähler kann die Komponente RAM_S_65_16 genutzt werden, um
FIR-Filter bis zur Ordnung N=255 zu realisieren.
-- Sample RAM 65x16, 8 Bit Adresszähler
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
library UNISIM; -- Xilinx Bibliothek der Modul-Verhaltensmodelle
entity RAM_S_65_16 is
generic( WIDTH : positive := 8 ); -- Counter Width
port
(RESET, CLK, EN, WE : in std_logic ;
DIN : in std_logic_vector(2*WIDTH -1 downto 0);
SAMP : out std_logic_vector(2*WIDTH -1 downto 0) );
end entity RAM_S_65_16;
architecture ADR_RAM_S of RAM_S_65_16 is
component RAMB4_S16 -- Xilinx Block-RAM Bibliotheksm. 256x16 Bit=4096 Bit
generic -- Initialisierungsstrings
( INIT_00, INIT_01, INIT_02, INIT_03, INIT_04, INIT_05, INIT_06, INIT_07,
INIT_08, INIT_09, INIT_0a, INIT_0b, INIT_0c, INIT_0d, INIT_0e, INIT_0f
: bit_vector(255 downto 0) :=
X"0000000000000000000000000000000000000000000000000000000000000000" );
-- 64 Nibble x 16 = 4096 Bit
port
( WE, EN, RST, CLK : in std_logic;
ADDR : in std_logic_vector(WIDTH-1 downto 0); -- Adressierung
DI : in std_logic_vector(2*WIDTH -1 downto 0); -- Codec Interface
DO : out std_logic_vector(2*WIDTH - 1 downto 0)); -- MAC-Eingang
end component;
signal ADR_S : unsigned(WIDTH-1 downto 0); -- RAM-Adresse
constant MAX : unsigned(WIDTH -1 downto 0) := x"40"; -- N=64
begin
ADR_CNT_SAMP: process(CLK) -- RAM-Adresszähler: Dekrementer
begin
if (CLK'event and CLK = '1') then
if (RESET = '1') then -- System-Reset
ADR_S <= (others => '0')after 3 ns;
elsif (EN = '1') then -- Freigabge durch FSM
if (ADR_S = 0) then ADR_S <= MAX after 3 ns; -- Wrap-Around
else ADR_S <= ADR_S - 1 after 3 ns;
end if;
end if;
end if;
end process ADR_CNT_SAMP;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
307 9.1 FIR-Filter
RAM_SAMP : RAMB4_S16 -- kein Reset, getakteter Ausgang immer freigegeben
port map
( WE => WE, EN => '1', RST => '0', CLK => CLK, -- Schreibfreigabe durch FSM
ADDR => std_logic_vector(ADR_S), DI => DIN, DO => SAMP );
end architecture ADR_RAM_S;
Code 9-13: RAM-Ringpuffer RAM_S_65_16 für L=65 Abtastwerte; dekrementierender Adresszähler
9.1.5.3 Koeffizienten-ROM
Der Koeffizientenspeicher ROM_COEF ist mit dem Xilinx Core Generator (vgl. Abschnitt
7.4.2) auf minimale Interfacefunktionalität und Speichertiefe 65×16 Bit ausgelegt worden
(vgl. Code 9-14). Ein Komparator signalisiert mit dem Statusbit CNT_C_MAX den Maxi-
malwert N=64 des inkrementierenden Adresszählers ADR_CNT_COEF und zeigt dem
Steuerautomaten damit den Abschluss eines Berechnungszyklus’ der MAC-Einheit an. Hier
steht ein Konzept im Hintergrund, nach dem die Komparatoren für die Grenzwertanzeigen
in der Zähler-Entity und nicht in der FSM zu realisieren sind.
Dieses FSM/Timer-Konzept zur Kopplung eines Datenpfades mit dem Steuerpfad ist auf-
grund folgender Aspekte zu empfehlen:
Sofern in Anwendungen ein Timer-Grenzwert in mehreren Zuständen geprüft werden
muss, ist es sinnvoll, den Komparator nicht mehrfach in der FSM zu realisieren. Der in
der Timer-Entity platzierte Komparator spart damit Logik-Ressourcen ein.
Zähler, die große Speicherbereiche adressieren, wie z.B. Bildzwischenspeicher mit >1
MB in Farbbildverarbeitungsanwendungen, sind ggf. mehr als 20 Bit breit. Ein Aus-
tausch von einzelnen Statusleitungen mit der FSM anstelle der Einkopplung aller Zäh-
lerleitungen in das kombinierte Übergangs- und Ausgangsschaltnetz (vgl. Bild 6-10)
kann die erforderlichen Verdrahtungsressourcen reduzieren. Da das FPGA-Routing in
den Signallaufzeitpfaden je nach Anwendung bis zu 50 % ausmacht, kann diese vorge-
schlagene Funktionspartitionierung auch die Timingkennwerte verbessern.
-- Koeffizienten ROM 65x16 Bit, 8 Bit Adresszähler library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity ROM_C_65_16 is
generic( WIDTH : positive := 8 ); -- Counter Width
port
( RESET, CLK, EN: in std_logic ;
CNT_C_MAX : out std_logic;
COEF : out std_logic_vector(2*WIDTH -1 downto 0)
);
end entity ROM_C_65_16;
architecture ADR_ROM_C of ROM_C_65_16 is
component ROM_COEF -- Core Generator ROM-Modul 65x16 Bit
port ( addr: IN std_logic_VECTOR(6 downto 0);
clk: IN std_logic;
dout: OUT std_logic_VECTOR(15 downto 0));
end component;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
308 9 Modellierung digitaler Filter
signal ADR_C : unsigned(WIDTH-1 downto 0); -- ROM-Adresse
constant MAX : unsigned(WIDTH -1 downto 0) := x"40"; -- N=64
begin
ADR_CNT_COEF: process(CLK) -- ROM-Adresszähler: Inkrementer
begin
if (CLK'event and CLK = '1') then
if (RESET = '1') then -- System-Reset
ADR_C <= (others => '0')after 3 ns;
elsif (EN = '1') then -- Freigabe durch FSM
if (ADR_C = MAX) then ADR_C <= (others => '0') after 3 ns; -- w-a
else ADR_C <= ADR_C + 1 after 3 ns;
end if;
end if;
end if;
end process ADR_CNT_COEF;
CNT_C_MAX <= '1' after 3 ns when ADR_C = MAX else '0' after 3 ns; -- Status
ROM_C: ROM_COEF
port map (addr => std_logic_vector(ADR_C(6 downto 0)),
clk => CLK, dout => COEF);
end architecture ADR_ROM_C;
Code 9-14: ROM-entity ROM_C_65_16 für L=65 Koeffizienten; inkrementierender Adress-
zähler
9.1.5.4 Sequenzsteuerung mit einem Zustandsautomaten
Ein Steuerautomat koordiniert den Speichervorgang des aktuellen Abtastwertes, die an-
schließenden Lesevorgänge der Abtastwerte und der Koeffizienten, die Freigabe des
Akkumulatorregisters der MAC-Einheit und die Ergebnisübernahme in das
Übergaberegister des Sättigungsmoduls (vgl. Bild 9-25). Mit der Adresszählerstrategie nach
Abschnitt 9.1.5.2 vereinfachen sich die Steuerungseingriffe, da die Zähler mit den gewähl-
ten Zählrichtungen und Wrap-Arounds nur noch ein geeignetes Timing der Zählfreigabe
erfordern. In Abhängigkeit von den Statusbits ADC_FULL aus dem Pulsverkürzer und
CNT_C_MAX aus dem Adresszähler des Koeffizienten-ROMs wird die Zustandssequenz
kontrolliert (vgl. Bild 9-28).
Hier liegt ein Mealy-Automat vor, da die Auswertung der Statusbits unmittelbaren Einfluss
auf Freigabesignale hat. Damit werden zwei Zustände eingespart, was die Übersichtlichkeit
des Zustandsdiagramms erhöht. Nachteile gehen nicht damit einher, da die Statussignale
aus dem gleichen synchronen System stammen und die gekoppelten Schaltnetze nicht be-
stimmend für die Taktfrequenz sind (vgl. Kap. 6.3 u. 6.4).
Das Zustandsdiagramm in Bild 9-28 verdeutlicht einerseits die Mealy-Charakteristik und
hebt andererseits hervor, welche Steuerausgänge nur durch den jeweiligen Zustand be-
stimmt sind, also ein Moore-Verhalten aufweisen. Alle Steuerausgänge, die im jeweiligen
Zustand nicht dargestellt sind oder nicht in Abhängigkeit der Statussignale stehen, erhalten
die Defaultzuweisung '0'. Die Wirkung der Zustände auf die Berechnungssequenz ist im
Folgenden zusammengefasst (vgl. Code 9-15):
IDLE: Das Akkumulatorregister Y wird gelöscht (CLR_REG), damit der nächste Be-
rechnungszyklus keinen Summen-Offset aus dem vorherigen Zyklus erhält. Der Spei-
chervorgang (WE_R_S) des Abtastwertes SAMP zu Beginn der Sequenz und der Ad-
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
309 9.1 FIR-Filter
resszählerstart (EN_CNT_S, EN_CNT_C) werden parallel vorbereitet, da die Latenz
der getakteten ROM- und RAM-Lesevorgänge einen zeitlichen Vorlauf der Adressenak-
tualisierung von einem Takt erfordert.
MULL_ACC: Drei getaktete Pipeline-Vorgänge laufen in diesem Zustand parallel ab,
wobei jeder Vorgang die Vorbereitung des nächsten in einem folgenden Takt darstellt:
Aktualisierung der Adressen: ADR_S(n-(k+1)), ADR_C(k+1).
Ein Wertepaar (SAMP(n-k), COEF(k)) erscheint an den Speicherausgängen.
Ein Produkt SAMP(n-(k-1))*COEF(k-1) wird akkumuliert (EN_REG).
Liegt die höchste Adresse k=N am Koeffizientenspeicher an (CNT_C_MAX), so wird
diese Pipeline mit den nächsten Zustandstransitionen schrittweise deaktiviert. Die
RAM-Adresse ADR_S bleibt für den nächsten Schreibvorgang unverändert
(EN_CNT_S=0) und die ROM-Adresse ADR_C führt nur noch den Wrap-Around auf
den Anfangswert aus (ENT_CNT_C).
STOP: Die letzte Multiplikation SAMP(n-N)*COEF(N) erfolgt und geht in die Summe
Y ein (EN_REG).
UPDATE: Das Akkumulationsendergebnis Y durchläuft die Sättigungsfunktion und
bleibt während des folgenden Zyklus im Übergaberegister YN gespeichert (EN_SAT).
Bild 9-28: Zustandsdiagramm der Sequenzsteuerung des FIR-Filters mit MAC-Einheit; Mealy-FSM
mit Moore-Ausgängen
Die Top-entity SEQ_FIR enthält die Pulssynchronisation und die FSM als Prozesse
parallel zu den Komponenten-Instanziierungen des Datenpfades (vgl. Code 9-15). Eine zu
kleinteilige Kapselung von Funktionen in Komponenten kann die Übersicht reduzieren,
ADC_FULL==1/EN_CNT_S, EN_CNT_C,
WE_R_S
CLR_REG
IDLE
STOPUPDATE
EN_REG
CNT_C_MAX==1/EN_CNT_S=0
EN_SAT
synch. RESET
EN_CNT_C, EN_REG
MULL_ACC
CNT_C_MAX==0/EN_CNT_S=1
ZUSTAND
ADC_FULL, CNT_C_MAX/EN_CNT_S, EN_CNT_C, WE_R_S,
CLR_REG, EN_REG, EN_SAT
ADC_FULL==0
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
310 9 Modellierung digitaler Filter
weil bezogen auf den Funktionsumfang zu viele port maps und interne Signale die
Inhalte verdecken.
Das im Prozess UE_AUS_SN enthaltene FSM-Ausgangsschaltnetz listet die Moore-
Ausgänge und die bedingten Mealy-Ausgänge sequentiell auf. Es sind keine else-Pfade
erforderlich, da die Default- und die Moore-Zuweisungen in allen Zuständen für eine voll-
ständige Ausgangsansteuerung sorgen (vgl. Kap. 3.6). Ungewollte Speichereffekte durch
Latches werden also sicher vermieden. Ein Aggregat dient hier auf der linken Seite der
Default-Zuweisungen zur Bündelung der Steuersignale, die alle den gleichen Typ aufwei-
sen. Auf der rechten Seite ist ein Type-Qualifier std_logic_vector' erforderlich, der
das Type-Casting des konstanten Vektors erzeugt, dessen Länge zur Anzahl der Aggregat-
elemente passen muss [37].
-- Top-Entity: Sequential FIR mit Puls-Shorter u. integrierter FSM
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity SEQ_FIR is
generic(WIDTH : positive := 8);
port
( CLK, RESET, RD : in STD_LOGIC; -- RD Ready Puls des Codec-Interf.
XN : in std_logic_vector(19 downto 0); -- 20 Bit Codec Interface
YN : out std_logic_vector(19 downto 0) );
end entity SEQ_FIR;
architecture HYBRID of SEQ_FIR is
component ROM_C_65_16 -- Koeffizienten ROM
generic( WIDTH : positive );
port
( RESET, CLK, EN: in std_logic ;
CNT_C_MAX : out std_logic; -- Status wrap around
COEF : out std_logic_vector(2*WIDTH -1 downto 0) );
end component;
component RAM_S_65_16 -- Ringpuffer RAM
generic( WIDTH : positive );
port
( RESET, CLK, EN, WE : in std_logic ;
DIN : in std_logic_vector(2*WIDTH -1 downto 0); -- Codec Ausgang
SAMP: out std_logic_vector(2*WIDTH -1 downto 0) );
end component;
component MAC_FIR -- MAC-Einheitt
generic( WIDTH : positive );
port
( CLK, CLR_REG, EN_REG, EN_SAT: in std_logic;
COEF, SAMP : in std_logic_vector(2*WIDTH -1 downto 0);
YN : out std_logic_vector(19 downto 0) ); -- Codec Eingang
end component;
signal TEMP_1, TEMP_2, ADC_FULL: std_logic; -- Ready
signal COEF_I, SAMP_I : std_logic_vector(2*WIDTH -1 downto 0);
type ZUSTAENDE is(IDLE, MUL_ACC, STOP, UPDATE); -- FSM-Zustände
signal ZUSTAND, Z_PLUS : ZUSTAENDE;
-- FSM Steuersignale und Statusrückmeldung aus Koeffizienten-Adresszähler
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
311 9.1 FIR-Filter
signal EN_CNT_S, EN_CNT_C, WE_R_S, CLR_REG: std_logic;
signal EN_REG, EN_SAT, CNT_C_MAX : std_logic;
begin
PULSE_SHORTER: process(CLK,RESET)
begin
if RESET = '1' then
TEMP_1 <= '0' after 3 ns; TEMP_2 <= '0'after 3 ns;
elsif CLK='1' and CLK'event then
TEMP_1 <= RD after 3 ns; -- Ready des Codec-Interface
TEMP_2 <= TEMP_1 after 3 ns;
end if;
end process PULSE_SHORTER;
ADC_FULL <= TEMP_1 and (not TEMP_2) after 3 ns; -- synch. Ready-Puls
ROM: ROM_C_65_16
generic map( WIDTH => WIDTH )
port map
( RESET => RESET, CLK => CLK, EN => EN_CNT_C, CNT_C_MAX => CNT_C_MAX,
COEF => COEF_I);
RAM: RAM_S_65_16
generic map( WIDTH => WIDTH )
port map
( RESET => RESET, CLK => CLK, EN => EN_CNT_S, WE => WE_R_S,
DIN => XN(19 downto 4), SAMP => SAMP_I);
MAC: MAC_FIR
generic map( WIDTH => WIDTH )
port map
( CLK => CLK, CLR_REG => CLR_REG, EN_REG => EN_REG, EN_SAT => EN_SAT,
COEF => COEF_I, SAMP => SAMP_I, YN => YN );
Z_REG: process(CLK) -- Zustandsaktualisierung
begin
if (CLK = '1' and CLK'event) then
if (RESET = '1') then ZUSTAND <= IDLE after 3 ns;
else ZUSTAND <= Z_PLUS after 3 ns;
end if;
end if;
end process Z_REG;
UE_AUS_SN: process(ZUSTAND, ADC_FULL, CNT_C_MAX) -- Mealy-FSM
begin -- Default Zuweisungen mit Aggregat und Vektor passender Länge
(EN_CNT_S, EN_CNT_C, WE_R_S, CLR_REG, EN_REG, EN_SAT) <=
std_logic_vector'("000000") after 5 ns;
Z_PLUS <= IDLE after 5 ns;
case ZUSTAND is
when IDLE => CLR_REG <= '1' after 5 ns; -- Moore-Ausgang, Reset MAC
if (ADC_FULL = '1') then
EN_CNT_S <= '1' after 5 ns; -- S.-Adressz. freigeben
WE_R_S <= '1' after 5 ns; -- RAM Schreibfreigabe
EN_CNT_C <= '1' after 5 ns; -- Koeff.-Adressz. freig.
Z_PLUS <= MUL_ACC after 5 ns;
end if;
when MUL_ACC => EN_CNT_S <= '1' after 5 ns;
EN_CNT_C <= '1' after 5 ns;
EN_REG <= '1' after 5 ns;-- MAC-Register freigeben
Z_PLUS <= MUL_ACC after 5 ns;
if (CNT_C_MAX = '1') then
Z_PLUS <= STOP after 5 ns;
EN_CNT_S <= '0' after 5 ns;-- Schreibpos. fixieren
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
312 9 Modellierung digitaler Filter
end if;
when STOP => EN_REG <= '1' after 5 ns; -- letzte Multiplik. akkumu.
Z_PLUS <= UPDATE after 5 ns;
when UPDATE => EN_SAT <= '1' after 5 ns; -- Ergebnis übernehmen
Z_PLUS <= IDLE after 5 ns;
when others => null; -- Default Reaktion in Pseudozuständen
end case;
end process UE_AUS_SN;
end architecture HYBRID;
Code 9-15: Top-entity SEQ_FIR mit integrierter FSM zur Sequenzsteuerung und READY-
Pulsverkürzer
9.1.5.5 Simulations- und Syntheseergebnisse
Die VHDL-Simulation in Bild 9-29 zeigt das Anlaufverhalten der Filterberechnungsse-
quenz während des ersten READY-Pulses, wobei die Testbench nach Code 9-1 die Stimuli
erzeugt hat. Drei Zeitpunkte während des Zustandsübergangs von IDLE nach MUL_ACC
sind markiert:
t1: Der erste Lesevorgang des ROMs und des RAMs mit den Startadressen 00Hex liefert
den Koeffizienten c0=FFECHex und den Inhalt des noch leeren ersten RAM-
Speicherplatzes. Der synchronisierte Puls ADC_FULL bereitet den Folgezustand
MUL_ACC+ vor und generiert die Mealy-Ausgänge für die Zählfreigaben sowie für den
Schreibfreigabepuls WE_R_S.
t2: Die Adresszähler inkrementieren bzw. dekrementieren und das RAM nimmt den auf
16 Bit verkürzten Abtastwert x[0]=SAMP_I=7FFFHex auf. Parallel dazu ist der Über-
gang in den Zustand MUL_ACC erfolgt.
t3: Im Zustand MUL_ACC sind alle Pipeliningstufen, Adresszähler, ROM- und RAM-
Speicher sowie das Akku-Register Y aktiv. Das erste Produkt SAMP(0)*COEF(0)=
7FFFHex*FFECHex wird in Y gespeichert, ein neues Wertepaar und zwei aktualisierte
Adressen liegen vor.
Mit der Timingsimulation in Bild 9-30 wird der Übergang in den stationären Zustand einer
Sprungantwort nach N+1 READY-Pulsen dargestellt. Das Synthesewerkzeug ISE 13.4 hat
die Zustandssequenz mit einer Gray-Codierung für zwei Datenflipflops ZU-
STAND_FFD[1:2] realisiert, wobei für die Indizes gilt [LSB:MSB]. Da eine Zustandskette
ohne Verzweigungen vorliegt, ist diese einschrittige Codierung automatisch gewählt wor-
den (vgl. Kap. 6.5):
(IDLE, MUL_ACC, STOP, UPDATE) = (00, 01, 11, 10)
Die Signalkennzeichnung ZUSTAND_FFDi/I gibt die D-FF Vorbereitungseingänge an,
also den Folgezustand Z_PLUS, und mit ZUSTAND_FFDi/O sind die D-FF Ausgänge
gekennzeichnet, also der aktuelle Zustand.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
313 9.1 FIR-Filter
Bild 9-29: VHDL-Simulation der Sprungantwort des sequentiellen FIR-Filters. Sequenzanlauf mit
dem ersten READY-Puls. N=64, Taktsignal CLK mit fCLK=48 MHz (20.83 ns)
Der in Bild 9-30 abgebildete Zeitausschnitt mit den markierten Zeitpunkten t1, t2 und t3
verdeutlicht den Abschluss der Zustandssequenz:
t1: Der Adresszähler des Koeffizienten-ROMs erreicht die höchste Adresse
ROM_ADR_C=40Hex, sodass die Transitionen aus dem Zustand MUL_ACC in den
IDLE-Zustand angestoßen werden (vgl. Bild 9-28). Dieser Adresszähler führt mit dem
nächsten Takt nur noch den Wrap-Around aus, wohingegen der Adresszähler des RAMs
unverändert auf den zu überschreibenden Speicheranfang zeigt. Der RAM-Speicher ist
nach N+1 Zyklen vollständig mit Abtastwerten beschrieben, sodass für SAMP_I kon-
stant 7FFFHex angezeigt wird.
t2: Da symmetrische Koeffizienten vorliegen, sind der letzte und der erste Koeffizient
identisch COEF_I=FFECHex. Im Zustand STOP wird das letzte Produkt
SAMP(0)*COEF(N) der Sprungantwort akkumuliert.
t3: Als letzter Schritt findet durch den Zustand UPDATE die Übergabe des stationären
Endwertes MAC_YN=74551Hex an das Register der Sättigungsfunktion und die Transi-
tion in den IDLE-Zustand statt.
t1
t2
t3
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
314 9 Modellierung digitaler Filter
Bild 9-30: Timingsimulation des sequentiellen FIR-Filters. Abschluss des letzten Berechnungszyklus
nach N+1 READY-Pulsen. N=64, Taktsignal CLK mit fCLK=48 MHz (20.83 ns)
Die Verzögerungen TPD der Zähler und Zustandsflipflops gegenüber der Taktflanke sind
größer als die Datenblattangaben (< 0.68 ns), da das Clock-Signal CLK am Chip-Eingang
und nicht das an den jeweiligen D-FFs dargestellt ist [84]. Erkennbar ist der Unterschied
zur Reaktion des ROMs, das als Block-RAM eine größere Verzögerung von > 1.45 ns
aufweist.
Das Syntheseergebnis zur entity SEQ_FIR nach Code 9-15, das das Werkzeug ISE 13.4
mit dem RTL-Schematic für die Implementierung mit einem Spartan-3-FPGA [84] anzeigt,
entspricht der Struktur in Bild 9-25. Die exakte Verdrahtung des Akkumulators und des
Multiplizierers lässt sich jedoch nur mit dem FPGA-Editor überprüfen (vgl. Seite 264). Der
Synthesereport listet die in den Komponenten enthaltenen Funktionselemente und die FSM
in den Macro Statistics mit ihren Vektorbreiten explizit als inferierte Objekte auf [81]:
# FSMs : 1
# Multipliers : 1
16×16-bit multiplier : 1
# Counters : 2
8-bit down counter : 1
8-bit up counter : 1
# Accumulators : 1
38-bit up accumulator : 1
# Registers : 22
Flip-Flops : 22 (Sättigungsstufe, Pulsverkürzer)
yn
IDLESTOP
UPDATEMUL_ACC
t1
t2
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
315 9.1 FIR-Filter
Der synthesegerechte Codierstil kann also mit dieser Liste zusätzlich überprüft werden. Je
mehr Makros der Synthesecompiler identifiziert, desto besser wird die Logikoptimierung
unterstützt [81]. Die Sättigungsfunktion (vgl. Code 9-12) ist nicht als Makro erkannt wor-
den, da der Prozess SAT eine kombinierte Codierung eines 3 zu 1-Multiplexers mit drei
Komparatoren enthält, die die Selektionsbedingungen für die Eingangsvektoren erzeugen.
In der Liste Cell-Usage sind neben den anderen erforderlichen FPGA-Ressourcen (LUTs,
D-FFs) auch die instanziierten Speichermodule aufgeführt, die zwei der 16 Block-RAMs
beanspruchen:
ROM: RAMB16_S18; 1024×18 10-Bit-Adresse, 16 Bit Datenbreite
RAM: RAMB4_S16; 256×16 8-Bit-Adresse, 16 Bit Datenbreite
Abschließend zeigt Tabelle 9-5 den Ressourcenbedarf und die erreichbare Taktfrequenz
fmax des sequentiellen FIR-Filters. Die Auswahl eines der Block-Multiplizierer für die
MAC-Einheit liefert die erwartete Reduzierung der erforderlichen Look-Up-Tabellen
(LUTs) und verdoppelt nahezu die maximal anwendbare Taktfrequenz, da die eingesparten
LUTs die Anzahl der Levels of Logic von 17 auf 3 verringern. Die Block-Multiplizierer der
Spartan-3-FPGAs sind in direkt benachbarten Spalten zu den Block-RAMs lokalisiert [84],
so kann die MAC-Einheit in diesem Fall dichter an dem Koeffizienten- und dem Abtast-
wertespeicher implementiert werden, sodass zusätzlich die Verdrahtungslaufzeit reduziert
wird.
Es sei hier noch erwähnt, dass die Schaltnetze der FSM mit 6 LUTs in der Gesamtbilanz
enthalten sind und die Zustandsrückführung eine Signallaufzeit von ca. 1.7 ns aufweist. In
Anwendungen mit arithmetischen Datenpfaden haben demnach Techniken zur Automaten-
Optimierung, wie z.B. Zustandsminimierungen und Zustandscodierung, keinen entschei-
denden Einfluss auf die Implementierungskennwerte des Gesamtsystems.
Tabelle 9-5: Implementierungskennwerte des sequentiellen FIR-Filters. N=64, FSM mit Gray-Code,
Spartan-3-XC3S400-5 FPGA mit je 8064 LUTs und D-FFs; ISE 13.4
Mult.-Typ D-FFs Slices LUTs tDelay/ns (fmax/MHz) Delay-Pfad
Block
78 51 100 10.7 (93.4) 8.3 ns Logik, 2.4 ns Verdr.
RAM → Akku.-
Register Y
LUT
78 210 412 19.53 (51.2) 13 ns Logik, 6.53 ns Verdr.
RAM → Akku.-
Register Y
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
316 9 Modellierung digitaler Filter
9.1.6 Taktschemata der Filterdatenpfade
Zwei Datenpfadstrukturen sind in den vorangegangenen Abschnitten vorgestellt worden:
Parallele Realisierung der Filterarithmetik ohne bzw. mit Pipelining.
Sequentielle Struktur mit MAC-Einheit.
Zusätzlich hat die Einbettung der Filtermodelle in einen Synchronisationsrahmen ein prak-
tisches Beispiel für eine typische Kopplung mit einem Audiocodec-Interface aufgezeigt,
mit der der Übergang zwischen Taktbereichen geklärt wurde (vgl. Bild 9-8 u. Bild 9-20).
Hier sollen diese Filterstrukturen in die Datenpfadentwurfsmuster mit unterschiedlichen
Strukturen und Taktschemata eingeordnet werden, wie sie vom Prozessorbau für den
Entwurf digitaler Systeme übernommen worden sind [8], [35], [41], [63], (vgl. Kap. 7 u.
Kap. 8):
Einzyklus-Datenpfad
Mehrzyklus-Datenpfad
Datenpfad mit Pipelining
Die Klassifizierung der Filtermodelle liefert eine zusammenfassende Übersicht zu deren
jeweils geeigneten Einsatzbereichen und zu den Implikationen für den FPGA-
Ressourcenbedarf sowie für die anwendbare Taktfrequenz. Vorangestellt werden Erläute-
rungen zu den in [63] behandelten Datenpfadkategorien:
In einem Einzyklus-Datenpfad (EZD) sind alle für einen Eingangsdatensatz erforderli-
chen Berechnungsschritte mit direkt verketteten und parallelen Arithmetikelementen
modelliert. Die Synthese liefert dazu einen Block mit kombinatorischer Logik, in dem
die identifizierten Makros wie Addierer, Multiplizierer und Multiplexer mehrstufig in-
tegriert sind. Der längste Signallaufzeitpfad durch alle Arithmetikstufen dieses Daten-
pfades legt die minimale Taktperiode TEZD fest, mit der die Eingangsdaten zugeführt
werden können und die aktualisierten Ergebnisse bereitstehen. Der Datendurchsatz ist
mithin 1 Ergebnis/TEZD.
Der Entwurf eines Mehrzyklus-Datenpfades (MZD) ist auf Ressourcen-Einsparung
ausgerichtet. Diese Technik nutzt deshalb wiederholt in aufeinander folgenden Taktpe-
rioden einen reduzierten Satz von parallelen Arithmetikelementen, die je nach Erforder-
nis ggf. nur in einer Stufe ohne Verkettung angeordnet sind. Ein Registerblock nimmt
die jeweils pro Taktperiode anfallenden Zwischenergebnisse auf und bringt diese wieder
in den nächsten Berechnungsschritt ein, in dem sie über Multiplexer an die
Arithmetikeingänge geführt werden. Die erreichbare Taktfrequenz fCLK=1/TMZD ist um
ein Vielfaches höher als in einem Einzyklus-Datenpfad, da die im Grenzfall nur einstu-
fige Arithmetik kürzere Signallaufzeitpfade verursacht. Von der Anzahl n der erforder-
lichen Bearbeitungstakte für einen vollständigen Berechnungsablauf hängt dann die rea-
lisierbare Datenrate bzw. der Durchsatz 1 Ergebnis/nTMZD ab.
Der Datenpfad mit Pipelining (DP) bearbeitet alle Rechenschritte parallel in einer
Taktperiode, wobei die Zwischenergebnisse der einzelnen Arithmetikstufen in separaten
Pipeline-Registerstufen gespeichert werden (vgl. Kap. 8). Die so im RTL-Stil entkop-
pelten Arithmetikstufen erlauben wie der Mehrzyklus-Datenpfad erheblich höhere Takt-
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
317 9.1 FIR-Filter
frequenzen fCLK=1/TDP als der Einzyklus-Datenpfad. Hinzu kommt, dass die Pipeline in
jeder Taktperiode einen Eingangsdatensatz aufnimmt und parallel ein neues Ergebnis zu
einem vorhergehenden Datensatz liefert, sodass der Durchsatz mit 1Ergebnis/TDP der
höchste der drei Datenpfadkategorien ist. Die Latenz, die die Anzahl der Takte angibt,
die zum Füllen der Pipeline benötigt werden, ist als Verzug in der gesamten Daten-
stromverarbeitung zu vernachlässigen.
Digitale Filter werden in Signalflussanwendungen eingesetzt, bei denen die zu verarbeiten-
de Datenrate die Anforderungen an den Entwurf des Datenpfades vorgibt [70], [77]. Des-
halb erfolgt hier eine Unterscheidung in zwei Bereiche:
Audiodatenrate mit fa=48 kHz << fCLK: Zwischen zwei Abtastwertaktualisierungen
stehen sehr viele Taktperioden zur Filterberechnung und für weitere Auswertestufen zur
Verfügung.
Datenrate fa ≤ fCLK: Der Eingangsdatenstrom muss im Grenzfall direkt mit der Taktfre-
quenz der FPGA-Plattform aufgenommen und verarbeitet werden. Hierzu gehören z.B.
Video-Sequenzen, die bei Bildraten mit mehr als 60 Bildern/s Taktfrequenzen von > 20
MHz erfordern, um den RGB-Pixelstrom kontinuierlich zu verarbeiten. In nachrichten-
technischen Anwendungen arbeiten die Modulatoren und Demodulatoren mit 200
MSamples/s, sodass nur noch Datenpfade mit Pipelining in Frage kommen.
9.1.6.1 Audiodatenrate
Die Verarbeitung von Audiosignalen ist ein Beispiel für den Fall, dass in einem Abtast-
intervall T=1/fa mit den Kennwerten nach Bild 9.8 und Bild 9-20 fast alle der fCLK/fa=
48 MHz/48 kHz=1000 Taktperioden zur Verarbeitung eines Eingangsdatensatzes eingesetzt
werden können. Da die bidirektionale serielle Datenübertragung zwischen Codec und
FPGA für zwei Stereokanäle und die Codec-Parametrisierung mit typisch fI=12 MHz er-
folgt, sind bei einem 20-Bit-Abtastwert nur 20fCLK/fI=80 der 1000 Takte nicht von der
Filterimplementierung nutzbar.
Anwendungen mit adaptiven FIR-Filtern z.B. zur Geräusch- oder Echokompensation [70],
[73], die zusätzlich zur Filterung noch eine Koeffizientenschätzung für die nachzubildenden
Übertragungsstrecken beinhalten, können also mit einem Mehrzyklus-Datenpfad aus-
kommen. Die sequentielle FIR-Struktur mit MAC-Einheit nach Kap. 9.1.5 erfüllt aus Sicht
der verfügbaren Berechnungstakte und des geringen FPGA-Ressourcenbedarfs das Anfor-
derungsprofil an einen Mehrzyklus-Datenpfad (vgl. Tabelle 9-4 u. Tabelle 9-5). Mit dem
Zustandsautomaten in Bild 9-28 sind nämlich nur N+4 Taktperioden für einen Berech-
nungsablauf erforderlich. Das sequentielle FIR-Filter ist ein spezieller Mehrzyklus-
Datenpfad, da der Aufbau mit Adresszählern, RAM bzw. ROM und MAC-Einheit eine
dreistufige Pipeline bildet und die MAC-Einheit eine zweistufige ALU wie in digitalen
Signalprozessoren darstellt [73].
Im Audio-Abtastzyklus lassen sich noch mehr Taktperioden für zusätzliche Funktionen
bereitstellen, indem die realisierbare Taktfrequenz der sequentiellen Filterimplementierung
durch ein zusätzliches Entkopplungsregister zwischen dem Multiplizierer und dem
Addierer weiter gesteigert wird (vgl. Bild 9-25). Die Pipeline erhält somit eine zusätzliche
Stufe, sodass die Latenz der Berechnung eines Akkumulationsergebnisses auf 4 Takte
ansteigt und der Zustandsautomat um einen Zustand zum Leerlaufen der Pipeline zu ergän-
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
318 9 Modellierung digitaler Filter
zen ist (vgl. Bild 9-28). Bei einer so erreichbaren Verdopplung der Taktfrequenz auf ca.
fCLK=170 MHz sind dann 3541-20fCLK/fI=3381 Taktperioden verfügbar und der Berech-
nungsablauf des FIR-Filters benötigt davon lediglich N+5 Taktperioden.
Falls für eine Anwendung die verfügbaren Takte zum Einsatz eines Mehrzyklus-
Datenpfades nicht ausreichen, müssen ggf. mehr parallele FPGA-Ressourcen für die Filter-
implementierung eingesetzt werden. Zur Realisierung eines Einzyklus-Datenpfades käme
dann die in Kap. 9.1.4.5 hergeleitete Linear-Phasen-Struktur mit balanciertem
Addiererbaum in Frage (vgl. Bild 9-17). Es ist auch hier jeweils zu prüfen, ob bei der reali-
sierbaren Taktfrequenz der parallelen Filterstruktur genügend Takte für die angeschlosse-
nen Funktionen der Audiosignalverarbeitung übrig bleiben. Eine Linear-Phasen-Struktur
mit einer Filterordnung N=64 besteht aus Γ3.32log(N+1)=7 Addiererstufen, sodass wie in
der Struktur nach Bild 9-17 eine Taktfrequenz von etwa fCLK=30 MHz zu erwarten ist (vgl.
Tabelle 9-4) und sich die verfügbaren Taktperioden so jedoch auf unter 600 reduzieren.
Parallele Strukturen ohne Pipelining können also nicht mit dem Mehrzyklus-Datenpfad
konkurrieren.
Erst bei massivem Ressourceneinsatz wie in Bild 9-19 für einen Datenpfad mit Pipelining
dargestellt, ergibt sich für ein vergleichbares Filter mit der Ordnung N=64 eine realisierbare
Taktfrequenz von fCLK=170 MHz und eine Latenz von nur (Γ3.32log(N+1)+2)=9, sodass
mehr Takte (ca. 3000) für andere Funktionen zur Verfügung stehen. Der Mehraufwand an
FPGA-Ressourcen (LUTs und D-FFs) ist auch bei der Wahl einer transponierten Form (vgl.
Kap. 9.1.4.6) noch so hoch, dass in den meisten Anwendungen nur ein Mehrzyklus-
Datenpfad zur Diskussion stehen wird.
9.1.6.2 Hohe Datenraten
Datenpfade mit Pipelining sind bei Datenraten im Bereich der Taktfrequenz fCLK zwin-
gend, da nur die direkte Verarbeitung eines kontinuierlichen Datenstroms, jedoch keine
Pufferung mehr möglich ist. Die transponierte Form mit reduzierter Anzahl an
Multiplizierern ist von den in Kapitel 9 vorgestellten Filterstrukturen der Favorit, da der
Ressourcenbedarf und die erreichbare Taktfrequenz für diese Variante sprechen (vgl. Ta-
belle 9-4). Vorteilhaft kommt hinzu, dass bei dieser Struktur (vgl. Bild 9-3 und Bild 9-20)
mit implizitem Pipelining eine von der Filterordnung unabhängige Latenz mit zwei Taktpe-
rioden vorliegt. Durch zusätzliches Pipelining der N/2+1 Produkte wird eine maximale
Taktfrequenz fCLK von bis zu 170 MHz realisierbar, wobei der Bedarf an D-FFs in dieser
Struktur mit reduzierter Anzahl der Multiplizierer um ca. 50% zunimmt und die Latenz auf
drei Takte ansteigt.
Hohe Datenraten bei geringem Ressourcenbedarf lassen sich mit dem im Kap. 7.4.2 vorge-
stellten SDA-FIR-Filter erreichen. Für das Beispielfilter mit der Ordnung N=22 werden bei
einer Implementierung mit einem Spartan-3 FPGA die erforderlichen Ressourcen mit 130
Slices, 220 D-FFs und 149 LUTs angegeben. Bei einer maximalen Taktfrequenz fCLK=
197.9 MHz ist eine Abtastrate bis zu 3.7 MHz realisierbar. Die relativ hohe Latenz (20
Takte) dieses Filterentwurfes lässt sich durch mehr Ressourcen-Parallelität mit den PDA-
Filtern bei allerdings zunehmendem Ressourcenbedarf reduzieren.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
319 9.2 IIR-Filter
9.2 IIR-Filter
Dieses Kapitel behandelt die Modellierung von ausgewählten parallelen IIR-
Filterstrukturen 2. Ordnung (Second Order Section, SOS), die Basismodule für die Reali-
sierung von Filtern höherer Ordnung bilden [70], [72], [74]. Ausgehend von den Koeffi-
zienten eines Analogfilters wird die bilineare z-Transformation (BZT) zur
Koeffizientenberechnung genutzt [70], [72], da diese eine Koeffizientensymmetrie erzeugt,
die zur Einsparung von FPGA-Ressourcen beiträgt. Eine Gegenüberstellung der typischen
Filterstrukturen zeigt die jeweils erforderlichen FPGA-Ressourcen und die zu erwartenden
längsten Signallaufzeitpfade auf. Zur Vermeidung von Überlaufeffekten in den Rückkopp-
lungsstrukturen der IIR-Filter wird eine Strategie angewandt, die zwei Dimensionierungs-
schritte kombiniert. Eine Skalierung der Filter erfolgt mit der L∞-Tschebyscheff-Norm [70],
die den SOS-Ausgang y auch bei monofrequenter Ansteuerung auf das Intervall -1 ≤ y < 1
begrenzt. Für die internen Signale werden die Vektorbreiten durch Ergänzung des Q-
Formates mit zusätzlichen Guard-Bits so ausgelegt, dass die auftretenden Schwingungs-
amplituden zur Vollaussteuerung führen. Die parametrisierbaren VHDL-Modelle verfügen
über synchronisierte Ausgänge, sodass sie als Module zum Aufbau von SOS-Kaskaden in
einer Pipelinestruktur geeignet sind. Als Spezialfall wird abschließend ein Sinusgenerator-
Modell mit einer reduzierten IIR-Filterstruktur vorgestellt, das zur monofrequenten Über-
prüfung von Filterfrequenzgängen dienen kann.
Dem Leser bietet dieses Kapitel einen Leitfaden zur Entwicklung von VHDL-Modellen für
rückgekoppelte Systeme, deren interne Signale je nach Koeffizientensatz und gewählter
Struktur trotz Skalierung erhebliche Überschwinger außerhalb des Q-Formatbereiches
aufweisen können. Zur Vorbereitung der letztlich einfachen VHDL-Modelle ist deshalb
eine Analyse des Filterübertragungsverhaltens mit z-Übertragungsfunktionen und Fre-
quenzgängen unerlässlich. Der folgende Abschnitt stellt einige Begriffe der Systemtheorie
zusammen, die auch zur Orientierung für die Vertiefung mit der angegebenen Literatur
dienen.
9.2.1 Koeffizientenberechnung und Beispielfilter
Ein Vorteil der IIR-Filter besteht darin, dass sie einen vorgegebenen Frequenzgang im
Vergleich zu FIR-Filtern mit weniger Multiplizieren, Addierern und Verzögerungselemen-
ten realisieren. Die Register in IIR-Filtern werden über eine Signalrückführung auch zur
Speicherung ehemaliger Ausgangswerte y[n-k] genutzt, sodass die Ausgangswerte immer
wieder die gleichen Register durchlaufen. Diese Ausgangssignalrückführung kommt in der
Differenzengleichung Gl. 9-14 durch den zweiten Summenterm zum Ausdruck, der das
rekursive Verhalten der IIR-Filter erzeugt. Demnach liegt bei IIR-Filtern aufgrund der
Rückkopplung des Signals y[n] eine effektivere Nutzung der Verzögerungselemente und
der beteiligten Signalpfade vor. Allerdings hat die daraus resultierende Impulsantwort
theoretisch eine unendliche Dauer, was in Gl. 9-14 der Summenterm auf der rechten Seite
symbolisiert (vgl. Gl. 9-1). Auf dieses Verhalten bezieht sich die Bezeichnung Infinite
Impulse Response (IIR).
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
320 9 Modellierung digitaler Filter
Gl. 9-14 ]kn[x]k[h]kn[ya]kn[xb]n[y0k
M
0k
N
1kkk
Der Signalflussgraph für ein Filter 2. Ordnung in Bild 9-31 zeigt, dass IIR-Filter aus der
Reihenschaltung eines FIR-Filters und einer zusätzlichen Rückkopplungsstruktur bestehen.
Aufgrund der kompakten Form wird diese Darstellung gern für Filterstrukturen und Algo-
rithmen verwendet, da sich insbesondere auch Rückkopplungsstrukturen übersichtlich ab-
bilden lassen. Die Bedeutung der Signalpfadkennzeichnung ist in Bild 9-31 mit angegeben.
Bild 9-31: Signalflussgraph eins IIR-Filters 2. Ordnung in Direktform I mit Kennzeichnung eines
der beiden längsten Signallaufzeitpfade. Bedeutung der Signalpfade
Mit Hilfe des Signalflussgraphen lässt sich die zur Gl. 9-14 korrespondierende z-Übertra-
gungsfunktion G(z) des digitalen Filters herleiten:
Gl. 9-15 )z(X
)z(Y
za1
zb
)z(GN
1k
kk
M
0k
kk
Die Filterimplementierung mit einem VHDL-Modell geht von der Zeitbereichsdarstellung
nach Gl. 9-14 mit Rückführungsterm bzw. von der Struktur nach Bild 9-31 aus. Zur Be-
stimmung der Koeffizienten ai und bi für eine vorgegebene Filterordnung N finden Verfah-
ren Anwendung, die analoge Filtercharakteristiken durch die z-Übertragungsfunktion G(z)
des digitalen Filters nach Gl. 9-15 approximieren. Damit stehen nämlich zahlreiche bewähr-
te Entwurfsmethoden für analoge Filter zur Verfügung, die je nach Anwendung auf die
erforderlichen Kennwerte für den Durchlass- und Sperrbereich des Frequenzganges ausge-
legt werden können [70], [75]. Ein Approximationsverfahren ist die bilineare z-Trans-
formation (BZT), bei der die Laplace-Variable s in der Laplace-Übertragungsfunktion eines
analogen Filters durch die Tustin-Formel angenähert wird (fa Abtastfrequenz):
Gl. 9-16 )z1()z1(f2zlnfs 11aa
+ +
+ +
x yw
z-1
z-1
z-1
z-1
b0
-a1b1
b2 -a2
y[n]
y[n]
a
z-1
Signalpfade
mit Multiplikation
y[n]=ax[n]
mit Verzögerung
y[n]=x[n-1]
x[n]
x[n]
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
321 9.2 IIR-Filter
Dieser Zusammenhang folgt aus einer Taylor-Reihenentwicklung der ln-Funktion, die nur
das 1. Glied berücksichtigt. Substituiert man in der allgemeinen Laplace-Übertragungs-
funktion eines analogen Tiefpassfilters 2. Ordnung (N=2) nach Gl. 9-17
Gl. 9-17 )sd2s()s(G 200
220
die Variable s mit Gl. 9-16, so ergibt sich die korrespondierende z-Übertragungsfunktion
für den zeitdiskreten Fall zu:
Gl. 9-18
2
200a
2a
200a
2a1
200a
2a
2a
20
200a
2a
2021
zdf4f4
df4f4z
df4f4
f421
df4f4zz21
)z(G
Für die Entwurfsparameter in Gl. 9-17 und Gl. 9-18 gilt [70]:
fa = 1/T Abtastfrequenz
d Dämpfung > 0
0 = 2f0 Kreisfrequenz, bei der am Ausgang 90° Phasendrehung auftritt
Ein Koeffizientenvergleich der Zählerpolynome in Gl. 9-15 und Gl. 9-18 zeigt für N=2,
dass eine Koeffizientensymmetrie vorliegt, die die BZT in ähnlicher Form auch für Hoch-
pass-, Bandpass- und Bandstoppfilter liefert (vgl. Gl. 9-19). Die s-Übertragungsfunktionen
der anderen Filtercharakteristiken lassen sich z.B. mit speziellen Frequenz-Transformatio-
nen der s-Variable vorab zur BZT aus der Darstellung des Tiefpasses herleiten [70].
Gl. 9-19
Neben dieser für die FPGA-Implementierung relevanten Koeffizientensymmetrie (vgl.
Abschnitt 9.1.4.5) besteht der wesentliche Vorteil der BZT mit Gl. 9-16 darin, dass der
gesamte Frequenzbereich eines analogen Referenzfilters auf den für das digitale Filter zu-
lässigen Frequenzbereich bis zur Nyquist-Frequenz fNy=fa/2 komprimiert wird. Damit treten
keine Aliasing-Effekte im Bereich der Nyquist-Frequenz auf, die z.B. die Filterapproxima-
tion mit dem Verfahren der Impulsinvarianz auf schmalbandige Filter beschränken [72].
Als Beispielfilter für die VHDL-Modellierung dient hier ein IIR-Tiefpass 2. Ordnung,
dessen Parameter in Tabelle 9-6 zusammengestellt sind. Die Dämpfung ist mit d=0.2 ge-
zielt gering gewählt, damit sich mit Gl. 9-18 ein typischer Koeffizientensatz ergibt, wie er
auch für die SOS-Module in stark selektiven Filtern höherer Ordnung entsteht.
b0 = b2 , b1 = 2b0 Tiefpass
b0 = b2 , b1 = -2b0 Hochpass
b0 = -b2 , b1 = 0 Bandpass
b0 = b2 , b1 b0 Bandstopp
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
322 9 Modellierung digitaler Filter
Tabelle 9-6: Parameter eines IIR-Tiefpassfilters; Koeffizientenberechnung mit der BZT. fa=48 kHz
Der Amplitudengang des Beispielfilters (vgl. Bild 9-32) zeigt im oberen Frequenzbereich
f>20 kHz einen stark abfallenden Verstärkungsverlauf. Dies ist die Auswirkung der nichtli-
nearen Frequenzkompression der BZT nach Gl. 9-16, die ab einem Verhältnis f/fNy > 0.4
deutlich wirksam wird. Die Verstärkungsüberhöhung mit VGmax=2.55 resultiert aus der
geringen Dämpfung d=0.2. Ein Nachteil der IIR-Filter gegenüber den nicht rekursiven FIR-
Filtern wird mit dem nichtlinearen Phasengang in Bild 9-32 erkennbar. Aufgrund der nicht
konstanten Gruppenlaufzeit τg=-d/d erfahren die Frequenzanteile der Filtereingangssig-
nale unterschiedliche zeitliche Verzögerungen, sodass z.B. Ausgangspulse unsymmetrische
Verzerrungen aufweisen.
Bild 9-32: Frequenzgang des digitalen IIR-Tiefpassfilters, berechnet mit der MATLAB-Funktion
freqz. Koeffizienten nach Tabelle 9-6, VGmax=8.135 dB, N=2, fa=48 kHz
Analoges Filter G(s) Digitales Filter
G(z)
Verstärkung
|G(f)|max= VGmax
Skalierte
Koeffizienten
d = 0.2
f0 = 4774.65 Hz
f0/fNy = 0.199
fd = f0(1-d2)1/2 = 1/Td
b0 = 0.079872
b1 = 0.159744
a1 = -1.476
a2 = 0.7955
VGmax = 8.135 dB
= 2.5511
bei fR = 4450 Hz
bi/VGmax
b0 = 0.03131
b1 = 0.06262
0 0.5 1 1.5 2
x 104
-180
-150
-120
-90
-60
-30
0
f/Hz
Ph
ase/
°
0 0.5 1 1.5 2
x 104
-80
-60
-40
-20
0
f/Hz
|G(f
)| /
dB
Phasengang
Amplitudengang
Frequenz-
kompression
8.135 dB
f0 = 4774.65 Hz
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
323 9.2 IIR-Filter
Als Grundlage für die Filterskalierung ist neben dem Frequenzgang auch die Sprungantwort
auf Überhöhungen ymax>1 zu überprüfen (vgl.Bild 9-33). In Anwendungen mit sprungför-
migen Anregungen reicht nämlich eine Skalierung der Filterverstärkung mit dem Maxi-
malwert der Amplitudenüberhöhung (ymax=1.519) aus. Treten jedoch schmalbandige Ein-
gangssignale im Bereich der Frequenz f0 auf, so würde mit dieser Skalierung aufgrund der
Verstärkungsüberhöhung VGmax>ymax dennoch ein 2er-Komplementüberlauf erfolgen. In
diesem Beispiel wird deshalb die Skalierung mit der Tschebyscheff-Norm L∞=VGmax zur
Begrenzung des Filterausgangs Y realisiert [70], [75]. Es empfiehlt sich dazu, die Zähler-
koeffizienten mit bi/VGmax zu reduzieren, um einen zusätzlichen Multiplizierer als Dämpfer
am Eingang oder Ausgang einzusparen.
Bild 9-33: Sprung- und Impulsantwort des digitalen Beispielfilters nach Tabelle 9-6, berechnet mit
den MATLAB-Funktionen stepz und impz. Schwingungsperiode Td des gedämpften Systems
Die Entwürfe digitaler Filter werden mit den MATLAB-Funktionen cheby1, cheby2,
ellip und butter unterstützt, die eine Kombination aus der Dimensionierung eines
analogen Filters und der Filterapproximation mit der BZT bereitstellen. Bei zunehmender
Filterordnung N>4 werden die Koeffizienten ai und bi mit hohen Indizes jedoch sehr klein,
sodass sie bei begrenzter Vektorbreite nur ungenau quantisiert werden können. Dies führt
zur Verschiebung der Pole und Nullstellen der Polynome in Gl. 9-15, woraus sogar ein
instabiles Verhalten resultieren kann [70], [74], [75]. Deshalb wird eine Übertragungsfunk-
tion G(z) hoher Ordnung gemäß Gl. 9-15 mit der MATLAB-Funktion tf2sos durch Pol-
/Nullstellenpaarung in verkettete SOS-Module separiert [70]. Solche SOS-Kaskaden erge-
ben dann bei gleicher Vektorbreite der Koeffizienten präzisere Frequenzgangapproximatio-
nen als eine Realisierung mit Zähler- und Nennerpolynomen höherer Ordnung.
ymax=1.519
0 1 2 3 4 5 6 7 8 9
x 10-4
-0.2
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
Am
pli
tud
e y
t/s
Sprungantwort
Impulsantwort
Td = 0.214ms
b0
ymax=1.519
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
324 9 Modellierung digitaler Filter
9.2.2 Parallele Strukturen für IIR-Filter 2. Ordnung
Ausgehend von der aufgezeigten Koeffizientensymmetrie werden im Folgenden die typi-
schen IIR-Filterstrukturen gegenübergestellt, um eine Übersicht zu den erforderlichen
FPGA-Ressourcen für die Implementierung eines SOS-Moduls zu erhalten. Die unter-
schiedliche Robustheit der Strukturen gegen interne Überlaufeffekte und die
Timingcharakteristika gehen ebenso in die Übersicht ein.
Die Direktform I in Bild 9-31 stellt die Reihenschaltung zweier linearer Übertragungsglie-
der dar, sodass diese in der Reihenfolge der Verkettung tauschbar sind. Das Koppelsignal w
durchläuft darin dann parallel zwei Registerketten, die die optimierte Direktform II zu einer
Registerkette zusammenfasst (vgl. Bild 9-34a). In beiden Strukturen lässt sich die
Koeffizientensymmetrie nach Gl. 9-19 leider nicht zur Einsparung von Multiplizierern
nutzen, da die Signalpfade der Koeffizienten bi mit unterschiedlich verzögerten Signalen
gespeist werden. Eine Variante zur Direktform II ergibt sich, wenn man die Registerzu-
sammenfassung rückgängig macht und die Verzögerungen hinter die Produkte verlagert
(vgl. Bild 9-35b). Diese modifizierte Direktform II bietet nun den Multiplizieren mit den
Koeffizienten bi ein gemeinsames Eingangssignal v an, sodass im Fall eines Tiefpasses das
einzig erforderliche Produkt vb0 dreifach genutzt werden kann, wobei die Multiplikation
b1=2b0 durch ein Linksschieben realisierbar ist (vgl. Gl. 9-19).
Bild 9-34: a) Direktform II und b) modifizierte Direktform II eines IIR-Filters 2. Ordnung. Kenn-
zeichnung ausgewählter längster Signallaufzeitpfade
Durch Transponierung der Direktform II (DF II) entsteht die Struktur in Bild 9-35, die eine
minimale Anzahl an Registern enthält und zusätzlich die Nutzung der Koeffizientensym-
metrie zur Reduzierung der erforderlichen Multipliziereranzahl erlaubt.
Die für eine FPGA-Implementierung relevanten Eigenschaften der aufgeführten Strukturen
sind in Tabelle 9-7 zusammengefasst. Der dort jeweils angegebene längste Signalpfad
beginnt bei den ersten beiden Strukturen (vgl. Bild 9-31 u. Bild 9-34a) an einem Verzöge-
rungselement und endet am Ausgang y, der mit einem Übergaberegister abgeschlossen
wird. In den beiden übrigen Strukturen (vgl. Bild 9-34b u. Bild 9-34) beginnt der längste
Signalpfad am synchronisierten Eingang x und endet an einem Verzögerungselement. In
der modifizierten Direktform II gibt es zusätzlich noch einen Signalpfad vom Eingang
direkt zum Übergaberegister. Das Übergaberegister dient zur Entkopplung der Module in
+
+
x y+
+
z-1
z-1
b0
b1
b2
-a1
-a2
x+
+
+
+
yv
z-1
z-1
z-1
-a1
-a2
b0
b1
b2z
-1
a) b)
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
325 9.2 IIR-Filter
SOS-Kaskaden für Filter höherer Ordnung, wobei dessen Taktung so zu realisieren ist, dass
das sprungförmige Verhalten des einzelnen Filters und der gesamten Filterkette nach Gl.
9-14 gesichert wird (vgl. Bild 9-33b).
Bild 9-35: Transponierte Struktur der Direktform II für
N=2 mit Kennzeichnung eines der beiden längsten Signal-
laufzeitpfade
Beim Vergleich der Strukturen ist zu berücksichtigen, dass sie sich auch in der Robustheit
gegen Überlaufeffekte unterscheiden. Da die Filterskalierung durch modifizierte Zählerko-
effizienten bi nur für den Ausgang y eine Begrenzung auf das Intervall -1 < y < 1 garantiert,
sind die internen Summationspunkte gesondert zu prüfen. Dazu können die Frequenzgänge
und Sprungantworten für die internen Größen bestimmt und auf Amplitudenüberhöhungen
untersucht werden, aus denen eine ggf. erforderliche Vorverstärkung bzw. Dämpfung des
Eingangspfades x über einen Multiplizierer abzulesen ist, die am Ausgang dann wieder
kompensiert werden muss. Vorteilhafter ist es jedoch, gezielt das Q-Format der kritischen
Summationspunkte durch Guard-Bits zu erweitern, sodass dieser Integeranteil die Signal-
überhöhungen aufnimmt. Mit diesem Konzept zur angepassten Vektorbreitenauslegung
sind gegenüber vorgeschalteten Multiplizierern weniger zusätzliche Ressourcen und eine
geringere Zunahme des Signallaufzeitverhaltens zu erwarten.
Tabelle 9-7: Gegenüberstellung der IIR-Struktureigenschaften für den Spezialfall eines Tiefpasses
mit N=2 und Koeffizientensymmetrie nach Gl. 9-19
Struktureigen-
schaften
Direktform I
Bild 9-31
Direktform II
Bild 9-34a
Transponierte
Direktform II
Bild 9-35
Modifizierte
Direktform II
Bild 9-34b
Längster
Signalpfad
1 Multipliz. 2 Multipliz. 2 Multipliz. 1 Multipliz.
3 Addierer 3 Adddierer 2 Addierer 2 Addierer
Anzahl
Multiplizierer
5 5 3 3
Anzahl
Register
4 2 2 4
x y
z-1
z-1
b0
b1
b2
-a1
-a2
+
+
+
S1
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
326 9 Modellierung digitaler Filter
Vergleichend lässt sich mit Tabelle 9-7 qualitativ feststellen:
Alle Strukturen benötigen vier Addierer, da auch der zentrale Addierer S1 der transpo-
nierten Direktform II mit drei Eingängen als Addiererkette realisiert wird.
Eine Einsparung von Multiplizierern ist nur mit der transponierten Struktur der Direkt-
form II und der modifizierten Direktform II erreichbar.
Aufgrund der kürzeren Signalpfade ist die modifizierte Direktform II (vgl. Bild 9-34b)
gegenüber der transponierten Direktform II für eine FPGA-Implementierung vorzuzie-
hen, um höhere Taktfrequenzen realisieren zu können. Allerdings weist das Koppelsig-
nal v der Teilsysteme in der Regel vielfach höhere Überschwinger auf als der skalierte
Ausgang y. Im Fall des Beispielfilters überlagert nämlich der Eingangsaddierer den voll
ausgesteuerten x-Pegel mit dem verstärkten v-Pegel, der bei einem a1<-1 als
Mitkopplung wirkt. Die Addierer im ersten Teilsystem müssen also mit der Anzahl Γ
ld(v-Übersteuerungsfaktor) an Guard-Bits ergänzt werden, wobei der Übersteuerungs-
faktor je nach Systemanregung dem Signalüberschwinger oder dem Frequenzgang ent-
nommen wird. Mit den so verbreiterten Operanden der Multiplizierer wächst auch deren
Breite. Das zweite Teilsystem mit den bi-Koeffizienten dämpft die v-Pegel, sodass der
Ausgangsaddierer y begrenzt ist.
In der transponierten Direktform II nach Bild 9-35 steuert das Eingangssignal x die
internen Summationspunkte über die dämpfenden bi-Koeffizienten an, sodass hier ge-
ringere Übersteuerungen auftreten. Die direkte Mischung der Signale aus dem Vor-
wärts- und dem Rückkopplungsteilsystem erzeugt tendenziell eine vorteilhafte Pegel-
kompensation. Als Folge sind die internen Addierer im Vergleich zur modifizierten
Direktform II mit weniger Guard-Bits und somit schmaler auszulegen.
Eine quantitative Analyse und Bewertung der hier erläuterten Struktureigenschaften erfolgt
im Rahmen der VHDL-Modellierung auf Basis der Syntheseergebnisse und der
Timinganalyse. Zur Dimensionierung des Q-Formats der Koeffizienten ist mit dem Stabili-
tätsdreieck in Bild 9-36 der Wertebereich der ai-Koeffizienten aufgezeigt. Die Grenzen des
dreieckförmigen Koeffizientengebietes für stabile IIR-Filter 2. Ordnung gehen aus der
Polstellenberechnung der z-Übertragungsfunktion nach Gl. 9-15 hervor. Im Stabilitätsdrei-
eck trennt die Parabel a2=a12/4 die schwingungsfähigen SOS-Module von denen mit aperio-
dischem Verhalten. Auf der oberen Begrenzungslinie liegen für a2=1 alle a1-Werte, die ein
grenzstabiles Verhalten erzeugen, das sinusförmige Dauerschwingungen liefert. Ein IIR-
Filter mit solchen Parametern kann also als Sinusgenerator zur monofrequenten Frequenz-
gangüberprüfung genutzt werden.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
327 9.2 IIR-Filter
Bild 9-36: Wertebereich der Nennerkoeffizienten a1 und a2 eines stabilen digitalen IIR-Filters 2.
Ordnung
9.2.3 VHDL-Modelle für Varianten der Direktform II
Dieser Abschnitt stellt die VHDL-Modelle der transponierten Direktform II und der modi-
fizierten Direktform II am Beispiel eines Moduls 2. Ordnung vor. Mit diesen Strukturen ist
die aus der bilinearen z-Transformation (BZT) resultierende Symmetrie der Zählerkoeffi-
zienten bi zur Einsparung von Multiplizierern nutzbar. Die Ausführungen zu diesen beiden
Modellen versetzen den Leser in die Lage, je nach Koeffizientensatz des Filters die geeig-
nete Filterstruktur zu realisieren, die die jeweiligen Anforderungen an die Taktfrequenz und
den zulässigen Ressourcenbedarf erfüllt. Die VHDL-Modelle können darüber hinaus auch
als Entwurfsmuster für rückgekoppelte Systeme dienen, wie z.B. digitale Regelungen.
Diese erfordern neben einer Skalierung zur linearen Ausgangsgrößenbegrenzung des Reg-
lers eine überlauffreie Integer-Arithmetik mit Guard-Bits für das Q-Format der internen
Berechnungsergebnisse. Rückkopplungspfade in komplexen Regleralgorithmen sind näm-
lich nicht allein durch modifizierte Koeffizienten skalierbar, da diese die Pollagen und
damit die Systemdynamik festlegen.
9.2.3.1 Transponierte Struktur der Direktform II
Das Simulink-Blockschaltbild [85] in Bild 9-37 gibt eine Übersicht zu den Vektorbreiten
und den Signalnamen im VHDL-Modell der transponierten Direktform II (vgl. Code 9-16).
Das Modul ist als Element einer SOS-Pipeline ausgelegt, wie sie zum Aufbau von Filtern
mit höherer Ordnung eingesetzt werden [70], [74], [75]:
Das Übergaberegister bildet die Ausgangsynchronisation und stellt damit dem folgen-
den Modul einen taktsynchronen Eingang zur Verfügung. Ein Übernahmeregister wie in
a1, a2 Gebiet der reellen Pole
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
a1
a2
instabiles System
a2 > a12/4
a2 > a1-1
a2 > -a1-1
Grenzzyklus
instabiles System
a1, a2 Gebiet der konjugiert komplexen Pole
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
328 9 Modellierung digitaler Filter
den Beispielen zum FIR-Filter ist deshalb nicht erforderlich (vgl. Bild 9-8). Die Ein-
gangssignalsynchronisation für die erste SOS-Stufe muss das Ausgangsregister des Co-
dec-Interfaces oder ein zusätzliches Eingangsregister im speziellen ersten IIR-Modul
übernehmen.
Ein Puls-Shorter für das READY-Bit der Eingangssignalaktualisierung ist nicht im
Modul enthalten, sondern wird dem Codec-Interface zugeordnet bzw. durch die
Testbench nachgebildet.
Zur Realisierung des zentralen Summationspunktes S1 im Signalflussgraphen nach Bild
9-35 ist die dargestellte Reihenfolge aus drei Möglichkeiten ausgewählt worden, da eine
Simulink-Simulation für diese Summationspunkte die geringsten Schwingungsamplitu-
den aufgezeigt hat. Außerdem würde der längste Signallaufzeitpfad ansonsten drei statt
der in Tabelle 9-7 angegebenen zwei Addierer enthalten.
Subtrahierer realisieren die korrekten Vorzeichen der Rückkopplungspfade, die die im
Vorzeichen unveränderten Koeffizienten ai enthalten.
Bild 9-37: Simulink-Blockschaltbild des skalierten IIR-Tiefpassfilters 2. Ordnung in transponierter
Direktform II nach Tabelle 9-6. Übersicht zum Q-Format und zu den Guard-Bits der Signalvektoren.
Der zentrale Summierer S1 ist durch ein Oval gekennzeichnet
Die Auslegung der internen Vektorbreiten orientiert sich am zentralen Summationspunkt
S1, da dieser über den Signalpfad mit |a1|>1 eine stark gewichtete Mitkopplung erfährt. Wie
bei der Skalierung richtet sich die Dimensionierung nach dem Verstärkungsverhalten (L∞-
Norm), sodass auch bei schmalbandiger Anregung keine Überläufe auftreten. Das dynami-
sche Verhalten dieses Summationspunktes S1(z) wird durch folgende z-Übertragungsfunk-
tion bestimmt (vgl. Bild 9-35):
Gl. 9-20
2
1k
kk
1202101
1S
za1
z)abb()abb(
)z(XN
)z(1S)z(G
YN
b20.06262
b10.03131
b0
0.7955a2 -1.476a1
z
1
SUM2z
1
SUM11
SUM10 SUM0
XN
0.03131
[s.10:0]
[s.10:0]
[s,g.10:0][s.10:0]
[s,g.21:0]
[s,g.14:0]
[s,g,g.21:0]Y_A1Y_A2
X_B0X_B0
[s,g.21:0]
X_B1
YFB
z
1
[s,g.14:0]
[s,g.14:0]S1
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
329 9.2 IIR-Filter
Der mit der MATLAB-Funktion freqz berechnete Amplitudengang |GS1(f)| zeigt für die
mit VGmax skalierten bi-Koeffizienten (vgl. Tabelle 9-6) eine maximale Verstärkung von
VGS1max=0.99464, sodass kein Guard-Bit erforderlich wäre. Damit jedoch nicht unmittelbar
abschätzbare Auswirkungen der Koeffizientenquantisierung und der Verkürzung der Multi-
plikationsergebnisse zu Überläufen führen, wird für die Signale SUM2, SUM10 und
SUM11 ein Q-Format mit einem Guard-Bit als Sicherheitsreserve gewählt (vgl. Bild 9-37)
SUM11[sign,guard. 14:0].
Darin ist der Bruchanteil mit 15 Bit ein Kompromiss aus dem Q11-Format der Koeffizien-
tenbreite und dem Q22-Format der Multiplizierer.
Alle anderen Vektorbreiten ergeben sich nach dieser Vorgabe aus folgenden Zusammen-
hängen, die auf den Ausführungen des Abschnitts 9.1.2 beruhen:
Der skalierte Addiererausgang SUM0 muss das Format des Operanden SUM11 erhal-
ten. In diesem Operanden kann noch ein Integeranteil enthalten sein, der erst nach der
Mischung im Ausgang SUM0 aufgehoben ist.
Für das Rückkoppelsignal YFB wird die minimale Breite des skalierten Ausgangs YN
gewählt.
Die unterschiedliche Breite der Rückkopplungsprodukte Y_A1 und Y_A2 ergibt sich
aus der jeweiligen Koeffizientenbreite.
Die Integeranteile in Y_A1 und Y_A2 müssen so reduziert werden, dass die Produkte
als Operanden die Breite der Subtrahierer aufweisen. Das Produkt Y_A1 kann nämlich
aufgrund des Maximalwertes |YFB|≤1 auch auf ein Guard-Bit reduziert werden.
Die übrigen Produkte sind nur im Q-Format (Bruchanteil) auf die Breite der Addierer
und Subtrahierer zu verkürzen.
Das aus Bild 9-37 entwickelte VHDL-Modell ist in einen getakteten Prozess STAGES und
parallele Anweisungen gegliedert, die die Multiplikationen und die Summen SUM10 und
SUM0 erzeugen (vgl. Code 9-16). Die Einsparung der Multiplizierer der Vorwärtsprodukte
wird durch dreifache Verwendung des Produktes X_B0 erreicht, wobei die Multiplikation
b1=2b0 durch eine Indexanpassung erfolgt. Der getaktete Rahmen inferiert die Verzöge-
rungselemente SUM2 und SUM11 mit den vorgeschalteten Subtrahierern sowie das
Übergaberegister YN.
Dieses Übergaberegister YN erfüllt zwei zu beachtende Funktionen:
Ausgangssignalsynchronisation zur Entkopplung der SOS-Module.
Es liefert den direkten Durchgriff von b0*x[n] auf y[n] nach Gl. 9-14.
Da alle Register mit dem verkürzten Puls RD parallel freigegeben werden, setzt sich der
Ausgang YN aus dem vorherigen Wert von SUM11 und dem aktualisierten Wert X_B0
zusammen. Ohne Übergaberegister hingegen würde der Ausgang YN den neuen Wert
X_B0 direkt mit dem aktualisierten Registerinhalt SUM11 mischen, was nicht der Diffe-
renzengleichung Gl. 9-14 entspricht. Das Rückkopplungssignal Y_FB muss allerdings eine
direkte Rückführung des Ausgangsaddierers SUM0 sein, da das Register SUM11 parallel
mit zeitgleich berechneten Werten aus dem Vorwärtspfad X_B1 und dem Rückkopplungs-
pfad Y_A1 zu aktualisieren ist.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
330 9 Modellierung digitaler Filter
Die Parametrisierung der Filterkoeffizienten mit generics erfordert den synthesefähigen
Typ integer (vgl. Abschnitt 7.2.1.4), sodass zu deren Übergabe an die Konstanten vom
Typ signed eine Typ-Konvertierung mit der Funktion to_signed(Pi,B*) durchzu-
führen ist, die auch die Zielvektorbreite B* als Parameter beinhaltet (vgl. Anhang 12). Der
Vektortyp signed ist zwar gerade für die Integer-Arithmetik im 2er-Komplement vorge-
sehen, jedoch sind direkte Zuweisungen mit Integerwerten nicht erlaubt. Zur Initialisierung
der generics Pi sind nur Integerwerte zulässig; jede Art von hexadezimalen oder Bit-
Strings führt in der Simulation und Synthese zu Fehlermeldungen mit Hinweis auf eine
Typinkompatibilität. Mit dem QB-Format der Koeffizienten ergeben sich die Integerwerte
der Parameter Pi durch eine Gewichtung, die den positiven bzw. negativen Zahlendarstel-
lungsbereich berücksichtigt:
Pi = (2B-1)c für positive Koeffizienten c = bi, ai > 0
Pi = (2B)c für negative Koeffizienten c = bi, ai < 0
In der port-Liste der entity IIR_SOS sind auch die Steuerbits und das Taktsignal vom
Typ std_logic, da die Testbench für die Timingsimulation Stimuli mit diesem Typ
liefern muss und zusätzliche Code-Zeilen mit Typkonvertierungen eingespart werden soll-
ten.
-- IIR-Tiefpassfilter in transponierter Direktform II; d=0.2; f0=4774 Hz
-- symmetrische, mit VGmax=2.5511 skalierte Zählerkoeffizienten
-- b0=b2=0.079872/VGmax; b1=2*b0; a1=-1.47604; a2=0.79553
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity IIR_SOS is
generic
( P1: integer := 64; -- B0=B2=0,031309; s.Q11 x"040"; B1=2*B0
P2: integer := -3023;-- A1=-1.47607; sg.Q11 x"1431"
P3: integer := 1629);-- A2=0.79553; s.Q11 x"65D"
port
( CLK: in std_logic; -- 48 MHz Systemtakt
RESET: in std_logic; -- synchron
RD: in std_logic; -- Eingang aktualisiert mit 48 kHz
DONE: out std_logic; -- Ergebnis verfügbar
XN: in std_logic_vector(11 downto 0); -- Eingangssignal
YN: out std_logic_vector(11 downto 0)); -- Signal zum Codec
end IIR_SOS;
architecture IIR_ARCH of IIR_SOS is
constant B0: signed(11 downto 0):= to_signed(P1,12); -- s.Q11
constant A1: signed(12 downto 0):= to_signed(P2,13); -- sg.Q11
constant A2: signed(11 downto 0):= to_signed(P3,12); -- s.Q11
signal X_B0, X_B1: signed(23 downto 0);-- Vorwärtsprodukte sg.Q22
signal X, YFB: signed(11 downto 0); -- Eingang, Rückkopplung
signal Y_A1: signed(24 downto 0);-- Rückkopplungsprodukt sgg.Q22
signal Y_A2: signed(23 downto 0);-- Rückkopplungsprodukt sg.Q22
signal SUM2, SUM11: signed(16 downto 0);--Subtrahiererregister sg.Q15
signal SUM10, SUM0: signed(16 downto 0);-- Addierer sg.Q15
begin
X <= signed(XN);
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
331 9.2 IIR-Filter
SYNC_RD: process(CLK)
Begin -- Enable-Kette für Folgestufe
if CLK'event and CLK='1' then
if RESET='1' then DONE <= '0' after 3 ns;
else DONE <= RD after 3 ns;
end if;
end if;
end process SYNC_RD;
X_B0 <= B0 * X after 6 ns; -- 24 Bit < 0,5
X_B1 <= X_B0(22 downto 0) & '0'; -- 24 Bit 2b0 < 1, shift left
Y_A1 <= A1 * YFB after 6 ns; -- 25 Bit
Y_A2 <= A2 * YFB after 6 ns; -- 24 Bit
SUM10 <= X_B1(23 downto 7) + SUM2 after 6 ns; -- Zwischensumme 17 Bit
STAGES: process(CLK)
begin
if CLK'event and CLK = '1' then
if RESET = '1' then
SUM2 <= (others => '0') after 3 ns;
SUM11 <= (others => '0') after 3 ns;
YN <= (others => '0') after 3 ns; -- Übergaberegister
elsif RD = '1' then
SUM2 <= X_B0(23 downto 7) - Y_A2(23 downto 7) after 3 ns;
SUM11 <= SUM10 - Y_A1(23 downto 7) after 3 ns;
YN <= std_logic_vector(SUM0(15 downto 4)) after 3 ns;
end if;
end if;
end process STAGES;
SUM0 <= X_B0(23 downto 7) + SUM11 after 6 ns;-- skalierter Ausgangsaddierer
YFB <= SUM0(15 downto 4); -- 12 Bit Rückkopplung
end IIR_ARCH;
Code 9-16: IIR-Tiefpass in transponierter Direktform II mit dreifacher Verwendung des Produktes
X_B0. Ausgangssynchronisation mit Übergaberegister YN
Die Modelle der IIR-Filter werden an einem Tiefpassbeispiel vorgestellt, dies schränkt
deren Allgemeingültigkeit jedoch nicht ein, da der VHDL-Code mit jeweils einer modifi-
zierten Zeile ein Hochpass- oder Bandpass-Modell liefert (vgl. Gl. 9-19):
Hochpass:
X_B1 <= -(X_B0(22 downto 0) & '0') after 6 ns; -- B1=-2*B0
Bandpass:
X_B2 <= -X_B0 after 6 ns; X_B1 <= (others => '0'); -- B0=-B2
Lediglich der Ressourcenbedarf des Hochpass-Filters steigt in geringem Maße, da der
Signalkomplementer eine bitweise Invertierung und eine anschließende 1-Addition erfor-
dert. Dieser Mehraufwand wird beim Bandpass durch einen wegfallenden Addierer über-
kompensiert.
In der Timingsimulation der Sprungantwort (vgl. Bild 9-38) des skalierten Filters sind der
Maximalwert ynmax und der stationäre Endwert ynstat zum numerischen Vergleich mit der
MATLAB-Referenzkurve in Bild 9-33 gekennzeichnet. Einige quantitative Detailauswer-
tungen beleuchten im Folgenden die Ergebnisse der Filterskalierung, der Signalvektoraus-
legung und der Synthese.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
332 9 Modellierung digitaler Filter
Die relative Abweichung |Δmax| des Scheitelwertes ynmax liegt unter 0.4 %:
ynmaxsoll = ymax/VGmax = 1.519/2.5511 = 0.59543 aus Bild 9-33 und Tabelle 9-6
ynmax= 4bfHex = 0.10010111111Bin = 0.59326 aus Bild 9-38
Abweichung: Δmax = (ynmax - ynmaxsoll)/ ynmaxsoll = -0.00364
Da die Berechnungen der positiven Sprungantwort durch das Abschneiden der Multi-
plikationsergebnisse X_Bi und Y_A1 betragsmäßig reduziert werden, liegt der simulier-
te Filterausgang ynmax unter dem MATLAB-Referenzwert.
Bild 9-38: Timingsimulation der Sprungantwort YN des skalierten IIR-Filters in transponierter
Direktform II (vgl. Code 9-16 u. Tabelle 9-6)
Für den Endwert ynstat, der in Bild 9-38 bei 0.985 ms abgelesen werden kann, gilt:
ynstatsoll = ystat/VGmax = 1/2.5511 = 0.39199 aus Bild 9-33 und Tabelle 9-6
ynstat = 323Hex = 0.0110010011Bin = 0.39209 aus Bild 9-38
Δstat = (ynstat – ynstatsoll)/ ynstatsoll = 0.000255
Die sprungförmige Reaktion des Ausgangs yn auf den Eingangspegel xn=7ffHex ent-
spricht dem Wert des Koeffizienten b0.
Die ablesbare Schwingungsperiode Td des gedämpften Systems entspricht aufgrund der
Treppenfunktion yn grob dem theoretischen Wert Td=0.214 ms (vgl. Tabelle 9-6 u. Bild
9-33). Diese Schwingungen sind ab ca. 1.25 ms vollständig abgeklungen und der Aus-
gang yn wird konstant yn=320Hex. Es treten keine quasi stationären Grenzzyklen auf,
wie sie durch Produktrundung entstehen können [70], [75].
ynmax = 0,59326
Td
ynmax
ynstat = 0,39209
sum11max = 4245Hex
xn*b0=03fHex
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
333 9.2 IIR-Filter
Das Register SUM11 des zentralen Addierers S1 ist im Post-Place & Route-
Simulationsmodell nur mit einem 16-Bit-Vektor repräsentiert. Der Synthesereport listet
zwar noch 17-Bit-Subtrahierer auf, jedoch ist das MSB im Register SUM11 nicht mehr
weiterverbunden (vgl. Tabelle 9-8). Ursächlich dafür ist die fehlende Verwendung die-
ses Sicherheitsbits aus dem Addierer SUM0 im skalierten Ausgangsvektor YN und in
der Rückführung YFB, sodass die Logiksynthese dieses Bit des Addierers SUM0 und
des Registers SUM11 heraus optimiert hat. Das Guard-Bit für die internen Addierer
lässt sich z.B. realisieren, indem die Rückführung YFB auf einen 13-Bit-Vektor erwei-
tert wird und die Produkte Y_A1 und Y_A2 auch um ein Guard-Bit breiter gewählt
werden. Im Fall der Sprungantwort ist keine maximale Aussteuerung der internen Sig-
nale zu erwarten (sum11max=4245Hex=0.51773), sodass ein Worst-Case-Test mit einer
Sinusanregung erfolgen muss, um die tatsächliche Notwendigkeit des Guard-Bits über-
prüfen zu können.
Zur Vervollständigung ist in Code 9-17 die Testbench angegeben, die die Sprunganregung
erzeugt und den Puls-Shorter (vgl. Bild 9-8) enthält. Die generic-Deklaration der Kom-
ponente IIR_SOS und die generic map der Komponenteninstanziierung sind nur für die
VHDL-Simulation erforderlich, das Timingsimulationsmodell hingegen repräsentiert die
FPGA-Implementierung mit der durch die Koeffizienten fixierten Filterfunktion. Der pro-
cess AUDIO_PERIODE startet die Sequenz der READY-Pulse erst 4 Systemtakte im
Anschluss an den Reset-Puls, damit dieser Verzug die Simulation des FPGA-
Anlaufverhaltens überbrückt. Das Post-Place & Route-Strukturmodell würde ansonsten
nicht auf den ersten RD_S-Puls reagieren.
-- Testbench mit Sprunganregung des IIR-Filters library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity IIR_TB is
generic(PERIODE48MHZHALBE: time:= 10.41666667 ns;
SAMPLES: positive := 1000);
end entity IIR_TB;
architecture IIR_FILTER of IIR_TB is
component IIR_SOS is
port
( CLK: in std_logic; -- 48 MHz Systemtakt
RESET: in std_logic; -- synchron
RD: in std_logic; -- Eingang aktualisiert
DONE: out std_logic; -- Ergebnis verfügbar
XN: in std_logic_vector(11 downto 0); -- Eingangssignal
YN: out std_logic_vector(11 downto 0)); -- Signal zum Codec
end component;
signal CLK, CLR, RD_S: std_logic;
signal Y, X: std_logic_vector(11 downto 0);
signal TEMP_1, TEMP_2, READY: std_logic ;
begin
CLOCK: process -- 48 MHz Clock-Periode
begin
CLK <= '0'; wait for PERIODE48MHZHALBE;
CLK <= '1'; wait for PERIODE48MHZHALBE;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
334 9 Modellierung digitaler Filter
end process CLOCK;
RESET: process
begin
CLR <= '1';
wait for (PERIODE48MHZHALBE * 2); -- high active reset
CLR <= '0';
wait; -- no change any more because of unconditional wait
end process RESET;
AUDIO_PERIODE: process
variable NUM: integer range 0 to SAMPLES +2;
begin
READY <= '0'; X <= x"000"; -- Initialisierung
NUM := 0; -- Zählt die Abtasterte x
wait for (PERIODE48MHZHALBE *8); -- Startverzögerung 4 Takte
WHILE NUM <= SAMPLES +1 LOOP
READY <= '1';
X <= x"7ff";
wait for (PERIODE48MHZHALBE *2 *4); -- 12 MHz Ready-Puls
READY <= '0';
wait for ((PERIODE48MHZHALBE *2 * 1000) - (PERIODE48MHZHALBE * 2 * 4));
-- 48 kHz Abtastperiode
NUM := NUM + 1;
END LOOP;
wait; -- unbedingter Halt
end process AUDIO_PERIODE;
PULSE_SHORTER: process(CLK,CLR)
begin
if CLR = '1' then
(TEMP_1,TEMP_2) <= std_logic_vector'("00") after 3 ns;
elsif CLK='1' and CLK'event then
TEMP_1 <= READY after 3 ns; -- Ready erzeugt Audio-Periode
TEMP_2 <= TEMP_1 after 3 ns;
end if;
end process PULSE_SHORTER;
RD_S <= TEMP_1 and (not TEMP_2) after 3 ns; -- verkürzter Puls
DUT1: IIR_SOS -- entity des Timingsimulationsmodells
port map(CLK => CLK, RESET => CLR, RD => RD_S, XN => X,
YN => Y, DONE => open);
end IIR_FILTER;
Code 9-17: Testbench der entity IIR_SOS (vgl. Code 9-16). Für die Timingsimulation sind die
zur Instanziierung gehörenden generics nicht erforderlich
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
335 9.2 IIR-Filter
9.2.3.2 Modifizierte Direktform II
Als zweites VHDL-Modell wird die Realisierung der modifizierten Direktform II nach Bild
9-39 erläutert (vgl. Code 9-18). Wie in Abschnitt 9.2.2 schon qualitativ beschrieben, enthält
das Rückkopplungsteilsystem kritische Addierer, deren Ausgänge V und SUM2 nicht ska-
lierbare Signalüberschwinger aufweisen. Die Auswertung des Amplitudengangs zur z-
Übertragungsfunktion GV(z) in Gl. 9-21 liefert für den Koppelpfad eine Verstärkungsüber-
höhung von VGVmax=8.71. Wenn dem System kein dämpfender Multiplizierer vorgeschaltet
werden soll, dann müssen also für das Koppelsignal V Γ ld(VGVmax)=4 Guard-Bits imple-
mentiert werden, damit auch im Worst-Case einer schmalbandigen Anregung keine Über-
laufeffekte auftreten.
Bild 9-39: Modifizierte Direktform II mit skaliertem Ausgangsaddierer YN+. Übersicht zum Q-
Format und zu den Guard-Bits der Signalvektoren (vgl. Code 9-18)
Gl. 9-21
2
1k
kk
V
za1
1
)z(XN
)z(V)z(G
Ausgehend von dieser Dimensionierung des Addierers V mit einer Breite von 16 Bit erge-
ben sich die Vektorbreiten der Signale in dieser modifizierten Direktform II nach den aus
Abschnitt 9.2.3.1 und 9.1.2 bekannten Schlussfolgerungen. Auch hier gilt der zuvor ge-
wählte Ansatz, Schnittstellensignale mit 12 Bit und Multiplizierereingänge mit Q11 zu
modellieren.
Die Breite der Rückkopplungsprodukte V_A1 und V_A2 resultiert aus der Breite von V
und aus der jeweiligen Koeffizientenbreite.
Zur Addition werden die Rückkopplungsprodukte auf die Breite des Addierers V redu-
ziert, indem von beiden Enden der Vektoren Bits abgeschnitten werden, sodass die Zu-
sammensetzung des Signals V aus Guard-Bits und Q11-Format erreicht wird. Eine vor-
zeichenrichtige Erweiterung passt den Eingangsvektor XN auf die Breite des Addierers
V an.
[s,g,g,g,g,g.21:0]
XN+
+
+
+
YNV
z-1
z-1
z-1
-a1
a2
b0
b1
b2z
-1
-V_A2 V_A1
SUM2
V_B2V_B1
SUM1V_B0
z-1
[s,g,g,g,g.10:0]
[s.10:0]
[s,g,g,g,g,g.21:0]
[s,g,g,g,g,g,g.21:0]
[s.10:0]
YN+
SUM1+SUM2+
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
336 9 Modellierung digitaler Filter
Für die Vorwärtsprodukte V_Bi gilt der gleiche Aufbau wie im Fall des Produktes
V_A2.
Der skalierte Ausgangsaddierer YN+ und der Addierer SUM1+ erhalten die minimale
Breite von 12 Bit ohne Sicherheitsbit, da dieses Bit ohne Verwendung an der Schnitt-
stelle YN ohnehin durch die Synthese entfernt würde. Eine Verkürzung der Produkte
auf das Q11-Format wird hier gewählt, da die Signalhübe nach Dämpfung durch die bi
auf den skalierten Bereich begrenzt sind.
Zur Einsparung von FPGA-Ressourcen ist die Addition der beiden Rückkopplungspfade
nach Bild 9-34b in einen Subtrahierer SUM2+ umgewandelt worden (vgl. Bild 9-39 und
Code 9-18). Die Synthese inferiert nämlich zur Addition von zwei negativ bewerteten
Summanden einen Subtrahierer und einen zusätzlichen 2er-Komplementer, der jeweils aus
einem bitweisen Inverter und einem 1-Addierer besteht. Damit das Produkt V_A1 als Mi-
nuend genutzt werden kann, geht der Koeffizient -a1 ins Produkt ein und das Produkt V_A2
bildet den Subtrahenden.
-- IIR-Tiefpassfilter in modifizierter Direktform II; d=0.2 ; f0=4774 Hz;
-- symmetrische, mit VGmax=2.5511 skalierte Zählerkoeffizienten bi
-- b0=b2=0.079872/VGmax ; b1=2*b0; a1=-1.47604; a2=0.79553
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity IIR_DFII is
generic
( P1: integer := 64; -- B0=B2=0.031309; Q11 B1 = 2*B0
P2: integer := 3022; -- -A1=1.47607; Q11
P3: integer := 1629 );-- A2= 0.79553; Q11
port
( CLK: in std_logic; -- 48 MHz Systemtakt
RESET: in std_logic; -- synchron
RD: in std_logic; -- Eingang aktualisiert
DONE: out std_logic; -- Ergebnis verfügbar
XN: in std_logic_vector(11 downto 0); -- Eingangssignal
YN: out std_logic_vector(11 downto 0)); -- Signal zum Codec
end IIR_DFII;
architecture IIR_ARCH of IIR_DFII is
constant B0: signed(11 downto 0):= to_signed(P1,12); -- s.Q11
constant A1: signed(12 downto 0):= to_signed(P2,13); -- sg.Q11
constant A2: signed(11 downto 0):= to_signed(P3,12); -- s.Q11
signal X: signed(11 downto 0); -- Eingang
signal V_A1: signed(28 downto 0); -- Rückkopplungsprodukt sgggggg.Q22
signal V_A2: signed(27 downto 0); -- sggggg.Q22
signal V,SUM2 : signed(15 downto 0);-- Rückkopplungssummen sgggg.Q11
signal V_B0, V_B1, V_B2: signed(27 downto 0);--Vorwärtsprodukte sggggg.Q22
signal SUM1 : signed(11 downto 0); -- Ausgangssumme s.Q11
begin
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
337 9.2 IIR-Filter
X <= signed(XN);
SYNC_RD: process(CLK)
begin
if CLK='1' and CLK'event then
if RESET='1' then DONE <= '0' after 3 ns;
else DONE <= RD after 3 ns; -- Enable Folge-SOS
end if;
end if;
end process SYNC_RD;
V_B0 <= B0 * V after 6 ns; -- B0=B2 Q11*Q11=Q22 < 0,5
V_B1 <= V_B0(26 downto 0) & '0'; -- B1=2*B2 < 1
V_A1 <= A1 * V after 6 ns;
V <=(X(11)& X(11)& X(11) & X(11)& X) + SUM2 after 6 ns; -- Koppelsignal
STAGES: process(CLK) -- 4 Verzögerungsglieder u. 1 Übergaberegister
begin
if CLK'event and CLK = '1' then
if RESET = '1' then
SUM2 <= (others => '0') after 3 ns;
SUM1 <= (others => '0') after 3 ns;
YN <= (others => '0') after 3 ns; -- Übergaberegister
V_A2 <= (others => '0') after 3 ns;
V_B2 <= (others => '0') after 3 ns;
elsif RD = '1' then
V_A2 <= A2 * V after 3 ns;
V_B2 <= V_B0 after 3 ns;
SUM2 <= V_A1(26 downto 11) - V_A2(26 downto 11) after 3 ns;
SUM1 <= V_B1(22 downto 11) + V_B2(22 downto 11) after 3 ns;
YN <= std_logic_vector(V_B0(22 downto 11) + SUM1) after 3 ns;
end if;
end if;
end process STAGES;
end IIR_ARCH;
Code 9-18: IIR-Tiefpass in modifizierter Direktform II mit dreifacher Verwendung des Produktes
X_B0; Übergaberegister YN zur Ausgangssynchronisation
In der Timingsimulation nach Bild 9-40 ist zum Nachweis der Vektorbreitenauslegung mit
Teilübertragungsfunktionen der Ausgang V des kritischen Addierers dargestellt, der den
verfügbaren Signalhub von 16-1 LSB bei einer Sprunganregung nur mit 4.9053 ausschöpft.
Es ist zu beachten, dass der Filterausgang YN den gleichen Scheitelwert ynmax aufweist,
wie die Sprungantwort der transponierten Direktform II in Bild 9-38, obwohl der Modell-
aufbau deutlich unterschiedlich strukturiert ist. Für den stationären Endwert ynstat, den die
Simulation ab 1.25 ms anzeigt, ergibt sich eine ebenfalls geringe Abweichung zur
MATLAB-Referenz in Bild 9-33:
ynstatsoll = ystat/VGmax = 1/2.5511 = 0.39199 aus Bild 9-33 und Tabelle 9-6
ynstat = 320Hex = 0.0110010000Bin = 0.39063 aus Bild 9-40
Δstat = (ynstat – ynstatsoll)/ ynstatsoll = -0.00348
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
338 9 Modellierung digitaler Filter
Bild 9-40: Timingsimulation der Sprungantwort des Koppelsignals V im skalierten IIR-Tiefpassfilter
in modifizierter Direktform II (vgl. Code 9-18 u. Tabelle 9-6)
9.2.3.3 Implementierungsergebnisse und Timinganalyse
Dieser Abschnitt stellt den FPGA-Ressourcenbedarf und die Timinganalysen zu den prä-
sentierten IIR-Filtermodellen mit paralleler Struktur vor. Eingesetzt wurde das Synthese-
und Implementierungswerkzeug ISE 13.4 [48], das den Synthesecompiler XST [81] nutzt.
Die Parameter für die Synthese, das Mapping sowie für das Place & Route sind wie in
Abschnitt 9.1.4.7 auf die Speed-Optimierung sowie die Effort-Option jeweils auf High
eingestellt worden. Damit die IIR-Filtermodelle mit den Parametern nach Tabelle 9-6 auch
tatsächlich drei Multiplizierer enthalten, erfolgte eine Skalierung des Koeffizienten b0 mit
ymax (vgl. Bild 9-33), sodass sich ein generic P1=108 ergibt.
Das Ergebnis der Timinganalyse in Tabelle 9-8 bestätigt die in Abschnitt 9.2.2 erläuterten
längsten Signalpfade der IIR-Strukturen: Die modifizerte Direktform II erlaubt die höchste
Taktfrequenz fmax. Die angegebenen längsten Signalpfade beginnen für beide Varianten der
Direktform II am Eingang XN, der mit einem Eingangsregister ergänzt wurde, damit der
Post-Place & Route-Timinganalysator alle Laufzeitpfade von Register zu Register untersu-
chen konnte. Durch die Auswahl von Block-Multiplizierern lässt sich der Bedarf an Look-
Up-Tabellen erheblich reduzieren und die Taktfrequenz nennenswert steigern, da der kom-
paktere Entwurf weniger Logik- und Verdrahtungsstufen erfordert.
Die im Synthesereport jeweils aufgeführten Addierer, Subtrahierer und Multiplizierer sind
hier mit angegeben, da deren Breite den LUT-Bedarf bestimmt. So sind auch die Auswir-
kungen der Vektorbreitendimensionierung für Signale in Rückkopplungspfaden, für die
Schnittstellen sowie die Vorwärtspfade ablesbar. Es zeigt sich hier deutlich, dass der Auf-
wand für Addierer im Vergleich zu Multiplizierern in LUT-Technik sehr gering ist. Quali-
tativ betrachtet sind breitere Addierer zur Steigerung der Signaldynamik (vgl. Tabelle 9-2)
weniger „kostspielig“ als breitere Multiplizierer in LUT-Realisierung.
ynmax = 0,59326
ynstat = 0,39063
bei t=1,25ms
.vmax = 4,9053
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
339 9.2 IIR-Filter
Transponierte DFII
Bild 9-37
Modifizierte DFII
Bild 9-39
D-FF LUT tDelay/ns
(fmax/MHz)
D-FF LUT tDelay/ns
(fmax/MHz)
Block
Multiplizierer
18×18 Bit
45 65 16.11
(62) XN-SUM2
53 57 13.44
(74) SUM2-YN
LUT
Multiplizierer
45 319 22.62
(44.2) XN-SUM2
69 440 16.77
(59) XN-SUM2
Addierer 1 × 16 Bit, 1 × 17 Bit 2 × 12 Bit, 1 × 16 Bit
Subtrahierer 2 × 17 Bit 1 × 16 Bit
Multiplizierer 2 × 12×12 Bit, 1 × 12×13 Bit 2 × 16×12 Bit, 1 × 16×13 Bit
Tabelle 9-8: Implementierungsergebnisse der IIR-Filtervarianten des Tiefpasses 2. Ordnung nach
Tabelle 9-6 für ein Spartan-3-XC3S400 FPGA. Skalierung mit ymax. Ressourcenbedarf und
Timinganalyse mit längstem Signalpfad bestimmt mit ISE 13.4
Die Anzahl der D-Flipflops in den beiden Implementierungen der IIR-Strukturen unter-
scheidet sich aufgrund folgender Eigenschaften:
Die modifizierte Direktform II enthält zwei Registerketten mit 97 D-FFs (vgl. Code
9-18). Diese Anzahl der D-FFs reduziert sich, da für abgeschnittene Vektoranteile der
gespeicherten Produkte V_A2 und V_B2 keine D-FFs inferiert werden. Im Fall der
Block-Multiplizierer kommt hinzu, dass ein Registered-Multiplier das gespeicherte Pro-
dukt V_A2 realisiert und deshalb dafür keine Slice-D-FFs erforderlich sind [84].
Für die transponierte Direktform II ergibt sich die D-FF-Anzahl der einen Registerkette
direkt aus dem VHDL-Code, wobei die MSBs der gespeicherten Subtrahiererausgänge
SUM2 und SUM11 in der Synthese heraus optimiert werden (vgl. Bild 9-38).
9.2.4 Sinusgenerator als synthesefähige Testbench
Die Skalierung der IIR-Filter ist mit der Tschebyscheff-Norm L∞=VGmax durchgeführt wor-
den, damit auch bei monofrequenter bzw. schmalbandiger Anregung im Bereich der Reso-
nanzfrequenz fR keine Überlaufeffekte am Ausgang auftreten (vgl. Tabelle 9-6). Mit den
vorgestellten Simulationsergebnissen zu den Sprungantworten konnte deshalb auch nur eine
Teilaussteuerung des Ausgangs und insbesondere der kritischen internen Addierer aufge-
zeigt werden. Eine korrekte Überprüfung der Skalierung und der Auslegung des Q-Formats
mit zusätzlichen Guard-Bits für die internen Addierer muss deshalb mit einem Sinusgenera-
tor erfolgen. Geeignet sind hierzu sind z.B. ROMs, die die diskreten Werte einer Sinus-
schwingung durch die Initialisierung mit einem COE-File erhalten (vgl. Kap. 7.4 u. Kap.
9.1.5.3) und in einer Testbench als Look-Up-Tabelle mit einem periodischen Zähler adres-
siert werden. Das TEXTIO-Package bietet darüber hinaus zahlreiche Funktionen für eine
Vielfalt von nicht synthesefähigen Testbench-Lösungen (vgl. Abschnitt 3.7) [37], [43].
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
340 9 Modellierung digitaler Filter
Im Folgenden wird ein sehr einfach realisierbarer Sinusgenerator vorgestellt, der das Über-
tragungsverhalten der IIR-Filter an der Stabilitätsgrenze nutzt, dass sich mit Nullstellen des
Nennerpolynoms in Gl. 9-15 auf dem Einheitskreis der z-Ebene ergibt [74], [75]. Die
Rückkopplungsstrukturen der Filter 2. Ordnung generieren nämlich bei einmaliger impuls-
förmiger Anregung für spezielle Koeffizienten (a1, a2) quasistationäre Dauerschwingungen,
deren Frequenz und Amplitude einstellbar sind. Diese Werte für a1 liegen mit a2=1 auf der
oberen Begrenzungsgerade des Stabilitätsdreiecks in Bild 9-36.
Eine erste Vereinfachung besteht darin, nur ein SOS-Modul z.B. nach Bild 9-31 oder Bild
9-34a) mit den Zählerparametern b0=1, b1=b2=0 zu untersuchen, da die übrigen Parameter
ausreichen, die Schwingungsfrequenz fS und die maximale Schwingungsamplitude uS fest-
zulegen. Über die Berechnung der Impulsantwort dieses SOS-Moduls wird eine Dimensio-
nierung des Koeffizienten a1 und der Amplitude y0 des Eingangsimpulses in Abhängigkeit
von den vorgegebenen Schwingungsparametern entwickelt:
Gl. 9-22 )f(Fa S11 ; )u,f(Fy SS20
Für das Nennerpolynom nach Gl. 9-15 gilt mit a2=1 und mit zwei komplexen Nullstellen z1
und z2:
Gl. 9-23 21212
2112 zz)zz(zz)zz)(zz(1zaz)z(N
Der Verschiebungsoperator ist definiert mit z = eTs=eT(σ+j), wobei für die Laplace-Variable
nur s=j gilt, da hier mit der Dämpfung σ=0 keine Transienten betrachtet werden, sondern
nur quasistationäre Dauerschwingungen interessieren. Die Eulersche Formel liefert für die
konjugiert komplexen Nullstellen z1 und z2:
Gl. 9-24 TsinjTcosz SS2,1 ; mit af1T und SS f2
Nach Einsetzen von Gl. 9-24 in die rechte Seite von Gl. 9-23 ergibt ein Koeffizientenver-
gleich mit dem Nennerpolynom den Koeffizienten a1, der die Schwingungsfrequenz fS fest-
legt:
Gl. 9-25
Die z-Transformierte Y(z) der Impulsantwort des vereinfachten SOS-Moduls lautet damit:
Gl. 9-26 2
S1
0
zTcosz21
y)z(Y
Aus Korrespondenztabellen kann man ein Transformationspaar entnehmen [70], [75]:
Gl. 9-27 Tsin]n[uzTcosz21
Tsinz)z(Y S2
S1
S1
*
a1 = –2 cos ST
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
341 9.2 IIR-Filter
Darin ist u[n] die Einheitssprungfunktion, die die Gültigkeit der Impulsantwort ab n=0 bis
n→∞ anzeigt. Durch Vergleich von Gl. 9-26 und Gl. 9-27 ergibt sich die Impulsantwort als
Sinusschwingung zu:
Gl. 9-28 Tsin
)T)1n(sin(y]n[u]n[y
Tsin
yz)z(Y)z(Y
S
S0
S
01*
Damit die Amplitude der Sinusschwingung y[n] auf | uS |≤1 begrenzt wird, muss für den
Eingangsimpuls des SOS-Moduls gelten:
Gl. 9-29 Tsiny S0
Die Implementierung des skalierten Sinusgenerators mit den Parametern nach Gl. 9-25 und
Gl. 9-29 lässt sich zusätzlich dadurch vereinfachen, dass die externe Impulsanregung mit y0
durch einen Initialisierungswert -y0 des Registers Y_2 ersetzt wird (vgl.Bild 9-41). Der
Ressourcenbedarf für die Arithmetikelemente reduziert sich so auf einen Addierer und
einen Multiplizierer. Dieser Generator erzeugt quasistationäre Dauerschwingungen, die mit
der Zeit weder aufklingen noch abklingen, da der Koeffizient a2=1 nicht durch eine
Quantisierung in der Genauigkeit eingeschränkt ist. Eine Sättigungsfunktion sorgt dafür,
dass auch bei Anregung mit y0=sin ST durch die begrenzten Vektorbreiten und die
Abschneideeffekte keine Übersteuerung der Testobjekteingänge erfolgt. Das Ausgangsre-
gister entkoppelt die Generatorarithmetik von den Arithmetikpfaden der zu testenden Fil-
terstufen.
Bild 9-41: Simulink-Blockschaltbild des skalierten Sinusgenerators. Anregung der Sinusschwingung
durch den Initialisierungswert –y0 des Registers Y_2. Schwingungsfrequenz fS=4480 Hz, Amplitude
uS=1, fa=48 kHz
Die Dimensionierung der Vektorbreiten ist mit dem Ausgang beginnend durchgeführt wor-
den (vgl. Code 9-19):
Der skalierte Stimulivektor YN passt zum Q11-Format der Filtereingänge (vgl. Code
9-17).
z
1
z
1
Y_1
a2=1
YFB
1.6658
-a1
Sättigung
YN
Y_2
Y_A1
[s,g.10:0]
[s,g.10:0]
[s.10:0]
[s,g,g,g.21:0]
+
z
1
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
342 9 Modellierung digitaler Filter
Auch bei maximaler Anregung mit y0=sinST treten in den Registerstufen keine Über-
laufeffekte auf, da das Guard-Bit in YFB, Y_1 und Y_2 eine Reserve für Überträge bie-
tet, die ggf. durch die quantisierte Zahlendarstellung entstehen.
Das Q22-Format und die Guard-Bits des Produktes Y_A1 ergeben sich aus der Breite
der Faktoren.
Parametrisiert ist der Code 9-19 des Sinusgenerators speziell zum Test der Skalierung und
der Vektorbreitenauslegung des IIR-Filters in modifizierter Direktform II nach Bild 9-39.
Das Ziel der abschließenden Detailuntersuchung ist auch die Übertragungsstrecke zum
kritischen Addierer V, die im Bereich der Filterresonanzfrequenz fR bei fS=4480 Hz eine
Verstärkungsüberhöhung VGVmax=8.71 aufweist (vgl. Abschnitt 9.2.3.2 u. Gl. 9-21):
-a1=2cos(2fS/fa) =1.6658; 01.10101010011Bin=0D53Hex =1.6660Dez
-y0=-sin (S/fa)=-0.5534; 11.01110010011Bin=1B93Hex=-0.5532Dez
Die Initialisierung der Register in der Signaldeklaration erzeugt den Power-Up-Zustand der
D-FFs. In der Timingsimulation des FPGAs steht so ein spezifischer Startzustand des Sys-
tems zur Verfügung, der unabhängig von der Wirkung eines Resets und der Dauer des
Anlaufverhaltens der FPGA-Simulation ist. Die erforderliche Dauer des synchronen Resets
zu Beginn der Anlaufphase einer FPGA-Timingsimulation muss experimentell bestimmt
werden. Bleibt die Wirkung des Resets beim Sinusgenerator nämlich aus, so läuft dieser
ohne Anfangswert erst gar nicht an.
-- Sinusgenerator: reduzierte SOS-Struktur
-- a1 = -2cos(2*pi*fs*T); Schwingungsfrequenz fs ; T = 1/48 kHz; a2=1
-- Impulsanregung: y0 = -Y_2(0) < sin(2*pi*fS*T), skalierter Ausgang
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity SINE_GEN_DFII is
port(CLK, RESET, RD: in std_logic; -- Systemtakt 48 MHz
YN: out std_logic_vector(11 downto 0)); -- Ausgang mit Sättigung
end SINE_GEN_DFII;
architecture IIR_ARCH of SINE_GEN_DFII is
-- a1 = -1.6658425; fs = 4480 Hz
constant A1: signed(12 downto 0):= ('0' & x"D53"); -- -a1 sg.Q11
signal Y_1: signed(12 downto 0):= (others => '0'); -- Reg. sg.Q11
signal Y_2: signed(12 downto 0):= ('1' & x"B93"); -- Reg. sg.Q11
signal Y_A1: signed(25 downto 0); -- 26 Bit Produkt sggg.Q22
signal YFB: signed(12 downto 0); -- 13 Bit Summe sg.Q11
begin
Y_A1 <= A1 * Y_1 after 6 ns; -- Nur ein Multiplizierer
STAGES: process(CLK)
begin
if CLK'event and CLK = '1' then
if RESET = '1' then
Y_1 <= (others => '0') after 3 ns;
Y_2 <= ('1' & x"B93") after 3 ns; -- Anregung -sin(2*pi*fs*T)> -1
elsif RD = '1' then -- Freigabe mit Periode T=1/fa
Y_1 <= YFB after 3 ns;
Y_2 <= Y_1 after 3 ns;
end If;
end if;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
343 9.2 IIR-Filter
end process STAGES;
YFB <= -Y_2 + Y_A1(23 downto 11) after 6 ns; -- Skalierung mit |YFB| < 1
SATURATION: process(CLK)
begin
if CLK'event and CLK = '1' then
if RESET = '1' then YN <= (others => '0') after 3 ns;
elsif RD = '1' then
if YFB(12 downto 11) = -2 then YN <= x"800" after 3 ns;
elsif YFB(12 downto 11) = 1 then YN <= x"7FF" after 3 ns;
else YN <= std_logic_vector(YFB(11 downto 0)) after 3 ns;
end if;
end if;
end if;
end process SATURATION;
end IIR_ARCH;
Code 9-19: Sinusgenerator in vereinfachter SOS-Struktur ohne externe Anregung mit Ausgangs-
sättigung und -synchronisation.
Mit den ersten Perioden der Sinusanregung in Bild 9-42 werden folgende Zusammenhänge
verdeutlicht:
Da die Abtastfrequenz fa kein gerades Vielfaches der Testfrequenz fS ist, ergeben sich
von Periode zu Periode wechselnde Verläufe, die nicht regelmäßig die tatsächlichen
Maxima und Minima aufzeigen.
Die Startwerte der Sinusschwingung SINE_W und des Filterausgangs YN sind direkt
mit den Parametern y0 und b0 nachvollziehbar.
Bild 9-42: Timingsimulation der Kopplung des Sinusgenerators nach Code 9-19 mit dem IIR-Filter
nach Code 9-16. Anlaufverhalten nach dem Power-Up des Sinusgenerators (SINE_W). fS=4480 Hz,
fa=48 kHz
.
Y0 :
2047*0.5532=1133
Vmax = 8.9722
Vmax
2041
-2048 ; -1
Vmin = -8.7891
Y0 *b0 = 35
2032
-1987
-2047
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
344 9 Modellierung digitaler Filter
Der Filterausgang YN schwingt verzögert auf und bleibt in den maximalen Intervall-
grenzen [-2048, 2047].
Der kritische Addierer V nutzt die implementierten 4 Guard-Bits für den Signalhub
korrekt aus, jedoch gehen die Maximalwerte um mehr als 3% über VGVmax=8.71 hinaus.
Aus dem gesamten simulierten Zeitfenster von 1000/fa=20.8 ms ist in Bild 9-43 ein Aus-
schnitt bei t=11.4 ms mit Überlaufeffekten dargestellt, die bei 8 von ca. 90 Schwingungen
des Filterausgangs in nicht regelmäßigen Abständen aufgetreten sind. In diesen Fällen
liegen die Pegel des kritischen Addierers V um ca. 3.5% über dem MATLAB-Ergebnis
(vgl. Kap. 9.2.3.2), wobei die Überläufe nur wenige LSB-Positionen ausmachen. Ursäch-
lich wird vermutlich sein, dass die Abschneidevorgänge der Produkte V_A1 und V_A2 im
Rückkopplungspfad des Filters nach Bild 9-39 nichtlineare Störungen einprägen, die in
Zusammenwirkung mit der periodischen Anregung zu dieser sich sporadisch entwickelnden
Pegelerhöhung des Addierers V beitragen (vgl. Tabelle 9-2).
Falls in Anwendungen solche wie hier getestete schmalbandige Anregungen auftreten
können, bieten sich folgende Gegenmaßnahmen an:
Den Skalierungsfaktor L∞ weiter erhöhen, damit die Vorwärtspfade mit den Koeffizien-
ten bi stärker dämpfen.
Ggf. ist es vorteilhafter, den Filterausgang mit einem Guard-Bit zu erweitern und mit
einer Sättigungsstufe zu ergänzen, da so die Signalaussteuerung erhalten bleibt und bei
Bereichsüberschreitungen nur eine geringe Verzerrung der Signalform auftritt.
Bild 9-43: Ausschnitt aus der Timingsimulation der monofrequenten Filteranregung ( fS=4480 Hz)
mit maximaler Amplitude. Sporadische Überlaufeffekte am Filterausgang. fa=48 kHz
Vmax =9.0532
Vmax
.
-2045
Überlauf
-8.7571
-2023
-2048 ; -1
8.9546
20102041
Überlauf
-9.0356
2047 ; +1
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
345 9.2 IIR-Filter
Die für die Timingsimulation genutze Testbench ist in Code 9-20 dargestellt, darin ist der
Sinusgenerator als FPGA-Modul ein Teil der VHDL-basierten Stimulierzeugung. Hier sei
abschließend darauf hingewiesen, dass der Sinusgenerator auch direkt für Hardware-Tests
anwendbar ist, da er sich zusammen mit dem Testobjekt direkt ins FPGA integrieren lässt.
So werden ein externer Funktionsgenerator und AD- sowie DA-Umsetzer gespart, wenn
Echtzeittiminganalysen z.B. mit dem Xilinx ChipScope Debugger erfolgen.
-- Testbench zur Kopplung des Sinusgenerators mit einem IIR-Filter
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity IIR_SINE_TB is
generic(PERIODE48MHZHALBE: time:= 10.41666667 ns;
SAMPLES: positive := 1000);
end entity IIR_SINE_TB;
architecture IIR_FILTER of IIR_SINE_TB is
component SINE_GEN_DFII is
port( CLK, RESET, RD: in std_logic;
YN: out std_logic_vector(11 downto 0));-- Sinusfunktion
end component;
component IIR_DFII is -- Modifizierte Direktform II
--generic
-- (P1: integer ; -- B0=x"040"=0.031309 =B2 < 0.5; B1 = 2*B0 < 1
--P2: integer ; -- A1=x"1431"="1010000110001"=-1.47607
--P3: integer ); -- A2=x"65D"=0.79553
port
( CLK: in std_logic; -- 48 MHz Systemtakt
RESET: in std_logic; -- synchron
RD: in std_logic; -- Eingang aktualisiert
DONE: out std_logic; -- Ergebnis verfügbar
XN: in std_logic_vector(11 downto 0); -- Eingangssignal
YN: out std_logic_vector(11 downto 0)); -- Signal zum Codec
end component;
signal CLK, CLR, RD_S: std_logic;
signal Y, SINE_W: std_logic_vector(11 downto 0); -- Koppelsignale
signal TEMP_1, TEMP_2, READY, IIR_EN: std_logic ; -- Freigabesignale
begin
CLOCK: process -- 48 MHz Clock-Periode
begin
CLK <= '0'; wait for PERIODE48MHZHALBE;
CLK <= '1'; wait for PERIODE48MHZHALBE;
end process CLOCK;
RESET: process
begin
CLR <= '1';
wait for (PERIODE48MHZHALBE * 4); -- high active reset
CLR <= '0';
wait; -- no change any more because of unconditional wait
end process RESET;
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
346 9 Modellierung digitaler Filter
AUDIO_PERIODE: process
variable NUM: integer range 0 to SAMPLES +2;
begin
READY <= '0';
NUM := 0; -- Zählt die Abtastwerte
wait for (PERIODE48MHZHALBE *10); -- Startverzögerung
WHILE NUM <= SAMPLES +1 LOOP
READY <= '1';
wait for (PERIODE48MHZHALBE *2 *4); -- 12 MHz Puls
READY <= '0';
wait for ((PERIODE48MHZHALBE *2 * 1000) - (PERIODE48MHZHALBE * 2 * 4));
-- 48 kHz Abtastperiode
NUM := NUM + 1;
END LOOP;
wait; -- unbedingter Halt
end process AUDIO_PERIODE;
PULSE_SHORTER: process(CLK,CLR)
begin
if CLR = '1' then
(TEMP_1,TEMP_2, IIR_EN) <= std_logic_vector'("000") after 3 ns;
elsif CLK='1' and CLK'event then
TEMP_1 <= READY after 3 ns; -- Ready erzeugt Audio-Periode
TEMP_2 <= TEMP_1 after 3 ns;
IIR_EN <= RD_S after 3 ns; -- Puls für IIR-Filter
end if;
end process PULSE_SHORTER;
RD_S <= TEMP_1 and (not TEMP_2) after 3 ns; -- Puls für Sinusgenerator
DUT1: IIR_DFII
--generic map( P1 => 64, P2 => 3023, P3 => 1629 )
port map(CLK => CLK, RESET => CLR, RD => IIR_EN, XN => SINE_W, YN => Y,
DONE => open);
DUT2: SINE_GEN_DFII
port map(CLK => CLK, RESET => CLR, RD => RD_S, YN => SINE_W);
end IIR_FILTER;
Code 9-20: Testbench zur Kopplung des Sinusgenerators mit dem Filtermodell nach Code 9-16
9.2.5 Entwurfsschritte für IIR-Filter
Abschließend sind hier die einzelnen Schritte zur VHDL-Modellierung von IIR-Filtern
aufgelistet:
1. Analogfilterentwurf und Filterapproximation mit der bilinearen z-Transformation
nach den in [70], [72], [75] dargestellten Verfahrensschritten.
2. Verfahren zur Skalierung von SOS-Kaskaden auf Filter höherer Ordnung anwenden
[74]. Auswertung des Amplitudengangs und der Sprungantwort der einzelnen SOS,
die L∞-Norm mit |G(f)|max oder den Signalüberschwinger ymax zur Skalierung der Ko-
effizienten bi zu nutzen.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
347 9.3 FPGA-Entwurf mit Simulink
3. Entscheidung für eine der vorgestellten IIR-Strukturen (vgl. Tabelle 9-8). Auswahl
nach zu erwartendem Ressourcenbedarf oder erreichbarer maximaler Taktfrequenz.
4. Identifikation des kritischen Addierers, der in einem Rückkopplungspfad liegt und
ggf. sogar Produkte mit Koeffizienten |a1| >1 aufnimmt.
5. Berechnung der jeweiligen Teilübertragungsfunktion des kritischen Addierers, um
Verstärkungsüberhöhungen und Signalüberschwinger festzustellen. Festlegung der
Anzahl der Guard-Bits für diesen Addiererausgang je nach Skalierungsstrategie. Ziel
dabei ist es, dass der maximale Signalhub vollständig durch Integeranteile in den
Guards-Bits repräsentiert wird.
6. Schrittweise Dimensionierung der Vektorbreiten in den übrigen Signalpfaden und der
Reduzierung von Multipliziererausgängen.
7. Parametrisierung des ausgewählten VHDL-Templates.
8. Parameterstudien zum Einfluss der Addierer- und Multiplizierer-Vektorbreiten auf
Abweichungen der Timingsimulation von MATLAB-Referenzen. Mit zunehmender
Vektorbreite ist die sinkende maximale Taktfrequenz zu beachten, da die Ripple-
Carry-Laufzeiten in Addierern und LUT-basierten Multiplizierern ansteigen.
9. Prüfung der Auswirkungen von Abschneidetechniken und Rundungen auf das statio-
näre Signalverhalten und den Bedarf an FPGA-Ressourcen.
9.3 FPGA-Entwurf mit Simulink
Durch die Abschnitte 9.1 und 0 wurde verdeutlicht, dass sich viele der ursprünglich den
Digitalen Signalprozessoren zugeordnete Anwendungen der digitalen Signalverarbeitung
ebenso mit FPGAs realisieren lassen, sofern diese eine Festkommaarithmetik benötigen.
Dabei haben die FPGAs gegenüber Digitalen Signalprozessoren die folgenden Vorteile:
Beim FPGA werden nur die zur Lösung des Algorithmus erforderlichen Hardwarestruk-
turen instanziiert.
Bei Bedarf lassen sich die Hardwarestrukturen in FPGAs mehrfach parallelisieren.
Der größere Aufwand zum Entwurf des VHDL-Codes ist hingegen im Vergleich zur Pro-
grammentwicklung für einen Digitalen Signalprozessor als nachteilig zu bewerten.
Wegen des großen Marktpotenzials, welches die FPGA-Hersteller den Anwendungen der
digitalen Signalverarbeitung beimessen, stellen diese seit einiger Zeit in ihren Entwick-
lungswerkzeugen auch grafische Entwurfsoberflächen in Form von MATLAB-Toolboxen
zur Verfügung. Damit ist es nun möglich, einen Entwurf auf Simulink-Ebene grafisch
einzugeben und diesen entweder sehr schnell mit MATLAB oder aber deutlich langsamer
mit dem VHDL-Simulator ModelSim zu simulieren. Eine Ankopplung an das Synthese-
und Implementierungswerkzeug erlaubt nicht nur die direkte Generierung einer FPGA-
Konfigurationsdatei sondern unterstützt auch eine Hardware-Software-Cosimulation.
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
348 9 Modellierung digitaler Filter
Bild 9-44: Simulink-Modell des IIR-Filters aus Bild 9-37. Die Hardwareelemente wurden mit der
Xilinx System Generator Toolbox [83] modelliert. Deutlich erkennbar sind die Bitbreiten der Vor-
und Nachkommaanteile der jeweiligen Koppelsignale
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
349 9.3 FPGA-Entwurf mit Simulink
Dabei werden die Simulationsstimuli aus MATLAB direkt über ein Hardwareinterface an
ein im FPGA implementiertes Modell übertragen und außerdem die Systemreaktion des
Hardwaremodells an MATLAB zur weiteren Verarbeitung zurückgegeben.
Exemplarisch wurde das Simulink-Modell des in Kap. 0 vorgestellten IIR-Filters (vgl. Bild
9-37) modifiziert, wobei die Xilinx System Generator Toolbox [83] verwendet wurde. Bild
9-44 zeigt im oberen Teil das MATLAB-Referenzfilter und im unteren Teil die Blöcke des
System Generators einer Festkommaimplementierung des IIR-Filtes. Darin wurden die im
Bild dargestellten Bitbreiten der Vor- und Nachkommaanteile der Koppelsignale zwischen
den Arithmetikkomponenten genau so eingestellt wie in Bild 9-37.
Bild 9-45: Sprungantwort des IIR-Filters aus Bild 9-44 a) MATLAB-Simulation des Referenzfil-
ters, b) Simulation des FPGA-Filters, c) Differenz beider Simulationsmodelle
Das in Bild 9-45a und b dargestellte Ergebnis einer MATLAB-Simulation der Sprungant-
wort zeigt einen nahezu gleichen Verlauf beider Filtermodelle mit einem Maximum bei
0.593 (vgl. Bild 9-38). Die in Bild 9-45c gezeigte Differenz beider Modelle ist wegen des
Abschneideverhaltens im FPGA-Filtermodell negativ und beträgt maximal -310-3.
Der in Bild 9-44 dargestellte „Resource-Estimator“ Block erlaubt entweder eine grobe
Abschätzung des zu erwartenden Bedarfs an FPGA-Ressourcen oder eine genaue Analyse
nach Ausführung der Synthese- und Implementierungsschritte.
Eine Variation der Bitbreiten der Koppelsignale ist in diesem Modell sehr einfach möglich
und erlaubt nun eine schnelle Optimierung des Ressourcenaufwands unter Einhaltung einer
vorgegebenen Spezifikation für die Abweichung vom Verhalten des Referenzfilters.
a)
c)
b)
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM
Brought to you by | Brown University Rockefeller LibraryAuthenticated | 128.148.252.35
Download Date | 6/11/14 8:46 PM