Les Travaux pratiques de Xilinx Vivado sont proposés avec la version 2019.1 et reposent sur la carte Zybo de Digilent (version B3).
Lancer Vivado HLx.
Attention : Vivado HLS concerne le développement de module IP en langage C et ne sera abordé que beaucoup plus tard.
Choisir Create Project dans la section Quick Start de l'écran d'accueil de Vivado.
Note importante : Pour les utilisateurs dont les fichiers personnels sont stockés sur un réseau, préférer la création du projet dans un dossier local à la station de travail (Vivado effectue de très nombreux accès disques et ses performances chuttent considérablement en passant par un réseau local).
Nom de ce premier projet : ProjetVHDL
Valider en cliquant sur Next
Laisser le choix par défaut (Register Transfer Level project) et valider par Next.
La boite de dialogue suivante propose d'ajouter des sources au projet (existants ou en les créant). Nous n'ajoutons pas de source mais en revanche, il faut préciser quel sera le langage cible (Target Language) et pour nous ce sera le VHDL.
Pour le moment, on choisit de passer cette étape en cliquant sur Next.
Passer la boite de dialogue permettant d'ajouter des contraintes en cliquant sur Next.
On termine la création du projet en choisissant la cible qui peut être simplement un composant (FPGA ou SoC) ou une carte intégrant un FPGA ou un SoC. Dans notre cas, il s'agit de la carte Zybo version B.3 dans la catégorie Boards.
Choix qu'il faut valider par Next.
Vivado propose un récapitulatif des caractéristiques du projet créé qu'il suffit de valider par Finish pour lancer le processus de création du projet.
Pour ce premier exemple, on procède à une description d'un module simple en langage VHDL. Ce premier exemple permet de faire clignoter la LED LD0 de la carte Zybo 10 fois par seconde.
Il s'agit donc de réaliser un diviseur de fréquence permettant de passer de la fréquence de 125MHz, notée clk_in et présente sur la carte Zybo (broche L16 du Zynq), à la fréquence de 10Hz, notée clk_out.
Pour réaliser cela, on commence par ajouter un nouveau fichier source au projet : Menu File->Add sources...
Conserver le choix par défaut pour ajouter ou créer un nouveau fichier source et passer à la suite en cliquant sur Next.
Dans la boite de dialogue Add or Create Design Sources, cliquer sur le bouton Create File.
Ce premier fichier est nommé dixiemeSeconde conformément à ce qui est présenté sur l'image ci-dessus et validé par un clic sur OK.
On ferme alors la boite de dialogue d'ajout et création de fichiers sources en terminant par Finish.
Dans la foulée, Vivado propose de définir les modules créés en les caractérisant par leur vue externe, c'est à dire en fournissant la liste des entrées, sorties et signaux bidirectionnels.
Compléter en respectant la copie d'écran suivante puis valider par OK.
On obtient alors la structure de projet suivante avec un fichier source dont l'entité est décrite en conformité avec ce qui a été défini précédemmment :
Compléter la description VHDL comme ceci :
L'outil de simulation de Vivado permet de définir les signaux de stimulii d'entrées graphiquement ce qui est suffisant pour des simulations simples.
Dans la section Flow Navigator, cliquer sur Run Simulation, puis Run Behavioral Simulation pour lancer le simulateur dans le mode simulation fonctionnelle (on ne simule que le code sans prendre en compte le comportement du circuit cible).
Dans la section comportant les résultats graphiques de simulation, sélectionner clk_in puis Force Clock... dans le menu contextuel. Renseigner la boite de dialogue comme suit pour définir clk_in comme étant un signal d'horloge à 125MHz :
Utiliser les boutons de gestion de la simulation pour remettre à 0 le processus de simulation puis la relancer pour une durée de 120ms.
La visualisation des résultats se fait en utilisant intuitivement l'outil de simulation. Savoir qu'il est possible de zoomer en utilisant la combinaison CTRL + molette de la souris et qu'on peut aller d'une transition à une autre sur un signal en sélectionnant le signal ciblé et en utilisant les boutons montrant une flèche pointant sur un front montant ou descendant.
Note : On prendra soin de vérifier que la période du signal de sortie est précisément de 0.1s
Ajouter un nouveau fichier source choisi dans la catégorie Constraints et le nommer zybo_reduit.xdc.
Compléter le fichier de contraintes comme suit :
Ce fichier permet de spécifier l'emplacement des signaux sur le Zynq ainsi que la technologie de signal à imposer.
Ainsi l'horloge d'entrée est positionnée sur la broche L16 du Zynq et elle est de type LVCMOS 3.3V. Comme il s'agit d'une entrée d'horloge, une ligne supplémentaire précise ses caractéristiques temporelles. Attention, ces informations ne crée pas le signal à 125MHz mais indique au logiciel la fréquence du signal effectivement connecté sur cette entrée.
La sortie clk_out sort sur la LED LD0 connectée à la broche M14 du Zynq sur la Zybo (voir l'inscription M14 présente sur le PCB de la carte Zybo près de la LED LD0).
Fichiers sources et contraintes étant spécifiés, on procède à l'implémentation qui consiste en la succession des opérations suivantes :
Lancer l'implentation.
A l'issue de cette étape, on peut observer le résultat des différentes opérations dans le composant :
Après zoom :
Cette figure montre un zoom sur une macrocellule constituée de deux Slices. Dans l'une des tranches, les bascules de sorties sont utilisées; tandis que dans la seconde ce sont essentiellement les LUT qui sont exploités.
Avant de pouvoir tester le design dans la carte Zybo, il reste à générer le fichier bitstream en lançant la commande Generate Bitstream dans la catégorie PROGRAM AND DEBUG de la section Design Flow.
Après exécution, on choisit d'ouvrir le gestionnaire de matériel (Open Hardware Manager) et on valide par OK.
Préparation de la carte :
Connexion à la carte :
Sous Linux, en cas de problème pour se connecter à la carte, procéder à l'installation des pilotes :
Chargement de la configuration dans la carte Zybo :
A l'issue de la programmation, la LED LD0 clignotte 10 fois par seconde.
Reprendre le module précédent et ajouter une sortie pour pouvoir piloter la LED D1 avec une fréquence de 1Hz.
Remarque : pas question de dupliquer le diviseur de fréquence précédent avec une nouvelle butée fixée à 125 000 000. Il faut exploiter la division précédente et ajouter une étape de division par 10 supplémentaire.
Quelques étapes pour vous aider :
Vous pouvez contribuer par vos dons (1€, 5€, 10€ ou au choix) au développement de nouveaux tutoriaux nécéssitant d'investir dans du matériel spécifique, de financer la fabrication de circuits imprimés permettant d'illustrer certains aspects théoriques et pratiques...
Vous avez un compte PayPal ? Faites votre don en évitant les frais PayPal :
Vous n'avez pas de compte PayPal, cliquez sur le bouton ci-dessous :