Architecture d'un fichier VHDL
Les deux blocs fondamentaux : l'entité (entity) et l'architecture (architecture).
Structure d'un fichier VHDL
Chaque fichier VHDL contient généralement deux blocs obligatoires :
- L'entité (
entity) : définit l'interface externe (ports d'entrée/sortie) - L'architecture (
architecture) : décrit le comportement 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;Les librairies
Avant de décrire un circuit, on déclare les librairies nécessaires.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; -- types std_logic, std_logic_vector
use IEEE.NUMERIC_STD.ALL; -- unsigned, signed, conversions| Librairie | Contenu principal |
|---|---|
IEEE.STD_LOGIC_1164 | Types std_logic, std_logic_vector |
IEEE.NUMERIC_STD | Types unsigned, signed, opérations arithmétiques |
STD.STANDARD | Chargée automatiquement - types bit, integer, boolean |
Attention : Ne pas utiliser
IEEE.STD_LOGIC_ARITHetIEEE.STD_LOGIC_UNSIGNED- ces librairies non-standard causent des conflits. PréférerIEEE.NUMERIC_STD.
L'entité (Entity)
L'entité représente la vue externe du composant : son symbole schématique.
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;Modes de port
| 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 |
L'architecture (Architecture)
L'architecture définit comment le circuit fonctionne en interne.
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;Noms d'architecture courants
| Nom | Signification |
|---|---|
rtl | Register Transfer Level (synthétisable) |
behavioral | Comportemental (simulation uniquement parfois) |
structural | Instanciation de composants |
tb | Testbench |
Concurrence dans l'architecture
En VHDL, tout ce qui est dans la zone begin ... end s'exécute en parallèle, comme des fils électriques :
architecture rtl of exemple is
begin
-- 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 instruction concurrente est une instruction placée directement dans l'architecture, après le begin : affectation de signal, instanciation de composant ou process. Chaque instruction décrit un morceau de circuit actif en permanence. Si i_a ou i_b change, o_y1 est recalculé indépendamment de o_y2 et o_y3.
L'ordre d'écriture ne donne donc pas un ordre d'exécution. Le synthétiseur voit trois blocs de logique combinatoire, pas trois lignes exécutées l'une après l'autre. Un process est lui aussi une instruction concurrente ; seules les instructions à l'intérieur du process se lisent comme une séquence.
Ce n'est pas de la programmation séquentielle : penser en termes de hardware.
Commentaires et style
-- Commentaire sur une ligne (double tiret)
-- Pas de commentaires /* */ en VHDL standard
-- VHDL-2008 ajoute les commentaires /* */ mais peu d'outils les supportent
entity mon_composant is -- commentaire en fin de ligne OKConventions de casse
VHDL est insensible à la casse : Signal, SIGNAL, signal sont identiques. Mais par convention :
- Mots-clés en minuscules
- Constantes et génériques en MAJUSCULES
- Signaux et ports avec préfixes (voir cours 07 - Règles de codage)
📝 Tester mes connaissances - Quiz du chapitre