L’entité GCD
et son architecture Detailed
décrivent le comportement d’un circuit
capable de calculer le plus grand commun diviseur (Greatest Common Divisor)
de deux nombres entiers.
Avant de réaliser le circuit, son fonctionnement peut être analysé en exécutant la description VHDL dans un logiciel de simulation. L’affichage des chronogrammes permettra, pour un scénario de fonctionnement possible, de comparer le comportement du circuit avec le comportement attendu.
Ensuite, la synthèse logique consistera à traduire la description VHDL en une interconnexion de fonctions logiques élémentaires qui pourront être affectées par exemple, aux cellules logiques d’un circuit programmable.
Dans cette section, nous allons dérouler tout le processus, de la simulation à l’exécution sur une carte à FPGA.
Les activités proposées dans le cadre du cours Conception de Circuits Numériques utilisent des outils de développement sous Linux. Les postes de travail des labos de l’ESEO fonctionnent avec Ubuntu 20.04.
La suite de développement Xilinx Vivado 2019.1 est installée dans le dossier
/opt/Xilinx/Vivado/2019.1
.
Les fichiers de cette activité et des suivantes sont disponibles en ligne dans un dépôt de code source public. Ouvrez un terminal et exécutez les commandes suivantes :
cd $HOME
git clone https://github.com/ESEO-Tech/CoCiNum.git
cd CoCiNum
Ces commandes créent un dossier CoCiNum
dans votre dossier personnel.
Les deux fichiers qui nous intéressent dans cette activité sont :
Fichier | Rôle |
---|---|
CoCiNum/src/vhdl/GCD/GCD.vhd |
Code source de l’entité GCD et de son architecture. |
CoCiNum/src/vhdl/GCD/GCD.xdc |
Fichier de contraintes d’implémentation et d’affectation des broches. |
Vivado est un environnement de développement pour les FPGA du constructeur Xilinx. Nous l’utiliserons pour effectuer les tâches suivantes : éditer des descriptions de circuits en VHDL, simuler leur fonctionnement, les synthétiser, configurer une carte à FPGA.
Démarrez Vivado à l’aide de la commande suivante :
./scripts/vivado
Créez un nouveau projet (Quick Start → Create Project) en renseignant les informations suivantes :
Page | Champ ou action | Valeur |
---|---|---|
Project Name | Project name | GCD |
Project location | CoCiNum/vivado |
|
Create project subdirectory | Oui | |
Project Type | RTL Project | |
Add Sources | Add Files | CoCiNum/src/vhdl/GCD/GCD.vhd |
Copy sources into project | Non | |
Add Constraints | Add Files | CoCiNum/src/vhdl/GCD/GCD.xdc |
Copy constraints files into project | Non | |
Default Part | Family | Artix-7 |
Package | cpg236 | |
Speed | -1 | |
Part | xc7a35tcpg236-1 |
À l’étape New Project Summary, vérifiez les informations et pressez le bouton Finish.
Démarrez le simulateur : Flow Navigator → Simulation → Run Simulation → Run Behavioral Simulation.
Vivado charge l’entité GCD
dans le simulateur et l’exécute pendant une picoseconde
en prenant des valeurs par défaut des entrées.
Pour piloter le simulateur, il est souvent plus rapide d’utiliser l’interface en ligne de commande Tcl. En bas de la fenêtre, l’onglet Tcl Console comprend deux champs:
Entrez les commandes suivantes, en pressant la touche Entrée pour exécuter chaque commande.
Redémarrer la simulation :
restart
Affecter des valeurs constantes aux entrées a
et b
.
L’option -radix dec
indique que les valeurs sont en décimal :
add_force -radix dec a_i 228
add_force -radix dec b_i 132
Créer un signal d’horloge de période 10 ns :
add_force -repeat_every 10ns clk_i 0 0ns 1 5ns
Mettre l’entrée load_i
à '1'
entre les dates 30 ns et 40 ns :
add_force load_i 0 0ns 1 30ns 0 40ns
Exécuter la simulation pendant 100 ns :
run 100ns
Observez l’évolution des signaux a_reg
et b_reg
au cours du temps.
Au moment ou done_o
passe à '1'
, vérifiez que la sortie g_o
est bien égale
au plus grand diviseur commun de a_i
et b_i
.
Astuce : Utilisez le bouton Zoom Fit pour ajuster les chronogrammes à la largeur de la fenêtre.
Dans les étapes suivantes, Vivado va construire un circuit conforme à notre description VHDL. Au cours des étapes de synthèse et de placement/routage, Vivado va appliquer des techniques d’optimisation du circuit. Selon les règles d’optimisation choisies, Vivado cherchera à réduire la durée des calculs, à réduire la taille du circuit, ou à réduire sa consommation d’énergie.
Cependant, les optimisations rendent les étapes de synthèse et de placement/routage plus longues. Au démarrage d’un nouveau projet, et lorsque le circuit à réaliser est relativement simple, il est plus confortable de désactiver les optimisations dans un premier temps.
Effectuez l’analyse du code source : Flow Navigator → RTL Analysis → Open Elaborated Design.
Vivado traduit les instructions VHDL en une interconnexion de fonctions logiques. À la fin de l’opération, un onglet Schematic affiche un schéma du circuit. Vous pouvez zoomer sur les éléments du schéma en utilisant les boutons de la barre d’outils ou en pressant la touche Ctrl tout en manipulant la molette de la souris.
À cette étape, Vivado travaille au niveau Transferts de Registres (RTL pour Register Transfer Level). Le schéma représente des opérations arithmétiques, des comparaisons, des choix, des synchronisations sur l’horloge, sans chercher à les détailler en termes de portes ou de cellules logiques, et sans les optimiser.
Démarrez la synthèse : Flow Navigator → Synthesis → Run Synthesis.
Si un message vous avertit que l’opération peut prendre du temps, confirmez le démarrage de la synthèse et patientez. À la fin de l’opération, la boîte de dialogue Synthesis Completed s’affiche. Pressez le bouton Cancel.
Affichez le schéma du circuit synthétisé : Flow Navigator → Synthesis → Open Synthesized Design → Schematic.
Dans l’onglet Schematic, zoomez sur les éléments du schéma jusqu’à ce que vous puissiez lire les noms des composants.
Au cours de la synthèse, Vivado a optimisé les fonctions logiques et les a décomposées en utilisant les composants de base disponibles dans le FPGA que nous avons choisi. Le schéma représente :
Par exemple, chaque composant de type LUT3 est configuré pour réaliser une fonction combinatoire à trois entrées et une sortie.
Cliquez sur un composant LUT3 dans le schéma et affichez sa table de vérité en sélectionnant l’onglet Truth Table dans le panneau Cell Properties à gauche du schéma.
Démarrez l’implémentation : Flow Navigator → Implementation → Run Implementation.
Si un message vous avertit que l’opération peut prendre du temps, confirmez le démarrage du placement/routage et patientez. À la fin de l’opération, la boîte de dialogue Implementation Completed s’affiche. Choisissez Open Implemented Design et acceptez de fermer le résultat de la synthèse.
Dans l’onglet Device, Vivado affiche une représentation de la disposition physique des cellules à l’intérieur du FPGA.
Zoomez sur la région colorée en bleu jusqu’à faire apparaître les contours des composants de base présents dans les cellules du FPGA : LUT, multiplexeurs, portes logiques, bascules D. Les composants colorés en bleu sont ceux qui constituent notre circuit GCD.
Dans la barre d’outils en haut de la fenêtre, pressez le bouton Project Summary, dont l’icône est une lettre Sigma (Σ).
La rubrique Utilization donne un aperçu du taux d’occupation du FPGA. Vous pouvez l’afficher sous forme de diagramme ou sous forme de tableau. On s’intéressera en particulier aux quantité suivantes :
Générez le fichier binaire à charger dans le FPGA : Flow Navigator → Program and Debug → Generate Bitstream.
À la fin de l’opération, la boîte de dialogue Bitstream Generation Completed s’affiche. Choisissez Open Hardware Manager.
Vérifiez que l’interrupteur d’alimentation de votre carte Basys3 est en position OFF. Le cavalier situé à côté de l’interrupteur doit être en position USB.
Reliez le connecteur micro-USB de la carte à un port USB de votre PC. Mettez la carte sous tension.
En haut du panneau Hardware Manager, pressez Open target et choisissez Auto Connect.
Pressez ensuite Program Device.
Les entrées/sorties de la fonction PGCD sont reliées aux interrupteurs et aux voyants de la carte de la manière suivante :
Port | Élément de la carte Basys3 |
---|---|
load_i |
Bouton-poussoir central (BTNC) |
a_i |
Les huit interrupteurs de droite (SW7 à SW0) |
b_i |
Les huit interrupteurs de gauche (SW15 à SW8) |
g_o |
Les huit voyants de droite (LD7 à LD0) |
done_o |
Le voyant le plus à gauche (LD15) |
La vidéo ci-dessous montre un exemple d’utilisation du circuit GCD. Nous avons réglé les interrupteurs pour avoir :
a_in
= 200 ()b_in
= 240 ()g_o
= 40 ()Vérifiez que vous obtenez le même résultat et essayez d’autres exemples de valeurs d’entrée.