¿Cómo interconectar 1 MSPS ADC con el módulo de procesamiento en FPGA?

Tengo una placa DE1-SoC que contiene 1 MSPS ADC, estoy tratando de tomar muestras de ADC y procesarlas. El reloj del controlador ADC es de 20 MHz y los datos están disponibles cada 16 ciclos de reloj. El módulo que toma muestras funciona con un reloj de 100 MHz. El problema es ¿cómo puedo interconectar estos dos módulos?

Mi primer pensamiento fue usar un FIFO asíncrono, pero después de la búsqueda descubrí que ¡es imposible! El reloj de escritura es mucho más lento que el lado de lectura. Encontré una fórmula para calcular la profundidad del FIFO ( here ) pero falló, ¡dándome una respuesta negativa! No sabía cuál era mi "ráfaga", así que asumí que era 1 ya que el controlador da una muestra cada 16 ciclos de reloj.

Entonces, ¿tienes alguna idea de cómo resolver este problema?

Respuestas (1)

Normalmente, los FIFO se autocontrolan para evitar desbordamientos y subdesbordamientos. Esto se hace implementando un control de flujo hacia adelante y hacia atrás. El control de flujo directo significa que las palabras de datos se marcan como válidas en FIFO para que el lado de lectura pueda distinguir las palabras válidas de las no válidas. El control de flujo hacia atrás se logra exportando el estado de llenado de un FIFO al lado de escritura. Si el FIFO está lleno, crea una señal de "lleno" que le indica al escritor que puede manejar más datos.

En su caso, el ADC está transmitiendo datos a una velocidad constante, por lo que debe dimensionar el FIFO correctamente para evitar un desbordamiento.

W r i t mi s pag mi mi d = 20 METRO H z 1   A D C W o r d s dieciséis   C y C yo mi s = 1.25 METRO W o r d s s mi C

R mi a d s pag mi mi d = 100 METRO H z 1 W o r d 1 C y C yo mi = 100 METRO W o r d s s mi C

Debido a que la velocidad de lectura es más rápida que la velocidad de escritura y la longitud de la ráfaga de escritura es una, no necesita preocuparse por la profundidad FIFO o la longitud de la ráfaga y los desbordamientos. Tenga en cuenta que los FIFO de reloj cruzado tienen una profundidad mínima, por ejemplo, 3 palabras.

Echemos un vistazo a una interfaz FIFO común:

entity fifo_ic_got is
    generic (
        D_BITS         : positive;          -- Data Width
        MIN_DEPTH      : positive           -- Minimum FIFO Depth
    );
    port (
        -- Write Interface
        clk_wr    : in  std_logic;
        rst_wr    : in  std_logic;
        put       : in  std_logic;
        din       : in  std_logic_vector(D_BITS-1 downto 0);
        full      : out std_logic;

        -- Read Interface
        clk_rd    : in  std_logic;
        rst_rd    : in  std_logic;
        got       : in  std_logic;
        valid     : out std_logic;
        dout      : out std_logic_vector(D_BITS-1 downto 0)
    );
end;

Este FIFO tiene 2 entradas de reloj, una para cada dominio de reloj (lectura (rd) y escritura (wr)), así como un reinicio para cada lado.

La ruta de datos de din a dout está rodeada por 4 señales:

  • poner - din es válido -> almacenar palabra en el FIFO
  • full - el FIFO está lleno -> no se pueden almacenar más datos, put no tiene efecto
  • válido: el FIFO tiene al menos una palabra de datos, que se puede ver en dout
  • got - se leyó la palabra actual en dout y el circuito está listo para la siguiente palabra

Escribir en cada ciclo de reloj 16 significa asignar poner cada 16 ciclos a 1. La señal completa puede ignorarse, porque el lado de lectura siempre es más rápido que el lado de escritura.

Aquí hay una forma de onda para el FIFO:ingrese la descripción de la imagen aquí

Editor de forma de onda en línea Wavedrome

Ok, pero ¿qué pasa con el desbordamiento? el módulo de procesamiento tendrá que esperar 80 ciclos de reloj para que llegue la siguiente muestra. Eso significa que no hay necesidad de FIFO, ¿verdad?
La condición de subdesbordamiento se evita mediante el control de flujo directo. Entonces, si validno es alto, no puede usar dout. Esto evita que el lector extraiga más palabras de las almacenadas en el FIFO. Todavía se necesita un FIFO porque está utilizando dos relojes diferentes no relacionados. Este límite de dominio de reloj solo puede cruzarse mediante un FIFO de reloj cruzado o un protocolo de protocolo de enlace complejo. Si no utiliza un FIFO de reloj cruzado o un circuito de cruce de dominio de reloj apropiado, leerá datos falsos de su ADC.
Entonces, ¿no hay posibilidad de que el módulo de procesamiento tome muestras continuamente de FIFO? ¿Debe esperar un determinado número de ciclos hasta que llegue la siguiente muestra?
Sí, la señal válida indica cuándo el módulo de procesamiento puede tomar una palabra del FIFO. El consumo continuo solo se puede hacer si la velocidad de escritura es igual a la velocidad de lectura. Como usted describió, el escritor opera en 1 dieciséis de 20 MHz y el lector a 100 MHz.
Una pregunta: escribiste que el ADC tiene 1 MSPS, eso es menos 1.25 METRO W o r d s s , ¿no debería estar escribiendo cada 20 ciclos a 20 MHz?
En realidad, como la hoja de datos describe el dispositivo, es un ADC de 1 MSPS, sin embargo, cuando describieron los modos de operación y otras cosas, dijeron que debe operarlo a 20 MHz de reloj si desea obtener la velocidad de datos más alta. ese es el 1 MSPS. No sé si la tasa de conversión es diferente a la tasa de transmisión.