Dans ce TP, vous allez réaliser votre première conception (j’utiliserai aussi le mot design) simple qui va vous permettre de découvrir les entrées et sorties de la carte Basys3. Par la même occasion, ce TP vise à fournir une initiation à l’utilisation des outils de Xilinx. De par sa simplicité, c’est aussi un bon exemple pour comprendre le fonctionnement de la chaîne de transformation : comment à partir d’un code de description vous allez, par Vivado , produire un fichier toplevel.bit. Ce fichier est ensuite chargé sur la carte afin d’implanter sur celle-ci le circuit spécifié dans Vivado.
Il faudra réutiliser le résultat Add4 pour la question 2,
Conçue sur la base d'un très puissant FPGA Artix-7 XC7A35T-1CPG236C de Xilinx™ (associé à de nombreux périphériques: BP, afficheurs, Leds, port USB, Port VGA...), cette platine de développement est idéale pour l'apprentissage rapide des techniques de conception numérique moderne.
La platine "BASYS3'" conviendra ainsi tout aussi bien pour la réalisation d'applications de décodage logique très simple comme pour la mise au point de réalisations extrêmement complexes et puissantes.
La platine nécessite un câble USB pour permettre sa programmation depuis un compatible PC. La platine est entièrement compatible avec la suite logiciel WebPack™ Vivado.
1 Power good LED 9 FPGA configuration reset button
2 Pmod connector(s) 10 Programming mode jumper
3 Analog signal Pmod connector (XADC) 11 USB host connector
4 Four digit 7-segment display 12 VGA connector
5 Slide switches (16) 13 Shared UART/ JTAG USB port
6 LEDs (16) 14 External power connector
7 Pushbuttons (5) 15 Power Switch
8 FPGA programming done LED 16 Power Select Jumper
Figure 2 La carte Basys3
Extensions via connecteurs Pmod™:
Les ports d'E/S du FPGA sont repris sur 4 connecteurs femelles spécifiques.
Ces connecteurs permettent l'utilisation de petits modules d'extensions optionnels (appelés "Pmod").
Une fois enfichées sur les connecteurs femelles de la platine "BASYS3", ces modules vous permettrons d'adjoindre de multiples possibilités et interfaces supplémentaires
Voici un lien où l'on peut en trouver pmod... de quoi lancer quelques projets en deuxième semestre....
- Equipé d'un FPGA Artix-7 XC7A35T-1CPGC
- 23633,280 logic cells (5200 slices)
- 1,800 Kbits (fast block RAM)
- Five clock management tiles, each with a phase-locked loop (PLL)
- 90 DSP slices
- Internal clock speeds exceeding 450MHz
- On-chip analog-to-digital converter (XADC)
Périphériques présents sur la platine:
- 16 interrupteurs nommés SW0 à SW15. Quand un interrupteur est orienté vers la led, l’entrée du FPGA qui lui est connecté est au niveau haut.
- 16 Leds nommées LD0 à LD15. Une led s’allume quand la sortie du FPGA qui lui est connectée est au niveau haut.
- 5 boutons-poussoirs nommés BTNU, BTND, BTNL, BTNR, BTNC. L’appui sur un de ces boutons déclenche une impulsion positive (met au niveau 1 l’entrée correspondante).
- Afficheur 7 segments(4 digits) Un segment s’allume quand la sortie du FPGA qui lui est connecté est au niveau bas et que son anode est à 0.
- 4 Connecteur Pmod™ (3 modèles 12 broches + 1 avec signaux XADC)
- Sortie VGA12 bits
- Interface USB-UART; prise micro USB qui sert à la fois de liaison JTAG pour programmer le FPGA mais aussi de port série. De plus, l’USB peut servir à alimenter la carte.
- Mémoire Flash série
- USB HID Host pour souris, clavier et autre stick mémoire externes
Les différents outils de conception que vous utiliserez lors des travaux pratiques sont tous intégrés et accessibles directement depuis le navigateur de projet Vivado2018.01. Vivado permet une grande efficacité car il regroupe plusieurs aspects de la conception d’un projet dans un seul environnement et un seul jeu de fichiers.
Ces TPs recouvrent l’approche de conception par le langage VHDL. Bien qu’assez différente de l 'approche schématique abordée en Licence 2 à Lille en TP d'architecture , ces deux approches mènent exactement au même résultat final. Pour ceux qui l'on fait, vous constaterez que l’approche par schéma est plus près du schéma bloc et de la réalisation du circuit alors que l’approche par langage VHDL est liée davantage aux processus algorithmiques et semble par conséquent plus abstraite. Pour ceux qui viennent d'ailleurs, vous pouvez refaire ces TPs en mode simulation avec l'autre environnement Xilinx ISE qui supporte la conception schématique. La carte basys3 n'est quant à elle pas supportée par ISE :-(
L’approche par schéma est sans doute plus instinctive que l’approche VHDL. Elle est d’ailleurs davantage préconisée pour les concepteurs débutants ou novices(en L2). Les concepteurs aguerris (en M1) préfèrent généralement l’approche par langage VHDL parce qu’elle est plus flexible et plus efficace. De plus, cette dernière présente une meilleure compatibilité avec les outils EDA et elle est davantage employée dans l’industrie.
La Figure 3 illustre le flow de conception type sous Vivado. C'est un extrait du tutorial Vivado-Teaching sur une carte Nexys4 assez similaire mais plus riche que la Basys3.
Voici une présentation de la chaîne de développement Vivado de la société Xilinx. Elle comprend les étapes suivantes.
1. Ecriture du modèle VHDL avec l’éditeur intégré du navigateur de projet. Nous allons voir au chapitre suivant une introduction à l’écriture de modèles VHDL synthétisables. Il y a deux parties à écrire :
L’entité (entrées/sorties),
L’architecture (la description du fonctionnement).
2. Ecriture du testbench (optionnelle). Pour pouvoir simuler le modèle VHDL de notre design, il faut écrire des vecteurs (stimuli) de test qui forment le testbench. Ils peuvent être introduit dans une première étape interactivement pendant la simulation. Le testbench permet de lancer plusieurs simulations avec les mêmes stimuli avec un gain de temps appréciable.
3. Simulation fonctionnelle. A partir des fichiers vhdl défini pour le système en cours de développement (toplevel.vhd) et éventuellement du testbench (toplevel_tb.vhd , générateur des vecteurs de test en VHDL), nous pouvons effectuer la simulation fonctionnelle du design.
compilation des fichiers,
lancement du simulateur sur une certaine durée simulée
exécution des vecteurs de test,
vérification du fonctionnement à l’aide des chronogrammes à chaque période de l’horloge.
4. Synthèse logique. La synthèse est l’opération qui consiste, à partir de la description VHDL, à produire la netlist contenant le schéma électrique destiné aux outils de placement-routage. Le rôle du synthétiseur est de comprendre et d’interpréter une description abstraite du design en VHDL afin de générer une netlist composée de primitives simples compréhensible par les outils d’implémentation.
5. Implémentation. Le but de l’implémentation est de générer un fichier de configuration toplevel.bit permettant de programmer le FPGA à partir de la netlist. L’implémentation comprend plusieurs étapes :
otimisation du design issu de la synthèse,
placement de la logique obtenue dans le FPGA,
routage des interconnections,
génération du fichier binaire de configuration.
6. Simulation temporelle (optionnelle). Après le placement-routage, on peut obtenir un modèle physique du design ainsi que le fichier de timing qui lui est associé. On utilise le testbench créé à l’étape 2 pour effectuer la simulation, les temps de simulation sont alors assez longs...
7. Chargement. Une fois le design entièrement simulé, il faut charger le fichier de configuration du FPGA sur la carte correspondante via le Hardware Manager.
8. Vérification sur la maquette FPGA. Tous les designs réalisés dans ce cours seront testés sur la carte Basys3. La simulation ne peut être une preuve de fonctionnement.
Le logiciel Vivado est maintenant prêt à être utiliser. Il se lance avec la commande : xilinx-vivado en ligne de commande.
Le Navigateur de projet Vivado sera utilisé comme outil de conception lors de ces TPs. Cet outil de Xilinx permet de créer des projets comportant plusieurs types de fichiers pour la simulation, le placement et routage et finalement le bit file pour programmer le FPGA, des compilateurs génèrent ces fichiers, d’effectuer des vérifications du design, de créer des contraintes d’implémentation y compris des contraintes de timing sur les horloges, de déterminer l’emplacement des broches, de créer des bancs d’essai de simulation (testbench) et de gérer efficacement les projets d’envergure.
Le Navigateur de projet Vivado offre un environnement de conception centralisé, extrêmement efficace et qui regroupe tous les outils nécessaires à la conception, la simulation et à l’implémentation d’un projet d’envergure ainsi qu’à la configuration de la carte, la Basys3 en ce qui nous concerne.
Vivado chez vous!
Vous pouvez installer Vivado sur votre machine linux ou Windows. Reportez-vous à cette page pour l’installation.
C’est parti! Connectez la carte via le câble USB et placez l’interrupteur en position ON. Lancez le logiciel Vivado!
La Figure précédente identifie les principaux éléments de l’interface du Navigateur de Projet Vivado utilisé dans ces TPs. Pour utiliser ce logiciel sur les machines de l’université de Lille :
Récupérer le fichier de licence et l'enregistrer sur votre compte, l'adresse vous sera donnée par l'enseignant. Sur votre machine personnelle utilisez votre propre licence, il suffit d'en faire la demande sur le site Xilinx. Un tuto dispo ici pour la webpack edition : Installing Vivado, Xilinx SDK, and Digilent Board Files - Digilent Reference
Depuis Vivado, lancer le gestionnaire de licences dans le menu Help>Manage License
Dans l'interface de gestion de licences choisir Load License
Il vous reste à choisir le fichier que vous venez de copier par Copy License.
Charger le fichier de licence puis cliquer sur "close". Remarque: les étapes de 1 à 5 ci-dessus doivent être réalisées par chacun des binômes sur son propre compte (une seule fois pour tout le semestre), chacun utilisera son propre compte lors des contrôles TP!
Pour cette première expérience, nous aborderons les dispositifs de communication directe avec la carte Basys3, le vecteur de 16 switches (interrupteurs), les 16 Leds et une fonctionnalité de l’afficheur quatre fois 7 segments. La première partie est assez simple: vous afficherez sur les 16 Leds les résultats des 16 switches : ‘0’ ou ‘1’ pour éteint ou allumé. Il est possible de représenter un nombre de 16 bits codé en binaire dont la valeur peut évidemment s’afficher en hexadécimal sur quatre afficheurs : x0000 à xFFFF, soit b0000000000000000 à b1111111111111111 en binaire, soit 0 à 65565 en décimal (Notation : b pour nombre binaire, x pour nombre hexadécimal, rien pour décimal).
Vhdl est le langage de conception que vous découvrirez au fur et à mesure des séances. Cela ne vous empêche pas de regarder d’un peu plus près ce puissant langage de synthèse dont vous ne verrez que les éléments fondamentaux pendant ces 12 séances. Des milliers de références sur le net, ce lien Syntaxe VHDL vous sera néanmoins suffisant pour vos développements.
Pour commencer la conception, il faut créer un nouveau projet en cliquant sur l'icone Create New Project .
La prochaine étape sert à préciser le type de projet , ici nous choisissons RTL, il suffit de lire les informations pour en comprendre l’intérêt.
Nous pouvons dès à présent ajouter un certrain nombre de sources à notre projet. Partant de rien, nous allons créer une seule source toplevel.vhd en sélectionnant le bouton create file.
Il vous suffira de remplir les zones avec le nom choisi.Il apparaît ensuite dans la liste de sources.
En appuyant 2 fois sur Next on saute la partie ajout d'IP et ajout de contrainte. On y reviendra plus tard pour les contraintes. On arrive alors sur la spécification de la carte sur laquelle vous voulez produire les binaires. On peut le faire sous Parts en spécifiant tous les caractéristiques nécessaires. Je vous propose de choisir l'icone Boards où vous retrouverez la carte Basys3 qui est proposée. Choisissez là et poursuivez, puis cliquez sur Finish si vous êtes satisfait de la spécification finale du projet.
Figure 5 Caractéristiques de la carte Basys3
Vivado va alors vous proposer de pré formater le fichier vhdl toplevel. Il s'agit de lui donner les noms des ports du composant en entrée et en sortie ainsi que leur largeur en nombre de bit. Ici on utilisera les switch sw et les led, chacun sur 16 fils.
Votre fichier vhdl toplevel.vhd est maintenant dans votre projet, en cliquant sur le nom vous pouvez voir ce code qu'il reste à compléter. Un petit arbre devant le nom indique que ce fichier est le point d'entrée de notre projet ( le top level).
On retrouve à gauche dans le Flow Navigator, des outils de gestion du projet que nous découvrirons au fur et à mesure des leçons. Dans la fenêtre du code toplevel.vhd il s'agit d'un éditeur, je vous laisse découvrir les outils proposés, le Language Templates est un bon moyen de découvrir VHDL ;-)
Pour "souder" deux fils :
En vhdl pour connecter deux fils on utilise l'affectation de signaux <=.
Question 1:
Définissez l'architecture du code vhdl, entre begin et end, afin de connecter les led sur les switches indice par indice. Aidez vous d'exemple de codes ici.
Les erreurs de syntaxe sont automatiquement sous-lignées en rouge lors de la sauvegarde. Vous pouvez aussi obtenir la liste des erreurs dans l'onglet Messages en bas de la fenêtre. Cliquez sur l'erreur pour la/les corriger.
C'est fait vous allez pouvoir lancer une première simulation de ce code même si il ne fait pas grand chose. En cliquant sur Project Manager> Settings dans le Flow Navigator, une fenêtre s'ouvre dans laquelle vous pouvez choisir le simulateur et le fichier à simuler entre autres choses... Ici après avoir jeter un œil, laissez les valeurs par défaut. Dans la hiérarchie du projet devrait apparaître le volet Simulation Sources.
Vous étes en mesure de lancer la simulation par Simulation>Run Simulation. Prenez le temps de découvrir les outils proposés, vous gagnerez ainsi beaucoup de temps par la suite ;-)
Une fenêtre affichant la trace des signaux s'ouvre. vous allez pouvoir donner des valeurs successives à sw et en regarder les effets sur les signaux de sortie led. Pour cela un clic droit sur le nom d'un signal ouvre un menu contextuel où l'on trouve un force constant . Placez la valeur xFEAB sur sw.
Lancez alors la simulation pour 10ns avec les boutons qui contrôlent la simulation. (choisissez le bon bouton sinon le simulateur ne s’arrêtera pas..)
Changez à nouveau la valeur des switches à x1234 et relancez la simulation pour une nouvelle période de 10ns. Les led doivent prendre la valeur des switches. Voici ce que j'observe en jouant sur le zoom :
Ce simulateur sera fortement utile pendant nos séances afin de mettre au point les circuits avant le test final sur la carte.. Prenez le temps de découvrir cet outil...
Travail à valider : Je vous propose de changer le code que vous venez de simuler afin d'afficher sur les led , non pas la valeur des switch, mais son inverse bit à bit: 1 >> 0 et 0 >> 1. C'est ce code qu'il faudra valider sur la carte . Les opérateurs vhdl se trouvent ici .
Ce nouveau code que vous avez écrit ayant été vérifié par simulation comportementale , il est a priori synthétisable sur la carte . Pour l’instant le code vhdl est portable, afin de le transformer pour le charger sur la carte, il faut pouvoir associer les ports du toplevel aux broches matérielles du composant : chaque broches à un nom physique, il sera associé aux noms logiques que vous utilisez dans votre fichier toplevel à savoir ici led et sw. Il y a beaucoup de broches sur cette carte et Xilinx vous propose un fichier type avec les liens prédéfinis, il suffit d'utiliser les même noms pour vos ports que ceux utilisés par Xilinx pour ne pas avoir à tout changer dans le fichier . C'est le cas pour sw et led. le fichier Basys3_Master.xd se trouve en bas de cette page , copiez le chez vous. Ensuite il faudra l'ajouter dans votre projet. L'outil Add Sources s'en chargera. Ici on utilisera Create Constraints. ( les exercices réalisés tout à l'heure était introductifs...)
Vous ajoutez le fichier en validant Copy constraint files into project
Ce fichier apparaît dans votre projet à sa place. Ouvrez-le car toutes les connections y sont en commentaires. Dé-commentez les lignes qui correspondent à led et sw dans l'éditeur en utilisant la commande adéquate proposée. Le fichier ajouté est bien entendu dans la hiérarchie du projet.
Cette fois vous pouvez générer le bitstream , la commande Generate Bitstream est accessible dans program and debug., on peut suivre le déroulement sous l'onglet Design Runs en bas. Un indicateur en haut à gauche vous permet aussi de suivre le déroulement de la génération. Il sera toujours utile d'y jeter un œil par la suite , parfois des informations sont données ici pour poursuivre la génération dans de bonnes conditions. La première compilation est assez longue car tout doit être fait cette fois, par la suite vivado peut shunter quelques phases en ne recompilant que le minimum nécessaire...
Quand le bitstream est correctement produit, vous pouvez ouvrir le Hardware manager afin de choisir la carte cible pour le chargement effectif de ce bitstream. ( vous n'avez qu'un seule carte ici, elle doit être connectée)
Normalement vous ne devriez pas encore voir votre carte lors de ce premier chargement. Il faut donc lancer Program and Debug>Open Hardware Manager>OpenTarget. Autoconnect va alors identifier les cartes connectées à votre PC. Vous voyez votre carte Diligent apparaître, lancez Program device, il vous suffit alors de choisir le fichier .bit que vous désirez charger sur la carte, pour l'instant vous n'en avez qu'un seul c'est toplevel.bit. Il est temps de lancer sur la carte votre premier design , cliquez sur Program!
Alors? vos switches allument les leds? Passez à la suite ;-)
Question 2
Vous allez réaliser un additionneur 4 bits en VHDL ( cf Exercice 1). Un mot de 4 bits est saisi sur les 4 switches de droite, le second sur les 4 de gauche, l'affichage du résultat se fera sur les 5 leds de droites (retenue comprise).
Ajoutez une nouvelle source à votre projet. Vous savez déjà le faire. Cette fois choisissez de créer un Add or create design sources de type VHDL. Je vous propose comme nom add4. Vivado vous aide pour créer le fichier add4.vhd.
Le second écran vous permet de spécifier les ports de votre composant. Il vous suffit de donner un nom aux ports, un sens input ou output et une taille lorsqu'il s'agit d'un bus de plusieurs fils.
Dans votre design vous observez l’apparition à coté de toplevel d'un nouveau fichier add4.vhd. Ouvrez-le!
En vous aidant de ces informations 4-Bit_Adder, en particulier l'exemple 2, le premier code est parfait. Codez votre adder 4 bits. Si il reste une ligne rouge c'est que vous n'avez pas tout repris de l'exemple sur le site...
Avant de poursuivre la conception, vous pouvez pas à pas vérifier par simulation le bon comportement d’un composant. C’est une bonne habitude de travail, chaque brique de base est testée avant assemblage.Il faut utiliser le mode simulation. Par un clic droit sur simulation vous devez changer le setting en choisissant simulation top module name à add4. On peut aussi le faire dans la hiérarchie du projet, partie simulation.
Vous êtes en mesure de lancer la simulation comportementale en cliquant sur run behavioral simulation. Le simulateur permet d’observer les valeurs sur chacun des fils du composant à tout moment de la simulation. En particulier il représente cette évolution par un chronogramme où les fils (ou signaux) valent normalement ‘0’ ou ‘1’ ou des valeurs sur des bus. Pour l’instant vos fils sont soit ‘u’ pour undefined, soit ‘x’ pour inconnu. C’est normal les entrées n’ont pas été initialisées! Vous allez pouvoir tester différentes valeurs en entrée afin de valider votre composant matériel. La sortie sum doit correspondre à vos spécifications, ici la somme de a et b.
Dans la fenêtre chronogramme sous la colonne Name il suffit de faire un clic droit sur a ou b et de sélectionner dans le menu déroulant Force constant pour les initialiser à des valeurs en hexadécimal, j'avais choisi (2,3) et (2,F).
La commande simulation nous propose 4 boutons qui permettent, de la gauche vers la droite: de replacer le simulateur à l’état initial, de lancer la boucle de simulation, d’avancer la simulation d’un pas de temps, ici 1.00us. Vous lancerez le simulateur pour un pas de temps. Les fils deviennent verts, ils sont tous définis. Recommencez la même manipulation en plaçant d'autres valeurs sur a et b puis un pas de simulation afin de visualiser le résultat sur sum. En utilisant le bouton zoom vous obtenez une vue globale de la simulation pour les quelques microsecondes de votre simulation.
Si la simulation vous donne de bons résultats, vous pouvez utiliser ce composant dans votre design.
Pour exécuter ce composant directement sur la carte, en mode implémentation il faut que add4.vhd soit définit comme le top module de votre design. il faut pour cela faire un clic droit sur le nom et valider cet état dans le menu déroulant comme Set as Top. Le fichier Basys3_Master.xdc n'est plus adapté!! Vous allez reconstruire un fichier xdc en suivant la même procédure Add source que précédemment. cette fois il faut créer un fichier constraints, appelez-le add4. En vous aidant de Basys3_master.xdc mettez à jour ce fichier add4.xdc afin de connecter les ports de add4 avec les bonnes broches du FPGA ( sw et led n'existent plus , ici c'est a, b et sum, les lignes commençant par # sont des commentaires). Il faut rendre le fichier add4.xdc comme target constraint file : par un clic droit sur le nom du fichier, vous trouverez l'option dans le menu. Vous devriez avoir un projet manager de ce type :
Cette fois vous êtes en mesure de créer le .bit en reprenant la procédure de synthèse décrite précédemment. Chargez le fichier add4.bit ainsi créé sur la carte et testez votre design. Faites valider par votre enseignant simulation et exécution sur la carte.
Question 3
On voudrait réutiliser le même fichier Basys3_master.xdc pour ce adder 4 bits. Créez un nouveau fichier VHDL my_add.vhd qui utilise alors les ports nommés sw(15:0) et led(15:0) en entrée et sortie. Simulez et testez ce nouveau circuit, il faudra le mettre en top module.
Faites valider.
Enfin réalisez l'affichage des 4 bits de poids faibles de la somme sur les led de droite et la retenue sur le point dp de droite de l'afficheur. Il faudra générer les sorties an et dp par votre code vVHDL et les prendre en compte dans le fichier xdc. Faites valider également.....
Pour les curieux , en se baladant sur open implemented design, on peut visualiser l'utilisation du FPGA, ici on n'utilise pas grand chose ;-)
Basys3_Master.xdc : https://drive.google.com/file/d/1fLXQTMog9gUZ5XU40UAGFULc7GJoAuYr/view?usp=sharing