27/03/2020
C h a p i t r e 2:
Structures de données
Le VHDL
1 ère a n n é e G E e t R T
Prof Zenkouar
1. Les types
Il y a 4 familles de types :
- Scalaires,
- Composites,
- Accès,
- et Fichiers.
Les deux premiers types étant les plus utilisés.
- Chacun de ces 4 types se décompose en types prédéfinis et en types
utilisateurs.
- Nous avons défini le type bit, le type tableau de bits (bit_vector), le
type integer et le type real.
- On peut utiliser ces types sans les définir par contre les types
utilisateurs doivent être définis avant leur utilisation.
2
1
27/03/2020
Remarque
La déclaration des types prédéfinis a été faite dans un module
appelé paquetage standard.
1.1 Types scalaires énumérés
Un type scalaire est dit énuméré si toutes les valeurs qu’il peut
prendre sont énumérées dans sa déclaration.
1.2 Types scalaires non énumérés
C’est le cas du type entier, réel et physique.
Remarque: Les bornes dépendent de la longueur du mot et du
codage utilisé.
2
27/03/2020
type bit is (‘0’,’1’);
type boolean is (false, true);
type character is (‘A’, ‘B’, ‘C’………’a’,’b’,’c’ …….’0’,‘1’,‘2’….’$’..);
type severity_level is (note, warning, error, failure);
type integer is range -2 147 483 648 to 2 147 483 647;
type real is -16#0.7FFFFF8#E+32 to 16#0.7FFFFF8#E+32;
La déclaration range
- vérifie lors de l’analyse et de la simulation que la valeur de l’objet
n’est pas en dehors de son intervalle de variation.
- code cet objet en binaire lors de la synthèse avec le nombre
adéquat de bits.
- on peut créer un nouveau type à partir de la déclaration range.
Exemple
type index is integer range 0 to 100 ;
type cosinus is float range –1.0 to +1.0 ;
3
27/03/2020
Le type physique correspond à des grandeurs électroniques.
(le type prédéfini est le type time)
Le type physique est défini par :
- par son intervalle de variation
- son unité de base
- par des unités multiples éventuelles
Type time is range -9 223 372 036 854 775 808 TO + 9 223 372
036 854 775 807
Units fs; ps=1000fs; ns=1000 ps; us=1000ns; ms=1000us;
sec=1000ms; min=60sec;
Hr=60min;
End units;
2.3 Type composite record (ARTICLE)
Un article est une collection d’éléments de même type ou de types
différents.
Chaque élément est un champ.
Ce type est défini en énumérant les champs.
type ARTICLE1 is record type ARTICLE2 is record
X,Y,Z: bit; ADRESSE: integer range 0 to 3;
end record; DONNEE: bit_vector(0 to 3);
--déclaration d’une variable end record;
--VAR1 de type ARTICLE1
--déclaration d’un signal SIG1 de
Variable VAR1: ARTICLE1; --type ARTICLE2
Signal SIG1 : ARTICLE2 ;
4
27/03/2020
Exemples
VAR1 := (′0′, ′1′, ′1′);
SIG1 <= (3, ″1011″);
VAR1.X :=′1′;
[Link] <= 2;
2.4 Type composite array à une seule rangée
Ce type est tellement commun qu’il a été défini dans le paquetage
standard du VHDL par bit_vector.
Exemple: type MOT is array (15 downto 0) of bit ;
2.5 Type composite array à plusieurs rangées
Trois cas sont possibles :
-1ère possibilité: empiler plusieurs ‘’array of array’’
-2ème possibilité: constituer un tableau d’objets de type scalaire
pour obtenir par exemple un tableau à deux dimensions ou deux
indices
- 3ème possibilité: constituer un empilement d’objets de type record
pour obtenir un array of record
10
5
27/03/2020
Exemples:
type ANNEE is array (0 to 3) of integer ;
type DATE is array (2 downto 0) of ANNEE ;
constant CSTE_DATE : DATE :=( (1,5,1,5) , (1,7,8,9) , (1,9,9,6) ) ;
type TABLE1 is array (0 to 7, 1 downto 0) of bit ;
constant CODE1 : TABLE1 := ( (′0′,′0′) , (′1′,′1′) , (′0′,′1′) , (′1′,′1′) ,
(′0′,′1′) , (′0′,′0′) , (′1′,′1′) , (′1′,′0′) ) ;
type TABLE2 is array (0 to 7) of bit_vector (1 downto 0) ;
constant CODE 2 : TABLE2 :=
(″00″, ″11″ , ″01″, ″11″ , ″01″ , ″00″ , ″11″ , ″10″ ) ;
11
M A R 19 30 0
J E U 20 10 1
S A M 21 00 2
JOUR HEURE MINUTE indice
type DATE is record
JOUR : string (0 to 2) ;
HEURE : integer range 0 to 23 ;
MINUTE : integer range 0 to 59 ;
end record
Déclaration de type array:
type TABLE3 is array (0 to 2) of DATE;
Déclaration d’une constante :
constant CSTE_DEBUT : TABLE3 :=( (MAR,19,30) , (JEU,20,10), (SAM,21,00) ) ;
12
6
27/03/2020
Exemples de déclaration de types
type TABLE2 is array (0 to 7) of bit_vector(0 to 2) ;
type LIGNE is array (0 to 2) of bit ;
type TABLE3 is array (0 to 7) of LIGNE ;
type TABLE4 is array (0 to 7, 0 to 2) of bit ;
2.6 Notation par agrégat
Un agrégat est un moyen d’indiquer la valeur de chaque type
composite.
Nous disposons de 3 possibilités :
13
1-Association élément-valeur par position
lister les valeurs dans l’ordre choisi dans la déclaration de type
Exemples
Variable ANNEE_EN_COURS:ANNEE;
ANNÉE_EN_COURS := (1,9,9,5) ; -- indice 0,1,2,3
SIG1 <= (3 ,’’1011’’) ;-- ADRESSE, DONNÉE
2-Association élément-valeur par nom
indiquer par le symbole => la correspondance
indice => valeur pour un array,
champ => valeur pour un record.
Exemples
ANNÉE_EN_COURS := ( 0 =>1, 1=>9, 2 =>9, 3 =>5 ) ;
SIG1 <= (ADRESSE=>3, DONNEE=>’’1011’’) ;
14
7
27/03/2020
3- Association mixte
les valeurs des premiers éléments sont données par position, les
autres sont donnés par nom.
On utilise l’expression others qui donne la valeur indiquée à tous les
éléments non encore affichés.
Exemples
- ANNÉE_EN_COURS := (1, 9, 2 => 9, 3 => 5) ;
- SIG1 <= (3, DONNEE => ’’1011’’) ;
Si la valeur de l’année est 2000, on pourra écrire :
- ANNÉE_EN_COURS := (2, others => 0) ;
Remarque1
Le mot clé others peut englober tous les éléments et peut servir à
initialiser tous les éléments à une même valeur.
15
2.7 Les sous types (SUBTYPE)
Un sous type d’un type donné appelé type de base appartient à ce
type avec en plus un intervalle de variation défini par le mot réservé
range.
Le paquetage standard donne 2 sous types (subtype): natural et
positive
Exemple
Subtype natural is integer range 0 to integer’HIGH ;
Ce sous type englobe l’ensemble des entiers nuls et positifs.
Subtype positive is integer range 1 to integer’HIGH ;
Ce sous type englobe l’ensemble des entiers strictement positifs.
16
8
27/03/2020
Remarques
Un sous-type est toujours compatible avec le type de base.
Comme pour une constante, un type ou sous-type est déclaré:
- soit devant le begin d’une architecture
- soit devant le begin d’un process
2.8 Les attributs
Un attribut est une caractéristique associée à un type ou à un signal.
Il est placé juste après ce type ou ce signal et séparé de lui par une
apostrophe.
Comme pour les types , il existe des attributs prédéfinis et des
attributs définis par l’utilisateur (user_defined).
Les principaux attributs prédéfinis les plus utilisés concerne les
tableaux (array).
17
Principaux attributs d’un type ou sous-type
scalaire énuméré ou physique
Nous prendrons comme exemple le type énuméré utilisateur
COULEUR défini comme suit :
type COULEUR is (ROUGE ,ORANGE,VERT) ;
position des éléments: 0 1 2
Attribut POS(X) : il exprime, par nombre entier, la position de
l’élément de valeur X. La position de l’élément de gauche est 0.
COULEUR’POS(VERT) est un entier valant 2.
Attribut VAL(X) : il exprime la valeur de l’élément de position égale
à X ; X étant un nombre entier .
COULEUR’VAL(2) est la valeur VERT de l’élément de position 2 .
Attribut PRED(X) : il exprime la valeur de l’élément précédent
celui de valeur X dans la déclaration du type.
18
9
27/03/2020
COULEUR’PRED(ORANGE) est la valeur ROUGE qui précède la
valeur ORANGE dans la déclaration du type COULEUR.
Attribut SUCC(X): il exprime la valeur de l’élément qui suit
celui de valeur X dans la déclaration de type
COULEUR’SUCC(ROUGE) est la valeur ORANG
Principaux attributs de tout typeou sous type scalaire
Exemples: type COULEUR et type INDEX
type INDEX is range 15 downto 0;
Attribut LEFT : il exprime la valeur en limite gauche dans la déclaration
du type. C’est la valeur d’initialisation par défaut de tous les objets de
type scalaire.
COULEUR’LEFT est rouge, valeur la plus à gauche dans la déclaration
de type couleur.
INDEX’LEFT est 15, valeur de gauche de l’intervalle « 15 downto 0 »
19
Attribut RIGHT : il exprime la valeur la plus à droite dans la
déclaration du type.
COULEUR’RIGHT est VERT et INDEX’RIGHT est 0.
Attribut HIGH : il exprime la valeur la plus grande dans la déclaration
du type.
INDEX’HIGH est 15.
Attribut LOW : il exprime la valeur la plus petite dans la déclaration
du type.
INDEX’LOW est 0.
20
10
27/03/2020
Principaux attributs du type tableau
Nous avons les mêmes fonctionnalités que pour les autres types avec
quelques ajouts.
Exemples
TABLE’LEFT(1) donne 0 car il prend la valeur la plus à gauche de
l’indice 1 (premier indice)
TABLE’RIGHT(1) donne 7 ; valeur la plus à droite du premier indice
TABLE’HIGH(1) est 7 prend la valeur supérieure de l’intervalle 0 to 7
TABLE’LOW(1) est 0 prend la valeur inférieure de l’intervalle de
variation (0 to 7)
TABLE’LEFT(2) = 1 prend la valeur la plus à gauche du deuxième
indice (1 downto 0)
21
Attribut LENGTH fournit le nombre d’éléments d’un indice :
TABLE’LENGTH(1) = 8 (valeur 0 à 7 de l’indice1)
TABLE’LENGTH(2) = 2 (valeurs 0 et 1 de l’indice 2) ;
Attribut RANGE ; il fournit l’intervalle de variation de sa borne gauche
à sa borne droite.
TABLE1’RANGE = TABLE1’RANGE(1)= 0 to 7,
TABLE1’RANGE(2) = 1 downto 0 ;
Ce dernier attribut est utile pour balayer les valeurs d’un tableau dans
une instruction de boucle .
Attribut REVERSE_RANGE : fournit l’intervalle de variation de sa borne
droite à sa borne gauche.
TABLE’REVERSE_RANGE(2)= 0 to 1
22
11
27/03/2020
2.9 Les expressions qualifiées
type COULEUR is (BLEU,BLANC,ROUGE)
type NOM is (DUPONT,DURAND,BLANC) ;
La valeur BLANC peut être ambiguë. On peut la remplacer par les
expressions qualifiées suivantes :
COULEUR’(BLANC)
NOM’(BLANC) ;
2.10 Déclarations d’alias
Un alias permet de donner un autre nom à un objet pour une
commodité d’utilisation.
L’ancien nom reste valable.
Alias NOUVEAU_NOM : type is ANCIEN_NOM ;
23
Remarque
Cette déclaration permet de manipuler un ou plusieurs bits d’un objet
de type bit_vector.
Exemple
Variable OCTET : bit_vector(7 downto 0) ;
Si OCTET(7) est le signe de cet octet , il peut être pratique de
l’appeler signe par la déclaration suivante :
Alias SIGNE : bit is OCTET(7) ;
Les bornes d’une partie d’un vecteur de bits peuvent aussi être
déplacés par une déclaration d’alias :
Alias INDICE bit_vector(0 to 3) is octet(7 downto 4) ;
24
12
27/03/2020
La notation de la valeur d’un objet
L’affectation d’une valeur à un objet se fait selon la syntaxe
suivante.
2.11 Les vecteurs de bits
Plusieurs bases sont possibles pour l’expression de la valeur d’un
objet de type bit_vector. On fait précéder l’écriture par la base : B
pour binaire, O pour octale, X pour hexadécimale. Par défaut, c’est
la base binaire qui est utilisée.
Exemple
Variable V : type bit_vector(0 to 7) ;
V := X’’B4’’ ; -- base hexa. écrite en majuscules
V := x’’b4’’ ; -- base hexa. écrite en minuscules
V := O ‘’264’’ ; -- base octale
V := B’’10110100’’ ; -- base binaire
V := ’’10110100’’ ; --base binaire prise par défaut
V := B’’1011_0100’’
Underscore est valable à condition de spécifier la base. 25
2.12 Nombres entiers ou réels
Ils sont exprimés en base décimale prise par défaut si aucune base n’est
spécifiée ou dans une base quelconque entre 2 et 16 à condition
d’exprimer cette base en décimal et la valeur entre dièses.
Exemples
Notation par défaut pour des entiers :
29, -5, 1996, 1_995, 10000 ou 10_000 ou 1E4 ou 1E+4
Notation par défaut pour des réels (décimale)
29.0, -5.2, 1_995.0, 9.5E-4 (9,510-4), 10000.0 ou 10_000.0 ou 1.0E4
ou 1.0E+4
Notation basée pour l’entier 12 :
10#12#, 2#1100#,8#14#, 16#C#
Notation basée pour le réel 12.5 :
8#14.4#,16#C.8#,2#1100.1#,2#1.1001#E4 (l’exposant E4
4
correspond à 2 )
0.5 = 4*1/8(base 8) = 4*1/16 (base 16) = 1*1/2 (base 2) ; 26
13
27/03/2020
2.13 Les caractères et chaines de caractères
Les caractères autorisés dans un programme VHDL sont au nombre
de 95 : à savoir les caractères ASCII à l’exception des caractères
de contrôle.
Exemple
‘A’, ’B’, ‘’ Circuits Intégrés’’, ‘’CIRCUITS INTEGRES’’
Pour noter sur deux lignes il faut rajouter le caractère &
Exemple ‘’ce message est mis’’ & ‘’sur deux lignes’’
2.14 Opérations de base sur les objets
- Le langage VHDL comporte 6 classes d’opérations avec un niveau
de priorité défini pour chaque classe.
- Lors de l’évaluation d’une expression, l’opération dont la classe a
la plus haute importance est effectuée en premier.
- L’usage des parenthèses est conseillé pour la lisibilité du
programme.
27
2.13 Les caractères et chaines de caractères
Les caractères autorisés dans un programme VHDL sont au nombre
de 95 : à savoir les caractères ASCII à l’exception des caractères
de contrôle.
Exemple
‘A’, ’B’, ‘’ Circuits Intégrés’’, ‘’CIRCUITS INTEGRES’’
Pour noter sur deux lignes il faut rajouter le caractère &
Exemple ‘’ce message est mis’’ & ‘’sur deux lignes’’
2.14 Opérations de base sur les objets
- Le langage VHDL comporte 6 classes d’opérations avec un niveau
de priorité défini pour chaque classe.
- Lors de l’évaluation d’une expression, l’opération dont la classe a
la plus haute importance est effectuée en premier.
- L’usage des parenthèses est conseillé pour la lisibilité du
programme.
28
14
27/03/2020
2.15 Les opérations logiques
Ce sont les opérations logiques : and, or, nand, nor, xor (et, ou,
non_et, non_ou, ou-exclusif)
Ils ont la même priorité et portent sur des opérandes de type booléen
ou bit_vector.
Remarque
Les deux types portent sur des opérandes de même type et de même
longueur.
Exemple
Signal A_BUS, B_BUS, C_BUS : bit_vector(0 to 3) ;
C_BUS <= A_BUS or B_BUS ;
Cette opération traduit quatre opérations bit à bit :
C_BUS(0) <= A_BUS(0) or B_BUS(0) ;
C_BUS(1) <= A_BUS(1) or B_BUS(1) ;
C_BUS(2) <= A_BUS(2) or B_BUS(2) ;
C_BUS(3) <= A_BUS(3) or B_BUS(3) ;
29
Signal A_BUS : bit_vector(0 to 3) ;
Signal B_BUS : bit_vector(3 downto 0) ;
B_BUS <= A_BUS ;
Cette instruction d’affectation donne :
C_BUS(3) <= A_BUS(0) ;
C_BUS(2) <= A_BUS(1) ;
C_BUS(1) <= A_BUS(2) ;
C_BUS(0) <= A_BUS(0) ;
En conclusion :
-Les opérandes doivent être de même type et doivent avoir la
même longueur c.à.d le même nombre d’éléments.
- Les opérandes se font sur les éléments de même position quelque
soit leurs indices
30
15
27/03/2020
2.16 Les opérations relationnelles
Ce sont les opérateurs :
=, /=, <, <=, >, >=
Le résultat de la comparaison est de type booléen.
Les opérations sont valables pour les types scalaires, composites et
access.
Exemple
A
COMPAR
C
B
31
Entity COMPAR is Spécification d’entité
Port(A : in bit_vector(0 to 2) ; COMPAR
B : in bit_vector(0 to 2) ; Architecture FLOT de type flot
C : out boolean ) ; de données COMPAR
End COMPAR ;
Architecture FLOT of COMPAR is
Begin
C <= (A=B); --comparaison de A et B
End FLOT ;
1 0 1
A(0) A(1) A(2)
1 1 0
B(0) B(1) B(2)
La première comparaison se fait entre A(0) et B(0), ensuite on passera à
A(1) et B(1), etc.
32
16
27/03/2020
2.17 Les opérations d’addition
Elles sont au nombre de trois : l’addition, la soustraction et la
concaténation : +, - et &
La concaténation est définie pour les chaînes de bits et de
caractères. C’est une simple juxtaposition des valeurs.
Exemple
Signal A, B : bit_vector(0 to 3) ;
Signal C : bit_vector(0 to 7) ;
A <= ‘’1011’’ ;
B <= ‘’0111’’ ;
L’instruction d’affectation C <= A&B ; donnera pour résultat
C=’’10110111’’
33
Les opérations d’addition et de soustraction comme les autres
opérations arithmétiques notamment la multiplication et la division
ne sont pas définies pour les types bit et bit_vector.
Elles sont par contre, définies pour le type integer, le type real
et le type physique uniquement pour 2 opérandes.
Exemple
Signal A, B : in integer ;
C : out integer ;
A <= 6 ;
B <= 2 ;
L’instruction d’affectation C <= A+B ; donnera pour résultat C
la valeur 8;
34
17
27/03/2020
Remarque
Dans certains cas, il est intéressant de pouvoir faire une addition ou
une soustraction sur un objet de type bit_vector.
Ainsi, ajouter +1 au contenu d’un compteur de n bits est utile. C’est
pourquoi certains compilateurs proposent quelques opérations
supplémentaires ne faisant pas partie du jeu normal d’opérations.
Cette possibilité est appelée la surcharge d’opérateur et elle est
définie dans un paquetage.
2.18 Les opérations de signe
Ce sont les signes + et -. Ces opérations sont définies, c.à.d valides
pour des objets de type entier ou flottant.
L’opérateur signe est moins prioritaire que l’opérateur multiplication.
35
2.19 Les opérations de multiplication
Ce sont les opérations suivantes :
- La multiplication de symbole *,
- la division de symbole /,
- le modulo de symbole mod
- et le calcule du reste (remainder) de symbole rem.
Elles sont définies sur le type entier et flottant.
Soient A et B de valeurs respectives 25 et 7.
A mod B est égal à 25 - 3*7 = 4 ;
A/B est égal à 3 (la partie fractionnaire est tronquée).
A rem B est le reste de la division A/B ; c’est 4 car
25 = 3*7 + 4
A mod B a le signe de A, par contre l’opération
A rem B a le signe de B.
36
18
27/03/2020
2.20 Les opérations NOT, ABS ET **
Ce sont les trois opérations de plus haute priorité.
L’opération NOT prend la complément de la valeur d’un objet de
type: bit, boolean, bit_vector
Exemples
C <= not A ; -- complément de A
C <= not (A or B) ; -- complément de (A+B)
L’opération ABS rend la valeur absolue. Elle est définie sur les entiers
et sur les flottants.
L’opération ** est l’exponentiation, c.à.d l’élévation de l’opérande de
gauche à la puissance définie par l’opérande de droite.
Ce dernier doit être un nombre entier tandis que l’opérande de
gauche doit être de type entier ou flottant.
37
19