preguntas sobre el muestreo ascendente y el paso del dominio de reloj lento al rápido en FPGA

Encontré algunas preguntas y problemas que me hice últimamente y esperaba poder obtener una buena pista aquí antes de comenzar a leer artículos largos sin siquiera estar seguro de si es la forma correcta.

Supongamos que tengo un diseño FPGA, donde obtengo datos ADC con una frecuencia de muestreo de 40 MHz, por lo que engancho los datos de la interfaz ADC en 40 MHz.
pero quiero hacer que el DSP dentro del FPGA tenga una velocidad de reloj de 100 MHz (por ejemplo, porque tengo una interfaz de memoria DDR3 en el diagrama de bloques del DSP que funciona a 400 MHz con una velocidad de reloj de 4:1, lo que significa que el reloj de la interfaz de usuario de la DDR3 es de 100 MHz).
Los datos de la interfaz ADC que vienen en una tasa de 40MHz son válidos el 90% del tiempo, lo que significa que necesito la mayor parte.

Entonces, la primera pregunta que quiero hacer es: ¿Cómo movería el flujo de datos del dominio del reloj lento al rápido?
Ya hice un mecanismo de trabajo para esto, llené un FIFO (con 1024 de profundidad) y justo después comencé a llenar el siguiente FIFO (utilicé 2 FIFO),
mientras que el proceso de lectura del primer FIFO comenzaba en el momento en que el primero FIFO está lleno y, a partir de este momento, solo leo el primero y luego el segundo y el primero y el segundo y así sucesivamente... mientras sigo escribiendo en los 2 FIFO cada uno a la vez.

Después de que terminé de escribir este bloque, me pregunté si había una mejor manera,

Encontré el filtro de interpolación usando FIR, ¿la interpolación hace este trabajo de pasar de un dominio de reloj lento a uno rápido para un flujo de datos?

También vi el filtro polifásico que también parece una forma de pasar a una frecuencia de muestreo más rápida.

¿Su filtro, que es fácil de instanciar en FPGA, es la forma correcta de mover el flujo de datos a un dominio de reloj más rápido, o mi camino con FIFO es el camino a seguir?
gracias.

esta es la sección incorrecta, debe ir a la sección de superusuario o procesamiento de señales, o recomendación de hardware :) pero me interesa su excelente pregunta. ¿Quieres construir FPGA DIY? ¿O creas una compilación de análisis?
@XCSource Recibo mucha ayuda en esta sección con respecto al diseño de FPGA, no creo que nadie en Signal Processing sepa cómo responderla. Porque es más una cuestión de diseño de FPGA que DSP. en términos de DSP, la respuesta es solo hacer un filtro de interpolación y obtendrá un mayor MSPS para su señal -> pero estoy más interesado en la respuesta de la perspectiva de diseño de FPGA.
¿ Qué estás tratando de lograr aquí? ¿Hay alguna razón por la que desee una versión de 100 MSPS de la señal? ¿O simplemente quiere usar su lógica de 100 MHz para guardar las muestras de 40 MSPS en el DDR? Esos son objetivos casi completamente diferentes .
@ChrisStratton Quiero usar un reloj de 100MHz para procesar los datos, una de las razones es porque es más conveniente pasar y recibir datos del módulo DDR usando un reloj de 100MHz pero no solo, también para acelerar el procesamiento de datos dentro de la FPGA
Entonces hazlo. La velocidad del reloj lógico/del procesador no necesita estar bloqueada a la frecuencia de muestreo (ciertamente no necesita volver a muestrear), solo debe ser suficiente para mantenerse al día con el flujo de datos si está ocurriendo en tiempo real.

Respuestas (1)

Entonces, la primera pregunta que quiero hacer es: ¿Cómo movería el flujo de datos del dominio del reloj lento al rápido? Ya hice un mecanismo de trabajo para esto, llené un FIFO (con 1024 de profundidad) y justo después comencé a llenar el siguiente FIFO (utilicé 2 FIFO),

Exactamente como lo está haciendo: con el dominio del reloj cruzando FIFO.

Después de que terminé de escribir este bloque, me pregunté si había una mejor manera, encontré el filtro de interpolación usando FIR, ¿la interpolación hace este trabajo de pasar de un dominio de reloj lento a uno rápido para un flujo de datos?

No. Quiero decir, sí, pero no.

Desea pasar las mismas muestras a un reloj más rápido y procesarlas allí. La interpolación (y todo el remuestreo) en realidad cambia la señal digital.

Ilustremos con un ejemplo: supongamos que desea pasar de una señal muestreada de 40 MHz a 200 MS/s (megasmuestras por segundo). Lo que hace es simplemente insertar 4 ceros después de cada muestra de entrada. Debido a que generalmente desea que los "ceros" no sean ceros sino que representen la señal analógica como si se muestreara a 200 MHz para empezar, aplica un filtro de paso bajo (en esa aplicación se llama filtro anti-imagen) y obtiene una señal interpolada.

Sin embargo, el hecho de que obtenga 200 millones de muestras por segundo no significa que deba procesarlas a un rendimiento de 200 millones de muestras por segundo o a una velocidad de reloj de 200 MHz. Puede procesarlos tan rápido como desee y, si tiene suficiente búfer, también tan lento como desee.

La frecuencia de muestreo y la frecuencia del reloj no están inherentemente vinculadas.

Piense en esto en su PC: digamos que tiene un archivo de audio PCM sin formato, muestreado a 44,1 kS/s. Quiere codificarlo como audio MPEG 4; aunque la pieza de audio puede durar minutos, el proceso de codificación toma solo unos segundos: no es necesario llevar el archivo de audio a la "tasa de procesamiento" de su CPU (cualquiera que sea esa tasa, realmente no existe) .

Lo mismo para su dominio FPGA: seguro, su lógica de dominio de reloj más alto probablemente tendrá que estar inactiva en el medio si recibe muestras de un ADC de menor velocidad, pero eso solo significa que puede relajarse, y está bien si las cosas toman más de uno. ciclo de reloj por muestra para trabajar.