Comment votre code VHDL se transforme en hardware FPGA : synthèse, implémentation et bitstream.
Le VHDL décrit le circuit ; les outils le transforment en ressources placées et connectées dans le FPGA. Le bitstream contient la configuration obtenue à la fin de ce flot.
Synthétiser et choisir les ressources
La synthèse analyse le comportement du RTL et construit une netlist. Voici quelques correspondances courantes :
Construction VHDL
Hardware inféré
AND, OR, NOT
Portes logiques dans LUTs
if rising_edge(i_clk)
Bascule D
case sur signal
MUX ou LUT
array de signaux
Registres ou BRAM
* (multiplication)
DSP ou LUTs
when/select
MUX
Cette expression combine trois entrées et peut tenir dans une LUT disposant d'au moins trois entrées :
-- Code VHDLo_y <= (i_a AND i_b) OR (NOT i_c);
Ce process décrit une bascule D, avec i_data sur D et r_data sur Q ; pour un vecteur, il décrit un ensemble de bascules :
-- Code VHDLprocess(i_clk)begin if rising_edge(i_clk) then r_data <= i_data; end if;end process;
Le mapping adapte ensuite la netlist à la cible : LUT pour la logique combinatoire, bascules pour les valeurs enregistrées, BRAM pour certaines mémoires et DSP pour les calculs compatibles. La taille et le mode d'accès influencent l'inférence d'une mémoire.
Les attributs peuvent orienter ces choix, sous réserve des possibilités de l'outil et du composant :
-- Forcer en BRAM (Xilinx)attribute ram_style : string;attribute ram_style of r_mem : signal is "block";-- Demander une RAM distribuée dans les LUTattribute ram_style of r_mem : signal is "distributed";
Placer, router et vérifier les délais
Le placement attribue une position physique aux ressources. Il influence les longueurs de connexion, la fréquence, la consommation et l'organisation des ressources utilisées. Une contrainte de placement peut répondre à un besoin précis :
# Contrainte de placement (Xilinx XDC)set_property LOC SLICE_X0Y0 [get_cells -hier -filter {NAME == r_counter_reg[0]}]
Le routage choisit ensuite les interconnexions. Un trajet long ou traversant de nombreuses ressources peut devenir le chemin critique. La STA vérifie les délais à partir des contraintes ; cette relation illustre un chemin de setup simple sans décalage d'horloge :
Chemin de données :FF_src → [combo logic + routage] → FF_dstSetup time violation si : Tclk_to_Q + T_logic + T_route > Tperiode - Tsetup
Utilise les rapports Timing Summary, Utilization et Synthesis Log pour comprendre le résultat. Déclare au minimum l'horloge dans les contraintes XDC ou SDC :
Les formats et les commandes dépendent des outils. Vivado utilise notamment .bit ; Quartus utilise .sof ou .rbf. Les commandes ci-dessous servent à charger une configuration, avec un script approprié dans le cas de Vivado :
Sur une carte de développement, JTAG permet souvent de charger la configuration SRAM. Une mémoire Flash SPI externe peut la fournir au démarrage, en développement comme en production.
Tout le VHDL utile en simulation ne décrit pas du matériel synthétisable :
Construction
Simulation
Synthèse
wait for 10 ns
✓
✗
Type real à l’exécution
✓
Généralement non ; calcul de constantes possible
Fichiers (textio)
✓
✗
assert
✓
Ignoré ou limité selon l'outil
after dans une affectation
✓
Délai ignoré ou construction rejetée selon l’outil
Simule avant l'implémentation, utilise les formes reconnues pour les bascules, RAM et FSM, puis relis les rapports. Dans un process combinatoire, donne une valeur à chaque sortie dans tous les cas pour éviter un latch involontaire.