show menu


Les utilisateurs connectés peuvent télécharger ce tutoriel en pdf

Controller la partie PL depuis la partie PS dans un Zynq-7000

Posté par Florent - 20 Mars 2017

Introduction

Dans ce tutoriel, nous allons accéder à la partie Programmable Logic (PL) d’un Zynq-7000 depuis sa partie Processor System (PS) afin de contrôler les LEDs de la carte Xilinx ZC702. Ce tutoriel est réalisé en utilisant Vivado 2016.2 mais il peut facilement être réalisé sur une autre version de Vivado. Aussi, bien que ce tutoriel cible une carte Xilinx ZC702, les mêmes étapes peuvent être utilisées pour d’autres cartes à base de Zynq telles que la ZYBO ou la ZedBoard.

Créer le design Hardware dans Xilinx Vivado

Ouvrez Vivado 2016.2 et créez un nouveau projet RTL. Créez un nouveau BD et ajouter une IP ZYNQ7 PS. Connectez l’entrée M_AXI_GP0_ACLK de l’IP ZYNQ7 PS a sa sortie FCLK_CLK0 (ces étapes sont expliquées en détail dans le tutoriel 8 - Première utilisation de la partie PS d'un Zynq-7000).

Pour accéder les LEDs de la carte ZC702 depuis la partie PS nous allons utiliser l’IP AXI GPIO. Ajoutez l’IP AXI GPIO en utilisant l’“IP catalog”.

Figure 1 – Ajouter l’IP AXI GPIO IP en utilisant l’IP catalog

Une fonctionnalité intéressante de Vivado est la fonctionnalité “Run Connection Automation”. Cliquer sur celle-ci va demander à Vivado de connecter l’IP AXI GPIO à l’IP ZYNQ7 PS automatiquement. Cliquez sur “Run Connection Automation” pour l’exécuter.

Figure 2 - Vivado IPI - Run Connection Automation

Sélectionnez “All Automation” dans la fenêtre “Run Connection Automation”.

Figure 3 - Fenêtre “Run Connection Automation”

Vivado a ajouté deux blocs, l’IP Processor System Reset et l’IP AXI Interconnect, requises pour connecter l’IP ZYNQ7 PS et l’IP AXI GPIO.

Figure 4 - Our system

Double cliquez sur l’IP AXI GPIO pour la configurer. Dans la partie “board” assurez-vous que l’option “board interface” pour “GPIO” soit configuré en “Custom”.

Figure 5 – Configuration de l’IP AXI GPIO – Onglet Board

Dans la partie “IP configuration”, sélectionnez “All Outputs” et configurez la valeur de “GPIO Width” a 8. Fermer l’IHM de configuration de l’IP AXI GPIO.

Figure 6 – IHM AXI GPIO

Valider le design. Vous ne devriez pas rencontrer d’erreur. Si l’on ouvre la page “Address Editor” dans le BD, on peut voir le mappage mémoire pour toutes les IPs du design. On peut voir que Vivado a assigné l’adresse 0x41200000 à nos GPIOs.

Figure 7 - Address Editor

Gênerez les “Outputs Products” de la BD et créez un wrapper HDL. Lancer la synthèse et ouvrez ensuite le design synthétisé. Dans la partie “device editor”, assignez les ports de sorties gpio_sw aux pins du FPGA correspondant aux LEDs.

Ports name

Package Pin

I/O Std

User Led

Gpio_sw_tri_o[7]

E15

LVCMOS25

DS19

Gpio_sw_tri_o[6]

D15

LVCMOS25

DS20

Gpio_sw_tri_o[5]

W17

LVCMOS25

DS21

Gpio_sw_tri_o[4]

W5

LVCMOS25

DS22

Gpio_sw_tri_o[3]

V7

LVCMOS25

DS18

Gpio_sw_tri_o[2]

W10

LVCMOS25

DS17

Gpio_sw_tri_o[1]

P18

LVCMOS25

DS16

Gpio_sw_tri_o[0]

P17

LVCMOS25

DS15

 

Figure 8 - Package Pins

Appuyez sur “Ctrl+S” pour enregistrer les contraintes. Comme nous n’avons pas encore de fichier de contrainte dans notre projet, Vivado nous propose de créer un nouveau fichier de contraint pour enregistrer les contraintes de location de pins. Créez un nouveau fichier appelé “phys_const” et cliquez sur OK.

Figure 9 – Créer un nouveau fichier de contraintes pour enregistrer les contraintes créées

Gênerez le Bitstream, exporter le Hardware vers SDK (en incluant le Bitstream) et lancez SDK.

Créer le projet Software dans Xilinx SDK

Créer l’application dans SDK

Créer un nouveau projet application (“File > New > Application Project”) avec une nouvelle Board Support Package (BSP).

Figure 10 – Nouveau projet application dans Xilinx SDK

Dans la liste projets exemples (templates), sélectionnez le projet “Hello World”. Lancez l’application sur la carte ZC702 et regardez si vous obtenez le texte “Hello World” dans la console UART (cette étape est expliquée dans le tutoriel 8 - Première utilisation de la partie PS d'un Zynq-7000).

Contrôler les LEDs

Pour accéder aux LEDs nous avons ajouté une IP AXI GPIO à notre design Hardware. La BSP créée par SDK devrait donc contenir les drivers permettant de contrôler cette IP. Afficher le contenu de la BSP de votre projet (comme montré dans la Figure 11). Sous “libsrc” vous devriez voir “gpio_v4_1” (avec éventuellement une autre version si vous avez utilisé une autre version de Vivado/SDK).

Figure 11 – Contenu de la BSP

Ouvrer le fichier “helloworld.c” contenu dans votre projet.

Premièrement, nous devons initialiser les pointeurs vers les GPIOs. Pour cela j’ai utilisé la fonction int XGpio_Initialize(XGpio * InstancePtr, u16 DeviceId) qui est declarée dans le fichier xgpio.h (le contenu de la fonction est accessible dans le fichier xgpio_sinit.c). Cette fonction à besoin de deux paramètres, InstancePtr, qui est le pointeur vers les GPIOs qui doit être initialisé par la fonction et DeviceId. Pour le paramètre InstancePtr, créez une nouvelle structure myGPIO de type XGpio et passez son adresse à la fonction. Pour le paramètre DeviceId, on peut utiliser la constante XPAR_AXI_GPIO_0_DEVICE_ID qui est declarée dans le fichier xparameters.h

Ensuite, pour changer la valeur des LEDs, j’ai utilise la fonction void XGpio_DiscreteWrite(XGpio * InstancePtr, unsigned Channel, u32 Data) qui est également déclarée dans le fichier xgpio.h (la structure de la fonction est accessible dans le fichier xgpio.c). Le paramètre InstancePtr est l’adresse de la structure XGpio creee precedement, entrez1 pour le parametre Channel et la valeur que vous souhaitez afficher sur les LEDs au paramètre Data.

Vous pouvez trouver le contenu de mon fichier en annexe de ce document.

Lancer le Software en mode Debug

Créer une Xilinx C/C++ debug application (GDB) et lancer la (voir tutoriel 8 - Première utilisation de la partie PS d'un Zynq-7000). Exécutez le code en pas à pas en utilisant l’icône “Step Over ou en appuyant sur “F6”.

Lorsque la ligne “success = XGpio_Initialize(&myGPIO, XPAR_AXI_GPIO_0_DEVICE_ID);” a été exécuté, regarder la valeur de myGPIO dans la fenêtre “variables” (si la fenêtre n’est pas dans la vue, cliquez sur Window > Show View > Variables). On peut voir que la valeur de myGPIO->BaseAddress est 0x41200000 (même valeur que nous avons vu précédemment dans l’“Address Editor” de Vivado).

Figure 12 – Fenêtre Variables dans SDK

Continuez l’exécution du code en appuyant sur l’icône “Resume”  ou en appuyant sur “F8”. Vous devriez voir la valeur des LEDs changer sur la carte ZC702.



Poster un commentaire

Seuls les utilisateurs connectés peuvent poster des commentaires