Leçon 16 sur 22

Chapitre 16 — Contraintes et programmation d’un FPGA

Objectif — Finalité du chapitre

Passer d’une description VHDL validée à une implantation matérielle : affecter les broches, contraindre les horloges, exécuter placement-routage, analyser le timing, générer le bitstream et programmer une carte FPGA.

Objectifs pédagogiques

À la fin de ce chapitre, l’étudiant devra être capable de :

  • associer les ports VHDL aux broches physiques d’une carte FPGA ;
  • choisir un standard électrique compatible avec la tension de la carte ;
  • déclarer une horloge primaire et sa période ;
  • identifier une horloge dérivée et la contraindre correctement ;
  • expliquer le placement et le routage ;
  • lire un rapport d’utilisation des ressources ;
  • interpréter setup, hold, chemin critique, fréquence maximale et slack ;
  • générer un fichier de programmation ;
  • distinguer configuration volatile et mémoire non volatile ;
  • programmer une carte FPGA et valider le fonctionnement matériel.

Prérequis

  • synthèse logique et lecture du schéma RTL ;
  • horloges, registres et compteurs ;
  • bancs de test et validation fonctionnelle ;
  • architecture supérieure possédant des ports de carte ;
  • notions élémentaires d’électricité numérique.

Organisation du chapitre

Section

Contenu

Compétence principale

16.1Affectation des brochesRelier le modèle VHDL à la carte
16.2Contraintes d’horlogeDéfinir les exigences temporelles
16.3Placement et routageComprendre l’implantation physique
16.4Analyse temporelleÉvaluer la fréquence et les marges
16.5Fichier de programmationConfigurer le FPGA
TP 12Première implantationRéaliser la chaîne complète

 

Concept clé — Le fichier de contraintes appartient au projet

Le VHDL décrit les fonctions et interfaces logiques. Le fichier de contraintes associe ces interfaces à la réalité physique : broches, tensions, horloges et exigences temporelles.

 

16.1 Affectation des broches

Les ports de l’entité supérieure sont des noms logiques. Pour être accessibles sur la carte, ils doivent être associés à des broches physiques du composant FPGA.

16.1.1 Entité supérieure

Exemple de niveau supérieur  |  VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity top_fpga is
    port (
        clk_carte : in  std_logic;
        sw        : in   std_logic_vector(3 downto 0);
        bouton    : in   std_logic;
        led       : out std_logic_vector(3 downto 0)
    );
end entity top_fpga;

 

Seuls les ports de l’entité définie comme top-level peuvent généralement être affectés directement aux broches externes.

16.1.2 Association port-broche

Exemple XDC  |   Contraintes XDC
set_property PACKAGE_PIN W5 [get_ports clk_carte]
set_property PACKAGE_PIN V17 [get_ports {sw[0]}]
set_property PACKAGE_PIN U16 [get_ports {led[0]}]

 

Exemple QSF  |   Contraintes QSF
set_location_assignment PIN_W5 -to clk_carte
set_location_assignment PIN_V17 -to sw[0]
set_location_assignment PIN_U16 -to led[0]

 

Important — Exemples conceptuels

Les identifiants de broches ci-dessus sont uniquement illustratifs. Ils doivent être remplacés par les valeurs exactes du manuel ou du fichier de contraintes maître de la carte.

 

16.1.3 Entrées par interrupteurs

Un interrupteur fournit un niveau logique stable correspondant à sa position. Il reste cependant asynchrone par rapport à l’horloge interne.

Connexion logique simple  |  VHDL
led <= sw;

 

  • Vérifier la polarité électrique de l’interrupteur.
  • Synchroniser le signal avant une logique séquentielle.
  • Éviter les entrées flottantes.
  • Utiliser les résistances de pull-up ou pull-down prévues par la carte.

16.1.4 Entrées par boutons

Un bouton mécanique produit des rebonds et n’est pas synchronisé avec l’horloge. Une utilisation fiable nécessite synchronisation, anti-rebond et détection d’impulsion.

Synchronisation à deux bascules  |  VHDL
process(clk_carte)
begin
    if rising_edge(clk_carte) then
        bouton_meta  <= bouton;
        bouton_synch <= bouton_meta;
    end if;
end process;

 

16.1.5 Sorties vers LED

Affichage direct  |  VHDL
led <= compteur(27 downto 24);

 

Certaines LED sont actives à 0. Dans ce cas, il faut inverser le signal logique.

LED actives à zéro  |   VHDL
led_physiques <= not led_logiques;

 

16.1.6 Sorties vers afficheurs sept segments

Un afficheur utilise sept lignes de segments et, souvent, des lignes d’activation de chiffre. Les polarités dépendent du montage à anode commune ou cathode commune.

Ports d’affichage  |  VHDL
segments : out std_logic_vector(6 downto 0);
anodes   : out std_logic_vector(3 downto 0);

 

16.1.7 Standards électriques

Le standard d’entrée-sortie précise la tension, les seuils et certaines caractéristiques électriques des broches.

Standard LVCMOS  |  Contraintes XDC
set_property IOSTANDARD LVCMOS33 [get_ports {sw[*]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]

 

Standard

Tension nominale indicative

Usage typique

LVCMOS333,3 VCartes pédagogiques courantes
LVCMOS252,5 VBanques d’E/S à 2,5 V
LVCMOS181,8 VInterfaces basse tension
LVDSDifférentielLiaisons rapides

 

Sécurité matérielle — Compatibilité de banque

Une broche appartient à une banque d’E/S alimentée à une tension donnée. Le standard choisi doit être compatible avec l’alimentation de cette banque et le périphérique externe.

 

16.1.8 Courant et force de commande

Force de sortie et vitesse  |  Contraintes XDC
set_property DRIVE 8 [get_ports {led[*]}]
set_property SLEW SLOW [get_ports {led[*]}]

 

Une force excessive et des fronts rapides peuvent augmenter le bruit et la consommation. Les valeurs doivent respecter les recommandations de la carte.

16.1.9 Pull-up et pull-down

Résistance interne  |  Contraintes XDC
set_property PULLUP true [get_ports bouton]

 

Une résistance interne peut définir un niveau par défaut, mais elle ne remplace pas toujours le réseau externe de la carte.

16.1.10 Broches dédiées

  • Utiliser une broche d’horloge dédiée pour l’oscillateur principal.
  • Respecter les broches de configuration et JTAG.
  • Éviter les broches réservées ou non connectées.
  • Vérifier les broches différentielles par paires.
  • Ne jamais imposer une sortie FPGA sur une sortie externe concurrente.

16.1.11 Vérification des affectations

Contrôle

Question

Nom du portCorrespond-il exactement au VHDL ?
BrocheExiste-t-elle sur le boîtier sélectionné ?
Fonction carteEst-elle reliée au bon bouton ou LED ?
DirectionEntrée ou sortie cohérente ?
StandardCompatible avec la tension de banque ?
PolaritéActif haut ou actif bas ?

 

16.2 Contraintes d’horloge

Une contrainte d’horloge indique à l’outil la fréquence ou la période exigée. Elle sert à vérifier que les données peuvent traverser la logique entre deux registres dans le temps disponible.

16.2.1 Définition de la période

Horloge de 100 MHz  |   Contraintes XDC/SDC
create_clock -name clk_carte     -period 10.000     [get_ports clk_carte]

 

Une période de 10 ns correspond à 100 MHz. La fréquence est l’inverse de la période.

Fréquence

Période

25 MHz40 ns
50 MHz20 ns
100 MHz10 ns
125 MHz8 ns
200 MHz5 ns

 

16.2.2 Forme complète avec fronts

Rapport cyclique de 50 %  |   Contraintes
create_clock -name clk_carte     -period 10.000     -waveform {0.000 5.000}     [get_ports clk_carte]

 

16.2.3 Importance des contraintes temporelles

  • Elles définissent le temps disponible entre registres.
  • Elles guident l’optimisation, le placement et le routage.
  • Elles permettent de calculer le slack.
  • Elles révèlent les chemins critiques.
  • Sans contrainte, un projet peut fonctionner à une fréquence inconnue.

16.2.4 Horloge primaire

Une horloge primaire entre généralement par une broche externe ou une primitive dédiée. Elle constitue la référence de base du domaine d’horloge.

Port et buffer d’horloge  |  VHDL
U_BUFG : entity work.buffer_horloge
    port map (
        clk_in  => clk_carte,
        clk_out => clk_interne
    );

 

Dans un projet réel, l’outil insère souvent automatiquement un buffer global, ou le concepteur instancie une primitive du fabricant.

16.2.5 Horloge dérivée

Une horloge dérivée provient d’une PLL, d’un MMCM, d’un diviseur dédié ou d’une autre ressource d’horloge reconnue.

Contrainte générée conceptuelle  |  Contraintes
create_generated_clock      -name clk_div2     -source [get_pins U_PLL/CLKIN]     -divide_by 2     [get_pins U_PLL/CLKOUT]

 

Bonne pratique — Préférer clock enable

Une sortie de compteur ne doit pas être utilisée comme horloge secondaire ordinaire. Conserver l’horloge principale et générer une impulsion d’activation simplifie le timing.

 

16.2.6 Domaines d’horloge

Deux horloges indépendantes créent deux domaines. Les données qui les traversent nécessitent une synchronisation ou un protocole de transfert.

Type de transfert

Solution typique

Bit de contrôleSynchroniseur à deux bascules
ImpulsionHandshake ou synchroniseur d’impulsion
Bus multi-bitFIFO asynchrone ou protocole
Horloges liéesContraintes generated_clock et analyse relationnelle

 

16.2.7 Contraintes d’entrée et de sortie

Pour une interface synchrone externe, les délais des périphériques et du circuit imprimé doivent être modélisés.

Délais d’entrée conceptuels  |  Contraintes
set_input_delay -clock clk_carte -max 3.0 [get_ports data_in[*]]
set_input_delay -clock clk_carte -min 0.5 [get_ports data_in[*]]

 

Délais de sortie conceptuels  |  Contraintes
set_output_delay -clock clk_carte -max 2.5 [get_ports data_out[*]]
set_output_delay -clock clk_carte -min 0.2 [get_ports data_out[*]]

 

16.2.8 Faux chemins et chemins multicycles

Certaines relations ne doivent pas être analysées comme des transferts synchrones ordinaires. Les exceptions doivent rester rares, documentées et justifiées.

Faux chemin conceptuel  |  Contraintes
set_false_path -from [get_ports bouton_async]

 

Chemin multicycle conceptuel  |  Contraintes
set_multicycle_path 2 -setup -from [get_cells SRC_REG] -to [get_cells DST_REG]
set_multicycle_path 1 -hold  -from [get_cells SRC_REG] -to [get_cells DST_REG]

 

Attention — Danger des exceptions

Une fausse exception peut masquer un vrai problème temporel. Elle doit correspondre à l’architecture et être vérifiée par revue.

 

16.2.9 Horloges non contraintes

Le rapport doit signaler les horloges et chemins non contraints. Un chemin non contraint n’est pas automatiquement correct.

  • Vérifier le nombre d’horloges reconnues.
  • Rechercher les endpoints non contraints.
  • Vérifier les horloges générées.
  • Contrôler les relations entre domaines.
  • Examiner les avertissements de timing.

16.2.10 Contraintes réalistes

Une fréquence irréaliste peut augmenter fortement le temps de compilation et la surface sans garantie de réussite. La contrainte doit provenir du cahier des charges.

16.3 Placement et routage

Après la synthèse, la netlist doit être associée aux ressources physiques du FPGA puis reliée par les réseaux d’interconnexion.

16.3.1 Placement des ressources

Le placement choisit une position pour chaque LUT, bascule, bloc RAM, DSP et ressource d’horloge.

Ressource logique

Ressource physique possible

Fonction combinatoireLUT
RegistreBascule
MultiplicationDSP
MémoireBRAM/URAM ou LUTRAM
HorlogeBuffer global et réseau dédié

 

16.3.2 Objectifs du placement

  • rapprocher les ressources fortement connectées ;
  • réduire les délais de routage ;
  • respecter les ressources dédiées ;
  • répartir la congestion ;
  • satisfaire les contraintes temporelles ;
  • respecter les affectations de broches et régions.

16.3.3 Routage des connexions

Le routage choisit les segments et commutateurs internes reliant les ressources placées. Le délai de routage représente souvent une part importante du chemin critique.

16.3.4 Réseaux dédiés

Réseau

Usage

Horloge globaleDistribution à faible skew
Carry chainAddition et comptage rapides
Cascade DSPChaînes arithmétiques
Bus BRAMAccès mémoire local
Interconnexion généraleLogique et signaux ordinaires

 

16.3.5 Congestion

Une zone surchargée peut rendre le routage difficile et allonger les délais.

  • forte densité de LUT et registres ;
  • nombreux bus traversant la même région ;
  • fanout important ;
  • placement imposé trop strict ;
  • hiérarchie ou floorplanning inadapté.

16.3.6 Utilisation des ressources

Indicateur

Interprétation

LUT utiliséesLogique combinatoire
RegistresStockage et pipeline
DSPOpérations arithmétiques spécialisées
BRAMMémoire intégrée
I/OBroches d’entrée-sortie
Buffers d’horlogeRéseaux globaux

 

16.3.7 Rapport d’utilisation

Le rapport indique les ressources utilisées et disponibles. Une utilisation élevée n’est pas nécessairement une erreur, mais réduit la marge pour le routage et les évolutions.

Utilisation approximative

Lecture prudente

FaibleMarge importante
MoyenneSituation courante
ÉlevéeCongestion possible
Très élevéeRisque de routage et timing

 

16.3.8 Rapports d’implémentation

  • résumé de placement ;
  • résumé de routage ;
  • utilisation des ressources ;
  • congestion ;
  • timing setup et hold ;
  • horloges et skew ;
  • puissance estimée ;
  • avertissements et règles de conception.

16.3.9 DRC

Les Design Rule Checks vérifient les règles électriques et structurelles : broches sans standard, conflits, horloges mal connectées, banques incompatibles et autres erreurs.

16.3.10 Placement manuel

Le placement manuel ou floorplanning peut aider un projet complexe, mais il peut aussi dégrader l’optimisation automatique.

Contrainte de localisation conceptuelle  |  Contraintes
set_property LOC SLICE_X10Y20 [get_cells registre_critique_reg]

 

Méthode — Ne pas contraindre prématurément

Commencer par une architecture RTL propre et des contraintes temporelles correctes. Le placement manuel est une optimisation avancée guidée par les rapports.

 

16.3.11 Itérations d’implémentation

1. Lancer placement-routage.

2. Analyser les violations temporelles.

3. Identifier les chemins critiques.

4. Corriger le RTL ou les contraintes.

5. Relancer l’implémentation.

6. Comparer les rapports avec les mêmes options.

16.4 Analyse temporelle

L’analyse temporelle vérifie que les données arrivent et restent stables dans les fenêtres exigées par les registres et les interfaces.

16.4.1 Chemin registre à registre

Élément du chemin

Rôle

Registre sourceLance la donnée au front
Clock-to-QDélai de sortie de la bascule source
Logique combinatoireCalcul
RoutageInterconnexion
Registre destinationCapture au front suivant
SetupStabilité requise avant le front

 

16.4.2 Temps de propagation

Le délai de propagation total comprend les cellules et le routage. Il dépend du placement, de la charge, de la technologie et des conditions de fonctionnement.

16.4.3 Temps de setup

Pour respecter le setup, la donnée doit arriver suffisamment tôt avant le front de capture.

Relation simplifiée de setup  |  Équation
Tclk >= Tcq + Tlogique + Troutage + Tsetup + incertitude

 

16.4.4 Temps de hold

Pour respecter le hold, la nouvelle donnée ne doit pas atteindre trop rapidement le registre destination après le front de capture.

Relation simplifiée de hold  |  Équation
Tcq_min + Tchemin_min >= Thold + effets_horloge

 

16.4.5 Chemin critique

Le chemin critique est le chemin limitant la fréquence. Il possède le plus petit slack de setup, souvent le plus négatif en cas de violation.

16.4.6 Fréquence maximale

Dans une approximation simple, la fréquence maximale est l’inverse de la période minimale réalisable.

Période minimale

Fmax approximative

20 ns50 MHz
10 ns100 MHz
8 ns125 MHz
5 ns200 MHz

 

16.4.7 Slack

Le slack est la différence entre le temps requis et le temps d’arrivée.

Définition  |   Équation
slack = temps_requis - temps_arrivee

 

Slack

Interprétation

PositifContrainte respectée avec marge
NulChemin exactement à la limite
NégatifViolation temporelle

 

16.4.8 WNS et TNS

Indicateur

Signification

WNSWorst Negative Slack : pire marge de setup
TNSTotal Negative Slack : somme des marges négatives
WHSWorst Hold Slack : pire marge de hold
THSTotal Hold Slack : somme des violations hold

 

16.4.9 Exemple de lecture

Mesure

Valeur

Conclusion

Période demandée10,0 ns100 MHz
Temps d’arrivée10,8 nsChemin trop lent
Temps requis10,0 nsLimite
Slack-0,8 nsViolation setup

 

16.4.10 Correction d’un chemin setup

  • ajouter un registre de pipeline ;
  • réduire la profondeur logique ;
  • utiliser une ressource DSP ou carry chain ;
  • réduire le fanout ;
  • améliorer le placement ;
  • abaisser la fréquence si le cahier des charges le permet.

16.4.11 Correction d’un chemin hold

Les outils de routage ajoutent souvent automatiquement du délai pour corriger le hold. Un changement de fréquence ne corrige généralement pas une violation de hold.

Distinction — Setup et hold

Le setup concerne surtout les chemins trop lents. Le hold concerne les chemins trop rapides et les relations d’horloge locales.

 

16.4.12 Skew et incertitude

Le skew est la différence d’arrivée de l’horloge entre registres. L’incertitude couvre notamment jitter et marges de modélisation.

16.4.13 Chemins d’entrée-sortie

Les interfaces externes nécessitent des contraintes input_delay et output_delay pour inclure les périphériques et le circuit imprimé.

16.4.14 Analyse multi-corners

Le timing est évalué dans plusieurs conditions de procédé, tension et température. Le pire cas de setup et celui de hold peuvent être différents.

16.4.15 Rapport de chemin critique

Information

Utilité

StartpointRegistre ou entrée source
EndpointRegistre ou sortie destination
Niveaux logiquesProfondeur combinatoire
Délai logiqueTemps dans les cellules
Délai de routageTemps dans les connexions
SlackMarge finale

 

16.4.16 Ne pas ignorer les chemins non contraints

Un rapport sans violation peut être trompeur si certaines horloges ou interfaces ne sont pas contraintes. La couverture des contraintes doit être vérifiée.

16.5 Génération du fichier de programmation

Lorsque l’implémentation est validée, l’outil génère un fichier contenant la configuration des ressources et interconnexions du FPGA.

16.5.1 Bitstream

Le bitstream configure les LUT, multiplexeurs, mémoires, routes, E/S et autres ressources programmables.

Écosystème

Extensions courantes

Flux FPGA diversbitstream ou fichier binaire propriétaire
Xilinx/AMDBIT, BIN selon usage
Intel/AlteraSOF, POF, JIC selon mode
LatticeBIT, BIN ou formats spécifiques

 

Les noms exacts dépendent du fabricant et de la famille.

16.5.2 Vérifications avant génération

  • synthèse et implémentation terminées ;
  • aucune erreur DRC critique ;
  • broches et standards définis ;
  • timing conforme ou dérogations justifiées ;
  • entité supérieure correcte ;
  • tensions et banque d’E/S cohérentes.

16.5.3 Programmation volatile

La configuration chargée directement dans le FPGA est généralement perdue à la coupure de l’alimentation pour les FPGA à mémoire SRAM.

1. Connecter la carte par JTAG ou interface de programmation.

2. Détecter le composant.

3. Sélectionner le fichier de configuration.

4. Programmer le FPGA.

5. Valider immédiatement le fonctionnement.

16.5.4 Mémoire de configuration

Pour un démarrage autonome, le bitstream peut être stocké dans une mémoire non volatile externe ou interne, selon la technologie.

Mode

Caractéristique

JTAG directRapide pour le développement, volatil
Mémoire flash externeChargement automatique au démarrage
Flash interneDisponible sur certaines familles
Processeur de configurationCharge le FPGA par une interface

 

16.5.5 Fichier pour mémoire non volatile

L’outil peut convertir le bitstream en un format adapté à la mémoire de configuration. Le mode de démarrage, la largeur du bus et la taille de mémoire doivent correspondre à la carte.

16.5.6 Chargement sur la carte

  • vérifier le câble et les pilotes ;
  • alimenter correctement la carte ;
  • sélectionner la chaîne JTAG ;
  • vérifier l’identifiant du composant ;
  • programmer puis observer le signal DONE ou équivalent ;
  • tester les entrées et sorties.

16.5.7 Sécurité et intégrité

Certaines familles proposent chiffrement, authentification, verrouillage de lecture et démarrage sécurisé. Ces fonctions nécessitent une gestion rigoureuse des clés.

Sécurité — Prudence avec les clés

Une clé perdue ou mal programmée peut rendre la reconfiguration difficile. Les fonctions de sécurité doivent suivre la documentation du fabricant et une procédure contrôlée.

 

16.5.8 Version et traçabilité

  • identifier le commit ou la version du code ;
  • archiver les contraintes ;
  • conserver les rapports de synthèse et timing ;
  • nommer le bitstream avec la version et la cible ;
  • documenter les options de compilation.

16.5.9 Échec de programmation

Symptôme

Cause possible

Composant non détectéCâble, alimentation, pilote ou JTAG
Erreur de fichierMauvais composant ou bitstream corrompu
DONE non actifConfiguration incomplète ou alimentation
Fonctionnement incorrectBroches, polarité, horloge ou timing
Perte après redémarrageProgrammation volatile uniquement

 

Méthode complète d’implantation

1. Valider le code par simulation.

2. Définir l’entité supérieure.

3. Sélectionner le composant ou la carte exacte.

4. Créer les contraintes de broches et standards électriques.

5. Déclarer les horloges et contraintes d’E/S.

6. Lancer la synthèse et lire les avertissements.

7. Vérifier le schéma RTL et les ressources.

8. Lancer placement et routage.

9. Analyser setup, hold, slack et chemins non contraints.

10. Corriger le RTL ou les contraintes si nécessaire.

11. Exécuter les DRC.

12. Générer le fichier de programmation.

13. Programmer la carte et effectuer la validation matérielle.

Checklist avant programmation

  • Le bon FPGA et le bon boîtier sont-ils sélectionnés ?
  • Toutes les broches sont-elles affectées ?
  • Les standards d’E/S sont-ils compatibles ?
  • L’horloge est-elle contrainte ?
  • Les chemins non contraints sont-ils expliqués ?
  • Le WNS et le hold sont-ils acceptables ?
  • Les DRC critiques sont-ils résolus ?
  • La polarité des boutons, LED et afficheurs est-elle connue ?

Erreurs fréquentes

Erreur

Conséquence

Correction

Copier les broches d’une autre carteRisque de mauvais câblageUtiliser le manuel exact
Oublier IOSTANDARDDRC ou risque électriqueDéfinir le standard
Confondre période et demi-périodeContrainte incorrecteT=1/f
Ne pas contraindre l’horlogeTiming non significatifcreate_clock
Utiliser une sortie de compteur comme horlogeDomaine secondaire fragileClock enable
Ignorer un slack négatifFonctionnement instableCorriger architecture ou fréquence
Programmer seulement le FPGAPerte après extinctionConfigurer la mémoire si nécessaire

 

Travaux pratiques

TP 12 — Première implantation sur FPGA

1. Objectifs du TP

  • créer un fichier de contraintes ;
  • affecter quatre interrupteurs et quatre LED ;
  • déclarer l’horloge de la carte ;
  • compiler complètement le projet ;
  • analyser les ressources et le timing ;
  • générer le bitstream ;
  • programmer la carte ;
  • valider le fonctionnement matériel.

2. Fonction choisie

Le circuit affiche d’abord directement les interrupteurs sur quatre LED, puis utilise un compteur lent pour faire clignoter une LED supplémentaire. Cette combinaison valide les E/S et l’horloge.

3. Organisation du projet

Arborescence proposée  |  Arborescence
tp12_premiere_implantation/
├── src/
│   └── top_fpga.vhd
├── sim/
│   └── tb_top_fpga.vhd
├── constraints/
│   └── carte.xdc_ou_qsf
└── reports/
    ├── utilisation.txt
    └── timing.txt

 

4. Entité supérieure

top_fpga.vhd — Entité  |  VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity top_fpga is
    generic (
        LARGEUR_COMPTEUR : positive := 26
    );
    port (
        clk_carte : in  std_logic;
        reset_n   : in   std_logic;
        sw        : in   std_logic_vector(3 downto 0);
        led       : out std_logic_vector(4 downto 0)
    );
end entity top_fpga;

 

5. Architecture

top_fpga.vhd — Architecture  |  VHDL
architecture rtl of top_fpga is
    signal compteur : unsigned(LARGEUR_COMPTEUR-1 downto 0);
begin
    led(3 downto 0) <= sw;
    led(4) <= compteur(compteur'high);

    process(clk_carte, reset_n)
    begin
        if reset_n = '0' then
            compteur <= (others => '0');
        elsif rising_edge(clk_carte) then
            compteur <= compteur + 1;
        end if;
    end process;
end architecture rtl;

 

6. Explication

Élément

Rôle

led(3:0)Copie des interrupteurs
compteurDiviseur binaire libre
led(4)Bit de poids fort visible
reset_nReset asynchrone actif bas
LARGEUR_COMPTEURAdapte la vitesse du clignotement

 

7. Banc de test rapide

tb_top_fpga.vhd — Déclarations  |  VHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use STD.ENV.ALL;

entity tb_top_fpga is
end entity tb_top_fpga;

architecture simulation of tb_top_fpga is
    constant PERIODE : time := 20 ns;
    signal clk_carte : std_logic := '0';
    signal reset_n   : std_logic := '0';
    signal sw        : std_logic_vector(3 downto 0) := "0000";
    signal led       : std_logic_vector(4 downto 0);
begin
    clk_carte <= not clk_carte after PERIODE/2;

    DUT : entity work.top_fpga(rtl)
        generic map (
            LARGEUR_COMPTEUR => 4
        )
        port map (
            clk_carte => clk_carte,
            reset_n   => reset_n,
            sw        => sw,
            led       => led
        );

 

tb_top_fpga.vhd — Stimuli  |  VHDL
    stimuli : process
    begin
        wait for 2 * PERIODE;
        reset_n <= '1';

        sw <= "1010";
        wait for 1 ns;
        assert led(3 downto 0) = "1010" severity error;

        wait for 20 * PERIODE;

        sw <= "0101";
        wait for 1 ns;
        assert led(3 downto 0) = "0101" severity error;

        report "Test fonctionnel valide" severity note;
        stop;
        wait;
    end process;
end architecture simulation;

 

8. Création du fichier de contraintes

Commencer depuis le fichier maître fourni par le fabricant ou l’établissement. Décommenter uniquement les broches utilisées et adapter les noms aux ports du VHDL.

Exemple XDC conceptuel — Horloge et reset  |  Contraintes XDC
set_property PACKAGE_PIN <PIN_CLK> [get_ports clk_carte]
set_property IOSTANDARD LVCMOS33 [get_ports clk_carte]
create_clock -name clk_carte -period 20.000 [get_ports clk_carte]

set_property PACKAGE_PIN <PIN_RESET> [get_ports reset_n]
set_property IOSTANDARD LVCMOS33 [get_ports reset_n]

 

Exemple XDC conceptuel — Interrupteurs  |  Contraintes XDC
set_property PACKAGE_PIN <PIN_SW0> [get_ports {sw[0]}]
set_property PACKAGE_PIN <PIN_SW1> [get_ports {sw[1]}]
set_property PACKAGE_PIN <PIN_SW2> [get_ports {sw[2]}]
set_property PACKAGE_PIN <PIN_SW3> [get_ports {sw[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[*]}]

 

Exemple XDC conceptuel — LED  |  Contraintes XDC
set_property PACKAGE_PIN <PIN_LED0> [get_ports {led[0]}]
set_property PACKAGE_PIN <PIN_LED1> [get_ports {led[1]}]
set_property PACKAGE_PIN <PIN_LED2> [get_ports {led[2]}]
set_property PACKAGE_PIN <PIN_LED3> [get_ports {led[3]}]
set_property PACKAGE_PIN <PIN_LED4> [get_ports {led[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}]

 

Étape obligatoire — À compléter avec la carte réelle

Les marqueurs <PIN_...> doivent obligatoirement être remplacés par les broches exactes. Le document ne peut pas deviner la carte utilisée.

 

9. Compilation complète

1. Créer un nouveau projet avec la cible correcte.

2. Ajouter top_fpga.vhd.

3. Ajouter le fichier de contraintes.

4. Définir top_fpga comme niveau supérieur.

5. Lancer l’analyse et la synthèse.

6. Examiner les avertissements.

7. Lancer placement et routage.

8. Lancer l’analyse temporelle.

9. Exécuter les DRC.

10. Générer le bitstream.

10. Analyse du rapport de synthèse

Élément

Valeur relevée

Interprétation

LUT Logique des E/S et du compteur
Registres Bits du compteur
DSP0 attenduAucune multiplication
BRAM0 attenduAucune mémoire
I/O Horloge, reset, interrupteurs et LED

 

11. Analyse du schéma RTL

  • Repérer le registre compteur.
  • Repérer l’incrémenteur.
  • Vérifier la connexion directe sw vers led.
  • Identifier le reset asynchrone.
  • Vérifier que LARGEUR_COMPTEUR a été appliqué.

12. Analyse temporelle

Mesure

Valeur

Verdict

Période demandée20 ns50 MHz
WNS Doit être ≥ 0
TNS 0 attendu
Worst hold slack Doit être ≥ 0
Chemins non contraints À expliquer ou corriger

 

13. Génération du bitstream

  • Résoudre les erreurs DRC bloquantes.
  • Vérifier le fichier généré.
  • Noter la version du projet.
  • Archiver le rapport de timing associé.
  • Ne pas modifier les contraintes après génération sans recompiler.

14. Programmation de la carte

1. Connecter et alimenter la carte.

2. Ouvrir le gestionnaire matériel.

3. Détecter la chaîne JTAG.

4. Sélectionner le FPGA.

5. Associer le bitstream.

6. Lancer la programmation.

7. Vérifier le statut de réussite.

15. Validation matérielle

1. Placer reset_n au niveau actif puis le relâcher.

2. Changer chaque interrupteur séparément.

3. Vérifier la LED correspondante.

4. Observer le clignotement de led(4).

5. Comparer la vitesse observée à la fréquence calculée.

6. Redémarrer la carte et observer si la configuration persiste.

16. Calcul du clignotement

Pour un compteur binaire libre, le bit k change à une fréquence approximative f_clk / 2^(k+1).

Exemple  |   Calcul
f_clk = 50 MHz
k = 25
f_led = 50 000 000 / 2^26 ≈ 0,745 Hz

 

17. Diagnostic si la carte ne fonctionne pas

Symptôme

Vérification

Aucune LEDAlimentation, bitstream, polarité, contraintes
LED incorrectesOrdre des bits et broches
Pas de clignotementHorloge, reset, largeur du compteur
Clignotement trop rapideAugmenter LARGEUR_COMPTEUR
Compilation sans timingVérifier create_clock
Perte après extinctionProgrammer la mémoire non volatile

 

18. Résultats à consigner

Étape

Résultat

Conforme

Simulation RTL  
Synthèse sans erreur  
Broches affectées  
Timing setup  
Timing hold  
Bitstream généré  
Programmation réussie  
Validation interrupteurs/LED  

 

19. Questions d’analyse

1. Pourquoi les ports VHDL ne suffisent-ils pas pour programmer une carte ?

2. Comment calculer la période d’une horloge de 50 MHz ?

3. Pourquoi le standard électrique doit-il correspondre à la banque d’E/S ?

4. Quelle différence existe entre synthèse et placement-routage ?

5. Que représente un slack négatif ?

6. Pourquoi une violation de hold n’est-elle pas corrigée en réduisant la fréquence ?

7. Quel est le rôle du bitstream ?

8. Pourquoi la configuration peut-elle disparaître après extinction ?

9. Pourquoi faut-il archiver les rapports avec le bitstream ?

10. Quels contrôles effectuer avant de connecter un périphérique externe ?

20. Extensions proposées

  • Ajouter un bouton synchronisé et anti-rebond.
  • Piloter un afficheur sept segments.
  • Créer un tick d’une seconde avec clock enable.
  • Mesurer l’effet de plusieurs largeurs de compteur.
  • Comparer une contrainte de 50 MHz et 100 MHz.
  • Programmer la mémoire de configuration.
  • Ajouter un identifiant de version visible sur les LED.
  • Analyser la consommation estimée.

21. Barème indicatif

Critère

Points

Simulation fonctionnelle2
Fichier de contraintes4
Synthèse et schéma RTL3
Rapport de ressources2
Analyse temporelle3
Génération du bitstream2
Programmation et validation matérielle3
Qualité du compte rendu1
Total20

 

Synthèse du chapitre

Notion

Résumé

Affectation de brochesAssociation entre ports logiques et boîtier physique.
IOSTANDARDCaractéristiques électriques d’une E/S.
create_clockDéclaration d’une horloge et de sa période.
PlacementPositionnement des ressources dans le FPGA.
RoutageConnexion physique des ressources.
SetupDonnée stable avant le front de capture.
HoldDonnée stable après le front de capture.
Chemin critiqueChemin limitant la fréquence.
SlackMarge entre temps requis et arrivée.
BitstreamConfiguration programmable du FPGA.
Programmation volatileConfiguration perdue à la coupure sur FPGA SRAM.
Mémoire de configurationStockage non volatile pour démarrage autonome.

 

Autoévaluation

1. Où associe-t-on les ports aux broches ?

Réponse : Dans le fichier de contraintes.

2. Quelle période correspond à 100 MHz ?

Réponse : 10 ns.

3. Que fait le placement ?

Réponse : Il positionne les ressources physiques.

4. Que fait le routage ?

Réponse : Il relie les ressources placées.

5. Que signifie un slack positif ?

Réponse : La contrainte est respectée avec marge.

6. Qu’est-ce que le chemin critique ?

Réponse : Le chemin le plus limitant pour le timing.

7. Que configure le bitstream ?

Réponse : Les ressources et interconnexions programmables.

8. Pourquoi la configuration peut-elle être volatile ?

Réponse : La mémoire SRAM perd son contenu sans alimentation.

9. Que faut-il vérifier avant programmation ?

Réponse : DRC, broches, standards et timing.

10. Comment obtenir un démarrage autonome ?

Réponse : Programmer une mémoire de configuration compatible.

Exercice de consolidation

Une carte utilise une horloge de 100 MHz. Le rapport indique un temps d’arrivée de 10,6 ns pour un temps requis de 10,0 ns. Calculer le slack, conclure et proposer deux corrections.

Correction  |   Analyse
slack = 10,0 ns - 10,6 ns = -0,6 ns

Conclusion : violation de setup.
Corrections possibles :
- ajouter un registre de pipeline ;
- réduire la profondeur logique ;
- utiliser une ressource spécialisée ;
- réduire la fréquence à une valeur compatible.

 

Suite du cours — Transition vers la suite

Après l’implantation, le cours peut approfondir les entrées asynchrones, la métastabilité, l’anti-rebond et les traversées de domaines d’horloge.