Entités

Définition

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é.

Exemples

Décodeur 7 segments

Un afficheur 7 segments est un composant constitué de sept voyants lumineux ou cristaux liquides disposés comme sur la figure ci-dessous :

Numérotation des segments sur un afficheur 7 segments

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 :

valeur segments
0123456
0 1111110
1 0110000
2 1101101
3 1111001
4 0110011
5 1011011
6 1011111
7 1110000
8 1111111
9 1111011
10 1110111
11 0011111
12 1001110
13 0111101
14 1001111
15 1000111

Nous définissons les entrées/sorties de ce décodeur 7 segments de la manière suivante :

L'entité SegmentDecoder

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 :

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.

Compteur synchrone

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.

L'entité CounterMod10

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;

Compteur synchrone générique

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.

L'entité CounterModN

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é.