Cette page présente les principaux types prédéfinis du langage VHDL et des paquetages standard. Pour créer vos propres types de données, référez-vous à la section Déclaration de type ou de sous-type.
VHDL définit les trois types entiers suivants :
Nom | Signification | Min | Max |
---|---|---|---|
integer |
Entier relatif | -2 147 483 648 () | 2 147 483 647 () |
natural |
Entier naturel | 0 | 2 147 483 647 |
positive |
Entier strictement positif | 1 | 2 147 483 647 |
Si un signal est déclaré avec l’un de ces types, sans préciser de valeur initiale, sa valeur à sera celle indiquée dans la colonne Min.
Les intervalles de définition des types natural
et positive
sont inclus
dans celui du type integer
.
Le mot-clé range
permet de restreindre un type entier à un intervalle :
type entier range intervalle
Par exemple, un signal dont la valeur est un entier compris entre -16 et 15 sera déclaré ainsi :
signal s : integer range -16 to 15;
Dans cet exemple, à , le signal s
vaudra -16.
La déclaration suivante est invalide car -16 n’est pas dans l’intervalle
du type natural
:
signal u : natural range -16 to 15;
Le type boolean
définit les valeurs true
(vrai) et false
(faux).
Les opérateurs de comparaison (=
, /=
, >
, <
, <=
, >=
) retournent
un résultat de type boolean
.
Les instructions conditionnelles (if
, when...else
) acceptent comme
conditions des expressions dont le résultat est de type boolean
.
Les types boolean
, bit
et std_logic
ne sont pas interchangeables.
Par exemple, une expression qui retourne un bit ne peut pas être utilisée comme
condition dans une instruction conditionnelle.
Le type bit
définit les valeurs binaires '0'
et '1'
.
Le type bit_vector
est un type tableau dont les éléments sont de type bit
.
Pour créer un vecteur, vous devez indiquer un intervalle
croissant ou décroissant d’indices de la manière suivante :
bit_vector(expression statique to expression statique)
bit_vector(expression statique downto expression statique)
Par exemple, les signaux u
et v
ci-dessous peuvent transporter des vecteurs
de huit bits :
signal u : bit_vector(0 to 7);
signal v : bit_vector(7 downto 0);
Les types binaires et entiers ne sont pas interchangeables.
Il ne faut pas confondre les valeurs binaires '0'
et '1'
et les valeurs entières 0 et 1.
Par défaut, les opérations définies sur ces types ne sont pas les mêmes :
not
, and
, or
, etc) sont définis sur les types logiques.+
, -
, *
, etc) sont définis sur les types entiers.Les types std_logic
et std_logic_vector
sont déclarés dans le paquetage
std_logic_1164
de la bibliothèque ieee
.
Pour les utiliser, vous devez insérer les lignes suivantes avant votre entité,
votre architecture ou votre paquetage :
library ieee;
use ieee.std_logic_1164.all;
Le type std_logic
permet de représenter des situations particulières dans
le fonctionnement d’un circuit électronique numérique, comme par exemple la logique à trois états
ou l’effet des résistances de tirage.
Il définit également des valeurs destinées à détecter les erreurs en simulation.
Valeur | Signification |
---|---|
'U' |
L’état d’un signal non initialisé |
'0' |
La valeur binaire 0 |
'1' |
La valeur binaire 1 |
'X' |
Une valeur indéterminée (conflit entre '0' et '1' ) |
'Z' |
L’état haute impédance en logique à trois états |
'L' |
La valeur binaire 0 faible (à travers une résistance de tirage pull-down) |
'H' |
La valeur binaire 1 faible (à travers une résistance de tirage pull-up) |
'W' |
Une valeur indéterminée faible (conflit entre 'L' et 'H' ) |
'-' |
Une valeur indifférente |
Les valeurs 'U'
, 'X'
et 'W'
sont des valeurs fictives qui n’ont d’intérêt qu’en simulation :
std_logic
ont la valeur 'U'
.'0'
et un '1'
au même signal, celui-ci prendra la valeur 'X'
.'L'
et un 'H'
au même signal, celui-ci prendra la valeur 'W'
.La valeur '-'
peut être utilisée pour alléger l’écriture de certaines fonctions logiques.
Le type std_logic_vector
est un type tableau dont les éléments sont de type std_logic
.
Pour déclarer un signal de type std_logic_vector
, vous devez indiquer un intervalle
d’indices.
Par exemple, les signaux u
et v
ci-dessous peuvent transporter des vecteurs
de huit bits :
signal u : std_logic_vector(0 to 7);
signal v : std_logic_vector(7 downto 0);
Les types entiers ne sont pas toujours appropriés pour représenter les données numériques traitées par un circuit. Voici deux exemples de situations problématiques :
Les types signed
et unsigned
sont des sous-types de std_logic_vector
permettant de représenter, en binaire, des valeurs entières signées
(en complément à deux) ou non signées (en binaire pur).
Ainsi, en plus des opérations binaires déjà disponibles sur les vecteurs,
les types signed
et unsigned
bénéficient des mêmes opérations arithmétiques
que les entiers.
Ces deux types sont définis dans le paquetage numeric_std
de la bibliothèque ieee
.
Pour les utiliser, vous devez insérer les lignes suivantes avant votre entité,
votre architecture ou votre paquetage :
library ieee;
use ieee.numeric_std.all;
Pour déclarer un signal de type signed
ou unsigned
, vous devez indiquer
un intervalle d’indices.
Par exemple, les signaux s
et u
ci-dessous peuvent transporter des vecteurs
de huit bits représentant respectivement des entiers signés et non signés :
signal s : signed(7 downto 0);
signal u : unsigned(7 downto 0);