Activité : instanciation d'une entité

L’entité CounterDemo

La carte Basys3 de Digilent possède quatre afficheurs 7 segments avec les caractéristiques suivantes :

Commandes des afficheurs 7 segments sur la carte Basys3

Dans cette activité, nous reprenons l’exemple CounterDemo détaillé précédemment et nous le modifions pour l’adapter à la carte Basys3. Le bouton central servira à remettre le compteur à zéro.

L’entité devient :

entity CounterDemo is
    port(
        clk_i             : in  std_logic;
        -- Le bouton-poussoir central de la carte Basys3.
        btn_center_i      : in  std_logic;
        -- Les commandes des afficheurs 7 segments de la carte Basys3.
        disp_segments_n_o : out std_logic_vector(0 to 6);
        disp_point_n_o    : out std_logic;
        disp_select_n_o   : out std_logic_vector(3 downto 0)
    );
end CounterDemo;

Les afficheurs sont numérotés de la manière suivante : le plus à gauche porte le numéro 3 et le plus à droite porte le numéro 0. Nous en tenons compte en définissant la sortie disp_select_n_o avec la plage d’indices 3 downto 0.

Par convention, nous ajoutons le suffixe _n aux noms des ports qui transportent des valeurs logiques actives au niveau bas.

Architecture modifiée pour l'entité CounterDemo

Afficher la légende des schémas.

Dans l’architecture, nous avons ajouté un signal interne segments qui reçoit la sortie du décodeur 7 segments. Le port de sortie disp_segments_n_o reçoit l’inverse bit à bit de segments. Les sorties disp_select_n_o et disp_point_n_o reçoivent des valeurs constantes qui ont pour effet de sélectionner l’afficheur le plus à droite et de ne pas allumer les voyants indicateurs de point décimal.

architecture Structural of CounterDemo is
    signal sec_inc   : std_logic;
    signal sec_value : integer range 0 to 15;
    signal segments  : std_logic_vector(0 to 6);
begin
    div_counter_inst : entity work.CounterModN(Behavioral)
        generic map(
            N => 100e6
        )
        port map(
            clk_i   => clk_i,
            reset_i => btn_center_i,
            inc_i   => '1',
            value_o => open,
            cycle_o => sec_inc
        );

    sec_counter_inst : entity work.CounterModN(Behavioral)
        generic map(
            N => 16
        )
        port map(
            clk_i   => clk_i,
            reset_i => btn_center_i,
            inc_i   => sec_inc,
            value_o => sec_value,
            cycle_o => open
        );

    decoder_inst : entity work.SegmentDecoder(TruthTable)
        port map(
            digit_i    => sec_value,
            segments_o => segments
        );

    disp_segments_n_o <= not segments;
    disp_point_n_o    <= '1';
    disp_select_n_o   <= "1110";
end Structural;

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.
Counter CounterDemo.vhd Code source de l’entité CounterDemo et de son architecture.
SegmentDisplay SegmentDecoder.vhd Code source de l’entité SegmentDecoder et de son architecture.
Basys3 Basys3_Clock.xdc Fichier de contraintes pour Vivado, définition de l’horloge.
Basys3 Basys3_Buttons.xdc Fichier de contraintes pour Vivado, définition des boutons-poussoirs.
Basys3 Basys3_SegmentDisplay.xdc Fichier de contraintes pour Vivado, définition des afficheurs.

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 CounterDemo
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

Aperçu des fichiers de contraintes

Pour l’outil Vivado, un fichier de contraintes définit des propriétés des signaux VHDL afin de maîtriser certaines caractéristiques du circuit qui sera construit. En créant le projet CounterDemo, nous avons ajouté trois fichiers de contraintes que vous pouvez trouver dans la rubrique Constraints de l’arborescence des fichiers sources du projet.

Ici, nous allons nous intéresser à trois types de propriétés :

Le fichier Basys3_Buttons.xdc définit les affectations de broches pour les boutons-poussoirs de la carte Basys3. Par exemple, le port btn_center_i de l’entité est associé avec le bouton central (BTNC) de la carte. Sur le circuit imprimé, la sérigraphie indique : « BTNC (U18) ». Ici, U18 est le numéro de la broche du FPGA à laquelle le bouton est relié. Dans le fichier de contraintes, nous avons écrit :

set_property PACKAGE_PIN U18 [get_ports btn_center_i]

Cette broche sera pilotée avec une tension de référence de 3,3 V :

set_property IOSTANDARD LVCMOS33 [get_ports btn_center_i]

Pour affecter la même propriété à tous les boutons en une seule ligne, nous avons écrit :

set_property IOSTANDARD LVCMOS33 [get_ports btn_*_i]

Dans le fichier Basys3/Basys3_SegmentDisplay.xdc, nous définissons de la même manière les propriétés de chaque bit des ports disp_segments_n_o, disp_point_n_o et disp_select_n_o. Les numéros de broches sont indiqués dans la documentation constructeur de la carte Basys3.

Dans le fichier Basys3/Basys3_Clock.xdc, pour définir le signal d’horloge, nous avons ajouté une directive create_clock indiquant la période et le rapport cyclique du signal attendu sur clk_i. Ces propriétés permettront à l’outil de synthèse de vérifier que les temps de prépositionnement et de maintien des bascules D sont toujours respectés.

set_property PACKAGE_PIN W5      [get_ports clk_i]
set_property IOSTANDARD LVCMOS33 [get_ports clk_i]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk_i]

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