VHDL — Guide Complet Débutant
GUIDE COMPLET DÉBUTANT · VHDL 2024 · ZÉRO HYPOTHÈSE

VHDL

Tu ne programmes pas un processeur.
Tu décris des circuits qui s'exécutent tous en même temps.
Tout est expliqué depuis la base — sans rien supposer.

↓   COMMENCER ICI   ↓
01 — FONDATION

Qu'est-ce que VHDL ?

VHDL signifie VHSIC Hardware Description Language (VHSIC = Very High Speed Integrated Circuit). C'est un langage inventé par le Département de la Défense américain dans les années 1980 pour décrire des circuits numériques. Ce n'est PAS de la programmation classique — c'est la description de comment des fils et des portes logiques sont connectés à l'intérieur d'une puce.

🧠 LE CHANGEMENT MENTAL CLÉ : En Python ou C, les instructions s'exécutent l'une après l'autre. En VHDL, tout se passe simultanément, comme de vrais fils et portes dans une puce. L'ordre des lignes ne compte pas. Tu décris du matériel, pas une recette.

💻 LOGICIEL (Python / C)

  • S'exécute sur un CPU séquentiellement
  • Ligne 1 termine avant ligne 2
  • Variables stockées en RAM
  • Tu décris ce que la machine fait
  • Pas de limite physique de variables

⚡ VHDL (Matériel)

  • Tout s'exécute en parallèle, toujours
  • Toutes les opérations simultanément
  • Les signaux sont de vrais fils
  • Tu décris ce qu'est le circuit
  • Limité par les ressources physiques
🏗️

Description matérielle

VHDL décrit la structure et le comportement de circuits numériques.

FPGA & ASIC

Ton code VHDL est synthétisé en vraies portes logiques sur un FPGA ou gravé dans un ASIC.

🔬

Simulation d'abord

Avant le matériel, tu simules avec GHDL, ModelSim ou Vivado.

📜

Norme IEEE 1076

VHDL est une norme IEEE officielle. Version usuelle : VHDL-93 ou VHDL-2008.

02 — STRUCTURE

Le Squelette d'un Fichier VHDL

Chaque fichier VHDL a la même structure en trois parties : la LIBRARY apporte les outils, l'ENTITY est la forme extérieure (les broches), et l'ARCHITECTURE est ce qu'il y a à l'intérieur (la logique).

SURVOLE CHAQUE BLOC POUR LE VOIR
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;← ta boîte à outils (comme "import" en Python)
USE IEEE.NUMERIC_STD.ALL;← outils supplémentaires pour l'arithmétique
ENTITY mon_circuit IS← le NOM et les BROCHES de ta puce
PORT (← liste tous les pins entrée/sortie
  a : IN STD_LOGIC;← broche d'entrée nommée "a"
  b : IN STD_LOGIC;← broche d'entrée nommée "b"
  y : OUT STD_LOGIC← broche de sortie nommée "y"
);
END mon_circuit;
ARCHITECTURE rtl OF mon_circuit IS← l'INTÉRIEUR du circuit
  SIGNAL fil_interne : STD_LOGIC;← fil interne (pas visible de l'extérieur)
BEGIN← tout ce qui suit s'exécute simultanément
  y <= a AND b;← le fil y est connecté à : A ET B
END rtl;

Directions des ports

MOT-CLÉDIRECTIONSIGNIFICATIONANALOGIE
INEntrée uniquementSignal entrant dans la pucePrise micro
OUTSortie uniquementSignal sortant de la pucePrise haut-parleur
INOUTBidirectionnelPeut aller dans les deux sensPort USB-C
BUFFERSortie lisibleSortie qu'on peut aussi relire en interneÉcran avec retour
03 — FILS & TYPES

Signaux — Les Fils

En VHDL, un SIGNAL est un fil. Il transporte une valeur d'un endroit à un autre dans ton circuit. Chaque signal doit avoir un type — le plus important est STD_LOGIC.

🔌 STD_LOGIC = un seul fil. Il peut avoir plus que 0 et 1, car les vrais fils peuvent être dans plusieurs états.
VALEURSIGNIFICATIONQUAND ON LA VOIT
'0'Zéro logique (relié à la masse)Signal normal à 0
'1'Un logique (relié à l'alimentation)Signal normal à 1
'Z'Haute impédance — fil flottantBus tri-état, fil déconnecté
'U'Non initialiséSimulation — avant toute affectation
'X'Inconnu / conflitDeux sources se battent
⚠️ PIÈGE — Les guillemets !
1 bit : guillemets simples '1'   Multi-bits : guillemets doubles "1010"
signaux.vhd
SIGNAL mon_fil  : STD_LOGIC;
SIGNAL mon_fil2 : STD_LOGIC := '0';
SIGNAL bus8  : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL u_val : UNSIGNED(7 DOWNTO 0);
-- Affectation signal : <=
mon_fil <= '1';
bus8    <= (OTHERS => '0');
04 — VECTEUR

Qu'est-ce qu'un VECTEUR ?

Un STD_LOGIC_VECTOR est un groupe de fils regroupés — un bus. Ensemble, 8 bits peuvent représenter des nombres de 0 à 255.

🎮 Vecteur Interactif — clique sur les bits !

STD_LOGIC_VECTOR(7 DOWNTO 0) — bit 7 (gauche, MSB) → bit 0 (droite, LSB)
Binaire:"00000000" Décimal:0 Hexa:0x00
vecteur.vhd
SIGNAL mon_bus : STD_LOGIC_VECTOR(7 DOWNTO 0);
mon_bus <= "10110001";        -- binaire
mon_bus <= x"B1";              -- hexadécimal
mon_bus <= (OTHERS => '0');  -- tous à 0
mon_fil <= mon_bus(3);        -- lire bit 3
grand   <= a & b;            -- concaténer
05 — LOGIQUE COMBINATOIRE

Instructions Concurrentes

Entre BEGIN et END, toutes les instructions s'exécutent simultanément — ce sont des connexions permanentes de fils.

concurrent.vhd
── 1. AFFECTATION DIRECTE
y1 <= a AND b;   y2 <= a OR b;   y3 <= NOT a;

── 2. WHEN/ELSE (MUX concurrent)
y <= a WHEN sel = '1' ELSE b;

── 3. WITH/SELECT (switch concurrent)
WITH sel SELECT
  y <= a WHEN "00",
         b WHEN "01",
         '0' WHEN OTHERS;
06 — PORTES LOGIQUES

Toutes les Portes Logiques

Une porte logique est le bloc de base de tout circuit numérique. Clique sur A et B pour voir les chronogrammes se mettre à jour en temps réel.

ANDET LOGIQUE
Y <= A AND B  |  Y=1 seulement si A=1 ET B=1
Y=0
porte_and.vhd
ENTITY porte_and IS
  PORT(A,B:IN STD_LOGIC;Y:OUT STD_LOGIC);
END porte_and;
ARCHITECTURE rtl OF porte_and IS
BEGIN
  Y <= A AND B;
END rtl;
OROU LOGIQUE
Y <= A OR B  |  Y=1 si A=1 OU B=1
Y=0
porte_or.vhd
ENTITY porte_or IS
  PORT(A,B:IN STD_LOGIC;Y:OUT STD_LOGIC);
END porte_or;
ARCHITECTURE rtl OF porte_or IS
BEGIN
  Y <= A OR B;
END rtl;
NOTNON LOGIQUE
Y <= NOT A  |  Inversion : Y=1 si A=0
NOT →
Y=1
porte_not.vhd
ENTITY porte_not IS
  PORT(A:IN STD_LOGIC;Y:OUT STD_LOGIC);
END porte_not;
ARCHITECTURE rtl OF porte_not IS
BEGIN
  Y <= NOT A;
END rtl;
NANDNON-ET
Y <= A NAND B  |  Y=0 seulement si A=1 ET B=1
Y=1
porte_nand.vhd
ENTITY porte_nand IS
  PORT(A,B:IN STD_LOGIC;Y:OUT STD_LOGIC);
END porte_nand;
ARCHITECTURE rtl OF porte_nand IS
BEGIN
  Y <= A NAND B;
END rtl;
NORNON-OU
Y <= A NOR B  |  Y=1 seulement si A=0 ET B=0
Y=1
porte_nor.vhd
ENTITY porte_nor IS
  PORT(A,B:IN STD_LOGIC;Y:OUT STD_LOGIC);
END porte_nor;
ARCHITECTURE rtl OF porte_nor IS
BEGIN
  Y <= A NOR B;
END rtl;
XOROU EXCLUSIF
Y <= A XOR B  |  Y=1 si A≠B
Y=0
porte_xor.vhd
ENTITY porte_xor IS
  PORT(A,B:IN STD_LOGIC;Y:OUT STD_LOGIC);
END porte_xor;
ARCHITECTURE rtl OF porte_xor IS
BEGIN
  Y <= A XOR B;
END rtl;

Tableau de vérité complet

ABANDORNOT ANANDNORXORXNOR
000011101
010111010
100101010
111100001
07 — LOGIQUE SÉQUENTIELLE

L'instruction PROCESS

Un PROCESS contient des instructions séquentielles (dans l'ordre). Il se réveille uniquement quand un signal de sa liste de sensibilité change.

📌 RÈGLE D'OR :
— À l'intérieur du PROCESS : instructions dans l'ordre.
— Le PROCESS en entier : s'exécute en parallèle avec tout le reste.
process_complet.vhd
PROCESS(signal1, signal2)   -- déclenché si signal1 OU signal2 change
BEGIN
  IF signal1 = '1' THEN
    sortie <= '1';
  ELSIF signal2 = '1' THEN
    sortie <= '0';
  ELSE
    sortie <= 'Z';
  END IF;
END PROCESS;
⚠️ Toujours couvrir tous les cas ! CASE → obligatoire WHEN OTHERS. IF → obligatoire ELSE. Sans ça, VHDL infère un LATCH — de la mémoire non voulue.
08 — SIGNAL D'HORLOGE

Le Signal d'Horloge

L'horloge est le cœur d'un circuit numérique. Elle alterne 0 → 1 → 0 → 1 … à fréquence fixe. Presque toute la logique séquentielle est pilotée par le front montant (rising edge) : quand CLK passe de '0' à '1'.

bascule_d.vhd
-- Modèle universel : reset asynchrone + logique synchrone
PROCESS(clk, rst)
BEGIN
  IF rst = '1' THEN          -- reset ASYNCHRONE (priorité max)
    q <= '0';
  ELSIF rising_edge(clk) THEN -- sur le front montant
    q <= d;
  END IF;
END PROCESS;
09 — EXEMPLE COMPLET

Compteur Modulo 10

Un compteur modulo 10 compte de 0 à 9, puis revient à 0. Il faut 4 bits (3 bits → max 7 : insuffisant !). Sur chaque front montant d'horloge, il s'incrémente.

⏱ Compteur Modulo 10 — Simulation Live

SÉQUENTIELSYNCHRONEMODULO 104 BITS
compteur_mod10.vhd
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.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 rtl OF compteur_mod10 IS
  SIGNAL cnt : UNSIGNED(3 DOWNTO 0) := (OTHERS => '0');
BEGIN
  PROCESS(clk, rst)
  BEGIN
    IF rst = '1' THEN
      cnt <= (OTHERS => '0');
    ELSIF rising_edge(clk) THEN
      IF cnt = 9 THEN
        cnt <= (OTHERS => '0');
      ELSE
        cnt <= cnt + 1;
      END IF;
    END IF;
  END PROCESS;
  q <= STD_LOGIC_VECTOR(cnt);
END rtl;
0
Q3 (MSB)
0
Q2
0
Q1
0
Q0 (LSB)
0
Valeur décimale
État : 0000
Prochain : 0001
CLK
RST
Q3
Q2
Q1
Q0
10 — ÉVALUE TOI-MÊME

Quiz 40 Questions

Questions progressives du niveau débutant au niveau avancé. Pour chaque mauvaise réponse, tu verras pourquoi c'est faux et quelle est la bonne réponse.

PROGRESSION
0 / 40 répondues  |  Score : 0
NIVEAU 1DÉBUTANT — Syntaxe de base & définitions (Q1 à Q10)
Q01DÉBUTANT
Quel opérateur utilise-t-on pour affecter une valeur à un SIGNAL en VHDL ?
Q02DÉBUTANT
Quel mot-clé VHDL définit l'interface externe d'un circuit (ses pins / broches) ?
Q03DÉBUTANT
Quelle bibliothèque IEEE doit-on toujours importer pour utiliser STD_LOGIC ?
Q04DÉBUTANT
Comment se termine correctement un bloc PROCESS en VHDL ?
Q05DÉBUTANT
Quel type VHDL représente un seul fil logique pouvant prendre plusieurs états ('0','1','Z','U','X') ?
Q06DÉBUTANT
Quelle est la valeur de '0' AND '1' en VHDL ?
Q07DÉBUTANT
Que produit l'instruction NOT '1' en VHDL ?
Q08DÉBUTANT
Où doit-on déclarer un SIGNAL interne dans un fichier VHDL ?
Q09DÉBUTANT
Que signifie DOWNTO dans la déclaration STD_LOGIC_VECTOR(7 DOWNTO 0) ?
Q10DÉBUTANT
Comment affecter tous les bits à '0' d'un vecteur sans connaître sa taille ?
NIVEAU 2BASIQUE — Types, opérateurs, portes logiques (Q11 à Q20)
Q11BASIQUE
Quelle est la sortie d'une porte NAND quand A='1' et B='1' ?
Q12BASIQUE
Que signifie la valeur 'X' pour un signal STD_LOGIC en simulation VHDL ?
Q13BASIQUE
Comment lire uniquement le bit 3 du vecteur my_bus ?
Q14BASIQUE
Quelle est la valeur de '1' XOR '1' ?
Q15BASIQUE
Comment joindre (concaténer) deux vecteurs a et b en VHDL ?
Q16BASIQUE
Quelle est la direction de port qui permet à un signal d'entrer ET de sortir par la même broche ?
Q17BASIQUE
Dans le code suivant, que se passe-t-il avec les deux lignes entre BEGIN et END ?
BEGIN
  y1 <= a AND b;
  y2 <= a OR  b;
END rtl;
Q18BASIQUE
Quelle est la sortie d'une porte NOR quand A='0' et B='0' ?
Q19BASIQUE
Combien de bits contient un STD_LOGIC_VECTOR(3 DOWNTO 0) ?
Q20BASIQUE
Que se passe-t-il si on oublie le WHEN OTHERS dans un bloc CASE dans un PROCESS ?
NIVEAU 3INTERMÉDIAIRE — PROCESS, horloge, compteurs, séquentiel (Q21 à Q30)
Q21INTERMÉDIAIRE
Quelle instruction VHDL détecte précisément le front montant d'un signal d'horloge ?
Q22INTERMÉDIAIRE
Dans un PROCESS(clk, rst), pourquoi le test du reset est-il placé AVANT rising_edge(clk) ?
Q23INTERMÉDIAIRE
Un compteur modulo 8 vient d'atteindre la valeur 7. Que se passe-t-il au prochain front montant d'horloge ?
Q24INTERMÉDIAIRE
Quelle est la différence principale entre un SIGNAL et une VARIABLE en VHDL ?
Q25INTERMÉDIAIRE
Pour un compteur modulo 10, combien de bits sont nécessaires et pourquoi ?
Q26INTERMÉDIAIRE
Que signifie "logique synchrone" en VHDL ?
Q27INTERMÉDIAIRE
Que fait q <= (OTHERS => '0') pour un signal q : UNSIGNED(3 DOWNTO 0) ?
Q28INTERMÉDIAIRE
Quel type VHDL faut-il utiliser pour faire des additions et incrémentations sur un vecteur (comme cnt + 1) ?
Q29INTERMÉDIAIRE
Dans quel cas un PROCESS avec liste de sensibilité (a, b, sel) se réveille-t-il ?
Q30INTERMÉDIAIRE
Que fait cette instruction VHDL : q <= STD_LOGIC_VECTOR(cnt)cnt est UNSIGNED(3 DOWNTO 0) ?
NIVEAU 4AVANCÉ — Code VHDL complexe, pièges, analyse de code (Q31 à Q40)
Q31AVANCÉ
Quelle est la sortie de ce code quand sel="10", c='1' ?
WITH sel SELECT
  y <= a WHEN "00",
         b WHEN "01",
         c WHEN "10",
        '0' WHEN OTHERS;
Q32AVANCÉ
Quelle est la valeur de TO_INTEGER(UNSIGNED("1010")) ?
Q33AVANCÉ
Que fait cette instruction (où a est STD_LOGIC_VECTOR(7 DOWNTO 0)) ?
q <= a(6 DOWNTO 0) & '0';
Q34AVANCÉ
Quel est le problème avec ce code VHDL ?
y <= a WHEN sel = '1';
Q35AVANCÉ
Que fait exactement ce code dans un PROCESS ?
PROCESS(clk)
BEGIN
  IF rising_edge(clk) THEN
    IF en = '1' THEN
      q <= d;
    END IF;
  END IF;
END PROCESS;
Q36AVANCÉ
Comment convertir un INTEGER de valeur 5 en UNSIGNED(3 DOWNTO 0) ?
Q37AVANCÉ
Analyse ce code. Quel problème contient-il ?
PROCESS(clk, rst)
BEGIN
  IF rst = '1' THEN
    cnt <= (OTHERS => '0');
  ELSIF rising_edge(clk) THEN
    cnt <= cnt + 1;
  END IF;
END PROCESS;
-- cnt est UNSIGNED(7 DOWNTO 0)
Q38AVANCÉ
Dans ARCHITECTURE rtl OF mon_circuit IS, que représente le mot rtl ?
Q39AVANCÉ
Quel code VHDL réalise un multiplexeur 4 vers 1 avec sélecteur 2 bits ?
SIGNAL s : STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL a, b, c, d, y : STD_LOGIC;
Q40AVANCÉ
Analyse ce code complet. Quelle est sa fonction ?
PROCESS(clk)
BEGIN
  IF rising_edge(clk) THEN
    IF cnt = 9 THEN
      cnt  <= (OTHERS => '0');
      tc   <= '1';
    ELSE
      cnt  <= cnt + 1;
      tc   <= '0';
    END IF;
  END IF;
END PROCESS;
RÉSULTAT FINAL — 40 QUESTIONS
0/40
11 — RÉFÉRENCE RAPIDE

Mémo Complet

TOUJOURS EN HAUT

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;

AFFECTATIONS

signal   <= val; -- planifié
variable := val; -- immédiat

MODÈLE HORLOGE (copier !)

PROCESS(clk,rst)
BEGIN
  IF rst='1' THEN
    q<=(OTHERS=>'0');
  ELSIF rising_edge(clk) THEN
    -- logique ici
  END IF;
END PROCESS;

PORTES LOGIQUES

y<=a AND b; -- ET
y<=a OR  b; -- OU
y<=NOT a;    -- NON
y<=a NAND b;-- NON-ET
y<=a NOR  b;-- NON-OU
y<=a XOR  b;-- OU EXCL.
y<=a XNOR b;-- ÉQUIVAL.

TYPES

STD_LOGIC          -- 1 fil
STD_LOGIC_VECTOR(N-1 DOWNTO 0)
UNSIGNED(N-1 DOWNTO 0)
SIGNED(N-1 DOWNTO 0)
INTEGER RANGE 0 TO N

VECTEURS

v(7 DOWNTO 0)   -- tous
v(3)            -- bit 3
a & b          -- concat
(OTHERS=>'0')  -- zeros

CONVERSIONS

UNSIGNED(slv)
STD_LOGIC_VECTOR(u)
TO_INTEGER(u)
TO_UNSIGNED(n,4)

COMPTEUR MODULO N

IF cnt = N-1 THEN
  cnt<=(OTHERS=>'0');
ELSE
  cnt<=cnt+1;
END IF;

ERREURS À ÉVITER

❌ '1010' au lieu de "1010"
❌ Oublier END IF; / END PROCESS;
❌ Lire un port OUT en interne
❌ Pas de WHEN OTHERS (latch!)
❌ WHEN/ELSE sans ELSE final
❌ Mélanger <= et :=

VHDL  ·  Guide Complet Débutant  ·  Norme IEEE 1076

Simuler · Comprendre · Synthétiser · Recommencer