Xilinx Microblaze XDmaCentral DMA Controller
Dieses einfache Beispiel soll verdeutlichen wie man am einfachsten mit dem XCmaCentral XPS Central DMA Controller umgeht, es ist für ein Anfang bewusst einfach gehalten. Und kopiert Werte von einem Speicherbereich im SD oder DDR RAM in den anderen. Bei dem System ist darauf zu achten dass, Microblaze, DMA Controller (SPLB & MPLB) und Speicher im Xilinx Platform Studio (XPS) am gleichen Buss hängen. Ist man soweit kann man das Projekt für das Xilinx Software Development Kit (SDK) exportieren.
Beim programmieren des DMA gibt es ein paar kleine Stolperfallen.
- bei XDmaCentral_SetControl sollte man sehr genau darauf achten Source und Destination nich zu vertauschen
- XDmaCentral_Transfer will eine Angabe haben wie viele Byte er zu übertragen hat … das sind für eine 32 Bit Variable also 4 …
Sonst ist die Konfiguration sehr “straightforward” ….
#include “xparameters.h”
#include “xintc.h”
#include “xdmacentral.h”
#define TEST_BUFFER_SIZE 20//4096int main () {
static XDmaCentral dma;
Xuint32* Buffer;
Xuint32 *Buffer2;
Buffer = (Xuint32 *)0x8c000A00;
Buffer2 = (Xuint32 *)0x8c000000;
//(XPAR_DDR2_SDRAM_16MX32_MPMC_BASEADDR);Xuint32 Index;
XStatus Status;for (Index = 0; Index < TEST_BUFFER_SIZE; Index++)
{
Buffer[Index] = Index+41;
}for (Index = 0; Index < TEST_BUFFER_SIZE; Index++)
{xil_printf(“\n\r %x %d”,&Buffer[Index], Buffer[Index]);
}Status = XDmaCentral_Initialize(&dma, XPAR_XPS_CENTRAL_DMA_0_DEVICE_ID);
if (Status != XST_SUCCESS)
{
xil_printf(“The Central DMA Didn’t Initialize! \r\n”);
return XST_FAILURE;
}
XDmaCentral_Reset(&dma);XDmaCentral_SetControl(&dma,XDMC_DMACR_SOURCE_INCR_MASK
+XDMC_DMACR_DEST_INCR_MASK);
XDmaCentral_Transfer(&dma,(Xuint32 *) Buffer, (Xuint32 *) Buffer2, TEST_BUFFER_SIZE*4);xil_printf(“\n\r Speicherzelle in Buffer %x wert an der stelle %d”,Buffer,*Buffer);
xil_printf(“\n\r Speicherzelle in Buffer %x wert an der stelle %d”,Buffer2,*Buffer2);for (Index = 0; Index < TEST_BUFFER_SIZE; Index=Index+1)
{
xil_printf(“\n\r %x %d”,&Buffer2[Index],Buffer2[Index]);
}xil_printf(“\r\nDone”);
return 0;
}
Das kleine Programm erzeugt ein Array im RAM welches dann vom DMA Controller in ein anders Umgespeichert wird. Im nächsten Schritt werde ich nun daran Arbeiten Daten mit dem Central DMA an und von meinem Ipif Modul zu übertragen. Der Central DMA kommt deswegen zum Einsatz da für den PLB4.6 kein IpIf Modul mit Integriertem DMA zur Verfügung steht. Siehe hier.