Une entité représente l’interface d’un circuit électronique. Une entité possède :
Une entité ne représente pas un circuit unique, mais plutôt un modèle que l’on peut reproduire en plusieurs exemplaires. Ces exemplaires sont appelés des instances. La structure interne ou le fonctionnement d’un circuit est décrit par une architecture.
Cette page illustre la notion d’entité à travers des exemples. Le détail de la syntaxe est expliqué dans la section : L’essentiel de VHDL / Unités de conception / Entité.
Un afficheur 7 segments est un composant constitué de sept voyants lumineux ou cristaux liquides disposés comme sur la figure ci-dessous :
Ce type d’afficheur est typiquement utilisé pour afficher des chiffres, mais aussi un ensemble limité de lettres ou d’autres symboles.
Un décodeur 7 segments est un circuit dont le rôle est de convertir une valeur
que l’on souhaite afficher (par exemple le chiffre 5) en signaux de commande
destinés aux segments d’un afficheur (ici, on commande l’allumage des segments
s0
, s2
, s3
, s5
et s6
).
Le tableau ci-dessous propose un fonctionnement possible d’un décodeur 7
segments pour afficher les entiers de 0 à 15 en notation hexadécimale :
Nous définissons les entrées/sorties de ce décodeur 7 segments de la manière suivante :
digit_i
recevra un nombre entier compris entre 0 et 15.segments_o
produira 7 bits de commande destinés à l’afficheur.En VHDL, l’interface de ce circuit sera décrite par cette entité :
entity SegmentDecoder is
port(
digit_i : in integer range 0 to 15;
segments_o : out std_logic_vector(0 to 6)
);
end SegmentDecoder;
Cette description se lit de la manière suivante :
SegmentDecoder
.digit_i
est une entrée (in
) du circuit et reçoit des nombres
entiers (integer
) compris entre 0 et 15 (range 0 to 15
).segments_o
est une sortie (out
) du circuit et produit des mots
binaires (std_logic_vector
) dont les bits sont numérotés de 0 à 6 (0 to 6
).Dans le chapitre suivant, nous proposerons une architecture pour cette entité.
Par convention, nous donnerons le suffixe _i
aux ports d’entrée,
_o
aux ports de sortie, et _io
aux ports bidirectionnels.
Ce nommage n’est pas imposé par le langage VHDL, mais c’est une pratique très répandue.
Un compteur synchrone produit une séquence de valeurs entières au cours du temps au rythme d’un signal d’horloge. Dans cet exemple, nous proposons une entité pour un compteur modulo 10, capable de compter de 0 à 9.
Ses ports sont :
Port | Direction | Type | Rôle |
---|---|---|---|
clk_i |
Entrée | Logique | Signal d’horloge |
reset_i |
Entrée | Logique | Commande de réinitialisation |
inc_i |
Entrée | Logique | Commande d’incrémentation |
value_o |
Sortie | Entier entre 0 et 9 | Valeur courante du compteur |
cycle_o |
Sortie | Logique | Indicateur de fin d’un cycle de comptage |
Voici la description VHDL correspondante :
entity CounterMod10 is
port(
clk_i, reset_i, inc_i : in std_logic;
value_o : out integer range 0 to 9;
cycle_o : out std_logic
);
end CounterMod10;
Si vous avez besoin de plusieurs compteurs avec différents modulos, vous pouvez
vous inspirer de l’exemple précédent et créer autant d’entités que nécessaire.
Il suffit de leur donner des noms différents et de modifier à chaque fois la
borne supérieure du port value_o
.
Dans l’exemple ci-dessous, nous définissons une entité pour un compteur modulo 16
avec une sortie comprise entre 0 et 15 :
entity CounterMod16 is
port(
clk_i, reset_i, inc_i : in std_logic;
value_o : out integer range 0 to 15;
cycle_o : out std_logic
);
end CounterMod16;
Un principe fondamental en informatique est Don’t Repeat Yourself (DRY). Au lieu de recopier inlassablement les même lignes de code en faisant des petites modifications à chaque fois, vous gagnerez en efficacité si vous trouvez une solution générale.
VHDL propose la notion de paramètre générique, qui nous permet de créer une
entité CounterModN
dont le modulo N
est personnalisable.
Contrairement à un port, un paramètre générique reçoit une valeur à la
construction du circuit ; cette valeur ne varie pas au cours du fonctionnement
du circuit.
Dans la définition de l’entité CounterModN
, le mot-clé generic
introduit
la liste des paramètres de l’entité. N
est déclaré comme un entier strictement
positif (positive
). La borne supérieure du port value_o
dépend désormais de
la valeur du paramètre N
:
entity CounterModN is
generic(
N : positive
);
port(
clk_i, reset_i, inc_i : in std_logic;
value_o : out integer range 0 to N - 1;
cycle_o : out std_logic
);
end CounterModN;
Dans le chapitre suivant, nous proposons une architecture pour cette entité.