Activité : affectations concurrentes de signaux

Réalisation d’un chronomètre

En nous inspirant de l’entité CounterDemo, nous allons développer une entité StopWatch capable de compter pendant une durée de dix minutes et d’afficher le temps au dixième de seconde près. Le bouton central servira à remettre le chronomètre à zéro ; l’interrupteur le plus à gauche servira à démarrer ou arrêter le comptage.

L’entrée switches_i sur la figure ci-dessous correspond aux seize interrupteurs présents sur la carte Basys3. La sortie leds_o correpond aux seize LED.

L'entité StopWatch

L’architecture sera composée de sept compteurs dont les rôles sont présentés dans ce tableau :

Compteur Modulo Mis à jour toutes les Durée d’un cycle Rôle
divider_5ms_inst (en simulation) 5 1 ms 5 ms Diviseur général de fréquence
divider_5ms_inst (pour la synthèse) 500000 10 ns 5 ms Diviseur général de fréquence
divider_20ms_inst 4 5 ms 20 ms Balayage des afficheurs sept segments
divider_100ms_inst 5 20 ms 100 ms Diviseur de fréquence pour le comptage du temps
counter_10x100ms_inst 10 100 ms 1 s Chiffre des dixièmes des secondes
counter_10x1sec_inst 10 1 s 10 s Chiffre des unités de secondes
counter_6x10sec_inst 6 10 s 1 min Chiffre des dizaines de secondes
counter_10x1min_inst 10 1 min 10 min Chiffre des minutes

L'architecture pour l'entité StopWatch

Afficher la légende des schémas.

Le compteur divider_20ms_inst permettra d’activer à tour de rôle les sorties disp_select_n_o pour réaliser un balayage des quatre afficheurs sept segments. Simultanément, en fonction de la valeur du signal digit_index, le décodeur sept segments recevra soit le chiffre des dixièmes de secondes, des unités de secondes, des dizaines de secondes ou des minutes.

Le compteur counter_10x100ms_inst sera autorisé à compter à chaque fin de cycle de divider_100ms_inst mais seulement si l’entrée switches_i(15) vaut '1'. Lorsque switches_i(15) vaut '0', les compteurs qui mesurent le temps maintiennent leur valeur stable.

Pour le moment, tous les bits de la sortie leds_o sont mis à '0'. Nous ajouterons la gestion des LED dans l’activité suivante.

Créer un projet Vivado

Voici la liste des fichiers que nous utiliserons dans cette activité. Tous ces fichiers sont situés dans des sous-dossiers de CoCiNum/src/vhdl.

Sous-dossier Fichier Rôle
Counter CounterModN.vhd Code source de l’entité CounterModN et de son architecture.
SegmentDisplay SegmentDecoder.vhd Code source de l’entité SegmentDecoder et de son architecture.
StopWatch StopWatch.vhd Code source de l’entité StopWatch et de son architecture.
Basys3 Basys3_Buttons.xdc Fichier de contraintes pour Vivado, définition des boutons-poussoirs.
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_SegmentDisplay.xdc Fichier de contraintes pour Vivado, définition des afficheurs.
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 StopWatch
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

Description

Dans le fichier StopWatch.vhd, complétez l’architecture de la manière suivante :

  1. Repérez les signaux internes sur le schéma et déclarez-les dans l’architecture. Aidez-vous de la légende des schémas..
  2. Ajoutez des instructions d’instanciation pour créer sept compteurs et un décodeur d’afficheur 7 segments. Donnez des valeurs à leurs paramètres génériques et connectez leurs ports conformément au schéma.
  3. Ajoutez les instructions d’affectation concurrentes représentées sur le schéma par des rectangles en pointillés.

Pour le point 3, nous vous demandons d’utiliser les instructions suivantes :

Signal à affecter Instruction
inc_100ms Affectation simple
digit Affectation avec sélection (with... select)
disp_select_n_o(i) Affectation conditionnelle (when... else)
disp_segments_n_o Affectation simple
disp_point_n_o Affectation simple

Simuler le fonctionnement du circuit

Pour réduire la durée de la simulation et éviter de produire des chronogrammes trop longs, nous allons travailler avec une fréquence d’horloge de 1 kHz, nettement inférieure à la réalité.

Dans le fichier StopWatch.vhd, faites en sorte que le compteur divider_5ms_inst ait un modulo égal à 5.

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

Dans la console Tcl, entrez les commandes suivantes, en pressant la touche Entrée pour exécuter chaque commande.

Redémarrer la simulation :

restart

Créer un signal d’horloge de période 1 ms :

add_force -repeat_every 1ms clk_i 0 0us 1 500us

L’entrée btn_center_i vaudra '1' au démarrage, et '0' au bout de 1 ms :

add_force btn_center_i 1 0ms 0 1ms

L’entrée switches_i(15) passera à 1 au bout d’une seconde, et sera à '0' entre 4 et 5 s :

add_force switches_i(15) 0 0sec 1 1sec 0 4sec 1 5sec

Exécuter la simulation pendant 3 minutes :

run 180sec

Vérifiez que tous les compteurs fonctionnent, en commençant par celui situé le plus à gauche sur le schéma. Observez les signaux cycle_5ms, cycle_20ms, cycle_100ms, cycle_1sec, cycle_10sec et cycle_1min. Vérifiez la durée qui sépare deux impulsions successives pour chacun de ces signaux. Vérifiez que les compteurs de temps ne comptent pas pendant la durée où switches_i(15) vaut '0'.

Observez les bits du signal disp_select_n_o et vérifiez qu’ils sont actifs à tour de rôle pendant 5 ms.

Si certains signaux n’ont pas la forme souhaitée, vérifiez votre description VHDL en la comparant au schéma fourni. Corrigez votre description, recompilez-la et recommencez la simulation.

En réalité, la carte Basys3 est équipée d’un oscillateur qui produit un signal d’horloge à 100 MHz.

Avant de passer à la suite, dans le fichier StopWatch.vhd, faites en sorte que le compteur divider_5ms_inst ait un modulo égal à 500000.

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

Sur la carte Basys3, actionnez l’interrupteur de gauche pour démarrer ou arrêter le comptage.