Sie sind auf Seite 1von 14

Chapitre 2 : Langage VHDL

On se limitera à l’aspect ‘synthèse’ de VHDL. se limitera à l’aspect ‘synthèse’ de


VHDL.
1.1 Règles d’écriture de VHDL
 Commentaires
Ils débutent par un double tiret ’--’ et finissent par la fin de la ligne..
 Majuscules et minuscules
VHDL ne fait pas de distinction entre majuscules et minuscules, sauf dans le cas ou le
caractère représente une valeur littérale.
 Objet
Il représente un signal, une variable, une constante, un processus, un composant,…
 Identificateur
Un identificateur représente le nom d’un objet.
Il est constitué d’une suite de caractère alphanumérique plus le caractère ‘_’.
Le premier caractère doit être une lettre.
Le symbole ‘_’ ne doit pas terminer le nom ni figurer 2 fois successives.
Il ne doit pas être un mot réservé de VHDL.
Sa longueur ne doit pas dépasser une ligne.
 Littéraux
Ils représentent des valeurs attribuées à des objets. Leur écriture dépend du type d’objet.
Exemples:
Entiers décimaux
Notation décimale habituelle avec la possibilité d’utiliser ‘_’ pour améliorer la lisibilité.
Bits
'0' et '1'.
Vecteur de bits (bit_vector)
Exemple: "100011"

1.2 Structure de VHDL


 entity (entité)
Elle décrit l’interface externe du module. Elle donne le nom du module ainsi que ses signaux
d’entrée et sortie. C’est la partie qui intéresse les autres modules du système.
 architecture
Elle contient la description proprement dite de la fonction du module.
Souvent les 2 unités entité et architecture suffisent pour décrire complètement le module en
VHDL.
 package (paquetage)
Les paquetages regroupent des entités/architectures afin de les réutiliser pour d’autres
descriptions.
Syntaxe pour appel d’un paquetage
use nom de bibliothèque . nom du paquetage . all ;
 Library (bibliothèque)
Une bibliothèque contient des descriptions VHDL ainsi que des fichiers générés lors de la
compilation. Il y a des bibliothèques définies par le langage, d’autres sont fournies dans les
outils de synthèse, d’autres ajoutées par les utilisateurs. Une bibliothèque prédéfinie est work
où sont stockés par défaut les modules analysés.
Pour accéder aux éléments d’une bibliothèque, il suffit de la nommer:

A.ZAARANE TSE - VHDL - 2018/2019 Page 1/14


Syntaxe
library nom de la bibliothèque ;
La bibliothèque work est toujours accessible. On n’a pas besoin de la déclarer explicitement.
 Environnement VHDL

entity …

architecture

architecture …
configuration

package

package
… library X Y
X
library work

1.3 Déclaration d’entité


L’entité décrit l’interface externe (signaux externes) d’une fonction sans aucune précision
concernant son fonctionnement interne.
Syntaxe
entity nom de l’entité is
generic ( noms de constantes : type := valeur ; …
noms de constantes : type := valeur ) ;
port ( noms de signaux : mode type ; …
noms de signaux : mode type ) ;
end nom de l’entité ;
 Generic
Mot clé indiquant la liste des paramètres génériques. Ce sont des paramètres qui seront fixés
ultérieurement (au moment de l’utilisation du circuit à décrire).
Ces paramètres génériques sont considérés comme des constantes dont il faut préciser le type
et la valeur par défaut.
 Port
Mot clé indiquant la liste des signaux externes. Il faut donner pour chaque signal le nom, le
mode, le type et éventuellement un ensemble de valeurs.
Les noms de signaux dans une liste sont séparés par des virgules. Leur ordre est quelconque.
 Mode
Il précise le sens du signal. On distingue les modes suivants:
- in : pour les signaux d’entrée
- out : pour les signaux de sortie
- inout : pour les signaux d’entrée/sortie bidirectionnels

A.ZAARANE TSE - VHDL - 2018/2019 Page 2/14


- buffer : pour les signaux d’entrée/sortie unidirectionnels.

out

in inout

buffer

 Type
On distingue les types prédéfinis, les types complémentaires définis par le langage VHDL et
les types définis par l’utilisateur.
o Types prédéfinis par le langage

Exemples de types prédéfinis :


- integer : Entiers entre –(231-1) et +(231-1)
L’intervalle de variation peut être limité par la directive range.
Exemple:
X : in integer range 0 to 255 ;
- natural : Entiers positifs ou nul
- positive : Entiers positifs
- boolean : Il a comme valeurs true et false.
- bit : Il a comme valeur ‘0’ et ‘1’.
- bit_vector : Il correspond à une chaine de bits.
Remarque :
Les valeurs de type caractère sont écrites entre des apostrophes. Celles qui sont de
type chaine de caractères sont écrites entre des guillemets.

o Types complémentaires

- std_logic : Ce type est la généralisation du type bit; il possède 9 valeurs:


'U' : non initialisé
'X' : niveau inconnu, forçage fort
'0' : niveau 0, forçage fort
'1' : niveau 1, forçage fort
'Z' : haute impédance
'W' : niveau inconnu, forçage faible
'L' : niveau 0, forçage faible
'H' : niveau 1, forçage faible
'-' : quelconque
- std_logic_vector : Type composite à base du type std_logic.
- signed : Type interprétant une suite de bits comme étant un nombre entier signé
- unsigned : Type interprétant une suite de bits comme étant un nombre non signé

A.ZAARANE TSE - VHDL - 2018/2019 Page 3/14


Ces deux derniers types sont importants pour pouvoir appliquer les opérations
arithmétiques sur des combinaisons binaires.
Remarque :

o Types et sous-types définis par l’utilisateur


Syntaxe
type nom du type is (définition du type) ;

Exemple :

L’utilisateur peut aussi définir des sous-types à partir des types existants.
Syntaxe
subtype nom du sous-type is définition du sous-type ;
Exemple
Définition d’un sous-type OCTET
Subtype OCTET is bit_vector (7 downto 0) ;

1.4 Déclaration d’architecture


L’architecture décrit le fonctionnement interne du système à concevoir. Elle contient deux
parties:
- Partie déclarative
- Corps de l’architecture
Ces deux parties sont séparées par le mot begin.
Syntaxe
architecture nom de l’architecture of nom de l’entité is
déclaration de types
déclaration de signaux
déclaration de constantes
déclaration de composants …
begin
instructions concurrentes
end nom de l’architecture ;

1.4.1 Partie déclarative


 Signaux
Ces signaux internes représentent des fils d’interconnexion. Ils sont équivalents aux signaux
déclarés dans le port, sauf que les signaux internes n’ont pas de mode et peuvent
éventuellement disparaître au moment de la synthèse.
Syntaxe
signal noms des signaux : type des signaux ;

A.ZAARANE TSE - VHDL - 2018/2019 Page 4/14


Exemple
signal ADRESSE : bit_vector(15 downto 0);
Remarque
L’affectation d’une valeur à un signal se fait avec l’opérateur ‘ <= ‘.
 Constantes
C’est un signal interne avec une valeur fixe. Le typage est comme celui des signaux.
L’affectation se fait avec l’opérateur ‘ := ‘.
Syntaxe
constant noms de constantes : type := valeur ;
Exemples
Déclaration d’une constante X de type entier et dont la valeur est égale à 8 :
constant X : integer := 8 ;
Déclaration d’une constante ADRESSE qui a 16 bits et est égale à 0101111111111111 :
constant ADRESSE : bit_vector (15 downto 0) :=
ou bien
constant ADRESSE : bit_vector (15 downto 0) :=
ou bien
constant ADRESSE : bit_vector (15 downto 0) :=

 Variables
Une variable n’est pas une liaison concrète. Elle disparaît après la synthèse. Elle est déclarée
dans les processus.
Syntaxe
variable noms des variables : type des variables ;
L’affectation d’une valeur à une variable se fait avec l’opérateur ‘ := ‘.
Exemple
X := 4 ;

 Composants
Les composants sont des modules qui sont utilisables dans d’autres descriptions.
Syntaxe
component nom de l’entité du composant port
(noms de signaux : mode type ;

noms de signaux : mode type ) ;
end component ;

1.4.2 Corps de l’architecture


Il contient les instructions décrivant la ou les fonctions du système. Cette description peut être
faite de deux manières différentes :

 Description comportementale (haut niveau)


Elle est faite sous forme d’un algorithme sans tenir compte de la réalisation concrète ou de
l’architecture matérielle du composant cible.
Exemple
Comparateur d’égalité à un bit

A.ZAARANE TSE - VHDL - 2018/2019 Page 5/14


A
Comparateur C
B

entity COMPARATEUR is port (A, B : in bit ; C : out bit ) ;


end COMPARATEUR ;
architecture COMPORT_COMPARATEUR of COMPARATEUR is
begin
C <= '1' when A = B else '0' ;
end COMPORT_COMPARATEUR ;

 Description structurelle (bas niveau)


Elle repose sur l’utilisation de composants la description de leurs interconnexions (comme un
schéma).
Exemple
Comparateur d’égalité à un bit

A I
=1 C
B
INV
XOR2

On suppose que les composants XOR2 et INV se trouvent déjà dans un paquetage appelé
portes dans la bibliothèque work.

entity COMPARATEUR is port (A, B : in bit ; C : out bit ) ;


end COMPARATEUR ;
use work.portes.all ;
architecture STRUCTURE_COMPARATEUR of COMPARATEUR is
signal I : bit ;
begin
P1 : XOR2 port map (A, B, I) ;
P2 : INV port map (I, C) ;
end STRUCTURE_COMPARATEUR ;

Remarque :

A.ZAARANE TSE - VHDL - 2018/2019 Page 6/14


1.5 Définition de paquetages
Syntaxe
package nom du paquetage is
déclaration de types
déclaration de signaux
déclaration de constantes
déclaration de composants …
end nom du paquetage ;
package body nom du paquetage is
déclaration de types
déclaration de constantes
définition de composants …
end nom du paquetage ;

Une fois décrit, compilé et stocké dans une bibliothèque, un paquetage peut être utilisé à
l’aide de la directive:
use nom de bibliothèque . nom du package . all ;
Un package peut contenir un nombre quelconque d’éléments.
Exemples de packages de la bibliothèque standard ieee
std_logic_1164
Il permet l’utilisation des signaux de type std_logic.
numeric_bit ou numeric_std
Il permet la manipulation du type signed (signé) et unsigned (non signé).
Remarques
- Les fichiers VHDL commencent généralement par les déclarations suivantes:
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.numeric_std.all ; (ou _bit.all ;)

1.5.1 Instanciation d’un composant


Elle consiste à appeler un composant qui est déjà défini dans un fichier ou dans un package.
On utilise les mot-clés port map pour associer les signaux effectifs de l’architecture appelante
aux signaux formels du composant.
Syntaxe
étiquette : nom du composant
generic map (valeurs de constantes) ;
port map (association des signaux) ;

Il y a deux possibilités pour faire l’association des signaux:


1ère possibilité
L’association se fait implicitement suivant le rang des signaux dans la liste figurant dans la
déclaration de l’entité du composant.
2ème possibilité
L’association se fait explicitement en associant chaque signal formel à un signal effectif.
signal formel => signal effectif
Remarques

A.ZAARANE TSE - VHDL - 2018/2019 Page 7/14


- La liste d’association doit avoir autant de signaux effectifs que le composant possède de
signaux formels.
- Elle ne doit pas contenir des valeurs littérales. S’il faut transmettre une valeur à un signal
formel, on doit d’abord définir une constante ayant cette valeur, et c’est cette constante qui
doit être affectée au signal.
- Si un signal formel n’est pas utilisé dans une instanciation, on utilise le mot réservé open.

Exemple: Bascule D (Bascule formelle)

reset
D q
clk BD
nq
set
Entité de la bascule:
entity BD is port (clk, D, reset, set : in std_logic ; q, nq : out std_logic) ;
end BD ;

Supposons qu’on veut utiliser une bascule D sans set et sans nq dans un circuit appelé CR.
Cette bascule s’appelle BASC_1 (bascule effective).
Dans ce cas, on instanciera le composant BD de la manière suivante:

RAZ

D_IN OUT
CLOCK BASC_1


architecture A_CR of CR is
constant ZERO : std_logic := '0' ;
begin
BASC_1 : BD port map (CLOCK, D_IN, RAZ, ZERO, OUT, open) ; …

1.6 Fonctionnement concurrent et séquentiel

La différence principale entre VHDL et les langages de programmation réside dans le fait que
dans VHDL les instructions sont évaluées en permanence et toutes simultanément.
Exemple
architecture A_EX of EX is
begin
A<= B or C ;
B<= D and E ;
end A_EX ;
L’ordre des instructions n’est pas important.
Les 2 instructions :

A.ZAARANE TSE - VHDL - 2018/2019 Page 8/14


A<= B or C ; B<= D and E ;
sont interprétées comme suit:
 à tout moment A prend la valeur de (B or C).
à tout moment B prend la valeur de (D and E).
On dit que les 2 instructions sont exécutées de manière concurrentielle, parallèle ou
combinatoire. Le mode concurrent est le mode de fonctionnement par défaut d’une
architecture.

1.6.1 Processus
Si on veut avoir un mode de fonctionnement séquentiel, on crée un processus (process). Un
processus est un groupe d’instructions ayant les propriétés suivantes:
- Il s’exécute chaque fois qu’un signal appartenant à une liste appelée liste de sensibilité
change de valeur.
- Les instructions d’un processus s’exécutent séquentiellement.
- Les nouvelles valeurs des signaux ne prennent effet qu’à la fin du processus.
Syntaxe
nom du processus : (optionnel) process (liste de signaux)
déclaration de types
déclaration de variables
déclaration de constantes …
begin
instructions séquentielles
end process nom du processus (optionnel) ;

Exemple 1 : Bascule D
D Q
CLK

entity BD is port ( CLK, D : in bit ; Q : out bit) ;


end BD ;

architecture A_BD of BD is
begin
process (CLK)
begin
if (CLK= '1') then Q <= D ;
end if ;
end process ;
end A_BD ;

Remarques
Concernant l’horloge CLK, il faut faire un test sur son front montant. C’est le rôle de l’attribut
event. Cet attribut associé à un signal exprime le changement de valeur (front) de ce signal.
– Test sur un front montant d’un signal S:
S’event and S= '1'
– Test sur un front descendant d’un signal S:
S’event and S= '0'

A.ZAARANE TSE - VHDL - 2018/2019 Page 9/14


Exemple 2 : Bascule D avec reset asynchrone

entity BASC is port ( CLK, D, RESET : in bit ; Q : out bit) ;


end BASC ;
architecture A_BASC of BASC is
begin
process (CLK, RESET)
begin
if (RESET= '1') then Q <= ‘0' ;
elsif (CLK’event and CLK= '1') then Q <= D ;
end if ;
end process ;
end A_BASC ;

1.7 Opérateurs:

Catégorie Type des opérandes


Opérateurs logiques
and
nand boolean
or bit
nor bit_vector
xor
xnor
not

Catégorie Type des opérandes


Opérateurs relationnels
=
/=
< scalaire
<=
>
>=

Catégorie Type des opérandes


Opérateurs arithmétiques
+ integer
-
real
*
/

A.ZAARANE TSE - VHDL - 2018/2019 Page 10/14


Catégorie Type des opérandes
Opérateurs de décalage
sll bit_vector
srl
rol
ror

Catégorie Type des opérandes


Opérateur de concaténation
& bit
bit_vector

Remarques :

1.8 Instructions
1.8.1 Quelques instructions en mode concurrent
a- Affectation inconditionnelle
Syntaxe
signal <= expression ;

Lire: Le signal prend immédiatement et à tout moment la valeur de l’expression.


b- Affectation conditionnelle
Syntaxe

signal <= expression when condition else


expression when condition else
expression when condition else expression ;

A.ZAARANE TSE - VHDL - 2018/2019 Page 11/14


c- Affectation sélective
Syntaxe

with sélecteur select


signal <= expression when valeur du sélecteur,
expression when valeur du sélecteur ,

expression when others ;

Exemple
Multiplexeur 4:1

A
B MUX Y
C 4:1
D

ADRESSE

with ADRESSE select


Y <= A when "00",
B when "01",
C when "10",
D when "11" ; (mieux : D when others ; )
Remarque
On peut regrouper plusieurs conditions pour une même affectation.
X <= A when "00" | "01", …

d- Instanciation de composant (voir §1.5.2 et §1.5.3)

e- Instruction generate
Cette instruction permet de générer plusieurs copies d’un même composant ou d’une même
instruction.
Syntaxe
étiquette: for variable de boucle in valeur initiale to valeur finale generate
instructions concurrentes
end generate étiquette ;
Remarques
- On peut imbriquer plusieurs instructions generate.
- Il n’est pas nécessaire de déclarer la variable de boucle.

A.ZAARANE TSE - VHDL - 2018/2019 Page 12/14


Exemple
A(0)
& Y(0)

A(1)
& Y(1)

A(2)
& Y(2)

A(3)
& Y(3)
EN
boucle : for J in 0 to 3 generate
Y(J) <= A(J) and EN ;
end generate ;

1.8.2 Quelques instructions en mode séquentiel


a- Affectation inconditionnelle pour signaux
Syntaxe
signal <= expression ;

Lire: Le signal prendra la valeur de l’expression.

b- Affectation inconditionnelle pour variables


Syntaxe
variable := expression ;
L’affectation prend effet immédiatement.

c- Affectation conditionnelle
Elle peut s’appliquer aux signaux et aux variables.
Syntaxe

if condition then instructions ;


elsif condition then instructions ;

elsif condition then instructions ;
else instructions ;
end if ;
c- Affectation sélective
Syntaxe

case sélecteur is
when valeur du sélecteur => instructions ;
when valeur du sélecteur => instructions ;

when others => instructions ;
end case ;

A.ZAARANE TSE - VHDL - 2018/2019 Page 13/14


Remarque
On peut regrouper plusieurs conditions pour une même affectation.
Exemple
when "00" | "01" => X <= A ;

d- Instruction loop
Syntaxe
étiquette: for variable de boucle in valeur initiale to valeur finale loop
instructions séquentielles
end loop étiquette ;

Mémorisation implicite
Si lors d’une instruction conditionnelle (combinatoire) un signal reçoit une affectation dans
une branche, il doit recevoir une affectation dans toutes les autres branches. Chaque absence
d’affectation signifie que le signal garde sa valeur. Dans ce cas le synthétiseur génère une
logique de mémorisation de ce signal (bascule).
Exemple
L’instruction suivante:
C <= B when A = ‘1’ ;
est interprété comme:
C <= B when A = ‘1’ else C when A=‘0’ ;
Si on veut que C prenne n’importe quelle valeur, lorsque A=0, alors il faut écrire l’instruction
suivante:
C <= B when A = ‘1’ else ‘-’;

1.9 Machines d’état

(Voir TD et TP)

A.ZAARANE TSE - VHDL - 2018/2019 Page 14/14