filtro de paso de banda digital con entradas paralelas

Tengo un ADC de alta velocidad conectado a un FPGA. El ADC está diseñado de tal manera que obtiene 16 muestras cada ciclo de reloj FPGA (eso son muestras, no bits). Las 16 muestras son de un solo canal de entrada ADC, solo se recopilan a lo largo del tiempo y se envían como 1 gran porción (samp[0] es la muestra más temprana en el tiempo, samp[15] es la última muestra en el tiempo).

Necesito diseñar un filtro de paso de banda para el flujo paralelo, pero las implementaciones digitales que encontré en línea siempre asumen que tengo una sola muestra por ciclo de reloj (una muestra se inserta en la estructura del filtro, una muestra sale de la estructura del filtro). No puedo simplemente crear un reloj interno que sea 16 veces más rápido, ya que esta alta frecuencia sería demasiado rápida para la FPGA. Necesito poder filtrarlo, pero cada ciclo de reloj envío 16 muestras y emito 16 muestras filtradas.

¿Puede alguien ayudarme a empezar? ¿Cómo se llamaría este tipo de filtro? ¿Hay algún truco matemático en el que pueda construir 16 filtros digitales paralelos y luego hacer algo de magia matemática en la salida (¿diezmación en el filtro de tiempo?)

Parece que su FPGA es demasiado lento.
¿Cómo muestrea el FPGA el reloj de entrada 16 ADC si su reloj está funcionando 16 veces demasiado lento?
¿Cuál es tu frecuencia actual? ¿Qué tan complejo es el filtro? ¿Puedes desenrollar el cálculo del filtro?
Andy: 8 muestras vienen en paralelo a una velocidad de datos dual = 16 muestras por ciclo de reloj.
Paebbels: FPGA/frecuencia de interfaz es 225Mhz. Veces 16 significa que el ADC muestra a 3,6 GSPS. Idealmente, tendríamos un filtro de paso de banda de 64 tomas. No estoy seguro de cómo desenrollar el cálculo del filtro.
Por ejemplo, CRC32 se define como una operación de 1 bit por ciclo. Por lo tanto, normalmente se necesitarían 32 ciclos por palabra de 32 bits o un reloj x32. Pero una operación CRC (xor + shift) de un solo bit necesita solo una fracción de un período de ciclo, por lo que es posible realizar 32 xor y shifts en un período de reloj. Volviendo a su problema de filtro: el bloque DSP funciona a más de 450 MHz, por lo que tal vez pueda hacer 2 cálculos de filtro por ciclo de 225 MHz. Consulte también la respuesta de Alex para obtener más consejos para desenrollar :).
Además, ¿cuántos bits son estas muestras?
El problema es que NECESITA tener un solo flujo de datos para la entrada de su filtro. Lo que debe hacer es realizar una etapa de entrada de búfer multicanal en la entrada de su FPGA. En su caso, va a ser difícil porque tiene un ancho de banda muy GRANDE. Puede capturar sus datos a 225 MHz y crear un bus de 16 muestras de ancho y usarlo como fuente para su filtro. en cada reloj tiene acceso a 16 muestras de consecuencias, será un desafío realmente DIFÍCIL hacer que funcione.

Respuestas (1)

Debería ser posible desenrollar esto, pero requerirá 64*16 = 1024 operaciones MAC por ciclo de reloj. Piénsalo así:

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

Esa es la operación de filtro que necesitas hacer. Simplifiquemos eso un poco y solo consideremos los primeros 3 términos:

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

Cada -1 es un ciclo de reloj de retraso. Si obtiene un término por ciclo de reloj, puede implementarlo directamente con 3 multiplicadores y tres registros para almacenar los valores de x. Sin embargo, si obtiene dos valores de x por ciclo de reloj, también necesita producir dos valores de y por ciclo de reloj. En ese caso, debe hacer algo como esto, asumiendo que sus valores de entrada son x[2n] y 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]

Y puedes continuar esto para más entradas:

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]

Tenga en cuenta que en este caso, cada ciclo de reloj de retraso NO es un retraso de 1, por lo que he vuelto a escribir los términos como una suma del término original y el retraso. Entonces, por ejemplo, 2n se mueve a 2n-2 en el siguiente ciclo y 2n+1 pasa a 2n+1-2 en el siguiente ciclo. Puede escalar este patrón a lo que necesite, sin embargo, recomendaría usar un script de Python o similar para generar su HDL, ya que sería una pesadilla implementarlo manualmente.

En general, necesitará operaciones MAC de recuento de muestras * longitud de filtro paralelas. Tenga en cuenta que, en algunos casos, puede ser posible realizar dos operaciones MAC en un segmento DSP si tiene un sumador previo y su lista de coeficientes de filtro tiene una simetría que puede explotar. Entonces, si está utilizando un chip Xilinx moderno, es posible implementar esto en 512 segmentos DSP.

Editar: aquí hay otra opción que es un poco loca, pero podría valer la pena mirarla. Es posible construir un filtro FIR sin usar ningún segmento DSP que sea razonablemente rápido; se llama filtro aritmético distribuido. La compensación es que para un ancho de coeficiente de M bits, se requieren M ciclos de reloj para calcular la siguiente muestra. Ya está haciendo 16 muestras en paralelo, podría valer la pena probar una implementación aritmética distribuida que es 16 * M en paralelo. Muestras de 16 bits * 16 muestras serían solo 256 implementaciones de filtro DA en paralelo. No he hecho mucho con la aritmética distribuida, por lo que no estoy seguro de qué tan bien se escala, pero es otra forma posible de implementar su filtro. No estoy seguro de qué FPGA estás usando, pero es posible que no lo hagas.