Vous êtes sur la page 1sur 134

Chapitre 2 : Présentation des

éléments du langage VHDL

Vhsic Hardware Description Language


Vhsic : Very High Speed Integrated Circuit
Langage de description de systèmes matériels
2. Présentation des éléments du VHDL
2.1. Qu’est ce que le VHDL?
L’abréviation VHDL signifie VHSIC Hardware Description Language
(VHSIC : Very High Speed Integrated Circuit). Ce langage a été écrit
dans les années 70 pour réaliser la simulation de circuits électroniques.
On l’a ensuite étendu en lui rajoutant des extensions pour permettre la
conception (synthèse) de circuits logiques programmables (P.L.D.
Programmable Logic Device).
Auparavant pour décrire le fonctionnement d’un circuit électronique
programmable les techniciens et les ingénieurs utilisaient des langages
de bas niveau ou plus simplement un outil de saisie de schémas.
Actuellement la densité de fonctions logiques (portes et bascules)
intégrée dans les PLDs est telle (plusieurs milliers de portes voire
millions de portes) qu’il n’est plus possible d’utiliser les outils d’hier pour
développer les circuits d’aujourd’hui.

E M . Mellouli 2
2. Présentation des éléments du VHDL
2.1. Qu’est ce que le VHDL?
Les sociétés de développement et les ingénieurs ont voulu s’affranchir
des contraintes technologiques des circuits. Ils ont donc créé des
langages dits de haut niveau à savoir VHDL et VERILOG.
Ils permettent au code écrit d’être portable, c’est à dire qu’une
description écrite pour un circuit peut être facilement utilisée pour un
autre circuit.
En effet les instructions écrites dans ces langages se traduisent par une
configuration logique de portes et de bascules qui est intégrée à
l’intérieur des circuits. C’est pour cela qu’on préfère parler de description
VHDL ou VERILOG que de langage.

E M . Mellouli 3
2. Présentation des éléments du VHDL
2.2. Pourquoi un langage de description?
Le schéma structurel que l'on utilise depuis si longtemps et si souvent
n'est en fait qu'un outil de description graphique.

Aujourd'hui, l'électronique numérique est de plus en plus présente et


tend bien souvent à remplacer les structures analogiques utilisées
jusqu'à présent.

Ainsi, l'ampleur des fonctions numériques à réaliser nous impose


l'utilisation d'un autre outil de description.

Il est en effet plus aisé de décrire un compteur ou un additionneur 64


bits en utilisant l'outil de description VHDL plutôt qu'un schéma.

E M . Mellouli 4
2. Présentation des éléments du VHDL
2.3. Historique
Le VHDL (Very High Speed Integrated Circuit, Hardware Description
language) est le fruit du besoin de normalisation des langages de
description de matériel (Première norme IEEE 1076-87 en
décembre 1987).
Auparavant, chaque fournisseur de CAO proposait son propre
langage de modélisation (GHDL chez GENRAD, BLM ou M chez
Mentor Graphics, Verilog chez Cadence etc...) mais aussi un autre
langage pour la synthèse et encore un autre pour le test. Au début
des années 80, le ministère de la défense des Etats Unis confiait le
soin à Intermetrics, IBM et Texas Instruments de mettre au point ce
langage.
L'objectif était bien sûre de s'assurer une certaine indépendance vis
à vis des fournisseurs de matériels et de logiciels

E M . Mellouli 5
2. Présentation des éléments du VHDL
2.3. Historique
En 1994 la version IEEE 1076-93 suivie du standard IEEE 1164 fut
établie (Normalisation des signaux logiques multivaleurs)
Il y aura aussi la norme IEEE 1076.3 (Numeric Standart pour la
synthèse). Implantation d ’un nombre signé
En 1995, afin de normaliser les méthodes de modélisation des
retards des circuits ASIC ou FPGA, de grands industriels se sont
associés dans la « VITAL initiative » (VHDL Initiative Toward ASIC
Libraries) fournissant des bibliothèques normalisées VITAL. Ceci est
concrétisé par la norme IEEE 1076.4
En 1999, le VHDL a connu une nouvelle extension avec la première
norme IEEE-1076.1-1999 du langage de modélisation mixte et multi-
technologique VHDL-AMS

E M . Mellouli 6
2. Présentation des éléments du VHDL
2.4. Structure d’une description VHDL
En VHDL, une structure logique est décrite à l'aide d'une entité et
d'une architecture de la façon suivante :

E M . Mellouli 7
2. Présentation des éléments du VHDL
2.4. Structure d’une description VHDL

E M . Mellouli 8
2.4. Structure d’une description VHDL
2.4.1. Déclaration des bibliothèques

Toute description VHDL utilisée pour la synthèse a besoin de


bibliothèques. L’IEEE (Institut of Electrical and Electronics
Engineers) les a normalisées et plus particulièrement la bibliothèque
IEEE1164. Elles contiennent les définitions des types de signaux
électroniques, des fonctions et sous programmes permettant de
réaliser des opérations arithmétiques et logiques,...

La directive Use permet de sélectionner les bibliothèques à utiliser.

E M . Mellouli 9
2.4. Structure d’une description VHDL
2.4.2 Déclaration de l’entité (entity) et des entrées/sorties

In 1 Out 1
In 2 Bloc A
In 3 Out 2

Vue externe : Définition de l'entité


Bloc A

In 1
Bloc B Bloc C Out 1
In 2

In 3 Bloc D Bloc E Out 2

Vue interne : Définition de l'architecture


E M . Mellouli 10
2.4. Structure d’une description VHDL
2.4.2 Déclaration de l’entité (entity) et des entrées/sorties
. Port :
. Signal d ’interface entre l’entité et l’extérieur
. Chaque port est associé à un nom, un mode et un type
. Ordre de la déclaration des différents signaux : aucune importance
. Ordre conservé lors d’une utilisation à un plus haut niveau de cette entité
. Mode :
. Définition du sens du signal
. 4 modes sont définis
- in : Signal d’entrée monodirectionnel
- out : Signal de sortie monodirectionnel
- inout : Signal d’entrée/sortie bidirectionnel
- buffer : Signal de sortie/entrée monodirectionnel
. Utile lorsqu’il y a rebouclage (sortie considérée comme une entrée)
. Peu utilisé (remplacé par une sortie associée à un signal interne)

E M . Mellouli 11
2.4. Structure d’une description VHDL
2.4.2 Déclaration de l’entité (entity) et des entrées/sorties

. Mode : 4 modes de ports . In


CS . Out
. Inout
. Buffer

R/W

Adresse Mémoire Busy

Données Erreur

E M . Mellouli 12
2.4. Structure d’une description VHDL
2.4.2 Déclaration de l’entité (entity) et des entrées/sorties

. Déclaration :

ENTITY nom_entite IS
PORT ( entrees : IN type_entrees;
sorties : OUT type_sorties;
entreessorties : INOUT type_entreessorties;
entreessorties_buffer : BUFFER type_entreessorties_buffer);
END nom_entite;

E M . Mellouli 13
2.4. Structure d’une description VHDL
2.4.2 Déclaration de l’entité (entity) et des entrées/sorties

a) Le NOM_DU_SIGNAL.
Il est composé de caractères, le premier caractère doit être une lettre, sa
longueur est quelconque, mais elle ne doit pas dépasser une ligne de code.
VHDL n’est pas sensible à la « casse », c’est à dire qu’il ne fait pas la
distinction entre les majuscules et les minuscules.

E M . Mellouli 14
2.4. Structure d’une description VHDL
2.4.2 Déclaration de l’entité (entity) et des entrées/sorties
b) Le SENS du signal

- in : pour un signal en entrée.


- out : pour un signal en sortie.
- inout : pour un signal en entrée sortie
- buffer : pour un signal en sortie mais utilisé comme entrée dans la
description.

E M . Mellouli 15
2.4. Structure d’une description VHDL
2.4.2 Déclaration de l’entité (entity) et des entrées/sorties
c) Le TYPE

Le TYPE utilisé pour les signaux d’entrées / sorties est :


- le std_logic pour un signal.
- le std_logic_vector pour un bus composé de plusieurs signaux.

Par exemple un bus bidirectionnel de 5 bits s’écrira :

LATCH : inout std_logic_vector (4 downto 0) ;

Où LATCH(4) correspond au MSB et LATCH(0) correspond au LSB.


Les valeurs que peuvent prendre un signal de type std_logic sont :

- ‘0’ ou ‘L’ : pour un niveau bas.


- ‘1’ ou ‘H’ : pour un niveau haut.
- ‘Z’ : pour état haute impédance.
- ‘-‘ : Quelconque, c’est à dire n’importe quelle valeur.

E M . Mellouli 16
Exercices
Exercice 1 : Définir
l’entité décrivant un
additionneur de 1 bit.

Exercice 2 : Définir
l’entité décrivant un
additionneur de deux
mots de quatre bits.

E M . Mellouli 17
2.4. Structure d’une description VHDL
2.4.2 Déclaration de l’entité (entity) et des entrées/sorties
Exercice 3

Exercice 4

E M . Mellouli 18
2.4. Structure d’une description VHDL
2.4.3 Architecture

. décrit le fonctionnement souhaité pour un circuit ou une partie du circuit.


. Plusieurs architectures peuvent être définies pour le même modèle

. Déclaration

ARCHITECTURE nomdelarchitecture OF nomdelentité IS


déclarations de types, de constantes,
de composants, de signaux
BEGIN
définiton de processus
et/ou
d'instances de composants, ...
END nomdelarchitecture;

E M . Mellouli 19
2.4. Structure d’une description VHDL
2.4.3 Architecture
. Exemples -- Décodeur 7 segments

Ecrire le code VHDL correspondant au décodeur 7 segments ci-


dessous.

E M . Mellouli 20
2.4. Structure d’une description VHDL
2.4.3 Architecture
. 3 Types de description :
. Description comportementale
- Description purement fonctionnelle du circuit
- Portabilité, lisibilité, maintenance, évolutivité
- Description flot de données pour traduire une table de vérité

. Description structurelle
- Traduction d’une représentation schématique
- Efficacité, compacité, clarté

. Description mixte
- Au sein d’une même architecture, il est possible d ’utiliser
des modules décrits de manière comportementale ou structurelle

E M . Mellouli 21
2.4. Structure d’une description VHDL
A. Architecture : Description comportementale
. Description haut niveau
ARCHITECTURE haut_niveau OF adder IS
BEGIN
S <= A + B;
END haut_niveau;

. Description niveau équations logiques

ARCHITECTURE niveau_equations_logiques OF adder IS


BEGIN
S(0) <= A(0) XOR B(0);
S(1) <= A(0) AND B(0) XOR A(1) XOR B(1);
END niveau_equations_logiques;

. Description bas niveau


ARCHITECTURE bas_niveau OF adder IS
BEGIN
S(0) <= '1' WHEN A(0)!= B(0) ELSE '0';
S(1) <= '1' WHEN ( A(0)!=B(0) AND A(1)!=B(1) OR
A(1)=B(1) AND A(0)=B(0)=1) OR
A(1)!=B(1) AND A(0)=B(0)=0 ) ELSE '0';
END bas_niveau;

E M . Mellouli 22
2.4. Structure d’une description VHDL
A. Architecture : Description comportementale
. Exemple : Description comportementale d'une bascule D sur niveaux

Q
D
Horloge

D H Q
0 0
1 1
X X Q-1

E M . Mellouli 23
2.4. Structure d’une description VHDL
A. Architecture : Description structurelle
. Traduction d'une représentation schématique
A(0) VHDL
S(0)
B(0)
A(1)
B(1)
A(0) S(1) ARCHITECTURE structurelle OF adder IS
B(0)
COMPONENT xor2
port(e1,e2 : in bit; s : out bit); end COMPONENT
COMPONENT and2
port(e1,e2 : in bit;s : out bit); end COMPONENT
SIGNAL inter1,inter2 :bit;
BEGIN
u1 : PORT MAP xor2 (e1=>A(0),e2=>B(0),s=>S(0));
u2 : PORT MAP xor2 (e1=>A(1),e2=>B(1),s=>inter1);
u3 : PORT MAP and2 (e1=>A(0),e2=>B(0),s=>inter2);
u4 : PORT MAP xor2 (e1=>inter1,e2=>inter2,s=>S(1));
end structurelle;

E M . Mellouli 24
2.4. Structure d’une description VHDL
A. Architecture : Description mixte
. Au sein d'une même architecture, il est possible d'utiliser du comportemental
et du structurel ENTITY integration IS PORT(
a : IN bit_vector(0 to 1);
reset,clk : IN bit;
s : OUT bit_vector(0 to 1));
END integration
reset ARCHITECTURE mixte OF integration IS
S_inter
SIGNAL b,s_inter :bit_vector(0 to 1);
COMPONENT adder
D clk PORT(a,b : IN bit_vector(0 to 1);
s : OUT bit_vector(0 to 1); END COMPONENT;
BEGIN
b VHDL PROCESS(clk)
a Adder s IF rising_edge(clk) THEN
IF reset = "1" THEN b <= '00';
ELSE b <= s_inter;
END IF;
END IF;
END PROCESS;
u1 : PORT MAP adder (a,b,s_inter);
s <= s_inter;
END mixte;

E M . Mellouli 25
2. Présentation des éléments du VHDL
2.4. Structure d’une description VHDL
L'entité donne les informations concernant les signaux d'entrées et
de sorties de la structure ainsi que leurs noms et leurs types.

L'architecture décrit le comportement de l'entité.

Il est possible de créer plusieurs architectures pour une même


entité. Chacune de ces architectures décrira l'entité de façon
différente.

E M . Mellouli 26
2.4. Structure d’une description VHDL
Exemple : description comportementale

E M . Mellouli 27
2.4. Structure d’une description VHDL
Exemple : description comportementale

Dans ce type de description, le comportement de la structure est


directement inscrit dans l'architecture à l'aide d'instructions
séquentielles ou sous forme de flot de données
données..

E M . Mellouli 28
2.4. Structure d’une description VHDL
Exemple : description structurelle

E M . Mellouli 29
2.4. Structure d’une description VHDL
Exemple : description structurelle

E M . Mellouli 30
2. Présentation des éléments du VHDL
2.5. Les Objets
3 types d’objets :
Constantes :
valeur fixe après initialisation
Variables :
valeur modifiable par affectation (affectation instantanée)
Signaux :
spécifiques aux langages de description de matériel
modélisent les informations qui circulent sur les fils ou bus

E M . Mellouli 31
2. Présentation des éléments du VHDL
2.5. Les Objets
Constantes :
Utilisation des constantes et des variables : proche des langages
traditionnels

. Constantes (Constant)

. Objets internes à valeurs fixes et définitives

. Déclaration : constant nom : type := valeur;

. Exemple : CONSTANT pi : real:=3.141592 ;

E M . Mellouli 32
2. Présentation des éléments du VHDL
2.5. Les Objets
Variables :

. Variables (Variable)

. Objets permettant de conserver une valeur pendant un


certain temps
. Utilisable qu'au sein d'un processus (définition dans le
process)
. Peu utilisé en synthèse logique

. Exemple:

VARIABLE octet1 : std_logic_vector(0 TO 7) := "00000001";

E M . Mellouli 33
2. Présentation des éléments du VHDL
2.5. Les Objets
Signaux : (signal)
• ils sont la base des langages de description de matériel
• ils véhiculent les informations entre composants
• ils ne sont pas de type pointeur, pas de type fichier
• Utilisation en mode concurrent et séquentiel
• Synthèse (représentation matérielle : un fil ou une mémoire)
• Une valeur courante et une valeur future

E M . Mellouli 34
2. Présentation des éléments du VHDL
2.5. Les Objets
Signaux : (signal)
. Synthèse d'une VARIABLE ≠ Synthèse d'un SIGNAL
ARCHITECTURE ex_sig OF exemple IS
BEGIN
PROCESS(a,b,c) a Tmp (fil)
VARIABLE tmp : bit;
BEGIN b y
c
tmp := a and b;
y <= tmp or c;
END PROCESS;
END ex_sig;

ARCHITECTURE ex_sig OF exemple IS


SIGNAL tmp : bit;
BEGIN
PROCESS(a,b,c) a Tmp (fil)
BEGIN b y
tmp <= a and b;
c
y <= tmp or c;
END PROCESS;
END ex_sig;
E M . Mellouli 35
2. Présentation des éléments du VHDL
2.5. Les Objets
Les signaux : Exemple

E M . Mellouli 36
2. Présentation des éléments du VHDL
2.5. Les Objets
Affectation des signaux :
VHDL permet de spécifier des délais dans les affectations.
2 modes de fonctionnement :
mode inertiel :
• filtre les impulsions de longueur insuffisante
mode transmission :
• transmission de toutes les impulsions

E M . Mellouli 37
2. Présentation des éléments du VHDL
2.5. Les Objets
Mode inertiel
utiliser pour les composants dont le temps de traversé est non
nul (tous les composants décrits de façon réaliste)

E M . Mellouli 38
2. Présentation des éléments du VHDL
2.5. Les Objets
Mode transport

toutes les transitions en entrée sont transmises en sortie avec un


décalage égal au temps de propagation.

E M . Mellouli 39
2. Présentation des éléments du VHDL
2.5. Les Objets
Mode inertiel vs mode transport

Le type inertiel permet de "filtrer" les variations de S trop courtes


par rapport au délai de la transaction.

Par exemple si S est à 1 pendant 5 ns, l'affectation S1 <= S after


10 ns; ne changera pas la forme d'onde de S1 qui restera à 0.

Contrairement au mode inertiel , le type transport n'opère pas


de "réjection des parasites". Il respecte les temps de propagation.

E M . Mellouli 40
2. Présentation des éléments du VHDL
2.5. Les Objets
Différences entre variables et signaux

Les variables sont toujours locales à un processus: il n’y a pas de


variables globales

Les signaux peuvent être déclarés n’importe où dans le programme,


sauf à l’intérieur d’un processus. S’ils sont déclarés au début de
l’architecture, ils sont communs à toute l’architecture

Contrairement aux signaux, les variables sont mises à jour de façon


instantanée, au moment de l’affectation, sans retard possible

E M . Mellouli 41
2. Présentation des éléments du VHDL
2.5. Les Objets
Signaux : Différences entre variables et signaux
. Synthèse d'une VARIABLE ≠ Synthèse d'un SIGNAL

E M . Mellouli 42
2. Présentation des éléments du VHDL
2.6. Types Prédéfinis ou non, fonction de résolution
Le VHDL est un langage fortement typé. Chaque objet doit être
déclaré et appartenir à un type connu (ensemble de valeurs possibles).
Type = ensemble de valeurs + opérateurs associés
Sous-type = type dérivé d'un type de base (type parent) avec
contraintes
4 classes de types
Types scalaires: entier, réel, énuméré, physique
Types composites: tableaux, enregistrements
Pointeurs
Fichiers
Déclaration de type:

Déclaration de sous-type:

E M . Mellouli 43
2. Présentation des éléments du VHDL
2.6. Types Prédéfinis ou non, fonction de résolution

E M . Mellouli 44
2. Présentation des éléments du VHDL
2.6.1 Types : scalaire
. Types entiers :
-231 + 1 ≤ entier ≤ 231 - 1

TYPE chiffre_ascendant IS RANGE 0 TO 9;


TYPE chiffre_descendant IS RANGE 9 DOWNTO 0;
. Types flottants :
Approximation discrète de l'ensemble des réels dans un intervalle
donné
TYPE tension IS RANGE 0 TO 5;
-1E38 ≤ Flottant ≤ 1E38
Opérateurs
• Arithmétiques: + – * / abs
mod rem (seulement pour types entiers)
** (puissance entière)
• Relationnels: = /= < <= > >=

E M . Mellouli 45
2. Présentation des éléments du VHDL
2.6.1 Types : scalaire
. Types entiers :

E M . Mellouli 46
2. Présentation des éléments du VHDL
2.6.1 Types : scalaire
. Types énumérés :
Ensemble de valeurs désignées par des identificateurs ou des caractères

TYPE boolean IS (false, true);


TYPE bit IS ('0','1');
TYPE jour IS (lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche);

Remarques :
. Chaque caractère ou chaîne de caractères au sein d'un même
type doit être distinct
. Possibilité d'utiliser le même caractère dans 2 types distincts
Opérateurs
• Relationnels: = /= < <= > >=
• Logiques: and or nand nor xor xnor not (types bit & boolean seulement)

E M . Mellouli 47
2. Présentation des éléments du VHDL
2.6.1 Types : scalaire
. Exercices :

E M . Mellouli 48
2. Présentation des éléments du VHDL
2.6.1 Types : scalaire
. Types physiques :

Valeurs numériques de quantités physiques


un type physique est caractérisé par :
son unité
par des sous unités
on peut effectuer des calculs sur ces types
TYPE resistance IS RANGE 0 TO 1E8;
UNITS ohms;
kohms = 1000 ohms;
Mohms = 1E6 ohms;
END UNITS;

♦ Opérateurs
• Arithmétiques: + – * / abs
• Relationnels: = /= < <= > >=

E M . Mellouli 49
2. Présentation des éléments du VHDL
2.6.1 Types : scalaire
. Types physiques :

E M . Mellouli 50
2. Présentation des éléments du VHDL
2.6.2 Types : composés

Tableaux et enregistrements (array & record) :


tableau : éléments homogènes, de même type
enregistrements : éléments hétérogènes, types différents

Les tableaux :
dimensions multiples
les indices sont de type discret (énuméré ou entier)
2 sortes de tableaux :
• contraint : on spécifie le sens de variation des indices
• non contraint : on repousse la définition de la taille à plus tard

E M . Mellouli 51
2. Présentation des éléments du VHDL
2.6.2.1 Type : tableaux
Exemples de types non prédéfinis
type word is array (31 downto 0) of bit; -- intervalle descendant
type memory is array (0 to 255) of word; -- intervalle montant

L'indice peut-être un type entier défini par déclaration


TYPE adresse IS RANGE 0 TO 255;
type memory is array (adresse) of octet;

Accès aux éléments d'un tableau


-- soit W un objet de type word, M de type memory.
W(15) --bit d'indice 15
M(122) --mot d'indice 122
M(122)(8) -- bit d'indice 8 du mot d'indice 122
-- tranches
W(31 downto 16) -- 16 bits les plus significatifs
M(129 to 255) -- portion haute de la mémoire

E M . Mellouli 52
2. Présentation des éléments du VHDL
2.6.2.1 Type : tableaux

Les tableaux non contraint :


permet de repousser la définition de la taille à plus tard.
la manipulation de ces tableaux demande l’utilisation d’attributs
range <>

Types prédéfinis

type bit_vector is array (natural range <>) of bit;


type string is array (positive range <>) of character;
(natural range: c'est l’indice)
l’indice)

E M . Mellouli 53
2. Présentation des éléments du VHDL
2.6.2.1 Type : tableaux
Exemple

E M . Mellouli 54
2. Présentation des éléments du VHDL
2.6.2.1 Type : tableaux
Exemple

E M . Mellouli 55
2. Présentation des éléments du VHDL
2.6.2.1 Type : tableaux
Exemple

E M . Mellouli 56
2. Présentation des éléments du VHDL
2.6.2.1 Type : tableaux
♦ Opérateurs

• Relationnels: = /= < <= > >=


• Logiques*: and or nand nor xor xnor not
• Décalage et rotation*: sll srl sla sra rol ror

(* tableaux à 1 dimension de types bit ou boolean seulement;


opérations logiques effectuées bit à bit)

• Concaténation: & (tableaux à 1 dimension seulement)

E M . Mellouli 57
2. Présentation des éléments du VHDL
2.6.2 Types : composés
Un type enregistrement définit une collection d'éléments (ou de champs) nommés dont
les valeurs peuvent être de types différents. Chaque nom d'élément doit être unique.
♦ Exemples de types non prédéfinis type memory_bus is record
addr : bit_vector(15 downto 0);
data : bit_vector(7 downto 0);
read, write: bit;
enable : boolean;
end record memory_bus;
type complex is record
real_part, imag_part: real;
end record complex;
♦ Accès aux éléments d'un enregistrement
-- soit MB1 et MB2 deux objets de type memory_bus et Z de type complex
MB1.addr -- tout le tableau addr
MB1.addr(7 downto 0) -- tranche du tableau addr
MB1.data(7) -- élément d'indice 7 du tableau data
Z.real_part, Z.imag_part -- nombres réels
Affectation par champs ou globale
MB1:=MB2
MB1.addr:=MB2.addr

E M . Mellouli 58
2. Présentation des éléments du VHDL
2.6.4 Sous-Types
Un sous-type reste compatible avec son type d’origine contrairement à un type
nouvellement créé.

SUBTYPE narurel IS integer RANGE 0 TO integer’high

naturel reste compatible avec integer

TYPE nouvel_entier IS RANGE 0 TO 99

nouvel_entier est un type différent

E M . Mellouli 59
2. Présentation des éléments du VHDL
2.6.5 Types prédéfinis

Prédéfinis

Integer bit Boolean Real Time

Natural Positive bit_vector

E M . Mellouli 60
2. Présentation des éléments du VHDL
2.6.6 Type std_logic
Les types prédéfinis proposés par le langage VHDL initial sont vite devenus
insuffisants dans la plupart des cas.
Il suffit, pour s'en convaincre, d'essayer de décrire à l'aide de signaux de
type bit la porte trois états ci-dessous :

Si E = 1, alors les sorties de cette porte/élément sont actives et ont une


valeur de 0 ou 1
Si E = 0, alors les sorties ne sont pas activées et n'ont pas de
signification, comme si les sorties étaient « déconnectées »

Avec un signal S de type bit pouvant prendre deux valeurs '0' et '1', la
description de cette structure est impossible. Il faut utiliser un type qui
permette au signal S de prendre la valeur 'Z‘ haute impédance.

E M . Mellouli 61
2. Présentation des éléments du VHDL
2.6.6 Type std_logic
L'objectif final étant de pouvoir décrire toutes les structures logiques
possibles. C'est dans cette optique que le type std_logic conforme au
standard IEEE 1164 a été créé.

Ces types proposent les valeurs suivantes :

'U' = Non initialisé,


’X ' = inconnu forçage fort,
’0’ = forçage fort,
’1’ = forçage fort,
’Z ' = haute impédance,
’W’ = inconnu forçage faible,
’L’ = forçage faible,
’H’ = forçage fort,
et ’-’ = quelconque.

E M . Mellouli 62
2. Présentation des éléments du VHDL
2.6.7 Fonction de resolution d’un type
Dans l'exemple ci-dessous, on constate que le signal S possède plusieurs
sources. La description VHDL d'une telle structure ne pose pas de difficultés
particulières.

Or, pour qu'une telle description puisse être simulée il faut que le simulateur
sache résoudre les différents cas possibles d'état du signal S.

On peut par exemple se demander quelle est la valeur de S si la sortie de


l'une des portes logiques est à '0' alors que l'autre est à '1'.

E M . Mellouli 63
2. Présentation des éléments du VHDL
2.6.7 Fonction de resolution d’un type
Pour permettre au simulateur de résoudre une affectation multiple d'un
signal, le langage VHDL permet à un type d'être résolu, c'est-à-dire
d'énumérer au sein de la description tous les cas possibles d'associations et
les résultats qui en découlent.

E M . Mellouli 64
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
. Remarque : Le VHDL est un langage développé initialement pour la
modélisation et la simulation, par conséquent certains opérateurs sont à
déconseiller en synthèse

. Opérateurs logiques

Nom Type opérandes Signification


And Et
Nand Non et
Or Ou
Boolean
Nor Bit ou Bit_vector Non ou
Xor Ou exculsif
Xnor Egal
Not Non

E M . Mellouli 65
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
. Opérateurs logiques
. Exemple 1
a(0)
c(0)
b(0)
SIGNAL a,b,c : std_logic_vector(1 downto 0);
);
Synthèse
c <= a AND b; a(1)
c(1)
b(1)

. Exemple 2

d
SIGNAL d, e, f, g : bit; e g
g <= (d AND e) AND f;
Synthèse f

E M . Mellouli 66
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
. Opérateurs relationnels Nom Type opérandes Signification
= Egal
Ils permettent de modifier
/= Non égal
l’état d’un signal ou de
signaux suivant le résultat < Entrées : Tout scalaire Inférieur
d’un test ou d’une condition <= Sortie : Boolean Inférieur ou égal
> Supérieur
>= Supérieur ou égal
. Exemple a0
a1
SIGNAL a,b : bit_vector(1 DOWNTO 0); !b0
SIGNAL s : bit; Synthèse a0
IF a > b THEN s <= "1"; !b1 s
!b0
END IF;
a1
!b1

E M . Mellouli 67
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
. Opérateurs de décalages
Nom Type opérandes Signification

Sll Sla Décalage à gauche

Srl Sra Décalage à droite


Bit_vector
Rol Rotation gauche
Ror Rotation à droite a0

. Exemple a1 b0
SIGNAL a,b : BIT_VECTOR(0 TO 3);
... a2 b1
Synthèse
b = a décalé de 1 bit à gauche
b <= a sll 1; --b
... a3 b2

'0' b3
clk
E M . Mellouli 68
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
Opérateurs arithmétiques

Nom Type opérandes Signification


+ Incrémentation de 1 ou addition
- Décrémentaion de 1 ou soustraction
Integer, Real
* Multiplication
/ Division
abs Valeur absolue
** Exponentiel
mod Modulo
Integer
rem Reste
Autres opérateurs

Nom Type opérandes Signification


& Bit, Bit_vector Concaténation
E M . Mellouli 69
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
A
. Exemple : addition
B S
S = (A + B) + (C - 1)
Synthèse C -1
T = ((A + B) + C - 1)

B -1 T
C

Remarque : Pour pouvoir utiliser les opérateurs ci-dessus il faut rajouter


les bibliothèques suivantes au début du fichier VHDL:

Use ieee.numeric_std.all ;
Use ieee.std_logic_arith.all ;

E M . Mellouli 70
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
. Opérateur de concaténation

Nom Type opérandes Signification


& Bit, Bit_vector Concaténation

ARCHITETCURE ...
SIGNAL A : BIT_VECTOR(2 DOWNTO 1 );
SIGNAL B : BIT;
SIGNAL C : BIT_VECTOR(5 DOWNTO 0 ); A(1) C(0)
BEGIN
C <= not B & "101" & not A(2 DOWNTO 1); A(2) C(1)
VDD C(2)
GND C(3)
VDD C(4)
« bon » & « jour » produira « bonjour » ;
« 101 » & « 10 » produira « 10110 » B C(5)

E M . Mellouli 71
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
. Opérateur de concaténation

Utilisation de l’opérateur de concaténation pour réaliser des décalages logiques


en synthèse logique :

Décalage à droite :

-- Si A est de type std_logic_vector(7 downto 0)


S1 <= ‘0’ & A(7 downto 1); -- décalage d’un bit à droite
S1 <= "000" & A(7 downto 3); -- décalage de trois bits à droite

Décalage à gauche :

-- Si A est de type std_logic_vector(7 downto 0)


S1 <= A(6 downto 0) & ‘0’; -- décalage d’un bit à gauche
S1 <= A(4 downto 0) & "000"; -- décalage de trois bits à gauche

E M . Mellouli 72
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
• L’affectation simple : <=
Dans une description VHDL, c’est certainement l’opérateur le plus utilisé.
Permet de modifier l’état d’un signal en fonction d’autres signaux et/ou
d’autres opérateurs.

Exemple avec des portes logiques : S1 <= E2 and E1 ;

Pour les signaux composés de plusieurs bits on utilise les guillemets " … "

Les bases numériques utilisées pour les bus peuvent être :

BINAIRE, exemple : BUS <= "1001" ; -- BUS = 9 en décimal


HEXA, exemple : BUS <= X"9" ; -- BUS = 9 en décimal
OCTAL, exemple : BUS <= O"11" ; -- BUS = 9 en décimal

Remarque : La base décimale ne peut pas être utilisée lors de l’affectation de


signaux.

E M . Mellouli 73
2. Présentation des éléments du VHDL
2.7 Opérateurs standards
Exemple:
Library ieee;
Use ieee.std_logic_1164.all;
entity AFFEC is
port (
E1,E2 : in std_logic;
BUS1,BUS2,BUS3 : out std_logic_vector(3 downto 0);
S1,S2,S3,S4 : out std_logic)
end AFFEC;
architecture DESCRIPTION of AFFEC is
begin
S1 <= '1'; -- S1 = 1
S2 <= '0'; -- S2 = 0
S3 <= E1; -- S3 = E1
S4 <= '1' when (E1 ='1') else S4; -- S4 = 1 si E1=1 sinon S4
BUS1 <= "1000"; -- BUS1 = "1000"
BUS2 <= E1 & E2 & "10"; -- BUS2 = E1 & E2 & 10
BUS3 <= x"A"; -- valeur en HEXA -> BUS3 = 10(déc)
end DESCRIPTION;

E M . Mellouli 74
2. Présentation des éléments du VHDL
2.8 Attributs
Un attribut est une caractéristique associée à un type ou un objet. Chaque
attribut est référencé par son nom consistant en un préfixe, une apostrophe et
l´attribut lui-même. Le préfixe doit être un type, sous-type, tableau, ou bloc.

Attribut = information sur un élément du langage


Utilisation : toto'att avec toto un objet ou un type et att un attribut
• Par exemple: longueur d'un signal bus = bus'length

ils permettent de connaître les caractéristiques :


des signaux
des tableaux
des types

E M . Mellouli 75
2. Présentation des éléments du VHDL
2.8 Attributs
. Attributs d'un scalaire
T'left -> Limite gauche de T
T'right -> Limite droite de T
T'low -> Limite basse de T
T'high -> Limite haute de T
. Attributs d'un ensemble discret
T'pos(X) -> Numéro de la position de X dans T
T'val(N) -> Valeur à la position N dans T
T'leftof(X) -> Valeur à une position à gauche de X dans T
T'rightof(X) -> Valeur à une position à droite de X dans T
T'pred(X) -> Valeur à une position au dessous de X dans T
T'succ(X) -> Valeur à une position au dessus de X dans T

E M . Mellouli 76
2. Présentation des éléments du VHDL
2.8 Attributs
. Exemples - Attributs d'un scalaire
Type adr is integer range 7 downto 0;

adr ’left = 7
adr ’right = 0
adr ’low = 0
adr ’high = 7

. Exemples - Attributs d'un ensemble discret


Type MVL4 is (‘ U ’, ’0 ’, ‘ 1 ’, ‘ Z ’);

MVL4'pos(‘ 1 ’) = 2
MVL4'val(0) = ‘ U ’
MVL4 ’rightof(‘ 1 ’) = ‘ Z ’
MVL4 ’leftof(‘ 1 ’) = ‘ 0 ’
MVL4 ’succ(2) = ‘ Z ’ //Valeur au dessus de 2 dans MVL4
MVL4 ’succ(‘1’) = ‘ Z ’
MVL4 ’prec(2) = ‘ 0 ’ // Valeur au dessous de 2 dans MVL4

E M . Mellouli 77
2. Présentation des éléments du VHDL
2.8 Attributs
. Attributs d'un tableau
A'left(N) -> Limite gauche de l'intervalle des indices de la dim. N de A
A'right(N) -> Limite droite de l'intervalle des indices de la dim. N de A
A'low(N) -> Limite basse de l'intervalle des indices de la dim. N de A
A'highof(N) -> Limite haute de l'intervalle des indices de la dim. N de A
A'range(N) -> Intervalle des indices de la dim. N de A
A'reverse_range(N) -> Intervalle inverse des indices de la dim. N de A
A'length(N) -> Longueur de l'intervalle des indices de la dim. N de A

E M . Mellouli 78
2. Présentation des éléments du VHDL
2.8 Attributs
. Exemples : Attributs d'un tableau

E M . Mellouli 79
2. Présentation des éléments du VHDL
2.8 Attributs
Attributs de signal
Pour cette catégorie d’attribut, le préfixe doit être un signal. Le type du
résultat peut être signal ou fonction.
• Objets signaux implicites:
S'delayed (T) Signal ayant même valeur que S mais retardé de
T unités de temps (T ≥ 0 ns)
S'stable(T) Signal de type boolean valant TRUE si aucun
événement n'est arrivé sur S durant T unités
de temps (T ≥ 0 ns), et FALSE sinon
• Fonctions:
S'event Fonction à valeur de type boolean valant TRUE
si un événement est arrivé sur S durant le cycle
de simulation courant, et FALSE sinon
S'last_event Fonction à valeur de type time valant le temps
écoulé depuis le dernier événement sur S
S'last_value Fonction à valeur du type de S valant la valeur
de S avant le dernier événement sur S

E M . Mellouli 80
2. Présentation des éléments du VHDL
2.8 Attributs
Attributs de signal
S’active :
• boolean
• true si il y a eu une transaction (affectation) sur le signal dans le
cycle de simulation en cours

S’quiet(T) :
• boolean
• true si le signal a eu ni transaction ni événement pendant un temps T

S’last_active :
• time
• rend le temps écoulé depuis la dernière transaction

E M . Mellouli 81
2. Présentation des éléments du VHDL
2.8 Attributs
Utilisation des attributs de signaux :
détection d'un front montant :

détection d'un front descendant :

E M . Mellouli 82
2. Présentation des éléments du VHDL
2.9 Exécution parallèle et séquentielle
. Particularisme du VHDL : Exécution parallèle ou séquentielle

. Exécution parallèle
. Exécution par défaut
. Les instructions au sein d'une architecture sont exécutées en parallèle ou de
manière concurrente
. Exécution concurrente = Exécution combinatoire
. Chaque opération dans une architecture est exécutée à chaque instant

. Exécution séquentielle
. Nécessité d'utiliser un PROCESS
. Le process est exécuté à chaque fois qu'un signal déclaré dans sa liste de
sensibilité change de valeur.
. Les instructions sont exécutées séquentiellement
. Les modifications des signaux (signal) sont effectives à la fin du process

E M . Mellouli 83
2. Présentation des éléments du VHDL
2.9 Exécution parallèle et séquentielle
. Exécution mixte
. Possibilité d'associer dans une même architecture des modules à exécution
parallèle et séquentielle
. Exemple : Comparateur synchrone à une horloge clk

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY comp_synch IS PORT (
a, b, clk, reset : IN std_logic;
qs : OUT std_logic);
END comp_synch;
ARCHITECTURE archi_mixte OF comp_synch IS
SIGNAL q : std_logic;
BEGIN
q<='1‘ WHEN a=b ELSE '0'; a
q
PROCESS(clk, reset) b Comparateur qs
BEGIN clk
IF reset='0' THEN qs<='0';
ELSIF (clk'event AND clk='1') THEN qs <= q;
END IF;
Reset
END PROCESS;
END archi_mixte;

E M . Mellouli 84
2. Présentation des éléments du VHDL
2.10 Instructions
. Deux types d'exécution : Deux familles d'instructions

. Instructions réservées au mode d'exécution parallèle ou concurrente


- Toutes les opérations sont exécutées simultanément
- L'ordre d'écriture n'a aucune importance

I1
I1 I2 I3

I2

. Instructions réservées au mode d'exécution séquentielle I3


- Chaque opération est effectuée l'une après l'autre
- L'ordre d'écriture a une grande importance

E M . Mellouli 85
2.10 Instructions
2.10.1 Instructions de type parallèle

. Assignation inconditionnelle
signal <= expression
. Assignation conditionnelle
signal <= {expression WHEN condition} ELSE expression

ARCHITECTURE flot_de_donnees OF xor IS


BEGIN
c <= '0' WHEN a = '0' AND b = '0' ELSE
'1' WHEN a = '0' AND b = '1' ELSE
'1' WHEN a = '1' AND b = '0' ELSE
'0' WHEN a = '1' AND b = '1' ELSE
'0';
END flot_de_donnees;

E M . Mellouli 86
2.10 Instructions
2.10.1 Instructions de type parallèle

. Assignation inconditionnelle
signal <= expression
. Assignation conditionnelle
signal <= {expression WHEN condition} ELSE expression

Exercice1:
Donner le programme (entité plus l’architecture ) du circuit ci-dessous
en utilisant l’assignation conditionnelle suivante:
signal <= {expression WHEN condition} ELSE expression

E M . Mellouli 87
2.10 Instructions
2.10.1 Instructions de type parallèle

. Assignation inconditionnelle
signal <= expression
. Assignation conditionnelle
signal <= {expression WHEN condition} ELSE expression

Exercice2 :
Donner le programme (entité plus l’architecture ) du circuit ci-dessous
en utilisant l’assignation conditionnelle suivante:
signal <= {expression WHEN condition} ELSE expression

E M . Mellouli 88
2.10 Instructions
2.10.1 Instructions de type parallèle
. Assignation sélective

WITH sélecteur SELECT


signal <= {expression WHEN valeur_sélecteur1,
expression WHEN valeur_sélecteur2,
expression WHEN OTHERS};
ARCHITECTURE flot_de_donnees OF mux IS
SIGNAL selection : std_logic_vector(0 TO 1);
SIGNAL a,b,c,d,s : std_logic_vector(0 TO 7);
BEGIN
WITH selection SELECT
s <= a WHEN "00",
b WHEN "01",
c WHEN "10",
d WHEN OTHERS;
END flot_de_donnees;

E M . Mellouli 89
2.10 Instructions
2.10.1 Instructions de type parallèle
. Assignation d'un composant
label : nom_du_composant PORT MAP (association des ports)
ARCHITECTURE arch_full OF full_adder IS
SIGNAL inter : bit;
COMPONENT half_adder PORT (a,b,cin : IN bit;
cout,s : OUT bit);
END COMPONENT;
BEGIN
u1 : half_adder PORT MAP (a=>a(0),b=>b(0),cin=>cin,cout=>inter,s=>s(0));
u2 : half_adder PORT MAP (a(1),b(1),inter, cout,s(1));
END arch_full;

E M . Mellouli 90
2.10 Instructions
2.10.1 Instructions de type parallèle
Instanciation de multiples composants
Une instruction generate permet de dupliquer un bloc d’instructions concurrentes un
certain nombre de fois, ou de créer un tel bloc si une condition est vérifiée
vérifiée..
. Instruction GENERATE
Structure répétitive
label : FOR variable_boucle IN val_initiale TO val_finale GENERATE
{instructions parallèles}
END GENERATE label
Structure conditionnelle
label : IF condition GENERATE
{instructions parallèles}
END GENERATE label

Notez que :
• le ELSE n'existe pas (oubli de VHDL ?) et qu'il faut refaire un 2ème IF
IF..
• Les deux instructions IF GENERATE et FOR GENERATE ont besoin obligatoirement d'une
étiquette

E M . Mellouli 91
2.10 Instructions
2.10.1 Instructions de type parallèle
Instanciation de multiples composants: Instruction GENERATE
Exemple:

E M . Mellouli 92
2.10 Instructions
2.10.1 Instructions de type parallèle
. Instruction PROCESS

- Un processus est un ensemble de phrases séquentielles


- Un modèle VHDL peut être vu comme un ensemble de processus
exécutés en parallèle
- Toutes les instructions comprises dans le PROCESS sont
exécutées séquentiellement
- Tous les PROCESS sont exécutés en parallèle
- Les signaux sont utilisés pour contrôler l’activation des processus
- Activation d'un PROCESS : 2 possibilités
[label] : PROCESS
[label] : PROCESS(liste_signaux) -- Partie déclarative du process
-- Partie déclarative du process BEGIN
BEGIN -- Corps du process
-- Corps du process -- phrases séquentielles
-- phrases séquentielles WAIT ON (liste_signaux)
END PROCESS [label] END PROCESS [label]

E M . Mellouli 93
2.10 Instructions
2.10.1 Instructions de type parallèle
. Instruction PROCESS

Phrases wait:
wait on A, B; -- changement de A ou B
wait for délai; -- une certaine durée
wait until condition;
wait on ListeDeSignaux until condition
N.B : L'instruction WAIT n'est pas synthétisable avec la condition de durée.
Elle est très utile pour les testbench pour la simulation.

E M . Mellouli 94
2.10 Instructions
2.10.1 Instructions de type parallèle
. Instruction PROCESS

E M . Mellouli 95
2.10 Instructions
2.10.1 Instructions de type parallèle
. Instruction PROCESS

E M . Mellouli 96
2.10 Instructions
2.10.1 Instructions de type parallèle
Exemple avec des variables:
entity toto is
end toto;
architecture var of toto is
signal trigger, sum : integer := 0;
begin
process
variable var1 : integer := 1;
variable var2 : integer := 2;
variable var3 : integer := 3;
begin
wait on trigger;
var1 := var2 + var3;
var2 := var1;
var3 := var2;
sum <= var1 + var2 + var3;
end process;
end var;
Si trigger change à t=10, alors var1=5, var2=5, var3=5 et à t=10+D, sum=15

E M . Mellouli 97
2.10 Instructions
2.10.1 Instructions de type parallèle
Exemple avec des signaux:
entity toto is
end toto;
architecture var of toto is
signal trigger, sum : integer := 0;
signal sig1 : integer := 1;
signal sig2 : integer := 2;
signal sig3 : integer := 3;
begin
process
begin
wait on trigger;
sig1 <= sig2 + sig3;
sig2 <= sig1;
sig3 <= sig2;
sum <= sig1 + sig2 + sig3;
end process;
end var;
Si trigger change à t=10, tous les signaux sont mis à jour à t=10+D :
sig1=5, sig2=1, sig3=2 et sum=6
E M . Mellouli 98
2.10 Instructions
2.10.1 Instructions de type parallèle

E M . Mellouli 99
2.10 Instructions
2.10.1 Instructions de type parallèle
Un port de sortie ne peut être utilisé que comme destination
d’une expression. Exemple:
entity nonet is
port (a, b : in bit;
z, zbarre : out bit);
end nonet;
architecture fausse of nonet is
begin
z <= a and b;
zbarre <= not z;
end fausse;
architecture correcte of nonet is
signal resultat : bit;
begin
resultat <= a and b;
z <= resultat;
zbarre <= not resultat;
end correcte;

E M . Mellouli 100
2.10 Instructions
2.10.2 Instructions de type séquentiel
. Ces instructions sont uniquement utilisées dans un Process
. Assignation inconditionnelle de variables et de signaux
Même traitement que pour le mode parallèle

SIGNAL sig : integer;


PROCESS(clk)
VARIABLE var : integer := 0;
BEGIN
sig <= sig + 1;
var := var + 1;
END PROCESS;

. Instruction IF
IF condition THEN
IF up_down = "1" THEN
instructions_sequentielles s <= s + 1;
ELSIF condition THEN ELSE
instructions_sequentielles s <= s - 1;
END IF;
ELSE instructions_sequentielles
END IF;

E M . Mellouli 101
2.10 Instructions
2.10.2 Instructions de type séquentiel
. Ces instructions sont uniquement utilisées dans un Process
. Assignation inconditionnelle de variables et de signaux
. Instruction IF
IF condition THEN
instructions_sequentielles
ELSIF condition THEN
instructions_sequentielles
ELSE instructions_sequentielles
END IF;
Exercice2 :
Donner le programme (entité plus l’architecture ) du circuit ci-dessous
en utilisant l’assignation inconditionnelle IF (Instruction IF).

E M . Mellouli 102
2.10 Instructions
2.10.2 Instructions de type séquentiel
. Instruction CASE
CASE expresssion is
{WHEN valeur_expression => instructions_sequentielles};
{WHEN OTHERS => instructions_sequentielles};
END CASE;
CASE selection IS
WHEN '0' => s <= a;
WHEN '1' => s <= b;
WHEN OTHERS => NULL;
. Instruction LOOP END CASE;
instruction_pour_iteration LOOP
instructions_sequentielles
END LOOP;
VARIABLE indice,resultat : INTEGER := 0;
VARIABLE indice,resultat : INTEGER;
Boucle1 : WHILE indice < 10 LOOP
Boucle2 : FOR indice IN 0 TO 9 LOOP
indice := indice + 1;
resultat := resultat + adresse(indice);
resultat := resultat + adresse(indice);
END LOOP boucle2;
END LOOP boucle1;

E M . Mellouli 103
2.10 Instructions
2.10.2 Instructions de type séquentiel
. Instruction NEXT
NEXT label_boucle WHEN condition

VARIABLE indice,resultat : integer := 0;


VARIABLE indice,resultat : integer;
Boucle1 : WHILE indice < 10 LOOP
Boucle2 : FOR indice IN 0 TO 9 LOOP
indice := indice + 1;
NEXT boucle2 WHEN indice = 5;
NEXT boucle1 WHEN indice = 5;
resultat := resultat + adresse(indice);
resultat := resultat + adresse(indice);
END LOOP boucle2;
END LOOP boucle1;

. Instruction EXIT
EXIT label_boucle WHEN condition

VARIABLE indice,resultat : integer := 0; VARIABLE indice,resultat : integer;


Boucle1 : WHILE indice < 10 loop Boucle2 : FOR indice IN 0 to 9 LOOP
indice := indice + 1; EXIT boucle2 WHEN indice = 5;
EXIT boucle1 WHEN indice = 5; resultat := resultat + adresse(indice);
resultat := resultat + adresse(indice); END LOOP boucle2;
END LOOP boucle1;

E M . Mellouli 104
2.10 Instructions
2.10.2 Instructions de type séquentiel
. Instruction NULL
Instruction sans aucun effet

CASE commande_moteur IS
WHEN avant => marche_avant;
WHEN arriere => marche_arriere;
WHEN statuquo => NULL;
END CASE;

. Instruction ASSERT
Vérification d'une condition spécifique
Information d'une éventuelle violation de cette condition
ASSERT condition REPORT message SEVERITY {note/warning/error/Failure}
PROCESS(clk)
BEGIN IF clk='1' THEN
ASSERT d'STABLE(15 ns);
REPORT "setup non respecté" SEVERITY warning;

END IF;
END PROCESS;

E M . Mellouli 105
2.10 Instructions
2.10.3 Exemples
. Multiplexeur 8 bits : 4 vers 1
1ère phase : définition des entrée/sorties (ENTITY)

Multiplexeur 8 bits
Entrées Sorties
4 vers 1

8
Entree1
8
Entree2 Multiplexeur 8 bits 8
8 Sortie
Entree3 4 vers 1
8
Entree4

Sel1 Sel2
E M . Mellouli 106
2.10 Instructions
2.10.3 Exemples
. Multiplexeur 8 bits : 4 vers 1
2ème phase : définition du fonctionnement ou de la structure
(ARCHITECTURE)
- Solution 1 : Instruction IF

- Solution 2 : Instruction CASE

- Solution 3: WITH sélecteur SELECT

Entree1 8
Entree2 8 Multiplexeur 8 bits 8 Sortie
Entree3 8 4 vers 1
Entree4 8

Sel1 Sel2

E M . Mellouli 107
2.10 Instructions
2.10.3 Exemples
. Multiplexeur 8 bits : 4 vers 1
- Solution 1 : Instruction IF

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux41 IS
PORT(entree1,entree2,entree3,entree4: IN std_logic_vector(7 DOWNTO 0);
sel: IN std_logic_vector(0 to 1);
sortie : OUT std_logic_vector(7 DOWNTO 0));
END mux41;
ARCHITECTURE comportementale OF mux41 IS
BEGIN
PROCESS(sel)
BEGIN
IF (sel="00") THEN sortie<=entree1;
ELSE IF (sel="01") THEN sortie<=entree2;END IF;
ELSE IF (sel="10") THEN sortie<=entree3;END IF;
ELSE sortie<=entree4;END IF;
END PROCESS;
END comportemental;

E M . Mellouli 108
2.10 Instructions
2.10.3 Exemples
. Multiplexeur 8 bits : 4 vers 1
- Solution 2 : Instruction CASE

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux41 IS
PORT(entree1,entree2,entree3,entree4: IN std_logic_vector(0 TO 7);
sel: IN std_logic_vector(0 to 1);
sortie : OUT std_logic_vector(7 DOWNTO 0));
END mux41;
ARCHITECTURE comportementale OF mux41 IS
BEGIN
PROCESS(sel)
BEGIN
CASE sel IS
WHEN "00" => sortie<=entree1;
WHEN "01" => sortie<=entree2;
WHEN "10" => sortie<=entree3;
WHEN OTHERS => sortie<=entree4;
END CASE;
END PROCESS
END comportementale;

E M . Mellouli 109
2. Présentation des éléments du VHDL
2.11 Description hiérarchique
. Descriptions plus simples
. Rapidité de simulation et donc rapidité de mise au point
. Réutilisation de sous-ensembles
. Concepts : COMPONENT, GENERIC, PACKAGE,
PROCEDURE ET FONCTION
LIBRARY, CONFIGURATION

. Utilisation d'un objet décrit à l'extérieur de la description utilisatrice :


- 2 fichiers VHDL distincts
. Compilation distincte :
- le composant
- l'entité utilisatrice de ce composant
. Entité compilée : Stockage dans la bibliothèque WORK

E M . Mellouli 110
2.11 Description hiérarchique
2.11.1 Description hiérarchique : Component
. Description structurelle
. Utilisation de composants
2 phases : - Déclaration
- Instanciation
Déclaration
La syntaxe est presque identique à celle de l'entité :

component AND_2
port (
a : in bit;
b : in bit;
s : out bit);
end component;

E M . Mellouli 111
2.11 Description hiérarchique
2.11.1 Description hiérarchique : Component
Instanciation :
L'instanciation d'un composant se fait dans le corps de l'architecture de cette
façon :
NOM_INSTANCE : NOM_COMPOSANT port map (LISTE DES CONNEXIONS);

architecture arc of AND_3 is


signal z : bit;
entity AND_3 is
component and2
port(
port (
e1 : in bit;
a : bit;
e2 : in bit;
b : bit;
e3 : in bit;
s : bit);
s : out bit);
end component;
begin
end entity;
inst1 : and2 port map (a=>e1, b=>e2 , s=>z);
inst2 : and2 port map (z, e3, s);
end arc

E M . Mellouli 112
2.11 Description hiérarchique
2.11.1 Description hiérarchique : Component
Dans cet exemple , 2 instances de composant "and2" sont appelées
pour créer une porte ET à 3 entrées.

L'association des ports du composants aux signaux de l'instance se


fait à l'aide de la clause port map.

La syntaxe des associations est soit :

par nom où chaque broche du composant est associée à un signal :


cas de inst_1
positionnelle où l'ordre des signaux correspond à l'ordre des broches :
cas de inst_2

E M . Mellouli 113
2.11 Description hiérarchique
2.11.1 Description hiérarchique : Component
Adder2.vhd
Exemple additionneur
ENTITY full_adder IS
PORT(
ENTITY full_adder IS
a,b : IN bit_vector(1 DOWNTO 0);
PORT(
cin : IN bit;
a,b : IN bit_vector(1 DOWNTO 0);
cout : OUT bit;
cin : IN bit;
Adder1.vhd s : out bit_vector(1 DOWNTO 0));
cout : OUT bit;
END full_adder
s : out bit_vector(1 DOWNTO 0));
ARCHITECTURE arch_full OF full_adder IS
ENTITY add1bit IS END full_adder
SIGNAL inter : bit;
PORT( a,b,cin : IN bit;
COMPONENT add1bit
cout,s : OUT bit); ARCHITECTURE arch_full OF full_adder IS
PORT (a,b,cin : IN bit;
END add1bit; SIGNAL inter : bit;
cout,s : OUT bit);
COMPONENT half_adder PORT (a,b,cin : IN bit;
END COMPONENT;
ARCHITECTURE arch_half OF add1bit IS cout,s : OUT bit);
BEGIN
BEGIN END COMPONENT;
u1: add1bit PORT MAP
s <= a XOR b XOR cin; BEGIN
(a(0),b(0),cin,inter,s(0));
cout <= (a AND b) OR (a AND cin) u1:half_adder PORT MAP
u2: add1bit PORT MAP
OR (b AND cin); (a(0),b(0),cin,inter,s(0));
(a(1),b(1),inter, cout,s(1));
END arch_half; u2:half_adder PORT MAP (a(1),b(1),inter,s(1));
END arch_full;
END arch_full;
E M . Mellouli 114
2.11 Description hiérarchique
2.11.1 Description hiérarchique : Component
En résumé :
Trois opérations sont nécessaires :
- Le couple entité-architecture du sous-ensemble doit être créé et annexé à
une librairie de l’utilisateur, par défaut la librairie « work ».
- Le sous-ensemble précédent doit être déclaré comme composant dans
l’ensemble qui l’utilise, cette déclaration reprend les éléments principaux
de l’entité du sous-ensemble.
- Chaque exemplaire du composant que l’on souhaite inclure dans le
schéma en cours d’élaboration doit être connecté aux équipotentielles de
ce schéma, c’est le mécanisme de l’instanciation.

- Au moment de la déclaration : (exemple de add)

component nom_composant -- même nom que l’entité


port ( liste_ports ) ; -- même liste que dans l’entité
end component ;

E M . Mellouli 115
2.11 Description hiérarchique
2.11.2 Description hiérarchique : Généricité
. Possibilité d'utiliser un même objet plusieurs fois avec des tailles différentes
. La clause generic map dans l'instanciation du composant ADD permet de fixer
la valeur du paramètre.
. Possibilité d'instancier des entités/architectures fonctionnellement
identiques mais de taille différente
ENTITY adder is
.Déclaration d'un GENERIC (largeur : integer :=8); -- valeur par défaut
additionneur PORT( a,b: IN signed_vector(largeur-1 DOWNTO 0);
s : OUT signed_vector(largeur DOWNTO 0);
END adder;

ARCHITECTURE arch_adder OF adder IS


BEGIN
s <= a + b;
END arch_adder;
.Instanciation avec
une largeur de 16 bits U0 : adder GENERIC MAP (16)
PORT MAP (a,b,s);
E M . Mellouli 116
2.11 Description hiérarchique
2.11.2 Description hiérarchique : Généricité
La généricité est un moyen de transmettre une information à un bloc ou
à un couple entité-architecture.

Cette information est statique pour le bloc.

Vue de extérieur, c´est un paramètre.

En fait, il s´agit d´une constante qui sera fixée au moment de l´


instanciation du bloc ou du composant.
Les associations de paramètres (generic map) et de ports (port map)
définissent des associations locales entre les noms utilisés dans la
déclaration de composant (paramètres et ports formels) et les
paramètres et ports effectifs de l'instance.

E M . Mellouli 117
2.11 Description hiérarchique
2.11.2 Description hiérarchique : Généricité

E M . Mellouli 118
2.11 Description hiérarchique
2.11.2 Description hiérarchique : Généricité
Autre exemple : additionneur structurelle générique :

construit à partir d’un additionneur 1 bit


assemblage des N additionneurs 1 bit afin de réaliser l’additionneur complet
la valeur de N est inconnue avant l’instanciation du composant

E M . Mellouli 119
2.11 Description hiérarchique
2.11.2 Description hiérarchique : Généricité
On dispose de l’entité Add et son architecture :
entity Add is architecture structurelle of AdditionneurN is
port ( component Add
A, B, Cin : in std_logic; port (
S, Cout : out std_logic); A, B, Cin : in std_logic;
end Add ; S, Cout : out std_logic);
L’entité Additionneur end component;
signal C : std_logic_vector(0 to N);
générique s’écrit :
begin
entity AdditionneurN is label: for I in 0 to N-1 generate
generic (N : Natural := 8); Instance : Add port map (X(I), Y(I), C(I),
port ( S(I), C(i+1));
X, Y : in std_logic_vector ( N-1 downto 0); end generate label;
Cin : in std_logic; C(0) <= Cin;
S : out std_logic_vector (N-1 downto 0); Cout <= C(N);
Cout : out std_logic); end structurelle ;
end AdditionneurN ;

E M . Mellouli 120
2.11 Description hiérarchique
2.11.2 Description hiérarchique : Généricité
Exercice:: Donner le programme (Entité et Architecture) du circuit ci-
Exercice ci-
dessous en utilisant l’assignation d’un composant port map.
map.

E M . Mellouli 121
2.11 Description hiérarchique
2.11.3 Description hiérarchique : Package
. Regroupement d'objets divers :
- types
- sous-types
- constantes
- sous-programmes
- composants, …

. Accessibilité ou visibilité : le package se nomme mon_package et a été


compilé et stocké dans la bibliothèque librairie1 (différent de work)

LIBRARY librairie1
USE librairie1.mon_package.all

. Possibilité d'utiliser plusieurs packages dans une même description


. Les standards IEEE 1164 et IEEE 1076.3 sont accessibles via des
packages
E M . Mellouli 122
2.11 Description hiérarchique
2.11.3 Description hiérarchique : Package
File Package Library Contents:

maxplus2.vhd maxplus2 altera MAX+PLUS II primitives, macrofunctions, and selected


megafunctions supported by VHDL.

megacore.vhd megacore altera Pre-tested megafunctions consisting of several different


design files.

std1164.vhd std_logic_1164 ieee Standard for describing interconnection data types for
std1164b.vhd VHDL modeling, and the STD_LOGIC and STD_LOGIC
_VECTOR types.

lpm_pack.vhd lpm_components lpm LPM megafunctions supported by VHDL.

arith.vhd std_logic_arith ieee SIGNED and UNSIGNED types, arithmetic and


arithb.vhd comparison functions for use with SIGNED and
UNSIGNED types, and the conversion functions
CONV_INTEGER, CONV_SIGNED, and
CONV_UNSIGNED.

signed.vhd std_logic_signed ieee Functions that allow MAX+PLUS II to use STD_LOGIC


signedb.vhd _VECTOR types as if they are SIGNED types
types as if they are SIGNED types.

unsigned.vhd std_logic_unsigned ieee Functions that allow MAX+PLUS II to use


unsignedb.vhd STD_LOGIC_VECTOR types as if they are
UNSIGNED types.
E M . Mellouli 123
2.11 Description hiérarchique
2.11.3 Description hiérarchique : Package
. 2 parties :
. Partie déclarative (spécification)
- Déclarations des éléments visibles à l'utilisateur du package
. Corps du package (implantation)
- Chaque élément défini dans la partie déclarative est visible du corps
PACKAGE data_types IS
SUBTYPES address is bit_vector(24 DOWNTO 0);
SUBTYPES data is bit_vector(15 DOWNTO 0);
CONSTANT vector_table_loc : address;
FUNCTION data_to_int(value : data) RETURN integer;
FUNCTION int_to_data(velue:integer) RETURN data;
END data_types;

PACKAGE BODY data_types is


CONSTANT vector_table_loc : address := X"FFFF00";
FUNCTION data_to_int(value : data) RETURN integer IS
--body of data_to_int
END data_to_int;
FUNCTION int_to_data(velue:integer) RETURN data IS
--body of int_to_data
END int_to_data;
end data_types;
E M . Mellouli 124
2.11 Description hiérarchique
2.11.4 Description hiérarchique : Procédures
Déclaration de procédures
PROCEDURE nom (liste de paramètres) IS
déclaration
BEGIN instructions END nom;

Exemple:
type byte is array (7 downto 0) of std_logic;
•••
procedure ByteToInteger (ib: in byte; oi: out
integer) is
variable result : integer := 0;
begin
for i in 0 to 7 loop
if ib(i) = '1' then
result := result + 2**i;
end if;
end loop;
oi := result;
end ByteToInteger;

E M . Mellouli 125
2.11 Description hiérarchique
2.11.4 Description hiérarchique : Fonctions
Tous les paramètres d’une fonction sont de mode in: en dehors de ses
variables locales, une fonction ne peut modifier que la valeur retournée.
En plus, les paramètres ne peuvent pas être de type variable: ils ne
peuvent être que des constantes ou des signaux

. Déclaration des fonctions

FUNCTION nom (liste de paramètres) RETURN type IS déclarations


BEGIN instructions end nom;
Résultat d'une fonction : return expression;

Exemple
function f (a, b, c : std_logic) return std_logic is
variable x : std_logic;
begin
x := ((not a) and (not b) and c);
return x;
end f;
N.B : Par rapport à la fonction, La procédure permet d'avoir plusieurs sorties,
mais à condition de déclarer les entrées et les sorties comme dans une entité
ou composant.
E M . Mellouli 126
Fonction de calcul de minimum
et maximum en procédure.
procedure MinMax( a,b : in unigned (7 downto 0);
min : out unsigned(7 downto 0);
max : out unsigned(7 downto 0)) is Il faut 2
begin fonctions min et max pour avoir
if (a < b) then l'équivalent en fonction. Voici
min <= a; max <= b; l'exemple de min :
else
min <= b; max <= a; function min (a,b : unsigned(7 downto 0)
end if; return unsigned(7 downto 0) is
end procedure MinMax; varaiable min : unsigned(7 downto0);
begin
MinMax(x, y, z, t); if (a < b) then
min := a;
else
min := b;
end if;
return min;
endfunction

...
z := min(x, y);

E M . Mellouli 127
2.11 Description hiérarchique
2.11.5 Description hiérarchique : Library
Une librairie est une collection de modules VHDL qui ont déjà été compilés. Ces
modules peuvent être des paquetages, des entités ou des architectures.

. Les programmes objets sont placés dans des bibliothèques

. Eléments d'une bibliothèque :


. Définitions de types, constantes, procédures PACKAGE
. Architecture de circuits ARCHITECTURE
. Associations composants/architectures CONFIGURATION

. 2 types de bibliothèque
. Bibliothèque de l'utilisateur (user library)
. Bibliothèque système

E M . Mellouli 128
2.11 Description hiérarchique
2.11.5 Description hiérarchique : Library
Les librairies
Facilite la tâche du concepteur
Rajout de fonctionnalités supplémentaires
La librairie IEEE
A mettre au début de votre description
Pour rajouter les types étendues std_logic et std_logic_vector
use IEEE.STD_LOGIC_1164.all;
DORENAVANT nous remplacerons SYSTEMATIQUEMENT
BIT par STD_LOGIC
BIT_VECTOR par STD_LOGIC_VECTOR
Pour utiliser des fonctions arithmétiques sur ces STD_LOGIC_VECTOR
USE IEEE.NUMERIC_STD.ALL;
Et aussi USE IEEE.std_logic_arith.all;
• Q<=Q+1; -- Q étant par exemple un std_logic_vector et 1 est un entier!!
• A<B -- A et B des std_logic_vector

E M . Mellouli 129
Complément sur les opérations arithmétiques
Le rajout de use IEEE.numeric_std.all;
IEEE.numeric_std.all permet de:
De travailler avec des valeurs signées et non signées
• signal A,B: signed(3 downto 0);

• signal tempo: unsigned(3 downto 0);

De convertir un std_logic_vector en signed ou unsigned


• A<= signed(SW(3 downto 0));

• B<=unsigned(RES);

De convertir des signed ou unsigned en std_logic_vector


• LEDG(3 downto 0)<=std_logic_vector(tempo);

De travailler avec les opérateurs arithmétiques standard


• >, >=, =<,<, + ,- etc….

Le rajout de use IEEE.std_logic_unsigned.all; permet


De travailler avec les opérateurs arithmétiques standard
de mélanger des entiers avec des std_logic_vector: A<= A +1;

E M . Mellouli 130
2.11 Description hiérarchique
2.11.5 Description hiérarchique : Library
. Bibliothèque WORK
- En réalité : Un espace de travail
- Tous les éléments créés par l'utilisateur au sein d'un même projet
y sont rangés
- Ces éléments sont réutilisables à tout instant dans le projet après
les avoir déclarés
. Exemple d'utilisation d'un package issu de la bibliothèque WORK
- L'utilisateur a créé un package operateur_arithmetique dans WORK
- Pour y avoir accès

USE WORK.operateur_arithmetique.ALL

- Pour utiliser l'élément mult de ce package

FOR ALL : multiplieur USE ENTITY WORK.mult(comportementale)

E M . Mellouli 131
2.11 Description hiérarchique
Exercice:

1) Ecrire la table de vérité pour un afficheur 7 segments cathode commune ('1' pour
allumer)
2) Réaliser le programme VHDL complet du transcodeur

E M . Mellouli 132
2.11 Description hiérarchique
Solution:
1) la table de vérité pour un afficheur 7 segments cathode commune

E M . Mellouli 133
2.11 Description hiérarchique
Solution:
1) la table de vérité pour un afficheur 7 segments cathode commune
2) Voici le programme VHDL du transcodeur

E M . Mellouli 134

Vous aimerez peut-être aussi