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?)
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.
Matt Jung
Andi aka
Paebbels
Benutzer2913869
Benutzer2913869
Paebbels
alex.forencich
FarhadA