La forma más rápida de transferir datos desde la sección VHDL al procesador Microblaze

0

Mi aplicación básica consiste en enviar muestras de ADC a PC a través de Ethernet. El muestreo y almacenamiento de ADC se realiza en la sección VHDL, mientras que el código de programación del conector Ethernet está en el procesador Microblaze.

Microblaze está funcionando a 60MHz y el FPGA está a 100MHz (me he encargado del problema de los CDC). Para transferir datos 1k me lleva 740us. Tengo un BRAM de doble puerto donde se almacenan las muestras y, tras una interrupción, Microblaze lo leerá desde el segundo puerto. Para simplificar, he mantenido el BRAM leído en estado siempre habilitado y solo estoy leyendo los datos por dirección.

Cualquier idea sobre cómo puedo transferir los datos de una manera más rápida.

He agregado los detalles de la conexión BRAM para más referencia. He usado el tipo simple de doble puerto BRAM.

Buf_2k : Ethernet_test_data
  PORT MAP (
    clka => ADC_clock,                      --10MHz clock
    wea(0) => BRAM_wr_en,                   --Write enable generated synchronously to ADC_clock
    addra => buf_wr_addr(10 downto 0),      --BRAM address generated similarly as write enable
    dina => ADC_data_trig,                  --Registered ADC data to be stored in BRAM
    clkb => CLK_50M,                        --50MHz clock generated from DCM
    addrb => BRAM_addr(10 downto 0),        --Address coming from Microblaze to read the data
    doutb => BRAM_dout                      --This data out is directly connected to Microblaze
  );
    
pregunta samjay

1 respuesta

1
  

Cualquier idea sobre cómo puedo transferir los datos de una manera más rápida.

Podrías usar el FSL (o AXI-Stream en microblazes más nuevos), ya que es un ciclo único "leído desde FIFO" en el registro.

Pero realmente la pregunta es ¿qué quieres decir con transferencias más rápidas?

Los datos ya están "en el subsistema Microblaze" una vez que están en un BRAM al que puede acceder el MB. El procesador solo puede ir lo más rápido que pueda, no puede obtener los datos más estrechamente acoplados de lo que ya está (asumiendo que el BRAM está conectado directamente a un LMB), el acceso al BRAM es muy rápido. Eche un vistazo al código de ensamblaje del bucle en el que está leyendo los datos; es probable que haya muchas cosas en marcha (todo lo cual es necesario si tiene el C-optimizador activado).

Está midiendo 42 ciclos por lectura de 32 bits, lo que suena bastante lento. Algunos pensamientos:

  • ¿Está procesando los datos en el bucle que los lee?
  • ¿Está su código de bucle en el caché o está ejecutando desde alguna memoria externa?

En el mejor de los casos, simplemente leyendo los datos a un registro y luego ignorándolos, podría lograr algunos ciclos por palabra.

    
respondido por el Martin Thompson

Lea otras preguntas en las etiquetas