Jun 13 2010

Atrium der Stusta zum Stustaculum 2010

360 Grad Panorama des Atriums der Stusta 2010

360 Grad Panorama des Atriums der Stusta 2010

Dieses Panorama entstand an einem Morgen während des Stustaculums im Atrium der Studenten Stadt München – Freimann. Es besteht aus 12 Fotos mit einer Brennweite von 12 mm welche ich mit der Canon 5D II eines bekannten aus der Hand aufgenommen habe und deckt annähernd 360 Grad ab. Auf dem Bild sind noch deutlich die Pfützen von den vorhergegangenen Regenfällen zu sehen. Um das Panorama etwas netzfreundlicher zu machen habe ich es von 55 MegaPixeln auf eine (halbwegs) brauchbare Auflösung runter gerechnet und komprimiert.  In der Originalgröße ist die Abbildungsqualität einiger Bilder nicht sooo toll. Sie weisen trotz einer Blende von 9 eine gewisse Unschärfe auf die ich bei 12mm so nicht erwartet hätte.

Gestiched wurde das Panorama mit AutopanoPro unter Gentoo Linux 64 Bit.
Kleiner gerechnet mit Gimp.


Jun 10 2010

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//4096

int 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.