Vous êtes sur la page 1sur 17

INTRODUCTION AU LANGAGE VHDL POUR LA SYNTHESE

I.

CE QUEST LE VHDL....................................................................................................................... 2
1.

PRESENTATION .................................................................................................................................. 2

2.

LE FLOT DE CONCEPTION.................................................................................................................... 3

II.

INTRODUCTION AU LANGAGE ................................................................................................... 4


1.

LES EN-TETES DE FICHIER ................................................................................................................... 4

2.

LENTITE (ENTITY) ............................................................................................................................. 5

3.

LARCHITECTURE............................................................................................................................... 5

4.

LE PROCESS ....................................................................................................................................... 6

5.

LES SIGNAUX LES PLUS UTILISEES ...................................................................................................... 7


5.1

Librairie standard : ...................................................................................................................... 7

5.2

Librairie std_logic_1164 .............................................................................................................. 7

5.3

Librairie std_logic_arith............................................................................................................... 8

5.4

Agrgats et concatnation sur les vecteurs................................................................................... 8

5.5

Attributs des signaux et vecteurs................................................................................................... 9

6.
III.

REGLES DECRITURE ........................................................................................................................ 10


LECRITURE SEQUENTIELLE ET PARALLELE .................................................................... 11

1.

LECRITURE SEQUENTIELLE ............................................................................................................. 11


1.1

If.................................................................................................................................................. 11

1.2

Case ............................................................................................................................................ 12

1.3

For Loop ..................................................................................................................................... 12

2.

ASSIGNATION CONCURRENTE .......................................................................................................... 12


2.1

Ecriture quivalente a un if hors process ................................................................................... 12

2.2

Ecriture quivalente a un case hors process............................................................................... 13

3.
IV.

VARIABLES VS SIGNAUX .................................................................................................................. 13


PROCESS CLOCKE ........................................................................................................................ 14

1.

ECRITURE DUN PROCESS CLOCKE .................................................................................................... 14

1.1

Reset synchrone .......................................................................................................................... 14

1.2

Reset asynchrone ........................................................................................................................ 17

TP CAO Electronique Numrique - 2005

Romain Berny

I. Ce quest le VHDL
1. Prsentation
Le Vhic Hardware Description Language (VHIC = Very High Speed Integrated Circuit) a
t normalis en 1987 par lIEEE, sous la norme IEEE 1076-87. Une importante volution
est parue en 1993, sous la norme IEEE 1076-93. Cest cette version du langage qui est
majoritairement supporte par les outils du march.
Dautre rvision de la norme sont parues depuis, mais ce sont des volutions
mineures , et pas forcement supports par les logiciels.
Le VHDL est un langage de description matriel, ce nest absolument un langage
software comme le C ou le Java.
A partir de ce langage, on peut dfinir un systme par une structure hirarchique de
fonctions, par une structure matrielle, en encore par une modlisation temporelle (mme si
elle nest pas utilisable pour faire du code synthtisable).
Ce langage permet daller dun niveau dabstraction trs leve, par une description
algorithmique, jusqu'
un niveau proche du matriel, o lon dcrit le systme par un
ensemble de porte logique et dinterconnexion ( gate level ). Entre les deux, se trouve le
niveau RTL (Register Transfer Level), qui permet de dfinir le systme par une architecture
de type machine de Moore ou Mealy.
Cest le niveau RTL que lon utilise le plus quand on fait de la synthse. En effet, le
niveau algorithmique nest pas forcement synthtisable, il est plutt utilis pour faire du
testbench ou de la simulation. Le niveau gate level est souvent lourd dcrire quand le
systme devient un tant soit peu complexe.
Lavantage du code RTL est quil est indpendant des technologies utilises dans la cible
programmer, alors quau niveau gate , il faut prendre en compte la techno du circuit
cible, car tout nest pas permis.

TP CAO Electronique Numrique - 2005

Romain Berny

2. Le flot de conception

fig 1 :

Flot de conception

Le code synthtiser sera gnralement crit dans un niveau RTL. Paralllement, un


banc de test doit tre crit.
Ce banc de test, crit sous la forme dune modlisation de lenvironnement, servira
appliquer les stimuli dentre et extraire les rsultats, pour ensuite permettre la validation
du systme.
Une fois le code valide, on le synthtise grce aux librairies du fabriquant, afin de
gnrer la netlist et le code de type porte .
Ensuite, on fait le Placement/routage du circuit (ou le layout sil sagit dun ASIC). Une
fois le circuit rout, on en extrait les temps de propagation et lon re-simule le systme, pour
vrifier que le placement routage est suffisamment optimis pour respecter les contraintes
de temps.
Si les contraintes de temps ne sont pas respectes, on relance un placement routage
pour tenter une optimisation. Ce processus est itratif, et sera renouvel un nombre de fois
suffisant pour atteindre les contraintes. Dans le cas o les contraintes ne sont pas atteintes,
le synthtiseur dclare alors quil ne peut router le circuit de faon a tenir les contraintes, et
donne les chemins critiques.

TP CAO Electronique Numrique - 2005

Romain Berny

II. Introduction au langage


1. les en-ttes de fichier
La premire chose faire est de dfinir les librairies qui seront utilises dans le code.
Library IEEE ;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

Cela se fait de la manire suivante :

Tout dabord, la librairie principale (en gnrale, IEEE).


ensuite, le mot cl use , qui indique quelle package de la librairie nous allons utiliser.
Aprs cela, le nom du package. Enfin, le .all signifie que lon souhaite utiliser tout ce qui se
trouve dans ce package. Lorsque le nom de la librairie est prcd de IEEE., cela signifie
que cest une librairie qui est dfinie dans la norme IEEE, et que lon retrouvera donc
normalement dans tout logiciel. A linverse, il faut se mfier des librairies qui ne sont pas
IEEE, car elles sont en gnrale spcifiques un logiciel.
Les librairies IEEE principales sont :

IEEE.standard

IEEE.std_logic_1164

IEEE.numeric_std

IEEE.std_logic_arith

Attention, il ne faut pas utiliser les librairies numeric_std et std_logic_arith en mme


temps : la librairie std_logic_arith est en fait une version amliore de la numeric_std,
dvelopp par synopsys, et qui a t ensuite incorpor dans la norme IEEE. Le fait dutiliser
les 2 librairies en mme temps causera un conflit lors de lutilisation de certaines fonctions.

TP CAO Electronique Numrique - 2005

Romain Berny

2. lentit (entity)
Un design est tout dabord dfini par une dclaration dentit. Cette entit permet de
dcrire linterface avec lenvironnement extrieur. On y retrouve donc un nom dentit, et la
liste des signaux, avec leurs caractristiques (nom, mode, type).
Elle est dfinie de la manire suivante :
Entity HALFADD is
Port (
A, B : in std_logic ;
SUM, CARRY : out std_logic
);
End HALFADD;

Un signal dentre/sortie est donc dfini par :


-

son nom

son mode : in, out, inout

son type : std_logic, std_logic_vector(x downto x) (on verra les diffrents types par la
suite)

3. Larchitecture
Une fois lentit dfinie, il faut dcrire son fonctionnement, cest ce que lon fait avec
larchitecture.
Architecture RTL of HALFADD is
-- Dclarations pralables
Begin
SUM <= A xor B;
CARRY <= A and B;
End RTL

Une architecture fait toujours rfrence une entit (ici, HALFADD). Elle est dfinie par
un nom quelconque (ici RTL), que lon pourra choisir pour expliciter la faon dont on code.
A la suite de la dclaration de larchitecture, on dfinira les dclarations pralables
(signaux internes, composants), qui seront abords un peu plus tard.
Ensuite, viens le mot cl begin . A sa suite, on trouvera le code qui dcrit le
fonctionnement de larchitecture.
Dans une architecture, toutes les lignes combinatoires ou bloc de process sont
excutes en parallle.

TP CAO Electronique Numrique - 2005

Romain Berny

4. Le Process
Lorsque lon a besoin de faire une excution squentielle dans une architecture, on utilise
Entity MUX is
Port (
A, B, SEL : in std_logic;
OP : out std_logic
);
End MUX;
Architecture TEST of MUX is
Begin
MUXPROCESS : process (A, B, SEL)
Begin
If (SEL = 1) then
OP <= A;
Else
OP <= B;
End if;
End process MUXPROCESS;
End TEST;

un process.

Un process peut tre dfinie par un label, mais ce nest pas obligatoire. Il ya par contre
toujours une liste de sensibilit (ce qui se trouve entre parenthse). Lorsque lun des signaux
prsent dans la liste de sensibilit va changer, le contenu du process est alors excut. Si
lon oublie de mettre un signal dans la liste de sensibilit, le rsultat peut tre compltement
diffrent.
Dans le cas 1, sortie OP avec liste de sensibilit normale (A, B, SEL)
Dans le cas 2, sortie OP avec liste de sensibilit sans le signal A

Dune manire gnrale, on mettra dans la liste de sensibilit tous les signaux qui seront
scruts dans le process.

TP CAO Electronique Numrique - 2005

Romain Berny

5. Les signaux les plus utilises


5.1 Librairie standard :

Boolean (true ; false)

Bit (0 ; 1)

Bit_vector (vecteur de bit)

Integer

Real

Character

String (vecteur de charactre)

Time (surtout en simulation)

5.2 Librairie std_logic_1164


Cest la librairie que lon utilise le plus dsormais. Elle reprend les dfinitions de la norme
IEEE1164, norme qui dfinie les signaux utilises en milieu industrielle.

Std_ulogic (U ; X ; 0 ; 1 ; Z ; W, L ; H ; -)

Std_logic : qui reprend les std_ulogic, mais qui gre les conflits de signaux lors
dassignement multiple. Cest ce que lon appel un type rsolue .

Std_ulogic_vector : vecteur de std_ulogic

Std_logic_vector : vecteur de std_logic

Comme vous pouvez le voir, la norme 1164 dfinie beaucoup plus dtat pour un signal
que la norme de base. Cest pourquoi on lutilise aujourdhui majoritairement, ne serait-ce
que pour la possibilit dutiliser un tat Z (haute impdance), trs utile pour des bus de
donnes.
Attention, le type bit nest pas compatible avec le type std_(u)logic. Il faut imprativement
utiliser des fonctions de conversion pour passer de lun lautre.

TP CAO Electronique Numrique - 2005

Romain Berny

5.3 Librairie std_logic_arith


Cest la librairie utilise lorsque lon a besoin de travailler avec les types unsigned et
signed . Ce sont des vecteurs de std_logic, avec lesquels on peut faire des oprations
arithmtiques (+ ; - ; * ; / ; =) et de comparaison numrique (< ; <= ; > ; >= ; = ; /=).
Comme les types unsigned et signed sont des vecteurs de std_logic, on peut facilement
faire des affectations vers le type std_logic_vector, en utilisant un cast (comme dans le
langage C) :
Architecture test of entity_test is
Signal A , B, C : std_logic_vector(5 downto 0) ;
Signal D, E, F : unsigned(5 downto 0) ;
begin
D <= unsigned(A) ;
E <= unsigned(B) ;
F <= D+E ; -- il est interdit de faire A+B directement avec des std_logic
C <= std_logic_vector(F) ;

5.4 Agrgats et concatnation sur les vecteurs


Dans le cas dun vecteur qui doit recevoir plusieurs sources sur des portions
diffrentes, on peut utiliser lagrgat, plus synthtique quune affectation par segment et qui
sera moins sujette a erreurs :
Signal A, B, C : std_logic ;
Signal Z_bus : std_logic_vector(1 downto 0) ;
Signal Status_byte : std_logic_vector(7 downto 0) ;
-- affectation par position
Z_bus <= (A, B) ;
-- affectation par association de nom
Status_byte <= (7 => 1, 5 downto 4 => Z_bus , 6 => C, others => 0) ;
-- affectation par concatnation
Status_byte <= 1 & C & Z_bus & "0000"
-- affectation par segment
Status_byte(7) <= 1 ;
Status_byte(6) <= C ;
Status_byte(5 downto 4) <= Z_bus ;
Status_byte(3 downto 0) <= "0000" ;

Les agrgats et concatnation doivent toujours faire la mme taille que celle du vecteur
cible.

TP CAO Electronique Numrique - 2005

Romain Berny

5.5 Attributs des signaux et vecteurs


Vecteurs :
Si lon prend un signal A dfini de la manire suivante :
Signal A : std_logic_vector(5 downto 0) ;

Ahigh renvoie 5
Alow renvoie 0
Aleft renvoie 5
Aright renvoie 0
Arange renvoi 5 downto 0
Areverse_range renvoi 0 to 5
Alength renvoi 6
Aascending renvoie false
Signaux :
Si lon prend un signal X dfini de la manire suivante :
Signal X : std_logic ;

Xevent renvoi true quand X change de valeur


Il existe dautre proprit pour les signaux, mais qui ne sont pas synthtisables, donc
nous ne les aborderons pas ici.

TP CAO Electronique Numrique - 2005

Romain Berny

6. Rgles dcriture
Le langage VHDL est trs strict sur la syntaxe.

Un signal doit tre dfini par son type et sa taille.

Tout objet doit tre dclar avant dtre utilis.

Les noms de signaux, labels, etc. ne doivent contenir que des lettres, nombres
et underscore. Ils doivent imprativement commencer par une lettre, et ne pas
terminer par un underscore (certains logiciels ne le supporte pas, mme si ce
nest explicite dans la norme).

Le langage VHDL est case insensitive : un signal abc peut tre appel en
tapant Abc ou ABC .

Pour introduire des commentaires, on fait commencer le commentaire par " -- ".
Le commentaire se termine la fin de la ligne, on ne peut pas faire de
commentaires sur plusieurs lignes sans remettre chaque fois les 2 traits.

Il ne faut jamais crire des choses qui vont crer un feedback zro dlai :

OP <= OP + Y ;

Cette criture est syntaxiquement correcte, mais va tre refuse par la plupart des
synthtiseurs, et fera planter la majeure partie des simulateurs.
Pour raliser cette fonction, il faut le faire dans un process :
Process (OP, Y)
Begin
OP <= OP + Y ;
End process ;

Ici, pas de boucle zro dlai, car la nouvelle valeur dOP ne sera positionne quune fois
le process excut, cela induit donc un dlai de propagation.

Il nest pas recommand de jouer sur les signaux prsents ou non dans la liste de
sensibilit pour essayer de faire des mmorisations implicite.

En effet, les synthtiseurs vont de toute faon rintgrer dans la liste de sensibilit tous
les signaux oublis. Ne pas le faire soit mme ds le dbut prsente deux risques :
-

la simulation et la synthse risquent de ne pas avoir le mme rsultat.

le synthtiseur peut mal interprter la mmorisation implicite espre, et


synthtiser une solution matrielle compltement diffrente du rsultat voulu.

TP CAO Electronique Numrique - 2005

Romain Berny

III.Lcriture squentielle et parallle


1. Lcriture squentielle
Les fonctions suivantes ne peuvent tre crites qu lintrieur dun process :

1.1 If
If CONDITION then
-- squence dopration
End if ;

La squence ne sera excute que si la CONDITION est ralis.

If CONDITION then
-- squence1 dopration
Else
-- squence2 dopration
End if ;

La squence1 sera excute si la CONDITION est ralis, sinon cest la squence2 qui
sera excute.
If CONDITION1 then
-- squence1 dopration
Elsif (CONDITION2) then
-- squence2 dopration
Elsif (CONDITION3) then
-- squence3 dopration
Else
-- squence_opt dopration
End if ;

Ici, on fait un encodage prioritaire : si la CONDITION1 nest pas ralise, on teste la


CONDITION2, et si elle nest pas elle-mme ralis, on testera alors la CONDITION3.
Si les conditions 1 et 3 sont ralises, par exemple, seule la squence 1 sera execut, du
fait de lencodage prioritaire

TP CAO Electronique Numrique - 2005

Romain Berny

1.2 Case
Case expression is
When VALUE_1 =>
-- squence1 dopration
When VALUE_2 to VALUE_5 =>
-- squence2 dopration
When VALUE_6 | VALUE_8 =>
-- squence3 dopration
When others =>
-- squence3 dopration
End case ;

Lvaluation des conditions doit tre imprativement disjointe : par exemple, on ne peut
avoir when VALUE_2 to VALUE_5 et when VALUE_5 to VALUE_6 .
Il faut toujours mettre un when others . Cela permet de couvrir tous les cas de figure,
et donc de ne pas avoir des tats indtermins.

1.3 For Loop


Signal OP,IP : std_logic_vector(3 downto 0) ;
()
For I in 0 to 3 loop
OP(I) <= IP(3 I) ;
End loop ;

La variable I ne doit pas tre dclare, elle lest dj par la fonction for..loop. Cest une
variable locale la fonction loop.

2. Assignation concurrente
2.1 Ecriture quivalente a un if hors process
Cette criture permet de remplacer un process simple qui ne contient quune boucle if
avec affectation sur un seul signal.
Process (A, B, C, T)
Begin
If (T > 5) then
OP <= A ;
Elsif (T < 5) then
OP <= B ;
Else
OP <= C ;
End if ;
End process ;
Affectation dans un process

TP CAO Electronique Numrique - 2005

OP <= A when T > 5


Else B when T < 5
Else C ;

Affectation hors process

Romain Berny

2.2 Ecriture quivalente a un case hors process


Cette criture permet de remplacer un process simple qui ne contient quune boucle if
avec affectation sur un seul signal.
Process (A, B, C, T)
Begin
Case T is
When 0 to 4 =>
OP <= B ;
When 5 =>
OP <= C ;
When others
OP <= A ;
End case ;
End process ;

With T select
OP <= B when 0 to 4,
C when 5,
A when others ;

Affectation dans un process

Affectation hors process

3. Variables vs signaux
Dans un process, un signal naura sa nouvelle valeur daffecte qu la fin du process. A
linverse, la variable aura sa nouvelle valeur affecte immdiatement.
Cest pourquoi, a lintrieur dun process, on prfrera utiliser des variables
intermdiaires plutt que des signaux intermdiaires. De plus, lutilisation de variable
intermdiaire soulage lcriture du process, car tant dclare lintrieur du process, on ne
les dclare pas dans la liste de sensitivit.

Signal A, B, P : integer ;
Begin
Process ( A, B)
Variable VM, VN : integer ;
Begin
VM := A ;
VN := B ;
P <= VM + VN ;
End process ;
Cas 1 : utilisation de variables

Signal A, B, P : integer ;
Signal SM, SN : integer ;
Begin
Process ( A, B, SM, SN)
Begin
SM <= A ;
SN <= B ;
P <= SM + SN ;
End process ;
Cas 2 : utilisations de signaux

Dans le cas 1, P est affect en une itration du process.


Dans le cas 2, P est affect en deux itrations : une premire itration va affecter SM et
SN en fin de process, ce qui va re-dclencher lexcution pour que P reoive la somme de
SM et SN.
TP CAO Electronique Numrique - 2005

Romain Berny

IV. Process Clock


1. ecriture dun process clock
Lorsque lon doit dcrire en VHDL une machine dtat synchrone, on utilise un process
qui ragit sur front dhorloge. Il existe plusieurs faons dcrire en VHDL un tel process.

1.1 Reset synchrone


Reset synchrone signifie que le reset ne sera pris en compte que lors dun front
dhorloge. Dans la majeure partie des cas, on lui prfrera un reset asynchrone, dcrit au
point 1.2. Dans le cas dun reset synchrone, seule lhorloge est utile dans la liste de
sensibilit, car il n y a quun front dhorloge qui entranera une action.
Library IEEE ;
Use IEEE.std_logic_1164.all ;
Use IEEE.std_logic_arith.all ;
Entity
Architecture
Signal clk, rst : std_logic ;
Signal count : unsigned(3 downto 0) ;
Begin
Process(clk)
begin
If clkevent and clk=1 then
If rst = 1 then
Count <= "0000" ;
Elsif (count >= 9) then
Count <= "0000" ;
Else
Count <= count + 1 ;
End if ;
End if ;
End process ;
End architecture ;

On peut remplacer if clkevent and clk=1 par if rising_edge(clk) .


Nanmoins, il ya une petite diffrence entre ces deux criture. Dans le premier cas, on
attend un venement sur clk, et on vrifie que le nouvel tat est 1. Cela veut dire que ltat
prcdent peut tre nimporte quoi (X, U, Z, 0, ).
Avec la fonction rising_edge() , la condition ne sera vrai que si il ya transition de la
valeur 0 a la valeur 1.
Il faut garder cela lesprit, car cest ce qui peu faire la diffrence dans une simulation,
mme si dun point de vue matriel, cela sera synthtis de la mme faon.

TP CAO Electronique Numrique - 2005

Romain Berny

Enfin, il existe une dernire faon dcrire un process synchrone,


laide la fonction wait until , qui remplace la boucle if .. then
Process(clk)
begin
Wait until clkevent and clk=1 ;
If rst = 1 then
Count <= "0000" ;
Elsif (count >= 9) then
Count <= "0000" ;
Else
Count <= count + 1 ;
End if ;
End process ;
End architecture ;

Lavantage de cette criture est denlever un niveau de if .. then. Dune manire gnrale,
on cherchera toujours a minimier le nombre de boucle if imbriques, car plus il ya de niveau
imbriqus, plus cela sera dur synthtiser.
On peut bien videment crire galement
Wait until rising_edge(clk) ;

Enfin, il faut noter plusieurs points importants :

Tout ce qui a t prcdemment crit fonctionne pour une dtection sur front

descendant. Dans ce cas, on utilisera clkevent and clk=0 , ou la fonction


falling_edge() .

Dune manire gnrale, aprs un if clkevent , il ny aura pas de else. Ecrire la

chose suivante est une aberration, et renverra une erreur de compilation.


If clkevent and clk=1 then
if (count >= 9) then
Count <= "0000" ;
Else
Count <= count + 1 ;
End if ;
Else count <= count ;
End if ;

La mmorisation est en effet toujours implicite lors de lutilisation dun process


synchrone.

TP CAO Electronique Numrique - 2005

Romain Berny

Sauf exception, une mme bascule ne peut tre active sur front montant et

descendant en mme temps. Cest pourquoi il nest pas correct dcrire les choses
suivantes :
If (ou wait until) clkevent
if (ou wait until) clkevent and (clk = 0 or clk = 1)
if clkevent and clk = 1
then
elsif clkevent and clk = 0
then
end if ;

Ces diffrentes critures renverront toujours une erreur de compilation dans un outil de
synthse.

Il faut galement faire attention bien crire un process synchrone.


If (clk = 1) then
Wait until clk= 1

Ces deux critures ne donneront pas un process synchrone, mme si la syntaxe avec le
wait until parait juste.

TP CAO Electronique Numrique - 2005

Romain Berny

1.2 Reset asynchrone


Dans la majeure partie des cas, on prfrera utiliser un process asynchrone. Dans ce cas
l, le signal de reset doit imprativement se trouver galement dans la liste de sensibilit.
Voici ce que cela donnera en reprenant les exemples prcdents :
Library IEEE ;
Use IEEE.std_logic_1164.all ;
Use IEEE.std_logic_arith.all ;
Entity
Architecture
Signal clk, rst : std_logic ;
Signal count : unsigned(3 downto 0) ;
Begin
Process(clk, rst)
Begin
If rst = 1 then
Count <= "0000" ;
Elsif (clkevent and clk=1)
then
if (count >= 9) then
Count <= "0000" ;
Else
Count <= count + 1 ;
End if ;
End if ;
End process ;
End architecture ;

Pour viter les deux boucles if imbriques, on pourra en plus remplacer la seconde
boucle par un case sur le signal count.

Process(clk, rst)
Begin
If rst = 1 then
Count <= "0000" ;
Else Wait until rising_edge(clk) ;
if (count >= 9) then
Count <= "0000" ;
Else
Count <= count + 1 ;
End if ;
End if ;
End process ;
End architecture ;

Ici, on reprend lcriture du wait until . On voit que le reset asynchrone impose de
toute faon dutiliser une boucle if.

TP CAO Electronique Numrique - 2005

Romain Berny

Vous aimerez peut-être aussi