TRAVAUX PRATIQUES — ÉLECTRONIQUE NUMÉRIQUE

Compteur Modulo 10
sur FPGA en VHDL

// Quartus Prime · DE2-115 / Cyclone IV · VHDL-93
DURÉE · 3H
NIVEAU · L3 / M1
OUTIL · Intel Quartus Prime
LANGAGE · VHDL
0
État : STOPPED
// INTRODUCTION

Objectifs du TP

Conception, simulation et implémentation d'un compteur modulo 10 synchrone en VHDL sur FPGA.

Ce que vous allez apprendre
Compétences visées à l'issue du TP

🔬 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
MATÉRIEL REQUIS
Carte FPGA Altera DE2-115 (Cyclone IV EP4CE115F29C7) · Câble USB Blaster · PC avec Quartus Prime 18.1+
// PARTIE 0 — RAPPELS THÉORIQUES

Compteur Modulo 10 — Principe

T1
Définition d'un Compteur Modulo N
Comportement synchrone

Un compteur modulo N est un circuit séquentiel synchrone qui compte de 0 jusqu'à N−1 puis repart à 0. Pour N = 10 :

0 1 2 3 4 5 6 7 8 9 RESET → 0 (quand count = 9)
FIG. 1 — Diagramme d'état du compteur modulo 10

Table de transitions

État QCLK ↑Prochain Q+1
00000001
00010010
00100011
00110100
01000101
01010110
01100111
01111000
10001001
10010000 ← RESET

Chronogramme attendu

CLK
RST
COUNT
0 1 2 3 4 5 6 7 8 9 0
FORMULE
Fsortie = Fclk / 10
// PARTIE 1 — CRÉATION DU PROJET

Création du Projet Quartus Prime

01
Lancer Quartus et créer un nouveau projet
File → New Project Wizard
Intel Quartus Prime — Lite Edition
File
Edit
View
Project
Assignments
Processing
Tools
📄 New...  ðŸ“‚ Open...  ðŸ§™ New Project Wizard...
▶ Project Navigator
No project open
  1. Ouvrir Quartus Prime → FileNew Project Wizard...
  2. Introduction — Cliquer Next
  3. Directory, Name, Top-Level Entity :
    PARAMÈTRES
    Répertoire :C:\TP_VHDL\compteur_mod10\
    Nom du projet :compteur_mod10
    Entité top-level :compteur_mod10
  4. Project TypeEmpty project puis Next
  5. Add Files — Ne rien ajouter. Next
02
Sélection du FPGA cible
Family & Device Selection
ATTENTION
Le choix du FPGA est crucial — il détermine les ressources et les assignations de broches.
New Project Wizard — Device Selection
Device family:
Cyclone IV E
Available devices:
EP4CE6E22C8
EP4CE10E22C8
EP4CE115F29C7 ✓
EP4CE22F17C6
✓ Selected: EP4CE115F29C7 — 114,480 LEs, 4 PLLs, 528 I/O Pins
  1. Dans FamilyCyclone IV E
  2. Dans DeviceEP4CE115F29C7
  3. Cliquer Next puis Finish
RÉSULTAT ATTENDU
Le projet est créé avec compteur_mod10 dans le Project Navigator.
03
Créer le fichier VHDL source
File → New → VHDL File
  1. FileNew...VHDL FileOK
  2. Sauvegarder avec Ctrl+S
  3. Nommer le fichier : compteur_mod10.vhd
RÈGLE IMPORTANTE
Le nom du fichier .vhd doit être identique au nom de l'entité top-level : compteur_mod10
// PARTIE 2 — CODE VHDL

Écriture du Code VHDL

04
Structure d'un fichier VHDL
Library · Entity · Architecture
LIBRARY LIBRARY ieee; ENTITY Nom + Ports I/O CLK, RST, Q(3:0) ARCHITECTURE Comportement PROCESS + IF/THEN FPGA LOGIC CLK RST REG 4 bits = 9? CMP Q
FIG. 2 — Structure VHDL → FPGA : Registre 4 bits + Comparateur (= 9)
05
Code VHDL Complet — Compteur Modulo 10
Saisir ce code dans l'éditeur Quartus
⚠ IMPORTANT
Tapez ce code mot pour mot, en respectant la convention de nommage.
VHDL — compteur_mod10.vhd
-- ============================================================
-- 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.

SAUVEGARDER
Appuyer sur Ctrl+S. Quartus vérifiera automatiquement la syntaxe.
06
Code du Testbench — Simulation
compteur_mod10_tb.vhd

Le testbench est un fichier VHDL non synthétisable — il génère les signaux de test (horloge, reset) pour simuler notre composant.

CRÉER UN NOUVEAU FICHIER
FileNew...VHDL File — Sauvegarder sous : compteur_mod10_tb.vhd
VHDL — compteur_mod10_tb.vhd (TESTBENCH)
LIBRARY 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;
// PARTIE 3 — SIMULATION

Simulation avec ModelSim / Questa

07
Configurer la simulation dans Quartus
Assignments → Settings → Simulation
  1. AssignmentsSettings...
  2. Arbre gauche → EDA Tool SettingsSimulation
  3. Sélectionner ModelSim-Altera ou Questa Intel FPGA
  4. Format for output netlistVHDL
  5. Cocher Compile test bench → Ajouter :
    PARAMÈTRES TESTBENCH
    Test bench name : compteur_mod10_tb
    Top level module : compteur_mod10_tb
    Add file : compteur_mod10_tb.vhd
  6. Cliquer OK
08
Lancer la simulation RTL
Tools → Run Simulation Tool → RTL Simulation
  1. ToolsRun Simulation ToolRTL Simulation
  2. ModelSim s'ouvre, compile et lance la simulation automatiquement
  3. Vérifier que la fenêtre Wave est visible
  4. Zoom avec la molette · Relancer avec Ctrl+R
RÉSULTATS ATTENDUS
La séquence : 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 0 → ...
0ns40ns80ns 120ns160ns200ns240ns CLKRSTQ[3:0] RST=1 0 1 2 3 4 5 6 7 8 9 0 1 RST→0 9→0 modulo!
FIG. 3 — Chronogramme ModelSim : séquence 0→9→0, reset synchrone
POINTS DE VÉRIFICATION
① Q reste à 0000 pendant RST=1
② Comptage démarre dès RST=0
③ Après Q=9, prochain état = Q=0 — rebouclage modulo 10
// PARTIE 4 — COMPILATION ET SYNTHÈSE

Compiler et Synthétiser le Design

09
Définir le fichier Top-Level
Project → Set as Top-Level Entity
ATTENTION
S'assurer que compteur_mod10.vhd (et NON le testbench) est le top-level.
  1. Dans le Project Navigator, clic droit sur compteur_mod10.vhd
  2. Sélectionner Set as Top-Level Entity
  3. Vérifier en bas : Top: compteur_mod10
10
Lancer la compilation complète
Processing → Start Compilation — Ctrl+L
  1. ProcessingStart Compilation ou Ctrl+L
  2. Quartus exécute : Analyse → Synthèse → Fitter → Assembleur → Timing
  3. Attendre la fin (quelques secondes)
ANALYSISVérif. syntaxe SYNTHESISRTL → Netlist FITTERPlace & Route ASSEMBLERGénère .sof TIMING ANALYSISVérif. timings
FIG. 4 — Pipeline de compilation Quartus : 5 étapes
COMPILATION RÉUSSIE
Message Full Compilation was Successful. Fichier output_files/compteur_mod10.sof généré.
RAPPORT — À VÉRIFIER
ProcessingCompilation Report

• Logic Elements : 4–6 LE
• Pins used : 6 (CLK + RST + 4×Q)
• Timing : fMax >> fréquence utilisée ✓
// PARTIE 5 — ASSIGNATION DES BROCHES

Pin Planner — Connexion FPGA ↔ Carte

11
Ouvrir le Pin Planner et assigner les broches
Assignments → Pin Planner
  1. AssignmentsPin Planner
  2. Les signaux CLK, RST, Q[0]...Q[3] apparaissent dans la liste
  3. Assigner chaque signal selon la table ci-dessous
DE2-115 EP4CE115F29C7 CLK PIN_Y2 RST PIN_AB28 LED[0] PIN_E21 LED[1] PIN_E22 LED[2] PIN_H21 LED[3] PIN_H22
FIG. 5 — Connexions VHDL ↔ broches physiques DE2-115

Table d'assignation — DE2-115

Signal VHDLDirectionBroche FPGARessourceDescription
CLKINPIN_Y2OSC 50MHzHorloge CLOCK_50
RSTINPIN_AB28SW[0]Interrupteur coulissant
Q[0]OUTPIN_E21LEDR[0]LED rouge 0 (bit 0)
Q[1]OUTPIN_E22LEDR[1]LED rouge 1 (bit 1)
Q[2]OUTPIN_H21LEDR[2]LED rouge 2 (bit 2)
Q[3]OUTPIN_H22LEDR[3]LED rouge 3 (bit 3)
SAISIE DANS LE PIN PLANNER
Double-cliquer dans la colonne Location → taper le numéro de broche (ex: PIN_Y2) → Entrée.
STANDARD I/O
Pour chaque broche → colonne I/O Standard3.3-V LVTTL
12
Recompiler après assignation
Ctrl+L obligatoire

Après assignation des broches, il faut obligatoirement recompiler pour intégrer les assignations dans le bitstream.

  1. Fermer le Pin Planner
  2. Appuyer sur Ctrl+L
  3. Vérifier l'absence d'erreurs critiques
FICHIER GÉNÉRÉ
Fichier de programmation : output_files/compteur_mod10.sof
Ce .sof (SRAM Object File) contient la configuration complète du FPGA.
// PARTIE 6 — PROGRAMMATION DU FPGA

Téléverser le Design sur la Carte

13
Brancher la carte et vérifier USB Blaster
PC Quartus Prime USB PORT USB Blaster DE2-115 USB B PWR ON FPGA LEDR[0..3] SW0
FIG. 6 — PC ↔ DE2-115 via USB Blaster. SW[0]=RST, LEDR[0..3]=Q[3:0]
  1. Brancher le câble USB Blaster (PC → port USB-B de la DE2-115)
  2. Allumer la carte : interrupteur ON
  3. Vérifier les pilotes : Gestionnaire de périphériques → Altera USB Blaster
PILOTES USB BLASTER
Si "Unknown Device" → pilotes dans : C:\intelFPGA_lite\18.1\quartus\drivers\usb-blaster\
14
Ouvrir le Programmer et charger le .sof
Tools → Programmer
  1. ToolsProgrammer
  2. Hardware Setup... → sélectionner USB-Blaster [USB-0]Close
  3. Vérifier que compteur_mod10.sof est dans la liste (sinon → Add File...)
  4. Cocher la case Program/Configure
Programmer — [compteur_mod10.cdf]
Hardware Setup: USB-Blaster [USB-0]  Mode: JTAG
FileDeviceProgram
output_files/compteur_mod10.sofEP4CE115F29
▶ Start
Add File...
15
Programmer le FPGA !
Cliquer Start — Configuration en quelques secondes
  1. Cliquer sur ▶ Start
  2. Barre de progression → 100% → message "Configuration succeeded"
  3. Les LEDs de la carte s'allument !
🎉 SUCCÈS — LE FPGA EST PROGRAMMÉ !
Le compteur tourne à 50 MHz sur la DE2-115 !

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)
LEDR[3] · LEDR[2] · LEDR[1] · LEDR[0]
Valeur décimale : 0
50 MHzOscillator 4-bitRegister count=9?Comparator MUX+1 or 0000 LEDsQ[3:0] Retour si count=9 → reset à 0
FIG. 7 — Architecture synthétisée dans le FPGA
// FIN DU TP

Bilan et Questions pour aller plus loin

Récapitulatif et exercices

✅ 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

  1. Modifiez le code pour réaliser un compteur modulo 7. Quelle ligne changer ?
  2. Diviseur de fréquence : si CLK = 50 MHz, quelle est la fréquence de rebouclage (9→0) ?
  3. Compteur décompteur : ajouter un signal DIR — si DIR=0 : monte, si DIR=1 : descend.
  4. Affichage 7 segments : comment connecter Q à l'afficheur de la DE2-115 ?
POUR ALLER PLUS LOIN
Réaliser une horloge digitale : secondes (mod 60) + minutes (mod 60) + heures (mod 24), en chaînant 3 compteurs modulo avec carry.