Académique Documents
Professionnel Documents
Culture Documents
Abdelmalek Essadi
Facult des Sciences et Techniques Tanger
Dpartement Gnie lectrique
Module : Electronique avance Spcialit : Cycle ingnieur EEA, S5
Le langage VHDL
Karim EL MOKHTARI
karim@elmokhtari.com
Le langage VHDL
Introduction
Au cours des quinze dernires annes, les mthodes de conception des fonctions numriques
ont subi une volution importante.
Dans les annes soixantedix, la majorit des applications de la logique cble taient construites
autour de circuits intgrs standard, souvent de la famille TTL.
Au dbut des annes 80 apparurent, paralllement, les premiers circuits programmables par
lutilisateur et les circuits intgrs spcifiques (ASICs) pour les fonctions complexes fabriques
en grande srie. La complexit de ces derniers a ncessit la cration doutils logiciels de haut
niveau pour la description structurelle des circuits.
A lheure actuelle, on trouve une large gamme de circuits qui vont des premiers PALs
(programmable Array Logic), quivalents de quelques centaines de portes, des FPGAs (Field
programmable Gate Array) de quelques centaines de milliers de portes quivalentes.
Les outils daide la conception se sont unifis ; un mme langage, VHDL par exemple, peut tre
employ quels que soient les circuits utiliss.
Dfinition
Le VHDL est un langage de description destin reprsenter le comportement et larchitecture
de circuits numriques.
Une spcification dcrite en VHDL peut tre simule ou synthtise sur un circuit
programmable.
Un langage de description, contrairement un langage de programmation informatique, sert
dcrire du matriel avec pour objectifs : la spcification, la modlisation, la simulation et la
documentation. Il ne faut jamais interprter le code VHDL comme un langage de programmation
de type C/C++/Pascal
Exemple
Prog 1
A2
B3
C A+B
Prog 2
C A+B
A2
B3
En informatique, le programme 2 est faux car laffectation de A et B doit avoir lieu avant de
calculer C. En VHDL, en revanche, les deux programmes sont identiques et se ramnent dcrire
le schma suivant :
2
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Historique et volution
Au dbut des annes 80, le ministre de la dfense des Etats Unis (D.O.D) demande
Intermetrics, IBM et Texas Instruments de mettre au point un langage dont lobjectif tait
dassurer une indpendance vis vis des fournisseurs de matriels et de logiciels et ainsi une
assurance de maintenabilit des quipements. Le rsultat tait le langage VHDL.
Le VHDL a t normalis pour la premire fois comme langage de description de matriel en
dcembre 1987 : norme IEEE 107687
Il a connu plusieurs amliorations notamment en 1994 o le standard IEEE 1164 enrichit le
VHDL par la notion de forces sur les signaux (multivalued logic)
Une autre extension du VHDL a vu le jour en 1999 (norme IEEE1076.1) qui ajoute la
modlisation mixte (numrique analogique) et multitechnologique : VHDLAMS (Analog and
Mixed Signal).
Exemple
Nous allons commencer par coder en VHDL un circuit additionneur.
La premire tape consiste considrer le circuit comme une bote noire et dcrire la nature de
ses entres/sorties.
A
SUM
Adder
B
CARRY
entity Adder is
port
(
A, B : in bit;
SUM, CARRY : out bit
);
end Adder;
entity : permet de dclarer une entit (le modle du composant) appel ici Adder
port : dfinit les entres/sorties : in et out indiquent le sens suivi du type du port, bit prend
la valeur 0 ou 1.
Lentit reprsente le botier ou la vue externe du composant.
Il faut ensuite dcrire le fonctionnement de ladditionneur. Dans ce cas simple on se basera sur
les quations logiques de ladditionneur :
SUM = A B
CARRY = A.B
3
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
La suite du code VHDL sera donc larchitecture ou la vue interne du composant :
architecture arch1 of ADDER is
begin
SUM <= A xor B;
CARRY <= A and B;
end arch1;
Chaque architecture porte un nom : ici arch1.
of ADDER : indique lentit correspondante cette architecture.
Dans lexemple prcdent, lvaluation de SUM et CARRY se fait en parallle, ces deux
instructions sont dites des instructions concurrentes, lchange des deux lignes na aucun
effet sur la description.
Lvaluation des instructions concurrentes na lieu que si lun des signaux droite change
c..d. SUM ne sera value que si A ou B change dtat.
Il est possible dintroduire un dlai dans une affectation :
SUM <= A xor B AFTER 10 ns ;
SUM reoit le rsultat de A xor B aprs un retard de 10ns. Ceci est trs utile pour simuler le
retard d aux oprateurs logiques.
Exercice
Sum
Cout
Solution
entity FullAdder is
port
(
A, B, Cin : in bit;
Sum, Cout : out bit
);
end FullAdder;
architecture arch2 of FullAdder is
begin
Sum <= A xor B xor Cin;
Cout <= (A and B) or (A and Cin) or (B And Cin);
end arch2;
4
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Exercice
Sum
Cout
Solution
entity Adder2bits is
port
(
A, B : in bit_vector(1 downto 0);
Cin : in bit;
S
: out bit_vector(1 downto 0);
Cout : out bit
);
end Adder2bits;
Pour larchitecture, on peut exprimer les quations du premier et du second additionneur. Le
lien entre les deux additionneurs est fait laide de C0. C0 est un lien interne il est dfini dans
larchitecture par le mot signal.
Remarque
On na pas besoin de dfinir la direction dun signal car cest une connexion interne
architecture arch3 of Adder2bits is
signal Co: bit;
begin
sum(0) <= A(0) xor B(0) xor Cin;
Co
<= (A(0) and B(0)) or (A(0) and Cin) or (B(0) and Cin);
sum(1) <= A(1) xor B(1) xor Co;
Cout
<= (A(1) and B(1)) or (A(1) and Co) or (B(1) and Co);
end arch3;
5
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Ce type de description sappelle une description de type flot de donnes. Les quations logiques
sont fournies directement sous forme dinstructions concurrentes. Le problme est que ces
quations deviennent plus nombreuses et complexes quand le nombre de bits augmente.
Il existe un autre type de description o on dfinit une structure contenant deux additionneurs
du type FullAdder interconnects. Cette description sappelle une description de type structurel
A0
S0
Adder0
B0
Cin
C0
A1
S1
B1
Adder1
Cout
architecture struct2Add of Adder2bits is
component FullAdder
port(
A, B, Cin : in bit;
Sum, Cout : out bit
);
end component
signal Co: bit;
begin
adder0: FullAdder port map(A(0), B(0), Cin, S(0), Co);
adder1: FullAdder port map(A(1), B(1), Co, S(1), Cout);
end struct2Add;
Le ou les composants utiliss dans larchitecture doivent tre dfinis par le mot component
suivi du nom lentit utiliser et la description de la nature des ports du composant.
adder0 et adder1 sont les deux additionneurs utiliss, la liste des connexions est indiqu
dans lordre (adder0 : A(0) A, B(0) B, Cin Cin, S(0) Sum, Cout Co)
Il existe une deuxime faon pour indiquer les connexions sans besoin de respecter lordre
(ce quon appelle association par nom) :
adder1: FullAdder port map(Cin=>Co, A=>A(1), B=>B(1), Cout=>Cout,
Sum=>S(1));
6
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Exercice
Solution
entity Mux4E is
port(
Sel : in bit_vector(1 downto 0);
-- Entrees de selection
EN : in bit ;
-- Entree de validation
D
: in bit_vector(3 downto 0);
-- Entree de donnees
S
: out bit
-- sortie
);
end Mux4E ;
Premire faon : quation logique brute :
architecture Flot_Don1 of Mux4E is
begin
S <= ((not Sel(0) and not Sel(1) and D(0)) or
(Sel(0) and not Sel(1) and D(1)) or
(not Sel(0) and Sel(1) and D(2)) or
(Sel(0) and Sel(1) and D(3))) and EN;
end Flot_Don1;
7
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Il existe une faon plus lisible et plus lgante pour reprsenter le fonctionnement du
multiplexeur :
architecture Flot_Don of Mux4E is
signal Y : bit ;
begin
with Sel select
Y <= D(0) when "00",
D(1) when "01",
D(2) when "10",
D(3) when "11";
S <= Y when (EN = '1') else '0';
end Flot_Don;
Exercice
Donner le code VHDL dun dcodeur 3 vers 8 avec une entre Enable.
Solution
entity Dec3vers8 is
port(
E : in bit_vector(2 downto 0);
EN : in bit ;
S : out bit_vector(7 downto 0)
);
end Dec3vers8 ;
-- Entrees
-- Entree de validation
-- sorties
8
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
En VHDL tout est processus. Chaque instruction concurrente est aussi un processus.
Le processus constitue llment de calcul du simulateur. Un processus est dclar
explicitement par le mot PROCESS ou implicitement avec une instruction concurrente.
Un processus est excut toujours, jusqu la fin de la simulation. Il peut tre mis en attente
par linstruction WAIT.
Un processus sexcute jusqu ce quil trouve WAIT
WAIT a plusieurs formes :
WAIT WAIT ON vnement WAIT FOR dure WAIT UNTIL Condition
Application
Fonctionnement
entity BasculeD is
port
(
D, H : in bit;
Q, Qb : out bit
);
end BasculeD;
9
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Notion dattribut
10
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Les instructions dans un processus sont des instructions squentielles, elles sont excutes
selon leur ordre dcriture. Cependant il faut savoir que laffectation de la valeur finale dun
signal/sortie ne seffectue qu la fin du processus ou la rencontre dune instruction WAIT
Exemple
process (H)
A <= D ; --A est un signal
Qb <= not A ;
End process ;
Qb <= not A : la valeur de A qui considre nest pas la nouvelle valeur de A (qui est D) mais
lancienne valeur de A.
Pour mieux expliquer le point prcdent, il faut savoir qu chaque signal dans un processus est
associ un pilote (driver en anglais). Toutes les oprations sur le signal sont effectues sur son
pilote, qui est considr comme une mmoire temporaire. Le transfert de la valeur du pilote vers
le vrai signal se fait la fin du processus ou la rencontre de WAIT.
Instant
D
A
Qb Pilote_A Pilote_Qb
Dbut process
1
0
1
0
1
A <= D
1
0
1
1
1
Qb <= not A
1
0
1
1
1 (Cest A et pas Pilote_A)
End Process
1
1
1
1
1
Exercice
Ecrire un code VHDL qui gnre un signal de priode 50 ns
Solution
PROCESS
BEGIN
clk <= not clk;
wait for 25 ns;
END PROCESS;
Ou encore :
PROCESS
BEGIN
h <= '0', '1' AFTER 25 ns;
WAIT FOR 25 ns;
END PROCESS;
Ou encore :
PROCESS
BEGIN
h <= '0';
WAIT FOR 25 ns;
h <= '1';
WAIT FOR 25 ns;
END PROCESS;
11
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Affectation conditionnelle
S9 <= '1' WHEN etat = "1001" ELSE '0' ;
Dans un processus, linstruction quivalente WHEN est linstruction IF THEN :
P2: PROCESS
WAIT ON etat;
IF etat = "1001" THEN
S9 <= '1';
ELSE
S9 <= '0';
END IF
END PROCESS;
La structure IF THEN peut tre tendue avec ELSIF
IF a = '1' THEN
s <= '1';
ELSIF b = '1' THEN
s <= '1';
ELSE
s <= '0';
END IF;
12
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Exercices
13
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Lerreur ici est lutilisation de S droite de laffectation, S tant dclar une sortie, elle ne peut
tre lue.
Solution : utiliser un signal temporaire y :
architecture Comp of GenParite is
signal y:bit;
begin
process(E)
begin
FOR i in 0 to 7 LOOP
y <= y xor E(i);
end loop;
S <= y;
end process;
end Comp;
Surprise : Rsultat de la simulation : S est toujours 0 quelque soit ltat des E(i) !!
Lerreur ici est que la valeur finale de y ne lui est transmise qu la fin du processus :
Exemple : E="00000001"
Instant
y Pilote_y
Dbut process
0
0
y <= y xor E(0)
0
1 Correct
y <= y xor E(1)
0
0 Faux car cest y qui est considre et non pas son pilote
y <= y xor E(2)
0
0 cest toujours y qui est considr
y <= y xor E(7)
0
0 cest toujours y qui est considr
End process
0
0 Transfert du Pilote_y vers y
Rsultat faux, la valeur finale de y est : y xor E(7), le rsultat de chaque xor nest pas prserv
pour litration suivante.
La solution pour prserver ce rsultat est dutiliser une variable au lieu dun signal. Une
variable reoit immdiatement sa valeur dans un processus et nattend pas sa fin :
architecture Comp2 of GenParite is
begin
process(E)
variable a : bit;
begin
a := '0';
FOR i in 0 to 7 LOOP
a := a xor E(i);
end loop;
S <= a;
end process;
end Comp2;
Remarques
Une variable est dclare dans un processus. lextrieur elle nest plus reconnue.
Laffectation dune variable se fait avec le symbole := , pour un signal cest le symbole : <=
Il nest pas ncessaire dfinir la variable i utilise dans la boucle FOR.
14
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Ces deux instructions squentielles assurent lexcution dune boucle : FOR pour un nombre de
rptition connu, WHILE pour une boucle avec condition.
Exemple : mise 1 des bits du vecteur S
for i in 0 to 7 loop
S(i) <= '1';
end loop;
i:=0;
while i<=7 loop
S(i) <= '1';
i := i +1;
end loop;
On prfre la boucle for la boucle while, car il y a risque de boucle infinie pour while.
Une boucle peut tre arrte par linstruction exit when <Condition>
Exemple
for i in 0 to 7 loop
exit when S(i)='1';
S(i) <= '1';
end loop;
type std_logic is (
'U',
-- Uninitialized
'X',
-- Unknown
'0',
-- 0
'1',
-- 1
'Z',
-- High Impedance
'W',
-- Weak Unknown (0 or 1)
'L',
-- Weak 0 (models a pull-down)
'H',
-- Weak 1 (models a pull-up)
'-');
-- Don't care
15
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger
Le type std_logic est plus gnralis que le type bit car il supporte des tats supplmentaires qui
peuvent tre rsolues (par exemple 0 est plus fort que H, si ces deux signaux sont
interconnects le rsultat est 0)
type std_logic_vector
Cest un vecteur de bits considr en binaire sign ou non sign selon la librairie incluse
(std_logic_unsigned ou std_logic_signed)
type UNSIGNED
Cest un vecteur de bits cod en binaire naturel (toujours positif)
type SIGNED
Cest un vecteur de bits cod en binaire code complment 2, il peut donc tre positif ou ngatif
Les oprations arithmtiques +,,*,/ peuvent soprer sur des oprandes de mme type. Sinon, il
faudrait utiliser des fonctions de conversion.
Exemple :
signal B,C : std_logic_vector (3 downto 0);
signal D
: unsigned (3 downto 0);
C <= B+D;
-- Incorect!
C <= B + conv_std_logic_vector(D, 4); -- Correct!
Les fonctions de conversion sont les suivantes :
conv_integer(arg) : convertit arg en integer
conv_unsigned(arg,n) : convertit arg en unsigned sur n bits
conv_signed(arg,n) : convertit arg en signed sur n bits
conv_std_logic_vector(arg,n) : convertit arg en std_logic_vector sur n
bits
Exercices
Raliser un compteur sur 4 bits
Raliser un diviseur de frquence sur N.
Utiliser dans la dfinition de lentit le mot : generic (N : integer) qui rend
lentit paramtrable par N, et lutilisation du composant indiquer la valeur dsire de
N : generic map (N=><valeur de division dsire>)
16
Cours VHDL Cycle Ing. EEA K. EL MOKHTARI Dpartement Gnie lectrique FST Tanger