Projet VHDL avec Vivado

Prérequis et lancement de Xilinx Vivado

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.

Création d'un projet VHDL

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

Création d'un projet sous Vivado

Valider en cliquant sur Next

Type de projet

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.

add source 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 de la cible

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.

Description en langage VHDL

Première étape : création du nouveau fichier source

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.

Vue externe du diviseur de fréquence dixiemeSeconde

Pour réaliser cela, on commence par ajouter un nouveau fichier source au projet : Menu File->Add sources...

Ajout d'un nouveau fichier source VHDL

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.

Création du fichier source dixiemeSeconde

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.

Définition de la vue externe de dixiemeSeconde

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 :

Fichier de base de dixiemeSeconde

Seconde étape : écriture du code VHDL du diviseur de fréquence

Compléter la description VHDL comme ceci :

Code source VHDL de dixiemeSeconde

Simulation sans testbench

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 :

Définir clk_in à 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.

Boutons de contrôle de la simulation

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

Contraintes de placement/routage

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 :

Fichier de contraintes

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

Implémentation

Fichiers sources et contraintes étant spécifiés, on procède à l'implémentation qui consiste en la succession des opérations suivantes :

  1. RTL Analysis : traduction du projet VHDL sous la forme d'une netliste à partir d'éléments fonctionnels usuels (mémoires, additionneur, multiplexeurs...),
  2. Synthesis : exploitation de la netliste RTL pour cibler les ressources disponibles dans le composants programmables (LUT, bascules, mémoires, blocks DSP...),
  3. Implementation : placement et routage de la structure issue de la synthèse dans le composant.

Lancer l'implentation.

A l'issue de cette étape, on peut observer le résultat des différentes opérations dans le composant :

Résultat du placement routage dans le composant

Après zoom :

Résultat du placement routage dans le composant 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.

Test dans la Zybo

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.

Résultat Generate Bitstream

Préparation de la carte :

  1. Vérifier que le jumper JP7 situé à gauche du connecteur ethernet est configuré avec VU5VO et USB connectés ensemble.
  2. Vérifier que le jumper JP5 situé sous le connecteur VGA assure la connexion entre les points QSPI et JTAG.
  3. Connecter la carte Zybo au PC en USB.
  4. Alimenter la carte en positionnant le switchSW4 sur ON.

Connexion à la carte :

  1. Choisir Autoconnect dans le menu Tools ou cliquer sur PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target -> Autoconnect dans le Flow Navigator.

Sous Linux, en cas de problème pour se connecter à la carte, procéder à l'installation des pilotes :

  1. Ouvrir un Terminal.
  2. Se rendre dans le dossier ‹Vivado Install Dir›/data/xicom/cable_drivers/lin64/install_script/install_drivers/
  3. Exécuter le script d'installation des pilotes en lançant la commande Linux : sudo ./install_drivers

Chargement de la configuration dans la carte Zybo :

  1. Menu Tools->Program Device->xc7z010_1
  2. Vérifier que le fichier bitstream correspond bien au projet en cours et valider par Program.

A l'issue de la programmation, la LED LD0 clignotte 10 fois par seconde.

Exercice

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 :

  1. Ajouter le port correspondant à l'entité.
  2. Ajouter un signal interne de comptage utile à la génération du signal de sortie.
  3. Modifier le test bench pour prendre en compte ces évolutions et permettre un test pertinent du nouveau module.
  4. Ajouter la définition de la nouvelle sortie dans le fichier de contraintes pour cibler la LED LD1 (broche M15 du Zynq).
  5. Implémenter le projet et envoyer la configuration dans le composant pour observer le travail réalisé.