¿Cómo conectar un ADC con FPGA a través de la señal CLKOUT en verilog?

Tengo un ADC (TLC2323-12) que (por lo que entiendo de la hoja de datos) tiene dos modos de controlar la salida de la señal convertida. Un método es con la señal de entrada SCK que se puede controlar desde el FPGA siempre que desee cambiar el valor al FPGA, y el otro es a través de CLKOUT, que es un reloj interno del ADC que "automáticamente y en ráfagas" (lo siento Soy nuevo en esto) escupir los resultados poco a poco de la resolución de 12 bits en total. Este último método se describe en la hoja de datos como "Alta velocidad" en comparación con el método SCK.

Ahora, pude controlar el ADC con el método SCK, porque puedo enviar las señales desde el módulo superior de la FPGA fácilmente y elegir el valor que quiero, en general trabajo con solo 1 reloj. Pero con el CLKOUT, aparentemente este se comporta como un segundo reloj, ¿entonces este es un sistema de doble reloj?

¿Qué debo hacer para codificar correctamente la interfaz cuando uso el método CLKOUT? Ahora hay 2 relojes. El reloj interno de la FPGA y el CLKOUT proveniente del ADC que puede "anunciar" a la FPGA la disponibilidad de los datos.

Estaba leyendo que tal vez una manera fácil es codificar un FIFO asíncrono que puede escribir desde CLKOUT y leer desde el reloj FPGA. ¿es esto correcto?

La interfaz es Serial, 2 canales.

Respuestas (1)

Creo que debe ir un poco más allá de la solución propuesta. Le sugiero que lea los datos del ADC en un registro usando el reloj del ADC. El registro debe ser lo suficientemente largo para contener el valor entero completo del ADC. Una vez que ese registro está lleno con una lectura, la lógica de la máquina de estado asociada generaría una señal para indicar que el valor era válido y no iba a cambiar y puede ser leído por la lógica FPGA principal.

Desde el punto de vista de la lógica impulsada desde el reloj del sistema FPGA principal, la señal de registro completo sería asíncrona; sin embargo, podría usarla como una señal de habilitación para copiar los datos en un ciclo de reloj del sistema a otro registro en el siguiente borde del reloj del sistema. . Por lo tanto, ahora tendría los datos disponibles sincrónicos con el reloj del sistema FPGA.

La única restricción con este esquema que puedo prever es que el reloj de la FPGA tendría que estar a una velocidad más alta que el reloj del ADC para garantizar que los datos estuvieran disponibles durante el tiempo suficiente.

En ese caso, ¿debería usar 12 registros de datos diferentes y 12 señales "listas" diferentes? Debido a que el reloj ADC cambia los datos uno por uno, por lo que están disponibles uno tras otro, y no me gustaría esperar hasta que se completen los 12 bits para que FPGA comience a leer. Y también me preocupaba lo que dijiste, qué pasa si los datos de salida no están allí el tiempo suficiente o cambian en el momento equivocado para que el FPGA no pueda recogerlos, no sería mejor dejar que el ADC guarde los datos en memoria fija, termine la conversio al mismo tiempo que la fpga los lea para finalmente hacer que la fpga ordene adc para comenzar nuevamente la conversión.
Supuse que necesita el valor entero completo del ADC para el proceso posterior, por lo que propongo un solo registro de 12 bits que podría leerse en más de 12 ciclos de reloj ADC [probablemente como un registro de desplazamiento] pero los 12 bits luego se leerían desde por la FPGA en un ciclo de reloj del sistema. Tener la señal de datos listos como una señal de habilitación para la lógica de lectura resuelve el problema de sincronización. He modificado la respuesta para que esto quede más claro.