Types prédéfinis

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.

Types entiers

VHDL définit les trois types entiers suivants :

Nom Signification Min Max
integer Entier relatif -2 147 483 648 (231-2^31) 2 147 483 647 (23112^31-1)
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 à t=0t=0 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, à t=0t=0, 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;

Type booléen

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.

Types binaires simples

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 :

Types binaires standard

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 :

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);

Types binaires pour représenter des nombres

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);