digitales Bandpassfilter mit parallelen Eingängen

Ich habe einen Hochgeschwindigkeits-ADC, der mit einem FPGA verbunden ist. Der ADC ist so konzipiert, dass Sie bei jedem FPGA-Taktzyklus 16 Samples erhalten (das sind Samples, keine Bits). Die 16 Samples stammen von einem einzelnen ADC-Eingangskanal, sie werden nur im Laufe der Zeit gesammelt und als 1 großer Block gesendet (samp[0] ist das früheste Sample in der Zeit, samp[15] ist das späteste Sample in der Zeit).

Ich muss einen Bandpassfilter für den Parallelstrom entwerfen, aber die digitalen Implementierungen, die ich online gefunden habe, gehen immer davon aus, dass ich einen einzelnen Abtastwert pro Taktzyklus habe (ein Abtastwert wird in die Filterstruktur geschoben, ein Abtastwert kommt aus der Filterstruktur). Ich kann nicht einfach eine 16x schnellere interne Uhr erzeugen, da diese Hochfrequenz für das FPGA zu schnell wäre. Ich muss in der Lage sein, es zu filtern, aber bei jedem Taktzyklus sende ich 16 Samples ein und gebe 16 gefilterte Samples aus.

Kann mir jemand beim Einstieg helfen? Wie würde man so einen Filter nennen? Gibt es einen mathematischen Trick, bei dem ich einfach 16 parallele digitale Filter bauen und dann etwas mathematische Magie am Ausgang anwenden kann (Dezimierung im Zeitfilter?)

Klingt wie Ihr FPGA ist einfach zu langsam.
Wie taktet das FPGA 16 ADC-Samples ein, wenn seine Uhr 16x zu langsam läuft?
Was ist Ihre aktuelle Frequenz? Wie komplex ist der Filter? Können Sie die Filterberechnung aufrollen?
Andy: 8 Samples kommen parallel bei dualer Datenrate = 16 Samples pro Taktzyklus.
Paebbels: FPGA/Schnittstellenfrequenz ist 225 MHz. Zeiten 16 bedeutet die ADC-Abtastungen bei 3,6 GSPS. Idealerweise hätten wir einen Bandpassfilter mit 64 Abgriffen. Ich bin mir nicht sicher, wie ich die Filterberechnung ausrollen soll.
Beispielsweise ist CRC32 als eine 1-Bit-pro-Zyklus-Operation definiert. Normalerweise würde man also 32 Zyklen pro 32-Bit-Wort oder einen x32-Takt benötigen. Aber eine Einzelbit-CRC-Operation (xor + shift) benötigt nur einen Bruchteil einer Zyklusperiode, so dass es möglich ist, 32 xor und Verschiebungen in einer Taktperiode durchzuführen. Zurück zu Ihrem Filterproblem: DSP-Block arbeitet bei 450+ MHz, also können Sie vielleicht 2 Filterberechnungen pro 225-MHz-Zyklus durchführen. Siehe auch die Antwort von Alex für weitere Abrolltipps :).
Und wie viele Bits haben diese Samples?
Das Problem ist, dass Sie einen einzigen Datenstrom für die Eingabe Ihres Filters benötigen. Was Sie tun müssen, ist eine Mehrkanal-Puffereingangsstufe am Eingang Ihres FPGA durchzuführen. In Ihrem Fall wird es schwierig, weil Sie eine so große Bandbreite haben. Sie können Ihre Daten bei 225 MHz erfassen und einen Bus mit einer Breite von 16 Samples erstellen und diesen als Quelle für Ihren Filter verwenden. Auf jeder Uhr haben Sie Zugriff auf 16 Konsequenz-Samples, es wird eine wirklich SCHWIERIGE Herausforderung, es zum Laufen zu bringen.

Antworten (1)

Es sollte möglich sein, dies aufzurollen, aber es erfordert 64*16 = 1024 MAC-Operationen pro Taktzyklus. Denken Sie so darüber nach:

y[n] = a0 * x[n] + a1 * x[n-1] + ... + a63 * x[n-63]

Das ist die Filteroperation, die Sie ausführen müssen. Vereinfachen wir das etwas und betrachten nur die ersten 3 Terme:

y[n] = a0 * x[n] + a1 * x[n-1] + a2 * x[n-2]

Jede -1 ist ein Verzögerungstaktzyklus. Wenn Sie einen Term pro Taktzyklus erhalten, können Sie dies direkt mit 3 Multiplikatoren und drei Registern zum Speichern der x-Werte implementieren. Wenn Sie jedoch zwei x-Werte pro Taktzyklus erhalten, müssen Sie auch zwei y-Werte pro Taktzyklus erzeugen. In diesem Fall müssen Sie so etwas tun, vorausgesetzt, Ihre Eingabewerte sind x[2n] und x[2n+1]:

y[2n]   = a0 * x[2n]   + a1 * x[2n+1-2] + a2 * x[2n-2]
y[2n+1] = a0 * x[2n+1] + a1 * x[2n]     + a2 * x[2n+1-2]

Und Sie können dies für weitere Eingaben fortsetzen:

y[3n]   = a0 * x[3n]   + a1 * x[3n+2-3] + a2 * x[3n+1-3]
y[3n+1] = a0 * x[3n+1] + a1 * x[3n]     + a2 * x[3n+2-3]
y[3n+2] = a0 * x[3n+2] + a1 * x[3n+1]   + a2 * x[3n]

Beachten Sie, dass in diesem Fall jeder Taktzyklus der Verzögerung NICHT eine Verzögerung von 1 ist, also habe ich die Terme als Summe des ursprünglichen Terms und der Verzögerung neu geschrieben. So wird zum Beispiel 2n im nächsten Zyklus auf 2n-2 verschoben und 2n+1 geht im nächsten Zyklus auf 2n+1-2. Sie können dieses Muster nach Bedarf skalieren, aber ich würde empfehlen, ein Python-Skript oder ähnliches zu verwenden, um Ihre HDL zu generieren, da dies ein Albtraum wäre, es manuell zu implementieren.

Alles in allem benötigen Sie parallele Sample-Anzahl * Filterlänge MAC-Operationen. Beachten Sie, dass es in einigen Fällen möglich sein kann, zwei MAC-Operationen in einem DSP-Slice durchzuführen, wenn er einen Voraddierer hat und Ihre Filterkoeffizientenliste eine Symmetrie hat, die Sie ausnutzen können. Wenn Sie also einen modernen Xilinx-Chip verwenden, ist es möglicherweise möglich, dies in 512 DSP-Slices zu implementieren.

Bearbeiten: Hier ist eine andere Option, die ein wenig verrückt ist, aber es könnte sich lohnen, sie sich anzusehen. Es ist möglich, einen FIR-Filter zu bauen, ohne DSP-Slices zu verwenden, der immer noch relativ schnell ist - er wird als verteilter arithmetischer Filter bezeichnet. Der Kompromiss besteht darin, dass für eine Koeffizientenbreite von M Bits M Taktzyklen erforderlich sind, um den nächsten Abtastwert zu berechnen. Sie machen bereits 16 Samples parallel, es könnte sich lohnen, eine verteilte arithmetische Implementierung zu versuchen, die 16 * M parallel ist. 16-Bit-Abtastwerte * 16 Abtastwerte wären nur 256 parallele DA-Filterimplementierungen. Ich habe nicht viel mit verteilter Arithmetik gemacht, daher bin ich mir nicht sicher, wie gut sie skaliert, aber es ist eine andere Möglichkeit, Ihren Filter zu implementieren. Ich bin mir nicht sicher, welches FPGA Sie verwenden, aber es ist möglich, dass Sie gewinnen.