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

1

Tengo una placa DE1-SoC que contiene 1 MSPS ADC, estoy intentando 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 opera en reloj de 100 MHz. El problema es ¿cómo puedo conectar estos dos módulos?

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

Entonces, ¿tienes alguna pista para resolver este problema?

    
pregunta Siraj Muhammad

1 respuesta

5

Normalmente, los FIFO son autocontrolados para evitar desbordamientos y desbordamientos. Esto se hace implementando un control de flujo hacia adelante y hacia atrás. El control de flujo hacia adelante significa que las palabras de datos están marcadas como válidas en el FIFO para que el lado de lectura pueda distinguir las palabras válidas de las inválidas. El control de flujo hacia atrás se logra exportando el estado de relleno de un FIFO al lado de escritura. Si el FIFO está lleno, crea una señal "completa" 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 correcto para evitar un desbordamiento.

\ $ Write \, speed = 20 \, MHz \ cdot \ frac {1 \ ADC \, Words} {16 \ Cycles} = 1.25 \, M \ frac {Words} {sec} \ $

\ $ Read \, velocidad = 100 \, MHz \ cdot \ frac {1 \, Palabra} {1 \, Ciclo} = 100 \, M \ frac {Palabras} {sec} \ $

Debido a que la velocidad de lectura es más rápida que la velocidad de escritura y la longitud de ráfaga de escritura, no necesita preocuparse por la profundidad FIFO o la longitud de ráfaga y los desbordamientos. Los FIFO de reloj cruzado de notas tienen un mínimo de defs, por ejemplo 3 palabras.

Veamos 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 una reinicialización para cada lado.

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

  • put - din es válido - > almacenar palabra en el FIFO
  • lleno - el FIFO está lleno - > no se pueden almacenar más datos, put no tiene ningún efecto
  • válido: el FIFO tiene al menos una palabra de datos, que se puede ver en dout
  • se obtuvo: 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 put cada 16 ciclos a 1. Se puede ignorar la señal llena, 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:

Editor de formas de onda en línea de Wavedrome

    
respondido por el Paebbels

Lea otras preguntas en las etiquetas