Forum: FPGA, VHDL & Co. zu blöd für 25 tap FIR auf FPGA


von mister (Gast)



Lesenswert?

Hallo,

ich bin gerade dabei einen FIR-Filter mit 25 Koeffizienten auf einem 
FPGA zu implementieren.
Hierzu hätt ich da mal ne Frage, insbesondere wie jemand anderes das 
gemacht hätt. Hab auch mal im Inet gesucht und halt beispiele mit 
gepipten Addierern etc gefunden, was mir erst mal zu viel ist da ich die 
meisten Probleme mit VHDL habe. Dann habe ich noch welche gefunden mit 
einer ordnung von max 4 was mir dann wieder nicht reicht.

Die eigentliche Frage ist erst mal wie ihr das implementieren würdet. 
Hab mal zwei Bilder angehangen (Quelle: wikipedia.org) wo abgebildet ist 
was ich will und wo ich mir mal eingezeichnet hab wie viel bit ich für 
die einzelnen Rechnungen der Faltung brauche.

Ich habe ein 8bit Signal welches mit einem 16bit Koeffizienten 
multipliziert wird. Mit meinen 25 Koeffizeinten brauche ich also 
8+16+24=48. Mein integer in VHDL geht glaub nur bis 32 bit. Bits zu 
sparen wär auch nicht schlecht, da ich wenn ich es hinbekomm den Filter 
100 Mal brauche.

Wie und wo würdet ihr LSBs abschneiden. Wie macht man das Prinzipiell 
richtig, so dass dann auch lesbarer Code rauskommt?


(Koeffizienten sind Symmetrisch, will aber erst mal wissen wies 
prinziepiell richtig gemacht wird.)

von Gustl B. (-gb-)


Lesenswert?

Kann man als Pipeline aber auch seriell bauen. Als Pipeline brauchst Du 
ja Tap einen Multiplizierer, hast anfangs eine Latenz, danach fällt aber 
in jedem Takt ein Ergebnis raus. Seriell brauchst man insgesamt einen 
Multiplizierer, braucht dafür aber je Ergebnis so viele Takte wie Taps.

Also:
Wie schnell kommen die Daten rein und so, was sind die Anforderungen?

Bits kann man am Ende schön abschneiden, also LSBs weglassen, wie viele 
hängt davon ab wie viele Bits das Ergebnis haben soll.

: Bearbeitet durch User
von mister (Gast)


Lesenswert?

Sorry hier noch ein paar Daten:

Eingang x(n): 8bit
Ausgang y(n): 8bit

Signaltackt: ca. 5MHz

FPGA Tackt: 100MHz

Der Filter ist an den 100MHz Tackt angeschlossen, wobei über einen 
enable Eingang Daten mit 5MHz ins das Filter eingetaktet werden.

von S. R. (svenska)


Lesenswert?

Takt schreibt man ohne c.

von Gustl B. (-gb-)


Lesenswert?

Also hast Du 100/5 Takte Zeit um ein Ergebnis zu berechnen, könntest 
also seriell mit einem Multiplizierer 20 Koeffizienten durchrechnen. Für 
25 müsstest Du das FPGA mit 5MHz*25=125MHz betreiben.

: Bearbeitet durch User
Beitrag #5052246 wurde von einem Moderator gelöscht.
von mister (Gast)


Lesenswert?

Hmm selbst wenn ich irgend einen Addertree aufbaue, brauche ich doch die 
48bit oder. Nicht für alle Zwischenrechnungen aber halt um die gesamte 
Summe zu bilden.

Eine Pipe nützt mir, so wie ich es sehe auch nichts, solange mein Carry 
nicht zu lange bis ans Ende Braucht. Ist doch bei 5MHz noch in Ordnung? 
Habs jetz nicht nachgerechnet und bin auch Anfänger und weiss nicht wie 
ich mir das zeitliche simmulieren kann und so.

Mit dem Addertree hab ich mir gedacht könnt ich meine Carrys einzeln 
führen und zum schluss dazu addieren oder so. Bringt mir doch aber auch 
nichts.


Mir gehts nich nur darum jetz nen Filter zu haben, will ihn auch 
einigermaßen sauber. Und meine eigenen Gedanken will ich nich alle 
einzeln mühsam Testen. Es sind mir auch zu viele und ich glaube mein 
Problem ist einfach die prinziepielle Realisierung und VHDL.


Ein Ansatz wäre Toll

von mister (Gast)


Lesenswert?

@ Gustl Buheitel

ich habe leider keine Ahnung wie mein Multiplizierer Funktioniert. Ist 
der Getaktet.

Ich habe einen Process mit 100MHz.
Der Enable wird mit 5MHz getaktet um das Signal rein zu shiften.

Zwischen diesen 5MHz soll eine Faltung statt finden.

So hab ich mein Prog. geschrieben bis jetzt. Macht er das auch.

von Achim S. (Gast)


Lesenswert?

@mister: ist dein Hauptproblem die Entscheidung zur Filterstruktur? Oder 
ist dein Hauptproblem das Einhacken in VHDL?

Beim zweiteren könnte dir höchstwahrscheinlich ein Assistent deiner 
Entwicklungsumgebung helfen (z.B. der FIR-Compliler bei der Xilinx ISE). 
Die Grundsätzlichen Strukturvorgaben musst du immer noch selbst treffen. 
Aber der Assistent zeigt dir z.B. übersichtlich an, welche Performance 
und welchen Ressourcenverbrauch du für deine Lösung benötigen würdest.

Gustl B. schrieb:
> könntest
> also seriell mit einem Multiplizierer 20 Koeffizienten durchrechnen.

Den Ansatz fände ich auch naheliegend: aus den 100MHz per DCM z.B. 
200MHz machen, einen dsp-Kern pro Filter, n dsp-Kerne für n parallele 
Filter

von Gustl B. (-gb-)


Lesenswert?

Naja beschreib doch mal wie du das machen würdest. VHDL kann man auch 
prima simulieren, da könntest Du testweise einen Sinus in der Testbench 
erzeugen und gucken was hinter dem Filter rauskommt.

Es gibt viele Möglichkeiten das Filter zu bauen.
Seriell, es wird also in jedem Takt einmal multipliziert und addiert, 
als Pipeline, da wird in jedem Takt oft Multipliziert und addiert, und 
vielleicht auch anders.

Das mit dem Carry habe ich nicht verstanden. Also die Addierer sind 
sicher schnell genug für 5MHz, aber wenn Du das Filter seriell aufbaust, 
wird in jedem Takt einmal multipliziert und addiert, und zwar nicht bei 
5MHz, sondern bei 100MHz wenn 20 Koeffizienten reichen oder bei 125MHz 
wenn es 25 Koeffizienten seien sollen.

Schreib doch mal Pseudocode oder gerne auch unvollständiges VHDL. 
Welches FPGA ist das eigentlich, die sind ja auch unterschiedlich 
schnell und groß?

Edit:
Multiplizierer kann man takten, auch mit 100MHz oder auch mit 200MHz. 
Wie schnell hängt vom FPGA ab und wie viele Du zur Verfügung hast hängt 
ebenfalls vom FPGA ab.

: Bearbeitet durch User
von Achim S. (Gast)


Lesenswert?

Achim S. schrieb:
> @mister: ist dein Hauptproblem die Entscheidung zur Filterstruktur? Oder
> ist dein Hauptproblem das Einhacken in VHDL?

Ok: während ich meinen Beitrag geschrieben habe, kam im Wesentlich schon 
die Antwort - du hast eigentlich noch ein Problem mit allem möglichen.

mister schrieb:
> ich habe leider keine Ahnung wie mein Multiplizierer Funktioniert

Dann lies dir den entsprechenden User-Guide oder das entsprechende 
Datenblatt deines FPGAs durch. Ist zwar aufwändig, ohne den Aufwand wird 
das aber nichts.

mister schrieb:
> Ist doch bei 5MHz noch in Ordnung?
> Habs jetz nicht nachgerechnet und bin auch Anfänger und weiss nicht wie
> ich mir das zeitliche simmulieren kann und so

lies dir den entsprechend User-Guide/das Datenblatt zum "FIR-Compiler" 
deines Systems durch (oder wie auch immer das dort heißen mag). Ist zwar 
aufwändig, aber ohne einen Mindestüberblick wird das nichts gescheites.

von mister (Gast)


Angehängte Dateien:

Lesenswert?

so hier mal mein Filter Code im Anhang (beides die gleichen Dateien) mit 
Normalform und transponiert (Auskommentierter Process).

Ja sehe das auch so, dass es an vielem Hakt. Desshalb ja auch der Thread 
Titel.

Problem nummer eins: Wie soll ich 24 24bit Zahlen Addieren. Mein Integer 
kann nur 32 und ich brauch auch nur die 8 MSBs.

von mister (Gast)


Lesenswert?

hab auch mal den Altera FIR IP ausprobiert. Mich nervt dieser Avalon 
kram.

Wills auch selber machen um zu lernen. Will auch nur einen Datenbuss 
einen clk und ein enable als Eingang.

von Achim S. (Gast)


Lesenswert?

mister schrieb:
> Wie soll ich 24 24bit Zahlen Addieren

Indem du schaust, ob dein dsp Kern diese Breite von Haus aus unterstützt 
(wahrscheinich eher nicht) und wie du mehrere dsp-Kerne zusammenschalten 
kanns, um die benötige Bitbreite zu erreichen. Findet sich im 
entsprechenden User-Guide

mister schrieb:
> Mein Integer
> kann nur 32

das ist den dsp-Kernen schätzungsweise egal: die können genau so viel, 
wie ihre Hardware hergibt.

von Gustl B. (-gb-)


Lesenswert?

Wieso 24 Bit? Ja, das ist 8 Bit Zahl mal 16 Bit Zahl, aber da kannst Du 
am Ergebnis wieder viele Bis weglassen wenn der Ausgang des Filters 
sowieso nur 8 Bit haben soll.

Also von den 24 Bit die letzten 16 Bits weglassen. Dann kommen je Tap 8 
Bit raus, also 25 Mal. Die werden zusammenaddiert und es kommt eine 13 
Bit Zahl raus von der wieder die letzten 5 Bits weggelassen werden.

von mister (Gast)


Lesenswert?

@ Gustl Buheitel
So hab ich mir die Hilfe vorgestellt. Schonmal Danke.
Das ist die Antwort auf die Frage wo ich LSBs abschneiden sollte.

@ Achim S.
Soweit wie ich es verstanden habe verwende ich keine DSP-Blöcke.
Auch keinen Multiplier werden verwendet. Da habe ich ein paar 9bit 
Multiplier. Glaube weil ich mit konstanten multipliziere nimmt er eine 
entsprechende Logik. Ich weis nicht was gemacht wird, jedenfalls zeigt 
er mir an, davon keinen verwendet zu haben.

von W.S. (Gast)


Lesenswert?

mister schrieb:
> Problem nummer eins: Wie soll ich 24 24bit Zahlen Addieren. Mein Integer
> kann nur 32 und ich brauch auch nur die 8 MSBs.

Also, so recht verstehe ich deine Probleme nicht - denkst du etwa an 
INTEGER - Berechnungen?

Nein, sowas macht man anders, nämlich mit echt gebrochenen Zahlen. Deren 
betrag ist immer kleiner als 1 und bei der Multiplikation werden die 
Beträge nicht größer, sondern kleiner. Nur bei der Addition kann es zum 
Überlauf kommen.

Deshalb stelt man die Zahlen etwa so dar:
- 1 Vorzeichenbit
- 1..2 Ganzzahlige Bits (für's Auffangen von Überläufen), also 
Wertigkeiten 2, 1
- dann der (virtuelle) "Dezimal"-Punkt (dazu Binärpunkt zu sagen, klingt 
komisch)
- dann der gebrochene Teil, 0.5, 0.25, 0.125, usw. soviel du möchtest.

Solche Zahlenformate werden auch bei Xilinx unterstützt, ich komme bloß 
grad nicht auf die Namen davon. Wenn du bloß 8 Bit brauchst, dann ist es 
sinnlos, mit 16 Bit Taps zu arbeiten und die Rechnung mit 24 Bit machen 
zu wollen. Also reduziere das einfach, ich sag mal so aus dem Ärmel, daß 
4 LSB  beim Rechnen ausreichen. Das macht dann eine Gesamtdatenbreite 
von 15 Bit aus.


W.S.

von mister (Gast)


Lesenswert?

hmm ok. Ich stell mich aber auch an.
Denke ich hab so langsam wieder alle Gedanken sortiert.

Die Festkommazahl kann ich natürlich deutlich verkleinern. Die 
Skalierung ändern und die Breite vernünftig anpassen.

Naja... Jetz bin ich leider erst mal ne Woche weg und kann nich weiter 
machen. Probier das dann mal alles.

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Ich habe das mal in einem Seminar drangenommen, da haben wir einen FIR 
Filter mal als Pipeline und mal seriell gebaut. Im Anhang beide 
Versionen mit Testbench wie ich sie damals im Seminar vorgestellt habe. 
Du kannst das zwar auch vielleicht 1:1 verwenden, aber vor allem 
solltest Du das mal angucken um zu verstehen was passiert. Die 
Koeffizienten wurden mit pyFDA https://github.com/chipmuenk/pyFDA 
berechnet. Der Autor dieses Tool hat auch eine sehr gute Vorlesung zum 
Thema Signalverarbeitung bei Youtube: 
https://www.youtube.com/playlist?list=PLIs1b8ziMXQYVsQaZAd1-ADnQGsqjdFg2

von mister (Gast)


Lesenswert?

Das sieht gut aus. Sehe ich mir mal an.
Danke

von Mampf F. (mampf) Benutzerseite


Lesenswert?

mister schrieb:
> Signaltackt: ca. 5MHz
>
> FPGA Tackt: 100MHz

Schade, sonst hätte dir pro FIR Filter ein MAC gereicht ... Da 
bräuchtest du aber 125MHz.

Man könnte eine gemischte Topologie bauen ... 2 MACs, die jeweils nur 
12/13 Taps berechnen. Das wäre resourcenschonender aber schnell genug.

Man könnte die Koeffizienten auch in ein Dual-Port-RAM auslagern, dann 
könnten beide MACs gleichzeitig Koeffizienten aus dem RAM lesen - spart 
nochmal Resourcen :)

Die 100 Instanzen deines FIR-Filters hätten alle die gleichen 
Koeffizienten?

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

W.S. schrieb:
> Solche Zahlenformate werden auch bei Xilinx unterstützt
Wobei man allerdings noch nicht weiß, ob das Zielsystem von Xilinx 
kommt.

Mampf F. schrieb:
>> FPGA Tackt: 100MHz
> Schade, sonst hätte dir pro FIR Filter ein MAC gereicht ... Da
> bräuchtest du aber 125MHz.
Ist ja auch kein Problem. Der Takt, der aussen am FPGA angeschlossen 
ist, hat nichts mit der Frequenz zu tun, mit der das FPGA intern 
arbeitet. Um den Takt auf höhere Frequenzen anzuheben gibt es dafür 
Taktmanager: DLL/PLL/DCM/usw...

mister schrieb:
> ich habe leider keine Ahnung wie mein Multiplizierer Funktioniert.
Das solltest du ändern. Denn du willst ja Hardare beschreiben. Wie 
willst du etwas beschreiben, von dem du nicht weißt, wie es aussieht?
Was sagt denn das Datenblatt des FPGAs zum Thema "Multiplier" und deren 
Instantierung?

mister schrieb:
> was mir erst mal zu viel ist da ich die meisten Probleme mit VHDL habe
Vermutlich, weil du damit programmieren willst. So wie du bisher µC 
programmiert hast.
Das ist aber, wie wenn du das Dachrinnenlöten gelernt hättest und nun 
mit der selben Technik und Herangehensweise Hochzeitsringe und Broschen 
löten wolltest.
Das sieht man besonders schön an diesem Satz,
den mister schrieb:
> Ich habe einen Process mit 100MHz.
Du hast nicht einen "Prozess mit 100MHz" sondern du hast irgendwelche 
Hardware, die mit 100MHz getaktet wird und in diesem Prozess beschrieben 
wird.

mister schrieb:
> ich glaube mein Problem ist einfach die prinziepielle Realisierung und
> VHDL.
Hast du in VHDL schon mal die "üblichen" Grundübungen (blinkende LED, 
Lauflicht, serielle Schnittstelle, einfache Datenmanipulation) hinter 
dich gebracht und realisiert? Oder willst du das Filter "aus dem 
Stand" schaffen?

mister schrieb:
> Mein integer in VHDL geht glaub nur bis 32 bit.
Dann rechne mit einem unsigned oder signed Vektor. Den kannst du 
beliebig breit machen.

> Ich habe ein 8bit Signal welches mit einem 16bit Koeffizienten
> multipliziert wird. Mit meinen 25 Koeffizeinten brauche ich also
> 8+16+24=48.
Wenn du für ein 8-Bit Signal 48 Bit brauchst, dann frage ich mich, wie 
andere das mit 16-Bit oder gar 24-Bit Werten (z.B. Audio) machen...

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Lothar M. schrieb:
> mister schrieb:
>> Ich habe ein 8bit Signal welches mit einem 16bit Koeffizienten
>> multipliziert wird. Mit meinen 25 Koeffizeinten brauche ich also
>> 8+16+24=48.
> Wenn du für ein 8-Bit Signal 48 Bit brauchst, dann frage ich mich, wie
> andere das mit 16-Bit oder gar 24-Bit Werten (z.B. Audio) machen...

Er hat schon recht, das Zwischensignal als Rechenergebnis dieser 
Multiplikation entsteht durchaus. Er muss es halt später cutten. Manche 
Schlauberger cutten auch vorher damit es passt und wundern sich dann 
über die Ergebnisse.

Die Berechnung der Filterkoeffizienten ist übrigens nicht so ganz ohne. 
Die müssen durchaus genauer sein, als es auf den ersten Blick scheint, 
weil sonst die Fehler kummulieren.

von J. S. (engineer) Benutzerseite


Lesenswert?

Gustl B. schrieb:
> Die Koeffizienten wurden mit pyFDA https://github.com/chipmuenk/pyFDA
> berechnet.
Nach welchen Randbedingungen? Fenster?

von Gustl B. (-gb-)


Lesenswert?

Das kann man da einstellen, gibt sehr viele Möglichkeiten. Keine Ahnung 
was ich damals eingestellt hatte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.