0% ont trouvé ce document utile (0 vote)
106 vues19 pages

Types de données en VHDL : Guide complet

Transféré par

Youssef El Ajraoui
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
106 vues19 pages

Types de données en VHDL : Guide complet

Transféré par

Youssef El Ajraoui
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi