Forum: FPGA, VHDL & Co. Xilinx FIFO mit Non-symmetrical aspect Ratio


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich verwende gerade mehrmals FIFOs mit Non-symmetrical aspect Ratio. Und 
zwar um parallel viele Werte hineinzuschreiben und danach nacheinander 
einzelne Werte herauszulesen.
Das funktioniert auch prima, aber ich habe eine Frage:

Wenn ich da z. B. 8 Werte hineinschreibe je Schreibtakt und nur 1 Werte 
lese je Lesetakt, kann ich irgendwie die Reihenfolge festlegen welcher 
der 8 Eingangswerte zuerst heraus gelesen wird?

Meine bisherige Lösung ist es zwischen FIR und FIFO die Reihenfolge der 
Werte umzuverdrahten, aber es wäre eleganter wenn man das am FIFO 
einstellen könnte. Geht das?

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Hmmm, was ich im Zweifel machen wuerde, waere mit eine Funktion zu bauen 
welche die Umverteilung am FIFO Eingang anhand eines Integer Arrays 
vornimmt. Oder alternativ mit dem generate Statement arbeiten. Dann 
brauchst du auch nicht staendig den Core neu generieren wenn du mal die 
Reihenfolge aendern willst.

Ist ein Wert bei dir ein Daten Wort oder ein einzelnes Bit?

: Bearbeitet durch User
von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
Tobias B. schrieb:
> aere mit eine Funktion zu bauen
> welche die Umverteilung am FIFO Eingang anhand eines Integer Arrays
> vornimmt. Oder alternativ mit dem generate Statement arbeiten.

Genau so habe ich das gelöst. Aber wenn man das beim Core einstellen 
könnte würde ich mir wieder etwas HDL sparen.

Tobias B. schrieb:
> Ist ein Wert bei dir ein Daten Wort oder ein einzelnes Bit?

Ich bekomme ja jetzt manchmal korrekte Daten aus dem ADC. Da will ich 
virtuell die Samplerate vervierfachen und dann mit einem FIR 
tiefpassfiltern. Funktioniert auch. Aber der FIR gibt mir dann jeweils 
256 Bits je Takt bei 250 MHz raus. Das sind 16 Werte je 16 Bits. Die 
gehen dann in einen FIFO mit Non-symmetrical aspect Ratio.
Eben geschrieben werden 256 Bits mit 250 MHz. Und gelesen wird mit 100 
MHz und jeweils 32 Bits.
(Ja, das passt nicht zusammen von den Datenraten, ist aber egal, weil 
das so läuft:
FIFO reset, dann Werte reinschreiben bis voll, Werte langsam auslesen 
und zum Rechner schicken.)

Jedenfalls würde ich gerne einstellen können ob von den 32 Bits die 
unteren oder oberen 16 Bit ein früherer Wert vom FIR Signal sind.

Genauso würde ich auch beim FIR gerne selber einstellen können ob beim 
Eingangsdatenvektor mit 128 Bits, das sind 16 Werte je 8 Bits, die 
unteren 8 Bits die neusten Abtastwerte oder die ältesten Abtastwerte 
sind. Das finde ich irgendwie nicht dokumentiert und muss das leider 
ausprobieren.

von Burkhard K. (buks)


Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> kann ich irgendwie die Reihenfolge festlegen welcher
> der 8 Eingangswerte zuerst heraus gelesen wird?

Hast Du mal in die Doku 
(https://www.xilinx.com/support/documentation/ip_documentation/fifo_generator/v13_1/pg057-fifo-generator.pdf) 
geschaut. Auf Seite 114 ist ein Beispiel mit 1:4 aspect ratio - laut 
Doku ist die Reihenfolge fix, das MSW (beim Lesen) wird zuerst 
geschrieben. Scheint wohl fix zu sein, von Einstellen steht da nichts.

Benutzt Du das built-in FiFo oder Block RAM? Seit ich mal ein FiFo mit 
einer Tiefe != 2**n benötigt habe, verwende ein FiFo aus der GH-VHDL 
Library (Block RAM). Ist zwar mehr "VHDL" - aber besser anpassbar. Für 
unsymmetrische Aspect Ratios habe ich ein Wrapper-Module mit 
generate-Statement.

von Felix (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> Da will ich
> virtuell die Samplerate vervierfachen und dann mit einem FIR
> tiefpassfiltern.

Was ist der Sinn von dem upsampling? Dadurch wird der FIR nur 
aufwendiger

von Gustl B. (-gb-)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Burkhard K. schrieb:
> Auf Seite 114 ist ein Beispiel mit 1:4 aspect ratio - laut
> Doku ist die Reihenfolge fix, das MSW (beim Lesen) wird zuerst
> geschrieben.

Danke! Das hat geholfen.

Burkhard K. schrieb:
> Benutzt Du das built-in FiFo oder Block RAM?

Block RAM. Denn das built-in FiFo kann nicht was ich will, siehe 
Bildchen.

Felix schrieb:
> Was ist der Sinn von dem upsampling? Dadurch wird der FIR nur
> aufwendiger

Naja der Sinn ist auch nicht der FIR, sondern das Upsampling. Und das 
funktioniert so:
Man wiederholt Abtastwerte. Das gibt aber fiese Stufen. Und diese Stufen 
filtert man danach weg indem man auf < f_Sample begrenzt. Der FIR ist 
also nur da weil ich Upsampling mache.

Mir geht es um schnelle Impulse mit < 20 ns Länge. Von denen möchte ich 
möglichst genau die Höhe bekommen. Wenn ich da Upsampling mache, dann 
bin ich näher am wirklichen Maximum und durch den FIR wird mir als 
Dreingabe auch etwas Rauschen entfernt.

Siehe Bildchen. Blau ist vom ADC roh, orange ist das Upgesampelte.

von Felix (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> Naja der Sinn ist auch nicht der FIR, sondern das Upsampling. Und das
> funktioniert so:
> Man wiederholt Abtastwerte. Das gibt aber fiese Stufen. Und diese Stufen
> filtert man danach weg indem man auf < f_Sample begrenzt. Der FIR ist
> also nur da weil ich Upsampling mache.

Wäre es nicht geschickter, da ein Polyphasenfilter zu nehmen? Außerdem 
glaube ich nicht, dass sich der Ansatz gut für eine genaue 
Amplitudenmessung eignet. Schließlich wird der Durchlassbereich deines 
Filters nicht ideal sein, sehr kurze Pulse werden also stärker gedämpft 
werden. Und wenn die Pulse nicht sehr kurz sind, dann hast du durch die 
Abtastwerte ja schon eine gute Approximation der Amplitude.

von Gustl B. (gustl_b)


Bewertung
0 lesenswert
nicht lesenswert
Felix schrieb:
> Wäre es nicht geschickter, da ein Polyphasenfilter zu nehmen?

Das ist ja auch nur eine Art FIR. Wenn du mir sagst was das für Vorteile 
hat dann vielleicht.

Felix schrieb:
> Schließlich wird der Durchlassbereich deines Filters nicht ideal sein,
> sehr kurze Pulse werden also stärker gedämpft werden.

Nix ist ideal. Die Impulse sind alle ähnlich kurz. Aber ja, ich muss 
drauf achten dass die gleich behandelt werden. Aber das ist eigentlich 
im Analogteil auch schon so. Die Bandbreite ist immer begrenzt und somit 
werden kurze Impulse anders durchgelassen als längere.

Felix schrieb:
> Und wenn die Pulse nicht sehr kurz sind, dann hast du durch die
> Abtastwerte ja schon eine gute Approximation der Amplitude.

Ja. Aber das sind dann nur 8 Bits und die Impulse sind <20 ns lang. Da 
bekomme ich je Impuls als nur 20 Abtastwerte maximal. Da liegen die 
Werte um die Spitze herum dann doch etwas vom Maximum der ideal 
gefilterten Kurve weg.

von Felix (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> Das ist ja auch nur eine Art FIR. Wenn du mir sagst was das für Vorteile
> hat dann vielleicht

Du sparst dir das Halteglied und das Upsampling machst du auch direkt in 
der Filterstruktur

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
OK, aber gibt es das irgendwo fertig oder muss ich das HDL selber 
schreiben und auch einen Filter Designer der mir die Koeffizienten 
rausgibt?

Bisher habe ich zwar FIR von Hand geschrieben, aber der FIR Designer von 
Xilinx optimiert nochmal deutlich. Der braucht recht wenig Hardware und 
nimmt mir fast alles ab.

von Felix (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> Bisher habe ich zwar FIR von Hand geschrieben

Klassischer Gustl ;)

Das sollte auch mit dem Generator gehen, es ist ja wie du schon sagtest 
ein normales FIR filter, nur dass du die Taps abwechselnd mit der 
4-fachen Geschwindigkeit abfragst. Wahrscheinlich gibt es dafür auch 
eine Option im Generator, das ist schließlich eine recht häufige 
Anwendung

von Gustl B. (-gb-)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Klar verwende ich den Generator, aber es ist mal eine gute Übung einen 
FIR zu Fuß zu bauen.

Du hast Recht, der Generator kann Interpolation. Sehr fein, werde ich 
mir angucken. Vielleicht ist das ja sparsamer bei den DSPs.

Edit:
OK, bevor ich das jetzt ausprobiere mit der Interpolation:
Wie ist das mit den Filterkoeffizienten die ich verwende, wirken die 
quasi auf die Ausgangsabtastrate oder auf die neue Abtastrate vom 
Ergebnis? Also wenn ich da einen Tiefpass bei f_c = 300 MHz setze bei 
1GHz Abtastrate, wird das nach der Interpolation zu einem Tiefpass mit 
f_c = 1,2 GHz bei virtuellen 4 GSample/s?

Bei meiner Variante mit dem normalen FIR musste ich auf < f_sample/8, 
also 500 MHz bei virtuellen 4 GHz begrenzen weil ja sonst die Obertöne 
der Stufen drinnen sind. Muss man das auch bei der Interpolation machen?

Edit:
Und ausprobiert. Exakt die gleichen Filterkoeffizienten. Siehe da, die 
arbeiten wie gewünscht, aber leider ist das nicht so gut wie die Methode 
mit dem normalen FIR. Man sieht deutlich die Töne durch die 
Interpolation. Beim FIR sind die Weg weil der ja erst nach dem 
Upsampling kommt.

Positiv ist, dass das FPGA nurnoch grob 1/3 der DSPs braucht und auch 
weniger heizt. Aber auch mit mehr Koeffizienten werde ich die Töne nicht 
wegbekommen weil da ja mein Passband liegt links und rechts von den hier 
1 GHz als Spiegelung.

Andererseits ... habe ich jetzt mehr DSPs übrig, ich könnte die 
Samplerate also virtuell sogar ver achtfachen und noch zusätzliche 
Koeffizienten verwenden. Verlockend.

: Bearbeitet durch User
von Felix (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gustl B. schrieb:
> Edit:
> Und ausprobiert. Exakt die gleichen Filterkoeffizienten. Siehe da, die
> arbeiten wie gewünscht, aber leider ist das nicht so gut wie die Methode
> mit dem normalen FIR. Man sieht deutlich die Töne durch die
> Interpolation. Beim FIR sind die Weg weil der ja erst nach dem
> Upsampling kommt.

Bei dem "normalen" FIR hast du aber zusätzlich ein Halteglied gehabt 
oder? Beim Polyphasenfilter werden einfach Nullen eingefügt. Das 
Halteglied müsstest du aber auf die Koeffizienten umrechnen können, 
sodass das Polyphasenfilter dir dasselbe rausgibt. Da bin ich mir aber 
gerade nicht 100% sicher. Poste mal die Koeffizienten, damit ich mir das 
vor Augen führen kann.

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
Felix schrieb:
> Bei dem "normalen" FIR hast du aber zusätzlich ein Halteglied gehabt
> oder?

Keine Ahnung, den habe ich hier nicht zu Fuß geschrieben sondern mir 
generieren lassen.

Also ich habe jeden Abtastwert viermal hintereinander gesetzt und das 
dann in den FIR gefüttert. Der FIR war mit den Koeffizienten auf 
<f_sample/8 eingestellt damit die Stufen durch das Upsampling dann 
rausgefiltert werden und das wurden sie ja auch.

Felix schrieb:
> Poste mal die Koeffizienten, damit ich mir das
> vor Augen führen kann.

-2,-10,-23,-37,-41,-22,31,128,267,439,624,797,932,1005,1005,932,797,624, 
439,267,128,31,-22,-41,-37,-23,-10,-2

Die sind so aus Pyfda rausgefallen. Ich habe die als Integer auf 14 Bit 
skalieren lassen.

von Felix (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also dass die zweite Nyquistzone bei 1 GHz so stark durchkommt, liegt an 
deinem FIR (siehe Bild). Andererseits geht das ja eh im 
Quantisierungsrauschen unter, also dürfte es auch egal sein.

Unten mal ein Filter, das meiner Meinung nach das Wiederholspektrum 
besser dämpfen müsste, ich habe jetzt mal auch nur 28 Koeffizienten 
genommen, damit das besser vergleichbar zu deinem "normalen" FIR ist. 
Aber wie du schon gemerkt hast, könntest du dir durch die Effizienz des 
Polyphasenfilters auch mehr Koeffizienten gönnen.

Kannst es ja mal probieren, würde mich interessieren ob das 
funktioniert. Simulierst die Sachen eigentlich (deine Screenshots) oder 
sind das Daten von der Hardware?


-0.00000051, -0.00000643, -0.00003773, -0.00013774, -0.00033622, 
-0.00049431, 0.00000000, 0.00255309, 0.00936045, 0.02270286, 0.04353410, 
0.07000008, 0.09697265, 0.11737518, 0.12500000, 0.11737518, 0.09697265, 
0.07000008, 0.04353410, 0.02270286, 0.00936045, 0.00255309, 0.00000000, 
-0.00049431, -0.00033622, -0.00013774, -0.00003773, -0.00000643, 
-0.00000051

von Gustl B. (-gb-)


Bewertung
0 lesenswert
nicht lesenswert
Felix schrieb:
> Also dass die zweite Nyquistzone bei 1 GHz so stark durchkommt, liegt an
> deinem FIR (siehe Bild).

Ah OK. In Pyfda habe ich mir bisher nur bis f_sample/2 angeguckt.

Felix schrieb:
> Unten mal ein Filter, das meiner Meinung nach das Wiederholspektrum
> besser dämpfen müsste, ich habe jetzt mal auch nur 28 Koeffizienten
> genommen, damit das besser vergleichbar zu deinem "normalen" FIR ist.

Danke!

Felix schrieb:
> Aber wie du schon gemerkt hast, könntest du dir durch die Effizienz des
> Polyphasenfilters auch mehr Koeffizienten gönnen.

Habe ich schon getan. Allerdings kämpfe ich gerade mit der nächsten 
Baustelle:
Der FIR hat ja AXI als Schnittstelle. Wenn ich die Interpolation auf 
Faktor 4 setze und die Daten vom Ausgang in einen FIFO mit 
unterschiedlichen Schreib- und Lesebreiten füttere, dann kann ich aus 
diesem FIFO immer 32 Bits lesen und bekomme damit zwei Samples, 31 
downto 16 und 15 downto 0.
Wenn ich die Interpolation aber auf Faktor 8 stelle und das ebenfalls in 
den FIFO schreibe (dann mit 512 Bit schreiben und 64 Bit lesen (es geht 
nur (8:1 und leider nicht 16:1 oder so)), dann sollte ich da ja 4 
Samples je Lesetakt bekommen. 63 downto 48, 47 downto 32, 31 downto 16 
und 15 downto 0. Aber das ist nicht so. Das sind zumindest keine schönen 
Samples und die Signalform sieht sehr kaputt aus. Da muss ich noch 
hinterherstochern.

Felix schrieb:
> Simulierst die Sachen eigentlich (deine Screenshots) oder
> sind das Daten von der Hardware?

Die Screenshots waren jetzt Hardware mit 10 MHz Quelle. Aber ich habe 
natürlich auch eine Testbench in der ich vom ADC bis zum UART alles 
drinnen habe und simulieren kann. Nur dauert das leider recht lange.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.