Du code VHDL au hardware

Comment votre code VHDL se transforme en hardware FPGA : synthèse, implémentation et bitstream.

Le flot de conception complet

Pipeline FPGA : Code VHDL → Synthèse → Mapping → Placement → Routage → Bitstream → FPGA


Étape 1 : Synthèse

La synthèse traduit votre VHDL en un réseau de portes logiques (netlist).

Ce que le synthétiseur fait

Construction VHDLHardware inféré
AND, OR, NOTPortes logiques dans LUTs
if rising_edge(i_clk)Bascule D
case sur signalMUX ou LUT
array de signauxRegistres ou BRAM
* (multiplication)DSP ou LUTs
when/selectMUX

Exemple

-- Code VHDL
o_y <= (i_a AND i_b) OR (NOT i_c);

Sera synthétisé en une LUT-3 avec la table de vérité appropriée.

-- Code VHDL
process(i_clk)
begin
  if rising_edge(i_clk) then
    r_data <= i_data;
  end if;
end process;

Sera synthétisé en une bascule D avec i_data sur l'entrée D et r_data sur Q.


Étape 2 : Mapping technologique

La netlist abstraite est mappée sur les ressources physiques du FPGA cible.

Le synthétiseur choisit d'utiliser :

  • Des LUTs pour la logique combinatoire
  • Des bascules D pour la logique registrée
  • Des BRAM pour les mémoires (si la taille est suffisante)
  • Des DSP pour les multiplications

Vous pouvez influencer ces choix avec des attributs de synthèse :

-- Forcer en BRAM (Xilinx)
attribute ram_style : string;
attribute ram_style of r_mem : signal is "block";
 
-- Forcer en registres distribués
attribute ram_style of r_mem : signal is "distributed";

Étape 3 : Placement

Les ressources logiques sont assignées à des positions physiques sur le FPGA.

Le placement influence :

  • La fréquence maximale (signaux longs = lents)
  • La consommation en puissance
  • L'utilisation des ressources

Vous pouvez contraindre le placement pour des raisons de timing :

# Contrainte de placement (Xilinx XDC)
set_property LOC SLICE_X0Y0 [get_cells r_counter_reg[0]]

Étape 4 : Routage

Les interconnexions entre les ressources placées sont configurées.

Le routage est souvent le goulot d'étranglement en timing. Des signaux qui traversent beaucoup de ressources d'interconnexion introduisent des délais.

Analyse du timing (STA)

L'outil effectue une analyse statique du timing pour vérifier que tous les chemins respectent les contraintes.

Chemin de données :
FF_src → [combo logic + routage] → FF_dst
 
Setup time violation si :
  Tclk_to_Q + T_logic + T_route > Tperiode - Tsetup

Étape 5 : Bitstream

Le bitstream est le fichier de configuration qui programme le FPGA.

# Xilinx : fichier .bit
vivado -mode batch -source program.tcl
 
# Intel : fichier .sof / .rbf
quartus_pgm -m jtag -o "p;output.sof@1"

Types de mémoire de configuration

TypePersistanceUsage
SRAM interneVolatile (perdu au reset)Développement
Flash externeNon volatileProduction
EEPROMNon volatilePetits FPGAs

Sur la plupart des kits de développement, la configuration SRAM est chargée via JTAG depuis l'outil de synthèse. Pour la production, on utilise une Flash SPI externe.


Ce que VHDL ne peut PAS synthétiser

ConstructionSimulationSynthèse
wait for 10 ns
Types réels (real, float)✗ par-iellement
Fichiers (textio)
assert✗ (i-noré)
after dans affectation

Bonnes pratiques pour la synthèse

  1. Tester en simulation d'abord — ne pas synthétiser du code non simulé
  2. Respecter les templates — bascule D, RAM, FSM (le synthétiseur les reconnaît)
  3. Éviter les latches — utiliser des valeurs par défaut dans les process combinatoires
  4. Contraindre le timing — fichier SDC/XDC avec create_clock
  5. Vérifier les rapportsTiming Summary, Utilization, Synthesis Log
# Contrainte d'horloge minimale (Xilinx XDC)
create_clock -period 10.000 -name sys_clk [get_ports i_clk]