MM2S la transferencia simple salió mal

1

Seguí algunos ejemplos y ya logré realizar una gran transferencia de S2MM (flujo a memoria asignada) mediante una AXI DMA .

Sin embargo, ahora estoy intentando lo contrario, es decir, para realizar una transferencia MM2S simple a un bloque de IP muy simple que hice y el resultado devuelto del bloque es incorrecto. Tenga en cuenta que el código MM2S también es casi una copia de los ejemplos que encontré.

Intenté la depuración con la herramienta ILA (analizador lógico integrado) de Vivado y el resultado está en el archivo adjunto.

¿Puedes ayudarme a entender por qué estoy escribiendo los siguientes valores:

static void initialize_parameters(u32 SrcAddress){
u32 *BufferPtr;
union float32 thisfloat;

BufferPtr=(u32*)(SrcAddress);
thisfloat.f32=10.0;
BufferPtr[0]=thisfloat.u32;

thisfloat.f32=0.0;
BufferPtr[1]=thisfloat.u32;

thisfloat.f32=10.0;
BufferPtr[2]=thisfloat.u32;

thisfloat.f32=20.0;
BufferPtr[3]=thisfloat.u32;

}

y haciendo una transferencia como esta:

// Kick off DMA transfers
Status = XAxiDma_SimpleTransfer(&axi_dma, PARAMETERS_ADDR, 4*4, XAXIDMA_DMA_TO_DEVICE);

y los parámetros de señal_TDATA cuando tvalid = 1 ¿es eso lo que podemos ver en el archivo adjunto? Además, el resultado final es incorrecto. ¿Qué estoy haciendo mal?

También,aquíhayunapantalladeimpresióndemidiseñodebloqueenVivado.Nota:estoytrabajandoenunZedboard

    
pregunta João Pereira

1 respuesta

1

Parece que funciona, bueno, casi. El primer error que veo es que no manejas axis_tready . De acuerdo con la especificación AXI-Stream, un intervalo de datos solo es válido si tanto axis_tready como axis_tvalid son '1'. El AXI DMA controla axis_tvalid como se esperaba, pero no completa la transferencia de 4 dwords ya que axis_tready no se controla. Sin embargo, la transferencia general parece funcionar como se esperaba.

Apuesto a que tienes un problema de caché. Cuando se ejecuta initialize_parameters , escribe los datos en la memoria caché, y si inicia la transferencia DMA antes de que la memoria caché se vacíe en DDR, no leerá lo que escribió, pero lo que era todavía está en la DDR. No tengo mucha experiencia con el Zynq y es un sistema de caché extenso, así que tienes que descubrir cómo vaciar el caché correctamente. Las funciones que busca son las funciones de descarga de "xil_cache_l.h", en microblaze usaría Xil_DCacheFlushRange(SrcAddress, 4*4) . Mirando el código, parece vaciar los cachés L1 y L2 en Zynq, por lo que probablemente sea todo lo que necesita. Si no funciona, intente escribir un megabyte de datos, se asegurará de que las primeras 4 palabras clave se vacíen de esa manera.

Ya que tiene el ILA para el bus AXI, debería poder verificar si hay una transacción de escritura en la dirección SrcAddress , si no hay antes de la transacción de AMA de DX, sabrá que esto es un problema de caché.

En una nota al margen, cuando lee utilizando el AXI-DMA, debe invalidar la caché antes de leer desde el DDR. De lo contrario, si lee en SrcAddress , inicie la Transferencia DMA y vuelva a leer en ScrAddress , leerá el valor antiguo que todavía está en la memoria caché.

    
respondido por el Jonathan Drolet

Lea otras preguntas en las etiquetas