Les deux blocs fondamentaux : l'entité (entity) et l'architecture (architecture).
Un bloc VHDL possède une interface, l'entity, et une réalisation, l'architecture. Cette séparation permet de voir les connexions externes sans parcourir toute la logique interne.
-- 1. Déclarations de librairies
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
-- 2. Entité
entity nom_entite is
generic (
-- paramètres génériques (optionnel)
);
port (
-- ports d'entrée/sortie
);
end entity nom_entite;
-- 3. Architecture
architecture rtl of nom_entite is
-- zone de déclaration (signaux, constantes, composants)
begin
-- zone de description (logique concurrente et processus)
end architecture rtl;
Déclarer l'interface et les dépendances
Les clauses library et use rendent les bibliothèques et les éléments des packages accessibles :
Pour l'arithmétique sur signed et unsigned, utilise IEEE.NUMERIC_STD. Les packages historiques STD_LOGIC_ARITH et STD_LOGIC_UNSIGNED ne sont pas normalisés par l'IEEE et peuvent introduire des ambiguïtés de surcharge.
L'entité représente les ports visibles du composant :
entity additionneur is generic ( g_WIDTH : integer := 8 -- paramètre configurable ); port ( i_clk : in std_logic; i_rst : in std_logic; i_a : in std_logic_vector(g_WIDTH-1 downto 0); i_b : in std_logic_vector(g_WIDTH-1 downto 0); o_sum : out std_logic_vector(g_WIDTH downto 0) );end entity additionneur;
Le mode de chaque port définit son usage :
Mode
Sens
Usage
in
Entrée seulement
Signaux de commande, données en entrée
out
Sortie seulement
Résultats, sorties
inout
Bidirectionnel
Bus tristate (rare en FPGA moderne)
buffer
Sortie relue en interne
Éviter : préférer un signal interne
Décrire le fonctionnement interne
L'architecture déclare les objets internes avant begin, puis les instructions concurrentes :
architecture rtl of additionneur is -- Zone de déclaration signal w_carry : std_logic; constant c_ZERO : std_logic_vector(g_WIDTH-1 downto 0) := (others => '0');begin -- Zone de description (tout est concurrent) o_sum <= ('0' & i_a) + ('0' & i_b);end architecture rtl;
Son nom est un choix de style. Ces noms sont fréquents :
Nom
Signification
rtl
Register Transfer Level (synthétisable)
behavioral
Comportemental (simulation uniquement parfois)
structural
Instanciation de composants
tb
Testbench
Les trois affectations suivantes décrivent des fonctions actives en parallèle :
architecture rtl of exemple isbegin -- Ces trois instructions sont toutes actives simultanément o_y1 <= i_a AND i_b; o_y2 <= i_a OR i_c; o_y3 <= NOT i_a;end architecture rtl;
Une affectation de signal, une instanciation ou un process directement placé dans l'architecture est une instruction concurrente. Une variation de i_a ou i_b entraîne le recalcul des sorties concernées.
L'ordre des lignes ne fixe pas l'ordre d'exécution des blocs. Le process lui-même est concurrent ; les instructions qu'il contient se lisent dans l'ordre pour décrire son comportement.
Rendre le fichier facile à relire
Les commentaires commencent par -- :
-- Commentaire sur une ligne (double tiret)-- Pas de commentaires /* */ en VHDL standard-- VHDL-2008 ajoute les commentaires /* */ mais peu d'outils les supportententity mon_composant is -- commentaire en fin de ligne OK
VHDL est insensible à la casse : signal, Signal et SIGNAL désignent le même mot-clé. Choisis une convention cohérente : mots-clés en minuscules, constantes et génériques éventuellement en majuscules, préfixes pour distinguer ports et signaux. Le chapitre sur les règles de codage détaille les conventions utilisées ici.