03 – Hello LEDvision.deis.unibo.it/~smatt/DIDATTICA/Sistemi_Digitali_M/PDF/03_He… · 03 –...

Post on 14-Jul-2020

3 views 0 download

Transcript of 03 – Hello LEDvision.deis.unibo.it/~smatt/DIDATTICA/Sistemi_Digitali_M/PDF/03_He… · 03 –...

1 1

Sistemi Digitali M

03 – Hello LED

Stefano Mattoccia, DISI - University of Bologna

Creazione periferiche (C/C++) e validazione (C/C++)

Design entry grafico

Sviluppo software C/C++ per uno specifico OS

Fasi di sviluppo di un progetto Zynq

Questa parte sarà oggetto della mggior parte delle prossime lezioni

ARM Memory Controller

Custom Module (FPGA) (e.g., GPIO)

DDR

AXI Lite

Esempio: accensione LED mediante ARM

Consideriamo, per il momento una periferica già esistente in forma di IP Core denominata GPIO.

DDR

GPIO AXI INT

La memoria (esterna) e lo spazio di indirizzamento (32 bit) sono condivisi tra:

•  ARM Cortex A9_0

•  ARM Cortex A9_1

•  FPGA

Vi è un unico memory controller (all’interno del PS) e un unico spazio di indirizzamento per le memorie e le periferiche (sia ARM sia FPGA) che sono pertanto memory mapped tra:

0x00000000 -> 0xFFFFFFFF

La PL (FPGA), è connessa al controllore della memoria DDR mediante le porte High Performance HP 0, 1, 2, 3. Elevate prestazioni (GB/s) in lettura e scrittura

Zynq: spazio di indirizzamento

0x00000000

0xFFFFFFFF

DDR

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

0x00100000

0x1FFFFFFF

GPIO 0x41200000

Il progetto Vivado risultante per il controllo di 8 led mediante un IP core (GPIO) con interfaccia AXI lite è il seguente:

Ne progetto è stato inserito (automaticamente) un hub (AXI interconnect) nel caso si decidesse in futuro di utilizzare altre periferiche AXI lite. Inoltre, è stato inserito (automaticamente) un modulo per il controlle del reset del sistema (Processor System Reset).

Progetto Vivado

#include <stdio.h> #include "platform.h" #include "xil_io.h" #include <unistd.h> int main() { init_platform(); int c; useconds_t sleeping_time_us = 50000; printf("Hello LED\n"); for (c=0;c<=255;c++) { printf("Xil_Out start %d\n",c); Xil_Out8(0x41200000, c); printf("Xil_Out done, sleeping for %d us\n",sleeping_time_us); usleep(sleeping_time_us); } for (c=255;c>=0;c--) { printf("Xil_Out start %d\n",c); Xil_Out8(0x41200000, c); printf("Xil_Out done, sleeping for %d us\n",sleeping_time_us); usleep(sleeping_time_us); } cleanup_platform(); return 0; }

Codice ARM/SDK (Baremetal OS)