bts eii · electronique numerique

Cours FPGA Complet — Circuits Logiques Programmables

De l'architecture interne d'un FPGA jusqu'au flot de conception Vivado / Quartus : LUT, BRAM, DSP, contraintes XDC, simulation, debug ILA et exemples VHDL prêts à flasher sur Basys 3, Nexys A7 ou DE10-Nano.

🔲 FPGA Xilinx Intel / Altera 8 chapitres VHDL + Verilog 100% hors-ligne

1. Introduction aux FPGA

Objectifs du chapitre

  • Définir un FPGA et comprendre son rôle dans le numérique moderne
  • Connaître l'historique et l'évolution des FPGA
  • Comparer un FPGA aux ASIC et aux microcontrôleurs
  • Identifier les domaines d'application des FPGA
1.1 Définition
FPGA — Field Programmable Gate Array. Un FPGA est un circuit intégré composé d'une matrice de blocs logiques configurables interconnectés. Il peut être programmé « sur le terrain » (field) pour réaliser n'importe quelle fonction logique, puis reprogrammé à volonté.

Historique :

  • 1984 — Premier FPGA par Xilinx (XC2064)
  • 1992 — Introduction des LUT 4 entrées
  • 2000 — Intégration de blocs DSP et mémoire
  • 2010 — SoC FPGA (ARM + FPGA sur la même puce)
  • 2020+ — FPGA haute performance (Versal, Agilex)
1.2 FPGA vs autres technologies

Le FPGA se situe entre le microcontrôleur (flexibilité logicielle, performance modeste) et l'ASIC (performance maximale, coût unitaire très bas mais NRE énorme). Voici une synthèse :

CritèreFPGAASICMicrocontrôleur
Coût NREFaibleTrès élevéNul
Coût unitaireMoyen à élevéTrès faible (en volume)Faible
PerformanceÉlevéeMaximaleModérée
ConsommationMoyenneOptimiséeFaible
FlexibilitéTotale (matérielle)NulleLogicielle uniquement
Time-to-marketCourtLong (12-18 mois)Très court
ParallélismeMassif (matériel)MassifLimité (CPU séquentiel)
Règle pratique : on choisit un FPGA lorsqu'on a besoin de parallélisme massif, de très faibles latences, ou d'une logique reconfigurable après déploiement. Pour un contrôle basique séquentiel, un microcontrôleur suffit.
1.3 Applications des FPGA

Les FPGA excellent dans les domaines où le parallélisme matériel et la performance déterministe priment :

📡

Télécom

5G, stations de base, radio logicielle (SDR)

🚀

Aérospatial

Satellites, avionique, FPGA durcis aux radiations

🏥

Médical

Imagerie, échographie, traitement temps réel

🚗

Automobile

ADAS, conduite autonome, fusion de capteurs

🤖

IA / ML

Accélération d'inférence, réseaux de neurones

💰

Finance

Trading haute fréquence, cryptographie

2. Architecture des FPGA

Objectifs du chapitre

  • Comprendre l'organisation interne d'un FPGA
  • Identifier le rôle d'un CLB, d'une LUT, d'une bascule
  • Connaître les ressources dédiées (BRAM, DSP, PLL, GTx)
  • Savoir distinguer slice logique et slice mémoire
2.1 Architecture générale

Un FPGA moderne est constitué d'une matrice régulière de ressources hétérogènes reliées par un réseau d'interconnexion programmable. L'organisation typique :

Vue d'ensemble d'un FPGA
┌─────────────────────────────────────────────────────────────┐
│                        FPGA                                  │
│  ┌─────────────────────────────────────────────────────┐    │
│  │                    I/O Blocks                        │    │
│  └─────────────────────────────────────────────────────┘    │
│  ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐           │
│  │ CLB │ │ CLB │ │ CLB │ │BRAM │ │ CLB │ │ CLB │           │
│  └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘           │
│     │       │       │       │       │       │    Routing    │
│  ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐           │
│  │ CLB │ │ DSP │ │ CLB │ │ CLB │ │ DSP │ │ CLB │           │
│  └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘           │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
│  │     PLL      │  │   Clock      │  │    PLL       │       │
│  │   (CMT)      │  │   Tree       │  │   (CMT)      │       │
│  └──────────────┘  └──────────────┘  └──────────────┘       │
└─────────────────────────────────────────────────────────────┘

CLB  = Configurable Logic Block
BRAM = Block RAM
DSP  = Digital Signal Processing
PLL  = Phase-Locked Loop
CMT  = Clock Management Tile
2.2 Bloc logique configurable (CLB)

Le CLB (Configurable Logic Block) est l'élément logique de base. Il contient des LUT (Look-Up Tables), des bascules (flip-flops) et de la logique de retenue (carry chain) pour les opérations arithmétiques.

Structure d'une LUT. Une LUT 4 entrées est en fait une mémoire SRAM de 16 bits qui implémente n'importe quelle fonction booléenne à 4 variables :

LUT 4 entrées
        LUT 4 entrées (16 bits de configuration)

        A ──┐
        B ──┼──► ┌────────────┐
        C ──┼──► │   SRAM     │ ──► Sortie
        D ──┘    │  16 bits   │
                 └────────────┘

        Peut implémenter N'IMPORTE quelle fonction de 4 variables :
        - AND, OR, XOR, NAND, NOR, XNOR
        - Multiplexeur 2:1
        - Comparateur
        - Addition (avec chaîne de retenue)

Slices Xilinx 7-series :

  • SLICEL (L = Logic) : 4 LUT6, 8 flip-flops, chaîne de retenue — pour la logique pure
  • SLICEM (M = Memory) : SLICEL + RAM distribuée (64 bits/slice) + registres à décalage (32 bits/slice)
Choix automatique. L'outil de synthèse (Vivado, Quartus) décide tout seul d'inférer une RAM distribuée ou un registre à décalage à partir de votre code HDL. Aucune action explicite n'est nécessaire tant que le style de code est correct.
2.3 Ressources spéciales

Outre les CLB génériques, un FPGA embarque des blocs durs (hard IP) dédiés à des tâches spécifiques :

RessourceFonctionCapacité typique
Block RAM (BRAM)Mémoire embarquée double-port18 Kb ou 36 Kb par bloc
DSP48Multiplieur-accumulateur 25×18 + 48 bits acc.Pipeline interne, pré-additionneur
IOBInterface d'entrée/sortieLVDS, LVCMOS, DDR, SSTL
PLL / MMCMGénération d'horlogeMultiplication, division, déphasage
GTx / GTHTransceiver série haute vitesseJusqu'à 28 Gbps
PCIeInterface bus rapideGen3 / Gen4 hard IP
Hard processor (SoC)Cœur ARM Cortex-A embarquéZynq, Cyclone V SoC
Soft IP vs Hard IP. Les hard IPs sont des blocs physiques figés dans le silicium (performances garanties, surface optimisée). Les soft IPs sont des descriptions HDL synthétisées dans la logique programmable (flexibles mais consomment des CLB).

3. Technologies de configuration

Objectifs du chapitre

  • Connaître les trois grandes technologies de programmation
  • Comprendre la notion de volatilité et de reprogrammabilité
  • Choisir la bonne technologie selon le contexte industriel
3.1 Comparaison des technologies

La « configuration » d'un FPGA est l'ensemble des bits qui définissent la fonction de chaque LUT, l'état de chaque switch d'interconnexion et le mode de chaque bloc IP. Trois technologies coexistent :

TechnologieVolatileReprogrammableFabricants
SRAMOui∞ (illimité)Xilinx, Intel
FlashNon~1 000 cyclesMicrochip, Lattice
AntifuseNonNon (OTP)Microchip (Axcelerator)

FPGA basés SRAM. C'est la technologie dominante (Xilinx, Intel/Altera). Caractéristiques :

  • Configuration perdue à chaque mise hors tension
  • Nécessite une mémoire externe (Flash SPI, EEPROM, microSD)
  • Temps de configuration : quelques ms à quelques secondes
  • Avantage : dernière technologie de process, densités les plus élevées
  • Inconvénient : sensible aux radiations (SEU), bitstream parfois chiffrable
3.2 FPGA Flash et Antifuse

FPGA Flash (Microchip PolarFire, Lattice iCE40) : la configuration est stockée dans des cellules Flash non volatiles, intégrées sur la puce. Démarrage instantané, immunité aux radiations, faible consommation. Limité en densité par rapport au SRAM.

FPGA Antifuse : chaque cellule est un fusible microscopique qu'on grille une fois pour créer une connexion. One-Time Programmable (OTP), mais extrêmement robuste face aux radiations — utilisé dans le spatial et le militaire.

Règle de choix. Pour un prototypage rapide et flexible → SRAM. Pour un système embarqué autonome qui démarre instantanément → Flash. Pour un environnement irradié (satellite, avionique) → Antifuse ou SRAM rad-hard.

4. Flot de conception

Objectifs du chapitre

  • Connaître les étapes du flot HDL → bitstream
  • Comprendre le rôle de la synthèse, du placement et du routage
  • Savoir lire les rapports Vivado / Quartus
4.1 Étapes du flot

Le passage du code HDL au bitstream qui programme le FPGA suit un flot bien défini :

Flot de conception FPGA
    ┌─────────────────┐
    │   Spécification │
    │   (Cahier des   │
    │    charges)     │
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │   Description   │  ◄── VHDL / Verilog / Schématique
    │     HDL         │
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │   Simulation    │  ◄── Testbench, vérification fonctionnelle
    │  Fonctionnelle  │
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │    Synthèse     │  ◄── Traduction en primitives (LUT, FF)
    │                 │
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │  Implémentation │  ◄── Placement + Routage
    │  (Place & Route)│
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │   Simulation    │  ◄── Timing, vérification post-implémentation
    │    Temporelle   │
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │   Génération    │  ◄── Fichier de configuration (.bit / .sof)
    │    Bitstream    │
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │  Programmation  │  ◄── Chargement dans le FPGA via JTAG
    │     FPGA        │
    └─────────────────┘
4.2 Synthèse

La synthèse transforme le code HDL en un netlist de primitives FPGA (LUT, flip-flops, BRAM, DSP). L'outil applique des optimisations logiques :

  • Area : minimise les ressources utilisées (LUT, FF, BRAM)
  • Speed : maximise la fréquence d'horloge (registres, pipeline)
  • Power : réduit la consommation (clock gating, désactivation)
Conseil pratique. Vérifiez toujours les rapports de synthèse pour détecter les inférences non désirées (latch, ROM, RAM). Un if sans else dans un process combinatoire synthétise un latch, presque toujours un bug.
4.3 Implémentation

L'implémentation se décompose en deux grandes phases :

  • Placement : attribution de chaque primitive logique à un emplacement physique (CLB précis, BRAM précis) sur le die.
  • Routage : utilisation des ressources d'interconnexion programmables pour relier les primitives entre elles.

Rapports importants à consulter :

  • Utilization Report : ressources utilisées (LUT, FF, BRAM, DSP, IO)
  • Timing Report : respect des contraintes temporelles (slack, WNS, TNS)
  • Power Report : estimation de consommation statique et dynamique
  • Clock Report : hiérarchie d'horloges et fréquences générées
WNS négatif = design raté. Si le Worst Negative Slack est négatif, le design ne tournera pas à la fréquence visée. Il faut soit pipeline / paralléliser, soit relâcher la contrainte de fréquence, soit réduire la logique sur le chemin critique.

5. Outils de développement

Objectifs du chapitre

  • Connaître les principaux IDE par fabricant
  • Identifier les simulateurs HDL gratuits et payants
  • Choisir l'outil adapté à son projet
5.1 Outils par fabricant

Chaque grand fabricant de FPGA fournit un IDE complet, gratuit dans sa version « Web » ou « Lite » :

FabricantOutilFamilles FPGALicence
AMD / XilinxVivado Design Suite7-series, UltraScale, VersalGratuit (WebPack)
AMD / XilinxISE (legacy)Spartan-6, Virtex-6Plus maintenu
Intel / AlteraQuartus PrimeCyclone, Arria, Stratix, AgilexGratuit (Lite)
LatticeDiamond / RadiantiCE40, ECP5, NexusGratuit
MicrochipLibero SoCPolarFire, SmartFusion, IGLOOGratuit (Silver)
Yosys + nextpnrFlot open sourceiCE40, ECP5, Gowin100 % libre
Yosys + nextpnr. Pour ceux qui veulent un flot 100 % open source, l'association Yosys (synthèse) + nextpnr (place & route) + iverilog / GHDL (simulation) fonctionne très bien sur les FPGA Lattice iCE40 et ECP5.
5.2 Simulateurs HDL

La simulation se fait avant la synthèse pour valider la fonctionnalité et après l'implémentation pour valider le timing :

  • ModelSim / QuestaSim : référence industrielle (Mentor / Siemens) — VHDL et Verilog, version « Starter » gratuite limitée
  • Vivado Simulator (xsim) : intégré à Vivado, gratuit, suffisant pour la plupart des cas
  • ModelSim-Altera Starter : fourni avec Quartus Prime Lite
  • GHDL : simulateur VHDL open source, très correct, parfait pour CI/CD
  • Icarus Verilog : simulateur Verilog open source léger
  • Verilator : compilateur Verilog → C++, simulation extrêmement rapide (utilisé pour le co-simulation)
5.3 Cartes supportées et chaînes open source

Le flot open source Yosys + nextpnr est entièrement utilisable pour :

  • Lattice iCE40 : cartes iCEBreaker, iCEStick, ULX3S, OrangeCrab
  • Lattice ECP5 : cartes ULX3S, Colorlight 5A-75B, OrangeCrab
  • Gowin GW1N : cartes Tang Nano (très bon marché)
Pour démarrer sans rien installer. Le projet EDA Playground (eda-playground.readthedocs.io) permet de simuler du VHDL/Verilog directement dans le navigateur, gratuitement, sans aucune installation.

6. Contraintes & timing

Objectifs du chapitre

  • Écrire un fichier de contraintes XDC correct
  • Comprendre les notions de setup, hold et slack
  • Interpréter un rapport de timing Vivado / Quartus
6.1 Fichier de contraintes (XDC / SDC)

Le fichier de contraintes indique à l'outil : quelle broche physique correspond à quel port HDL, quelle est la fréquence d'horloge cible, et quelles sont les exceptions de timing. Au format XDC (Xilinx Design Constraints) ou SDC (Synopsys, utilisé par Quartus) :

basys3.xdcXDC · Xilinx
# Contraintes d'horloge
create_clock -period 10.000 -name sys_clk [get_ports clk]

# Contraintes de pins (FPGA Basys3)
set_property PACKAGE_PIN W5   [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]

# LEDs
set_property PACKAGE_PIN U16  [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]

# Boutons
set_property PACKAGE_PIN T18  [get_ports reset]
set_property IOSTANDARD LVCMOS33 [get_ports reset]

# Switches
set_property PACKAGE_PIN V17  [get_ports {sw[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[0]}]
📌 Le numéro de broche (PACKAGE_PIN) dépend de la carte. Voir le schematic de la Basys 3 pour la liste complète.
6.2 Analyse temporelle

L'analyse temporelle (static timing analysis) vérifie que tous les chemins logiques respectent les contraintes définies dans le fichier XDC/SDC.

Concepts clés :

  • Setup Time (Tsu) : temps avant le front d'horloge pendant lequel la donnée doit être stable
  • Hold Time (Th) : temps après le front pendant lequel la donnée doit rester stable
  • Slack : marge temporelle — positif = OK, négatif = violation
  • WNS (Worst Negative Slack) : pire slack sur l'ensemble du design (en setup)
  • TNS (Total Negative Slack) : somme des slacks négatifs sur tous les chemins en violation
  • Fmax : fréquence maximale atteignable = 1 / (Tperiod − WNS)
Attention. Un slack négatif signifie que le design ne fonctionnera pas à la fréquence visée à la température et la tension nominales. Il faut optimiser le chemin critique : pipeline, parallélisme, réordonnancement logique, ajout de registres.
6.3 Pseudo-contraintes d'optimisation

Quelques attributs Vivado utiles pour guider l'outil :

optim_hints.xdcXDC · Xilinx
# Garder une hiérarchie lors du routage
set_property DONT_TOUCH true [get_cells u_eth_mac/*]

# Forcer un bloc dans une région (Pblock) — pour le floorplanning
create_pblock pblock_eth
add_cells_to_pblock [get_pblocks pblock_eth] [get_cells u_eth_mac]
resize_pblock [get_pblocks pblock_eth] -add {SLICE_X10Y50:SLICE_X30Y80}

# Contrainte de période spécifique sur un sous-module
create_clock -period 5.000 -name clk_fast [get_pins u_dsp/clk]

7. Debug & vérification

Objectifs du chapitre

  • Connaître les outils de debug intégrés au FPGA
  • Savoir insérer un ILA / VIO dans un design Vivado
  • Utiliser la simulation pour valider un design avant synthèse
7.1 Outils de debug intégrés

Les FPGA modernes embarquent des blocs de debug qui permettent d'observer et de contrôler le design en cours d'exécution, sans instrumenter physiquement le circuit :

  • ILA (Integrated Logic Analyzer) : capture de signaux internes en temps réel, équivalent d'un analyseur logique mais à l'intérieur du FPGA
  • VIO (Virtual I/O) : contrôle et observation de signaux via JTAG — comme si vous aviez des boutons / LEDs virtuels
  • JTAG-to-AXI : accès direct aux bus mémoire AXI depuis Vivado, idéal pour lire / écrire la DDR
  • SDK / MicroBlaze : pour les FPGA avec cœur soft, exécution de code C sur un mini-processeur embarqué
Workflow ILA Vivado. Marquez les signaux internes à observer avec Mark Debug → lancez la synthèse et l'implémentation → Vivado insère automatiquement un cœur ILA → téléchargez le bitstream → ouvrez le dashboard Hardware et déclenchez la capture comme sur un analyseur logique classique.
7.2 Stratégie de vérification

Une bonne stratégie mélange simulation, testbench et debug in-situ :

  • Testbench VHDL/Verilog : simule les stimuli et vérifie les sorties (assert)
  • Simulation fonctionnelle : avant synthèse, vérifie la logique pure
  • Simulation post-implémentation : tient compte du timing réel
  • Debug sur carte : capture de signaux internes via ILA / VIO
  • Test unitaire par bloc : valider chaque sous-module indépendamment
  • Couverture de code : identifier les branches HDL non testées
Piège courant. Ne jamais se fier uniquement à la simulation — un testbench qui ne stimule pas tous les cas laisse passer des bugs. Et un design « qui marche en simulation » peut quand même échouer sur carte à cause du timing, du reset, ou de la contention de bus.

8. Applications pratiques

Objectifs du chapitre

  • Connaître les cartes de développement les plus utilisées
  • Savoir choisir une carte selon son budget et son besoin
  • Implémenter un premier design complet VHDL + XDC
8.1 Cartes de développement populaires

Le choix de la carte conditionne l'apprentissage et les projets possibles :

CarteFPGAPrixUsage
Basys 3Artix-7 35T~150 €Éducation (référence Digilent)
Nexys A7Artix-7 100T~300 €Éducation avancée, plus d'IO
Arty A7Artix-7 35T / 100T~130 €Maker, prototypage, Pmod
DE10-NanoCyclone V SoC~180 €SoC ARM + FPGA, retrogaming
iCEBreakeriCE40UP5K~70 €Open source, Yosys / nextpnr
Tang NanoGowin GW1N-1~15 €Ultra-budget, open source
Recommandation pour démarrer. La Basys 3 est la carte la plus utilisée dans l'enseignement : excellente documentation, schematics publics, exemples Vivado, switches / LEDs / boutons / afficheur 7-segments / VGA / USB-UART. C'est la valeur sûre.
8.2 Projet : LED clignotante sur Basys 3

Premier design complet : un compteur 27 bits incrémenté à 100 MHz, dont le bit de poids fort fait clignoter une LED à environ 0,75 Hz.

Code VHDL :

blink.vhdVHDL
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity blink is
    port (
        clk : in  std_logic;  -- 100 MHz
        led : out std_logic
    );
end entity;

architecture behavioral of blink is
    signal counter : unsigned(26 downto 0) := (others => '0');
begin
    process(clk)
    begin
        if rising_edge(clk) then
            counter <= counter + 1;
        end if;
    end process;

    led <= counter(26);  -- ~0,75 Hz
end architecture;
📌 counter(26) change tous les 2²⁶ ≈ 67 millions de coups d'horloge. À 100 MHz, ça donne une période de 0,67 s — donc une LED qui clignote à environ 0,75 Hz.

Contraintes XDC (Basys 3) :

basys3_blink.xdcXDC
## Horloge 100 MHz sur la broche W5
set_property PACKAGE_PIN W5 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -period 10.000 -name sys_clk [get_ports clk]

## LED[0] sur la broche U16
set_property PACKAGE_PIN U16 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports led]

Étapes sous Vivado :

  1. Create Project → cible xc7a35tcpg236-1 (Basys 3 par défaut)
  2. Ajouter blink.vhd comme Design Source
  3. Ajouter basys3_blink.xdc comme Constraints
  4. Run Synthesis → vérifier le rapport (1 LUT, 27 FF)
  5. Run Implementation → vérifier le timing (slack largement positif à 100 MHz)
  6. Generate Bitstream → produit blink.bit
  7. Open Hardware Manager → connecter la Basys 3 en USB → Program Device
  8. La LED clignote. Premier FPGA programmé. ✨
8.3 Pour aller plus loin

Quelques idées de projets progressifs après la LED clignotante :

  • Compteur 7 segments : afficher un compteur hexadécimal sur l'afficheur de la Basys 3
  • Chenillard : séquence de LEDs commandée par un bouton ou un switch
  • UART loopback : transmettre en boucle ce qu'on reçoit sur le port USB-UART
  • Multiplieur pipeline : multiplier deux nombres 16 bits en 1 cycle grâce aux blocs DSP
  • FIR filter : filtre numérique RIF sur un flux d'échantillons ADC
  • CPU soft (RISC-V) : instanciation d'un cœur RISC-V (PicoRV32, Ibex) et exécution de code C
Cours FPGA Complet — BTS EII · Électronique Numérique · 8 chapitres · yacine.love