Exercice : séquenceur lumineux

Dans cet exercice, vous allez réaliser un circuit qui allume des LED à tour de rôle. L’utilisateur actionnera les interrupteurs pour choisir quelles LED allumer.

Compléter l’architecture

Ouvrez le fichier CoCiNum/src/vhdl/Exercices/LightSequencer/LightSequencer.vhd :

cd $HOME/CoCiNum/src/vhdl/Exercices/LightSequencer
gedit LightSequencer.vhd &

L’entité LightSequencer possède les ports suivants :

Port Direction Type Rôle
clk_i Entrée Logique Le signal d’horloge global.
switches_i Entrée Vecteur de 16 bits État des seize interrupteurs.
leds_o Sortie Vecteur de 16 bits Commandes des seize voyants.

Version sans interrupteurs

Sachant que la fréquence du signal d’horloge clk_i est indiquée par le paramètre générique CLK_FREQUENCY_HZ de l’entité LightSequencer, réalisez un diviseur de fréquence pour gérer la vitesse à laquelle on passe d’une LED à la suivante.

Le numéro de la LED à allumer sera représenté par un signal led_index_reg. Ce signal sera mis à jour à la fin de chaque cycle de comptage du diviseur de fréquence. Dans un premier temps, led_index_reg sera géré par un compteur modulo 16.

Pour gérer les sorties leds_o, deux solutions sont possibles :

process(led_index_reg)
begin
    leds_o                <= (others => '0');
    leds_o(led_index_reg) <= '1';
end process;
leds_gen : for i in 0 to 15 generate
    leds_o(i) <= '1' when i = led_index_reg else '0';
end generate;

Version avec interrupteurs

À présent, on ne souhaite plus allumer toutes les LED, mais seulement celles pour lesquelles l’interrupteur correspondant est à l’état haut (voir la vidéo au début de cette page).

Écrivez un processus qui détermine l’indice suivant led_index_next en fonction de led_index_reg et de l’état des interrupteurs switches_i.

Vérifier la syntaxe

Dans un terminal, exécutez les commandes suivantes. La commande cd peut être omise si vous êtes déjà dans le dossier LightSequencer.

cd $HOME/CoCiNum/src/vhdl/Exercices/LightSequencer
ghdl -a LightSequencer.vhd

Modifiez votre fichier source jusqu’à ce qu’il n’y ait plus de message d’erreur.

Simuler le fonctionnement du circuit

Démarrez la simulation en utilisant les commandes suivantes :

cd $HOME/CoCiNum/src/vhdl/Exercices/LightSequencer/tests
make

Le script de test affiche une fenêtre avec une rangée de LED et une rangée d’interrupteurs. Dans des conditions normales, une LED allumée a la couleur verte. Si une LED s’allume en rouge, cela signifie généralement que le signal leds_o(i) vaut 'U' (signal non initialisé), ou 'X' (valeur indéterminée). Voir à ce sujet la section sur le type std_logic.

Agissez sur les interrupteurs et observez l’état des LED.

Vérifiez que vous obtenez le comportement attendu.

Pour afficher les chronogrammes, utilisez la commande suivante :

gtkwave LightSequencer.ghw

Par défaut, la fenêtre GTKWave n’affiche aucun chronogramme. Déroulez l’arborescence à partir de l’élément top dans le panneau SST en haut à gauche et sélectionnez les signaux à afficher dans la liste Signals en bas à gauche.

Utilisez les boutons de la barre d’outils pour dézoomer: le bouton Zoom fit ajuste l’échelle de temps pour que la durée totale de simulation corresponde à la largeur de la fenêtre.

Créer un projet Vivado

Voici la liste des fichiers nécessaires à la construction du projet. Tous ces fichiers sont situés dans des sous-dossiers de CoCiNum/src/vhdl.

Sous-dossier Fichier Rôle
Exercices/LightSequencer LightSequencer.vhd Code source de l’entité LightSequencer et de son architecture.
Basys3 Basys3_Clock.xdc Fichier de contraintes pour Vivado, définition de l’horloge.
Basys3 Basys3_Leds.xdc Fichier de contraintes pour Vivado, définition des LED.
Basys3 Basys3_Switches.xdc Fichier de contraintes pour Vivado, définition des interrupteurs.

Si vous ne l’avez pas encore fait, démarrez Vivado à l’aide des commandes suivantes :

cd $HOME/CoCiNum
./scripts/vivado

Créez un nouveau projet en renseignant les informations suivantes :

Page Champ ou action Valeur
Project Name Project name LightSequencer
Project location CoCiNum/vivado
Create project subdirectory Oui
Project Type RTL Project
Add Sources Add Files Fichiers .vhd dans le tableau précédent
Copy sources into project Non
Add Constraints Add Files Fichiers .xdc dans le tableau précédent
Copy constraints files into project Non
Default Part Family Artix-7
Package cpg236
Speed -1
Part xc7a35tcpg236-1

Pour donner une valeur au paramètre générique CLK_FREQUENCY_HZ de l’entité LightSequencer, exécutez cette commande dans le panneau Tcl Console de Vivado :

set_property generic CLK_FREQUENCY_HZ=100000000 [current_fileset]

Synthétiser le circuit

Configurer les optimisations

  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

Synthétiser et implémenter le circuit

Exécutez cette commande dans la console Tcl pour réduire la gravité de certains messages concernant les affectations de broches :

set_msg_config -id {Common 17-55} -new_severity {WARNING}

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

Vivado generate bitstream

Vivado va enchaîner toutes les étapes d’analyse des fichiers sources, de synthèse logique, de placement et routage, pour terminer par la génération d’un fichier binaire à charger dans le FPGA.

À la fin des opérations, la boîte de dialogue Bitstream Generation Completed s’affiche. Choisissez Open Hardware Manager.

Configurer le FPGA

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