Compteur Modulo 10
sur FPGA en VHDL
Objectifs du TP
Conception, simulation et implémentation d'un compteur modulo 10 synchrone en VHDL sur FPGA.
🔬 SIMULATION
- Créer un projet Quartus Prime
- Écrire un code VHDL complet
- Créer un testbench de simulation
- Lancer ModelSim / Questa
- Analyser les chronogrammes
⚡ IMPLÉMENTATION FPGA
- Compiler et synthétiser le design
- Assigner les broches (Pin Planner)
- Générer le bitstream (.sof)
- Programmer le FPGA via USB Blaster
- Vérifier le fonctionnement sur carte
Compteur Modulo 10 — Principe
Un compteur modulo N est un circuit séquentiel synchrone qui compte de 0 jusqu'à N−1 puis repart à 0. Pour N = 10 :
Table de transitions
| État Q | CLK ↑ | Prochain Q+1 |
|---|---|---|
| 0000 | ↑ | 0001 |
| 0001 | ↑ | 0010 |
| 0010 | ↑ | 0011 |
| 0011 | ↑ | 0100 |
| 0100 | ↑ | 0101 |
| 0101 | ↑ | 0110 |
| 0110 | ↑ | 0111 |
| 0111 | ↑ | 1000 |
| 1000 | ↑ | 1001 |
| 1001 | ↑ | 0000 ← RESET |
Chronogramme attendu
Création du Projet Quartus Prime
- Ouvrir Quartus Prime → File▶New Project Wizard...
- Introduction — Cliquer Next
- Directory, Name, Top-Level Entity :
PARAMÈTRES
Répertoire : C:\TP_VHDL\compteur_mod10\ Nom du projet : compteur_mod10 Entité top-level : compteur_mod10 - Project Type → Empty project puis Next
- Add Files — Ne rien ajouter. Next
- Dans Family →
Cyclone IV E - Dans Device →
EP4CE115F29C7 - Cliquer Next puis Finish
- → File▶New...▶VHDL File▶OK
- Sauvegarder avec Ctrl+S
- Nommer le fichier :
compteur_mod10.vhd
compteur_mod10Écriture du Code VHDL
-- ============================================================ -- Fichier : compteur_mod10.vhd -- Description: Compteur synchrone modulo 10 (0 à 9) -- Reset : synchrone, actif haut -- ============================================================ LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY compteur_mod10 IS PORT ( CLK : IN STD_LOGIC; RST : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END compteur_mod10; ARCHITECTURE behavioral OF compteur_mod10 IS SIGNAL count : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000"; BEGIN PROCESS(CLK) BEGIN IF rising_edge(CLK) THEN IF RST = '1' THEN count <= "0000"; -- Reset prioritaire ELSIF count = "1001" THEN count <= "0000"; -- count=9 → rebouclage à 0 ELSE count <= count + "0001"; -- Incrément +1 END IF; END IF; END PROCESS; Q <= count; END behavioral;
Explication ligne par ligne
LIBRARY / USE
Import des bibliothèques IEEE pour les types STD_LOGIC et l'opérateur + sur les vecteurs.
ENTITY — Interface
CLK : horloge principale.
RST : reset synchrone actif haut.
Q(3:0) : sortie 4 bits (0000 Ã 1001).
SIGNAL count
Registre interne 4 bits, invisible de l'extérieur. Initialisé à "0000". Stocke l'état courant.
PROCESS(CLK)
Sensible à CLK uniquement. rising_edge(CLK) détecte le front montant → comportement synchrone.
Reset prioritaire
Condition RST='1' testée en premier. Remise à zéro quelle que soit la valeur courante.
Rebouclage Modulo 10
Si count = "1001" (=9), prochain état = 0. Sinon, incrément +1. C'est la logique modulo 10.
Le testbench est un fichier VHDL non synthétisable — il génère les signaux de test (horloge, reset) pour simuler notre composant.
compteur_mod10_tb.vhdLIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY compteur_mod10_tb IS END compteur_mod10_tb; ARCHITECTURE sim OF compteur_mod10_tb IS COMPONENT compteur_mod10 PORT(CLK:IN STD_LOGIC; RST:IN STD_LOGIC; Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT; SIGNAL tb_clk : STD_LOGIC := '0'; SIGNAL tb_rst : STD_LOGIC := '0'; SIGNAL tb_q : STD_LOGIC_VECTOR(3 DOWNTO 0); CONSTANT CLK_PERIOD : TIME := 20 ns; -- 50 MHz BEGIN UUT : compteur_mod10 PORT MAP(CLK=>tb_clk, RST=>tb_rst, Q=>tb_q); CLK_GEN : PROCESS BEGIN tb_clk <= '0'; WAIT FOR CLK_PERIOD/2; tb_clk <= '1'; WAIT FOR CLK_PERIOD/2; END PROCESS; STIM : PROCESS BEGIN tb_rst <= '1'; WAIT FOR 3*CLK_PERIOD; -- Reset 3 cycles tb_rst <= '0'; WAIT FOR 25*CLK_PERIOD; -- Comptage libre tb_rst <= '1'; WAIT FOR 2*CLK_PERIOD; -- Reset en cours tb_rst <= '0'; WAIT FOR 15*CLK_PERIOD; -- Suite du comptage WAIT; END PROCESS; END sim;
Simulation avec ModelSim / Questa
- Assignments▶Settings...
- Arbre gauche → EDA Tool Settings → Simulation
- Sélectionner ModelSim-Altera ou Questa Intel FPGA
- Format for output netlist →
VHDL - Cocher Compile test bench → Ajouter :
PARAMÈTRES TESTBENCHTest bench name :
compteur_mod10_tb
Top level module :compteur_mod10_tb
Add file :compteur_mod10_tb.vhd - Cliquer OK
- Tools▶Run Simulation Tool▶RTL Simulation
- ModelSim s'ouvre, compile et lance la simulation automatiquement
- Vérifier que la fenêtre Wave est visible
- Zoom avec la molette · Relancer avec Ctrl+R
② Comptage démarre dès RST=0
③ Après Q=9, prochain état = Q=0 — rebouclage modulo 10
Compiler et Synthétiser le Design
- Dans le Project Navigator, clic droit sur
compteur_mod10.vhd - Sélectionner Set as Top-Level Entity
- Vérifier en bas :
Top: compteur_mod10
- Processing▶Start Compilation ou Ctrl+L
- Quartus exécute : Analyse → Synthèse → Fitter → Assembleur → Timing
- Attendre la fin (quelques secondes)
output_files/compteur_mod10.sof généré.• Logic Elements : 4–6 LE
• Pins used : 6 (CLK + RST + 4×Q)
• Timing : fMax >> fréquence utilisée ✓
Pin Planner — Connexion FPGA ↔ Carte
- Assignments▶Pin Planner
- Les signaux
CLK,RST,Q[0]...Q[3]apparaissent dans la liste - Assigner chaque signal selon la table ci-dessous
Table d'assignation — DE2-115
| Signal VHDL | Direction | Broche FPGA | Ressource | Description |
|---|---|---|---|---|
CLK | IN | PIN_Y2 | OSC 50MHz | Horloge CLOCK_50 |
RST | IN | PIN_AB28 | SW[0] | Interrupteur coulissant |
Q[0] | OUT | PIN_E21 | LEDR[0] | LED rouge 0 (bit 0) |
Q[1] | OUT | PIN_E22 | LEDR[1] | LED rouge 1 (bit 1) |
Q[2] | OUT | PIN_H21 | LEDR[2] | LED rouge 2 (bit 2) |
Q[3] | OUT | PIN_H22 | LEDR[3] | LED rouge 3 (bit 3) |
PIN_Y2) → Entrée.3.3-V LVTTLAprès assignation des broches, il faut obligatoirement recompiler pour intégrer les assignations dans le bitstream.
- Fermer le Pin Planner
- Appuyer sur Ctrl+L
- Vérifier l'absence d'erreurs critiques
output_files/compteur_mod10.sofCe .sof (SRAM Object File) contient la configuration complète du FPGA.
Téléverser le Design sur la Carte
- Brancher le câble USB Blaster (PC → port USB-B de la DE2-115)
- Allumer la carte : interrupteur ON
- Vérifier les pilotes : Gestionnaire de périphériques → Altera USB Blaster
C:\intelFPGA_lite\18.1\quartus\drivers\usb-blaster\- Tools▶Programmer
- Hardware Setup... → sélectionner USB-Blaster [USB-0] → Close
- Vérifier que
compteur_mod10.sofest dans la liste (sinon → Add File...) - Cocher la case Program/Configure
| File | Device | Program |
|---|---|---|
| output_files/compteur_mod10.sof | EP4CE115F29 | ☑ |
- Cliquer sur ▶ Start
- Barre de progression → 100% → message "Configuration succeeded"
- Les LEDs de la carte s'allument !
Ce que vous observez :
• Les 4 LEDs rouges (LEDR[3:0]) changent très rapidement (50M fois/seconde)
• Pour voir à l'Å“il nu → utiliser
KEY[0] comme CLK manuel (broche PIN_M23)
Bilan et Questions pour aller plus loin
✅ SIMULATION
- Projet Quartus créé
- Code VHDL écrit et compilé
- Testbench réalisé
- ModelSim lancé
- Chronogrammes analysés
✅ FPGA
- Compilation réussie
- Broches assignées
- Bitstream .sof généré
- FPGA programmé via USB Blaster
- Compteur vérifié sur carte
Questions pour la réflexion
- Modifiez le code pour réaliser un compteur modulo 7. Quelle ligne changer ?
- Diviseur de fréquence : si CLK = 50 MHz, quelle est la fréquence de rebouclage (9→0) ?
- Compteur décompteur : ajouter un signal
DIR— si DIR=0 : monte, si DIR=1 : descend. - Affichage 7 segments : comment connecter Q Ã l'afficheur de la DE2-115 ?