¿Cómo se lee una FIFO fuera del sistema Qsys usando Nios II?

1

Hay un bloque FIFO que tiene una interfaz Avalon compatible con Qsys que se puede usar en los sistemas Qsys. Sin embargo, en mi caso hay un bloque externo que genera datos que deben ser leídos por un Nios II. El bloque externo tiene una interfaz FIFO, por lo que las señales son básicamente q, vacío y rdreq. Podría intentar usar un bloque PIO para conectarme a la FIFO externa y escribir algunos controladores simples para ayudar en la comunicación. Sin embargo, ¿hay una mejor manera de hacer esto? ¿Es posible comunicarse de alguna manera con este FIFO externo como si estuviera en el bloque Qsys con la interfaz de transmisión Avalon MM o Avalon?

    
pregunta quantum231

1 respuesta

1
Los

FIFO se utilizan normalmente con interfaces de tipo streaming. Puede convertir sus señales FIFO en una interfaz Avalon ST con bastante facilidad. Se mapean de la siguiente manera:

  • válido = ~empty
  • Listo = rdreq
  • Datos = q

En realidad, no necesitas ninguna otra señal para hacer Avalon ST. El único extraño de arriba es asegurarse de invertir la señal vacía.

Una vez en Qsys, deberá convertir de Avalon ST a Avalon MM, de las cuales hay algunas opciones. Por ejemplo, podría usar un controlador DMA para leer los datos del FIFO en la memoria en chip que Nios puede leer (por ejemplo, el Controlador DMA Scatter-Gather en Qsys).

Pensándolo bien, podría ser más fácil simplemente construir un módulo para crear una interfaz Avalon-MM. Algo como:

module fifo_to_mm (
    input         clk,
    input         rst,

    input  [31:0] q,
    output        rdreq,
    input         empty,

    input         read,
    input         address,
    output [31:0] readdata
);

assign rdreq = read && (address == 1'b0);
assign readdata = address ? {31'b0, empty} : q;

endmodule

En ese ejemplo, si lees la dirección 0 , leerá la siguiente palabra del FIFO. Si lees la dirección 1 , te dirá si el FIFO tiene datos disponibles o no.

Haría una envoltura de TCL alrededor de este módulo (puede usar la herramienta "Archivo - > Nuevo Componente" en Qsys para ayudarlo).

  • Agrega un reloj y reinicia la interfaz. Debe conectarlos al mismo reloj / reinicio que saca para su FIFO.
  • Agregue las señales FIFO a un conducto que exporte desde su sistema Qsys.
  • Agregue las señales Avalon-MM a una interfaz de esclavo Av-MM que se configura como:
    • Bits por símbolo: 8
    • Espera de lectura: 0
    • Lectura de latencia: 1 o 2 (*)
    • Unidades de dirección: PALABRAS

Entonces deberías poder conectar esto directamente a Nios, y Qsys se encargará de la estructura de interconexión por ti.

(*) la latencia de lectura depende de su latencia FIFO, es decir, el número de ciclos entre la confirmación de la señal rdreq y la señal q que se está actualizando.

Si lo desea, puede registrar la señal readdata para mejorar Fmax, en cuyo caso agregue 1 a la latencia de lectura.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas