Activité : entités et architectures

L’entité GCD

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.

Télécharger les fichiers de cette activité

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.

Créer un projet Vivado

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

Simuler le fonctionnement du circuit

Démarrez le simulateur : Flow NavigatorSimulationRun SimulationRun Behavioral Simulation.

Démarrer la 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:

La console Tcl

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.

Chronogrammes de l'entité GCD

Astuce : Utilisez le bouton Zoom Fit pour ajuster les chronogrammes à la largeur de la fenêtre.

Synthétiser le circuit

Configurer les optimisations

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.

  1. Ouvrez la fenêtre des paramètres de Vivado : Flow NavigatorProject ManagerSettings.

Accès aux réglages de Vivado

  1. Dans la catégorie Synthesis, sous le titre Options, le champ Strategy propose une liste des stratégies d’optimisation disponibles à l’étape de synthèse logique du circuit. Choisissez la stratégie Flow RuntimeOptimized.

Accès aux réglages de Vivado, synthèse

  1. Dans la catégorie Implementation, sous le titre Options, modifiez le champ Strategy en choisissant également la stratégie Flow RuntimeOptimized.

Accès aux réglages de Vivado, implémentation

Analyser la description

Effectuez l’analyse du code source : Flow NavigatorRTL AnalysisOpen Elaborated Design.

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

Schéma RTL de l'entité GCD

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

Synthétiser les fonctions logiques

Démarrez la synthèse : Flow NavigatorSynthesisRun Synthesis.

Vivado 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 NavigatorSynthesisOpen Synthesized DesignSchematic.

Vivado open synthesized design

Dans l’onglet Schematic, zoomez sur les éléments du schéma jusqu’à ce que vous puissiez lire les noms des composants.

Schéma après synthèse de l'entité GCD

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.

Table de vérité d'une LUT3

Effectuer le placement et le routage

Démarrez l’implémentation : Flow NavigatorImplementationRun Implementation.

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

Schéma après implémentation de l'entité GCD

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.

Afficher les statistiques d’utilisation du FPGA

Dans la barre d’outils en haut de la fenêtre, pressez le bouton Project Summary, dont l’icône est une lettre Sigma (Σ).

Vivado project summary

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 :

Utilisation du FPGA par l'entité GCD

Configurer le FPGA

Générez le fichier binaire à charger dans le FPGA : Flow NavigatorProgram and DebugGenerate Bitstream.

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

Vivado open target

Pressez ensuite Program Device.

Vivado 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 :

Vérifiez que vous obtenez le même résultat et essayez d’autres exemples de valeurs d’entrée.