TP1 — VHDL

Système de Gestion de Parking

Modélisation VHDL synthétisable • Simulation • Implémentation FPGA Artix-7 (Basys 3)

Vivado Design Suite  |  Basys 3 Board  |  Avril 2026

Code Source — GitHub

👤 Réalisé par

MT
Montassar Tayachi
YH
Med Yassine Hamami
AB
Amen Allah Bayoudh
OK
Med Omar Khaloun
2I
Classe : 2ISEOC
1

Objectifs

#Objectif
1Modéliser en VHDL synthétisable un système de gestion de parking de voitures
2Valider et simuler le système via des testbenches
3Utiliser l'objet assert … report … severity pour valider le fonctionnement
4Implémenter la description sur FPGA Artix-7 (carte Basys 3)
2

Description du système

Le but du système est de gérer la disponibilité des places d'un parking. Il fournit :

À travers les entrées capt_entree et capt_sortie (capteurs de présence), le système met à jour le nombre de places disponibles :

SignalDirectionDescription
capt_entreeEntréeCapteur de présence à l'entrée → incrémente le compteur de +1
capt_sortieEntréeCapteur de présence à la sortie → décrémente le compteur de -1
nb_places_disposSortieNombre de places disponibles = max − count
completSortie'1' si count ≥ max
3

Architecture globale

capt_entree
Detect_Front_1
FSM
capt_sortie
Detect_Front_1
FSM
Compteur
4 bits up/down
→ count →
Comparateur
count ≥ max
Soustracteur
max − count
complet
nb_places_dispos
max_places_in
Registre
capacité max
→ max →
Comparateur
+ Soustracteur
4

Description des composants

4.1 — Composant compteur

Compteur/décompteur 4 bits avec reset asynchrone actif haut.

PortDirectionDescription
clkinHorloge système
rstinReset asynchrone actif haut → remet count à 0
upin'1' → incrémentation (+1)
downin'1' → décrémentation (−1)
countoutValeur 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.

PortDirectionDescription
clkinHorloge système
rstinReset asynchrone actif haut
loadin'1' → chargement de data_in dans le registre
data_ininCapacité maximale à charger (4 bits)
data_outoutCapacité maximale stockée (4 bits)

Niveaux de severity — assert / report

NiveauCondition déclenchanteComportement 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)

Problème : Le capteur peut rester à '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

S0_IDLE
out = '0'
signal_in='1'
S1_PULSE
out = '1'
(toujours)
S2_WAIT
out = '0'
signal_in='0'
↪ S0_IDLE
État courantConditionÉtat suivantpulse_out
S0_IDLEsignal_in = '1'S1_PULSE'0'
S0_IDLEsignal_in = '0'S0_IDLE'0'
S1_PULSE(toujours)S2_WAIT'1'
S2_WAITsignal_in = '1'S2_WAIT'0'
S2_WAITsignal_in = '0'S0_IDLE'0'

5.2 — Chronogramme (Figure 2)

clk : ___________
signal_in : ______‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾_______
pulse_out : __________‾‾__________________

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.

InstanceComposantRôle
U_DETECT_ENTREEdetect_front_1Détection front montant capteur entrée
U_DETECT_SORTIEdetect_front_1Détection front montant capteur sortie
U_COMPTEURcompteurComptage des voitures dans le parking
U_REGISTREregistreStockage de la capacité maximale
U_COMPARATEURcomparateurDétection de l'état "parking plein"
U_SOUSTRACTEURsoustracteurCalcul du nombre de places disponibles
5

Validation et simulation

5.1 — Plan de test

TestbenchComposant testéCas couverts
tb_compteur.vhdcompteurReset, comptage +5, décomptage −2, protection underflow / overflow
tb_registre.vhdregistreChargement valide, stabilité sans load, valeur 0, messages assert severity
tb_comparateur.vhdcomparateurcount < max, count = max, count > max
tb_soustracteur.vhdsoustracteurCas normaux, parking plein, parking vide
tb_detect_front_1.vhddetect_front_1Front long, front court, deux fronts successifs (Figure 2)
tb_gestion_parking.vhdgestion_parkingScénario complet d'utilisation système

5.2 — Scénario de simulation du top-level (capacité max = 4)

ÉtapeActioncountnb_places_disposcomplet
InitReset + load max = 4040
1capt_entree pulse (voiture 1)130
2capt_entree pulse (voiture 2)220
3capt_entree pulse (voiture 3)310
4capt_entree pulse (voiture 4)401 — COMPLET
5capt_sortie pulse (1 voiture sort)310
6Reset système040
6

Structure des fichiers

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
7

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.