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?
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
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.
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.
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
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.
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.
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.
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
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.
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
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
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.