Ce TP utilise add4 de la question 4 ou éventuellement add4 du TP1.
Le but de ce TP est d'aborder la programmation VHDL pour des comportements combinatoires, d'instancier des composants. De simuler et de tester sur la carte.
Il faudra finir la question 2 pour démarrer le TP3!!!! les salles en accès libre sont à votre disposition si besoin....
Dans le TP1 le résultat de votre addition était affiché sur les LED directement par le biais du fichier .xdc. L'objectif ici vise à utiliser l'afficheur 7 segments ! Créez un nouveau projet TP2 en suivant la même démarche que pour TP1. Ajoutez une nouvelle source à votre projet. Vous savez déjà le faire. Cette fois choisissez de créer un VHDL . Je vous propose comme nom x7seg. Bien sur il faudra choisir la même carte Basys3 pour créer ce projet...
Figure 14 Création fichier VHDL x7seg
En cliquant Next, vous serez invité à entrer les ports de votre nouveau module. C’est facultatif mais cela vous permet d'économiser la saisie manuelle d’une partie du code VHDL. Que vous le remplissiez ou non, le fichier texte obtenu reste complètement modifiable par la suite. Entrez les ports qui seront alors insérés dans l’entête de votre fichier VHDL. Le composant convertit les 4 bits en entrée afin de produire une combinaison sur les 7 segments en sortie afin d’afficher un chiffre de x0 à xF. Le sens des ports doit être spécifié également IN (entrée) ou OUT (sortie).
Figure 15 Création des ports
OK et Finish vous produisent automatiquement le squelette du module VHDL x7seg.vhd. ViVADO insère le fichier dans le projet il vous reste à ouvrir le fichier avec l'éditeur de texte, il contient ce squelette.
Le code VHDL est composé de deux parties : la partie ENTITY qui reprend les ports que vous avez spécifiés lors de la création de ce module VHDL et la partie ARCHITECTURE qui en spécifie le comportement. La syntaxe de VHDL est suffisamment explicite pour s’y retrouver et reprend les concepts introduits dans la leçon 2. C’est cette seconde partie encore vide qu’il faut maintenant écrire. Vous insérerez le comportement entre le BEGIN et END de cette ARCHITECTURE.
Pour chaque valeur présente sur le port sw(3:0), il faut expliciter les segments à afficher sur le port de sortie sevenseg(6:0). cette architecture doit expliciter le comportement de la table de vérité. La notation x"0" (~"0000") représente un nombre de 4 bits en hexadécimal. L'affectation <= permet de relier la valeur du signal de sortie à la valeur présente sur le signal d’entrée à un instant particulier. De façon intuitive, les signaux ne sont pas des variables rangées en mémoire mais plutôt des valeurs qui circulent sur des fils et évoluent avec le temps….
Voici le codage sur 7 bits de votre afficheur Basys, ‘1’ pour éteint et ‘0’ pour allumé, il y a donc 7 fils pour les 7 segments à piloter (G F E D C B A), par exemple b1111001 allume B et C. Les 4 fils anodes permettent de sélectionner un ou plusieurs afficheurs parmi les quatre afficheurs, vous les positionnerez plus tard.
Figure 16 L'afficheur 7 segments - document Digilent
Proposez le code qui réalise la table de vérité suivante, avec sw en entrée et donc un bus de 7 sorties sevenseg qui pilotent chacun des segments. Je vous suggère d'utiliser un with select pour spécifier l'architecture.
Après avoir inséré votre code VHDL, lorsqu'il n'y a plus d'erreur de syntaxe signalée dans l'éditeur, enregistrez le fichier. En cliquant sur Run Synthesize vous pouvez lancer la synthèse de ce composant X7seg. Une fois la synthèse finie, .vous pouvez choisir de générer le rapport de synthèse, il vous permettra de connaitre le nombre de cellule etc.. utilisées, c'est un bon moyen de savoir ce qu'on génère. Essayez sur ce code simple, moi j'ai utilisé 7 LUT4 ;-)
En cliquant sur Open Synthtized Design> Schematic , on obtient une représentation schématique du résultat de synthèse... Essayez aussi sur Open Elaborated Design> Schematic on s'en servira régulièrement!! Gardez ces informations pour la validation de cette question. Pour valider ce code sur la carte , il faudra connecter les 4 switches , les sevenseg et les anodes dans le fichier XDC, vous devriez garder le fichier xdc de référence et utiliser toujours le même fichier toplevel de la semaine dernière dans lequel vous instanciez ici un composant x7seg. Vous pouvez ensuite faire un test d'affichage sur la carte. Faire valider.
. A valider!
Si vous utilisez le add4 de l'exo2 du TP2 : Vous devez créer un fichier add4.vhd et insérer le code de l'architecture avec les 4 instances de add1.
Si vous utilisez le add4 du TP1 : Vous allez maintenant récupérer le code de add4.vhd du TP1. Pour cela dans Project Manager> Add sources, il suffit de faire un Add or create design sources pour ajouter une copie du fichier dans votre projet. Le fichier add4.vhd doit se trouver dans tp1/tp1.srcs/sources_1/new, il faut cocher le Copy sources into project afin d'éviter de partager le même fichier entre deux TPs. La copie de add4.vhd doit apparaître dans la hiérarchie du projet! Si vous regardez de près dans Source File Properties, les fichiers copiés sont placés par VIVADO dans une autre directory : /tp2/tp2.srcs/sources_1/imports/new
Il faut encore ajouter une source vhdl , appelez-la calc , il remplacera votre toplevel de la question 1, avec les ports suivant:
Le fichier calc
Ce fichier calc.vhd sera votre Top Module une fois que vous l'aurez spécifié avec un clic droit sur le nom et un Set as Top . Le fichier .bit de configuration du FPGA s’appellera donc calc.bit. Votre architecture est vide il faut y placer une instance de add4 et une instance de x7seg, les relier entre elles, et connecter les ports de calc.
Afficheur 16 bits
Votre composant x7seg n'affiche qu'un seul digit à la fois. Pour afficher un mot de 16 bits il faut balayer les 4 digits successivement et si vous lisez la documentation de votre carte, vous verrez que la fréquence de balayage est de 190Hz. La construction nécessite un compteur de b00 à b11 qui changera de valeur tous les 1/190 de seconde. La valeur produite par ce compteur vous permettra de choisir parmi les 16 bits à afficher la tranche de 4 bits à sélectionner à cet instant. Un multiplexeur 4x4 (4 entrée de 4 bits) réalise cette sélection. Il faudra réaliser ce composant pour le TP de contrôle dans quelques semaines....
Revenons à notre calculatrice 4 bits, comme vous l'avez vu dans la leçon 2, VHDL permet d'instancier des composants dans d'autres composants.
A vous de jouer!!! placez une instance de add4, puis une instance de x7seg, déclarez des signaux si nécessaire pour relier ces deux instances. Enfin réalisez les connections par les deux port map, avec les signaux ou avec les ports du composant calc. Il faudra assurer le typage des connections.Seuls les 4 bits de poids faibles de sum ( notation sum(3 downto 0)) seront affichés sur le 7 segments. Les LED affichent quand à elles les 5 bits de sum, il faudra sans doute ajouter des '0' à gauche par l'opérateur de concaténation &. Le port an peut être affecté à une constante afin de sélectionner le bon afficheur parmi les quatre (celui de droite).
Quand il n'y a plus d'erreur de syntaxe , vous pouvez lancer la simulation sur calc.vhd. (run behavioral simulation) Vérifiez que calc.vhd est bien le top level dans la hiérarchie des Simulation Sources. Corrigez éventuellement. Voila ce que j'ai observé en forçant les valeurs des switches sw successivement à x2003, x7008 et x8008.
Avant de pouvoir tester sur la carte, il vous faut ajouter le fichier .xdc. Je vous propose de reprendre une copie du fichier Basys3_master.xdc. Il doit encore se trouver dans /tp1/tp1.srcs/constrs_1/imports/.... Ouvrez le fichier dans l'éditeur et dé-commentez les lignes utilisées par votre design. Il est temps de générer le Bitstream et de le tester sur la carte une fois chargé.
Il vous reste à faire valider la simulation et l'exécution sur la carte
Vous allez enrichir votre calculatrice en proposant un choix de 4 opérations, l’opération exécutée sera fonction d'un combinaison des deux boutons BTNL et BTNR de votre carte
ADD 4 bits : BTNL = 0 et BTNR = 0
AND 4 bits : BTNL = 0 et BTNR = 1
OR 4 bits : BTNL = 1 et BTNR = 0
XOR 4 bits : BTNL = 1 et BTNR = 1
Comment s'y prendre?
Ajoutez deux ports d'entrée btnR bntL
Dé-commentez ces ports dans le fichier xdc
Modifiez le code VHDL afin de choisir la valeur à imprimer sur x7seg et sur les led en fonction de btn
Afin de comprendre ce que génère VIVADO, je vous conseille de regarder dans le menu Synthesis>Schematic . Valisez sur la carte et ouvrez aussi ce schématic lors de la validation