Objectifs
| # | Objectif |
|---|---|
| 1 | Modéliser en VHDL synthétisable un système de gestion de parking de voitures |
| 2 | Valider et simuler le système via des testbenches |
| 3 | Utiliser l'objet assert … report … severity pour valider le fonctionnement |
| 4 | Implémenter la description sur FPGA Artix-7 (carte Basys 3) |
Description du système
Le but du système est de gérer la disponibilité des places d'un parking. Il fournit :
nb_places_dispos: nombre de places disponibles (sortie 4 bits)complet: indicateur à'1'si le parking est plein
À travers les entrées capt_entree et capt_sortie (capteurs de présence),
le système met à jour le nombre de places disponibles :
| Signal | Direction | Description |
|---|---|---|
capt_entree | Entrée | Capteur de présence à l'entrée → incrémente le compteur de +1 |
capt_sortie | Entrée | Capteur de présence à la sortie → décrémente le compteur de -1 |
nb_places_dispos | Sortie | Nombre de places disponibles = max − count |
complet | Sortie | '1' si count ≥ max |
Architecture globale
FSM
FSM
4 bits up/down
count ≥ max
max − count
capacité max
+ Soustracteur
Description des composants
4.1 — Composant compteur
Compteur/décompteur 4 bits avec reset asynchrone actif haut.
| Port | Direction | Description |
|---|---|---|
clk | in | Horloge système |
rst | in | Reset asynchrone actif haut → remet count à 0 |
up | in | '1' → incrémentation (+1) |
down | in | '1' → décrémentation (−1) |
count | out | Valeur courante du comptage (4 bits) |
process(clk, rst)
begin
if rst = '1' then
count_reg <= (others => '0'); -- Reset asynchrone
elsif rising_edge(clk) then
if up = '1' and down = '0' then
if count_reg < 15 then
count_reg <= count_reg + 1; -- Comptage (protection overflow)
end if;
elsif down = '1' and up = '0' then
if count_reg > 0 then
count_reg <= count_reg - 1; -- Décomptage (protection underflow)
end if;
end if;
end if;
end process;
4.2 — Composant registre
Registre 4 bits pour stocker la capacité maximale du parking. Modifiable facilement sans recompilation.
| Port | Direction | Description |
|---|---|---|
clk | in | Horloge système |
rst | in | Reset asynchrone actif haut |
load | in | '1' → chargement de data_in dans le registre |
data_in | in | Capacité maximale à charger (4 bits) |
data_out | out | Capacité maximale stockée (4 bits) |
Niveaux de severity — assert / report
| Niveau | Condition déclenchante | Comportement du simulateur |
|---|---|---|
| NOTE | Valeur valide chargée (data_in > 0) |
Affichage informatif dans la console — simulation continue normalement |
| WARNING | data_in = 0 (capacité nulle) |
Message en surbrillance — simulation continue mais avertit l'utilisateur |
| ERROR | data_in > 15 (impossible sur 4 bits) |
Signalement d'erreur — selon les paramètres du simulateur, peut arrêter la simulation |
| FAILURE | Cas critique irréparable | Arrêt immédiat et inconditionnel de la simulation |
4.3 — Composant comparateur
Compare le nombre de voitures présentes avec la capacité maximale. Utilise une instruction concurrente conditionnelle.
-- Instruction concurrente conditionnelle (when/else)
complet <= '1' when (UNSIGNED(count) >= UNSIGNED(max)) else '0';
4.4 — Composant soustracteur
Calcule le nombre de places disponibles :
nb_places_dispos = max − count
nb_places_dispos <= STD_LOGIC_VECTOR(UNSIGNED(max) - UNSIGNED(count));
4.5 — Composant detect_front_1 (Machine d'états)
'1' pendant plusieurs coups d'horloge.
Le compteur ne doit s'incrémenter qu'une seule fois par voiture.
La solution : détecter uniquement le front montant et générer une impulsion
d'exactement 1 période d'horloge.
5.1 — Diagramme d'états
| État courant | Condition | État suivant | pulse_out |
|---|---|---|---|
| S0_IDLE | signal_in = '1' | S1_PULSE | '0' |
| S0_IDLE | signal_in = '0' | S0_IDLE | '0' |
| S1_PULSE | (toujours) | S2_WAIT | '1' |
| S2_WAIT | signal_in = '1' | S2_WAIT | '0' |
| S2_WAIT | signal_in = '0' | S0_IDLE | '0' |
5.2 — Chronogramme (Figure 2)
ⓘ pulse_out = '1' pendant exactement 1 période d'horloge lors du front montant,
quelle que soit la durée pendant laquelle signal_in reste à '1'.
4.6 — Composant gestion_parking (Top-Level)
Architecture structurelle — instancie tous les sous-composants par port map.
| Instance | Composant | Rôle |
|---|---|---|
U_DETECT_ENTREE | detect_front_1 | Détection front montant capteur entrée |
U_DETECT_SORTIE | detect_front_1 | Détection front montant capteur sortie |
U_COMPTEUR | compteur | Comptage des voitures dans le parking |
U_REGISTRE | registre | Stockage de la capacité maximale |
U_COMPARATEUR | comparateur | Détection de l'état "parking plein" |
U_SOUSTRACTEUR | soustracteur | Calcul du nombre de places disponibles |
Validation et simulation
5.1 — Plan de test
| Testbench | Composant testé | Cas couverts |
|---|---|---|
tb_compteur.vhd | compteur | Reset, comptage +5, décomptage −2, protection underflow / overflow |
tb_registre.vhd | registre | Chargement valide, stabilité sans load, valeur 0, messages assert severity |
tb_comparateur.vhd | comparateur | count < max, count = max, count > max |
tb_soustracteur.vhd | soustracteur | Cas normaux, parking plein, parking vide |
tb_detect_front_1.vhd | detect_front_1 | Front long, front court, deux fronts successifs (Figure 2) |
tb_gestion_parking.vhd | gestion_parking | Scénario complet d'utilisation système |
5.2 — Scénario de simulation du top-level (capacité max = 4)
| Étape | Action | count | nb_places_dispos | complet |
|---|---|---|---|---|
| Init | Reset + load max = 4 | 0 | 4 | 0 |
| 1 | capt_entree pulse (voiture 1) | 1 | 3 | 0 |
| 2 | capt_entree pulse (voiture 2) | 2 | 2 | 0 |
| 3 | capt_entree pulse (voiture 3) | 3 | 1 | 0 |
| 4 | capt_entree pulse (voiture 4) | 4 | 0 | 1 — COMPLET |
| 5 | capt_sortie pulse (1 voiture sort) | 3 | 1 | 0 |
| 6 | Reset système | 0 | 4 | 0 |
Structure des fichiers
- 📄compteur.vhdCompteur/décompteur 4 bits
- 📄registre.vhdRegistre capacité max + assert
- 📄comparateur.vhdComparateur (when/else)
- 📄soustracteur.vhdCalcul places disponibles
- 📄detect_front_1.vhdFSM détecteur front montant
- 📄gestion_parking.vhdTop-level structurel
- 🧪tb_compteur.vhdTestbench compteur
- 🧪tb_registre.vhdTestbench registre
- 🧪tb_comparateur.vhdTestbench comparateur
- 🧪tb_soustracteur.vhdTestbench soustracteur
- 🧪tb_detect_front_1.vhdTestbench FSM
- 🧪tb_gestion_parking.vhdTestbench top-level
Ordre de compilation (bibliothèque work)
-- Étape 1 : Composants de base (aucune dépendance)
vcom compteur.vhd
vcom registre.vhd
vcom comparateur.vhd
vcom soustracteur.vhd
vcom detect_front_1.vhd
-- Étape 2 : Top-level (dépend de tous les composants)
vcom gestion_parking.vhd
-- Étape 3 : Testbenches
vcom tb_compteur.vhd
vcom tb_registre.vhd
vcom tb_comparateur.vhd
vcom tb_soustracteur.vhd
vcom tb_detect_front_1.vhd
vcom tb_gestion_parking.vhd
Conclusion
Le système de gestion de parking a été entièrement décrit en VHDL synthétisable.
L'architecture structurelle du composant top-level gestion_parking permet d'assembler
proprement les six sous-composants indépendants.
La machine d'états detect_front_1 garantit qu'une voiture n'est comptée
qu'une seule fois, même si le capteur reste actif plusieurs cycles d'horloge.
L'utilisation des assertions VHDL dans le composant registre illustre les quatre
niveaux de severity (NOTE, WARNING,
ERROR, FAILURE) et leur
impact différent sur le comportement du simulateur.
L'ensemble a été conçu pour être facilement implémentable sur la carte Basys 3 (FPGA Artix-7) via Vivado Design Suite.