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.1 | Affectation des broches | Relier le modèle VHDL à la carte |
| 16.2 | Contraintes d’horloge | Définir les exigences temporelles |
| 16.3 | Placement et routage | Comprendre l’implantation physique |
| 16.4 | Analyse temporelle | Évaluer la fréquence et les marges |
| 16.5 | Fichier de programmation | Configurer le FPGA |
| TP 12 | Première implantation | Ré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 |
|---|---|---|
| LVCMOS33 | 3,3 V | Cartes pédagogiques courantes |
| LVCMOS25 | 2,5 V | Banques d’E/S à 2,5 V |
| LVCMOS18 | 1,8 V | Interfaces basse tension |
| LVDS | Différentiel | Liaisons 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 port | Correspond-il exactement au VHDL ? |
| Broche | Existe-t-elle sur le boîtier sélectionné ? |
| Fonction carte | Est-elle reliée au bon bouton ou LED ? |
| Direction | Entrée ou sortie cohérente ? |
| Standard | Compatible 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 MHz | 40 ns |
| 50 MHz | 20 ns |
| 100 MHz | 10 ns |
| 125 MHz | 8 ns |
| 200 MHz | 5 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ôle | Synchroniseur à deux bascules |
| Impulsion | Handshake ou synchroniseur d’impulsion |
| Bus multi-bit | FIFO asynchrone ou protocole |
| Horloges liées | Contraintes 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 combinatoire | LUT |
| Registre | Bascule |
| Multiplication | DSP |
| Mémoire | BRAM/URAM ou LUTRAM |
| Horloge | Buffer 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 globale | Distribution à faible skew |
| Carry chain | Addition et comptage rapides |
| Cascade DSP | Chaînes arithmétiques |
| Bus BRAM | Accès mémoire local |
| Interconnexion générale | Logique 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ées | Logique combinatoire |
| Registres | Stockage et pipeline |
| DSP | Opérations arithmétiques spécialisées |
| BRAM | Mémoire intégrée |
| I/O | Broches d’entrée-sortie |
| Buffers d’horloge | Ré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 |
|---|---|
| Faible | Marge importante |
| Moyenne | Situation courante |
| Élevée | Congestion possible |
| Très élevée | Risque 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 source | Lance la donnée au front |
| Clock-to-Q | Délai de sortie de la bascule source |
| Logique combinatoire | Calcul |
| Routage | Interconnexion |
| Registre destination | Capture au front suivant |
| Setup | Stabilité 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 ns | 50 MHz |
| 10 ns | 100 MHz |
| 8 ns | 125 MHz |
| 5 ns | 200 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 |
|---|---|
| Positif | Contrainte respectée avec marge |
| Nul | Chemin exactement à la limite |
| Négatif | Violation temporelle |
16.4.8 WNS et TNS
Indicateur | Signification |
|---|---|
| WNS | Worst Negative Slack : pire marge de setup |
| TNS | Total Negative Slack : somme des marges négatives |
| WHS | Worst Hold Slack : pire marge de hold |
| THS | Total Hold Slack : somme des violations hold |
16.4.9 Exemple de lecture
Mesure | Valeur | Conclusion |
|---|---|---|
| Période demandée | 10,0 ns | 100 MHz |
| Temps d’arrivée | 10,8 ns | Chemin trop lent |
| Temps requis | 10,0 ns | Limite |
| Slack | -0,8 ns | Violation 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é |
|---|---|
| Startpoint | Registre ou entrée source |
| Endpoint | Registre ou sortie destination |
| Niveaux logiques | Profondeur combinatoire |
| Délai logique | Temps dans les cellules |
| Délai de routage | Temps dans les connexions |
| Slack | Marge 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 divers | bitstream ou fichier binaire propriétaire |
| Xilinx/AMD | BIT, BIN selon usage |
| Intel/Altera | SOF, POF, JIC selon mode |
| Lattice | BIT, 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 direct | Rapide pour le développement, volatil |
| Mémoire flash externe | Chargement automatique au démarrage |
| Flash interne | Disponible sur certaines familles |
| Processeur de configuration | Charge 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 fichier | Mauvais composant ou bitstream corrompu |
| DONE non actif | Configuration incomplète ou alimentation |
| Fonctionnement incorrect | Broches, polarité, horloge ou timing |
| Perte après redémarrage | Programmation 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 carte | Risque de mauvais câblage | Utiliser le manuel exact |
| Oublier IOSTANDARD | DRC ou risque électrique | Définir le standard |
| Confondre période et demi-période | Contrainte incorrecte | T=1/f |
| Ne pas contraindre l’horloge | Timing non significatif | create_clock |
| Utiliser une sortie de compteur comme horloge | Domaine secondaire fragile | Clock enable |
| Ignorer un slack négatif | Fonctionnement instable | Corriger architecture ou fréquence |
| Programmer seulement le FPGA | Perte après extinction | Configurer 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 |
| compteur | Diviseur binaire libre |
| led(4) | Bit de poids fort visible |
| reset_n | Reset asynchrone actif bas |
| LARGEUR_COMPTEUR | Adapte 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 | |
| DSP | 0 attendu | Aucune multiplication |
| BRAM | 0 attendu | Aucune 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ée | 20 ns | 50 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 LED | Alimentation, bitstream, polarité, contraintes |
| LED incorrectes | Ordre des bits et broches |
| Pas de clignotement | Horloge, reset, largeur du compteur |
| Clignotement trop rapide | Augmenter LARGEUR_COMPTEUR |
| Compilation sans timing | Vérifier create_clock |
| Perte après extinction | Programmer 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 fonctionnelle | 2 |
| Fichier de contraintes | 4 |
| Synthèse et schéma RTL | 3 |
| Rapport de ressources | 2 |
| Analyse temporelle | 3 |
| Génération du bitstream | 2 |
| Programmation et validation matérielle | 3 |
| Qualité du compte rendu | 1 |
| Total | 20 |
Synthèse du chapitre
Notion | Résumé |
|---|---|
| Affectation de broches | Association entre ports logiques et boîtier physique. |
| IOSTANDARD | Caractéristiques électriques d’une E/S. |
| create_clock | Déclaration d’une horloge et de sa période. |
| Placement | Positionnement des ressources dans le FPGA. |
| Routage | Connexion physique des ressources. |
| Setup | Donnée stable avant le front de capture. |
| Hold | Donnée stable après le front de capture. |
| Chemin critique | Chemin limitant la fréquence. |
| Slack | Marge entre temps requis et arrivée. |
| Bitstream | Configuration programmable du FPGA. |
| Programmation volatile | Configuration perdue à la coupure sur FPGA SRAM. |
| Mémoire de configuration | Stockage 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. |