Sunteți pe pagina 1din 33

Cours VHDL 1 J.M.

LANGAGE VHDL
Cours VHDL 2 J.M.
SOMMAIRE
Page 3 Introduction
Page 4 Logique combinatoire
Page 19 Logique squentielle
Page 27 Graphe d`tats
Page 32 Ligne 3 tats
Cours VHDL 3 J.M.
INTRODUCTION
Le langage VHDL a ete cree pour decrire des systemes numerises destines a une implantation
dans des circuits logiques programmables (PLD, FPGA, ASIC). Il remplace la saisie de
schema traditionnelle. La plupart des outils de developpement autorisent les 2 types de saisie.
Le langage VHDL est en principe standardise. Chaque outil de developpement dispose
cependant de bibliotheques speciIiques.
L`utilisation de ces systemes de developpement induit l`usage intensiI de la simulation.
Les exemples Iournis dans ce cours ont ete testes et simules avec l`outil ALTERA Quartus.
Pour developper une application de logique programmable, il Iaudra suivre la demarche ci-
dessous :
Saisie du texte VHDL (ou de schema)
VeriIication
Generation d ` une NETLIST
Simulation Ionctionnelle
Choix d `un composant et routage
Simulation temporelle
Programmation du composant et test
- L`etape de veriIication permet de valider la syntaxe du programme. La netlist est un
Iichier contenant la description de l`application sous Iorme d`equations logiques.
- Lors de l`etape de simulation Ionctionnelle, on valide l`application, independamment de
l`architecture et des temps de propagation du Iutur circuit cible.
- L`etape de routage genere les inIormations permettant d`integrer l`application dans le circuit
choisi. Une retro annotation est eIIectuee dans la netlist : les temps de propagation du
composant cible y sont pris en compte.
- Lors de la simulation temporelle, on peut evaluer les perIormances de l`application generee.
Cours VHDL 4 J.M.
LOGIQUE COMBINATOIRE
1- Un exemple simple
Le texte ci-dessous decrit un circuit nomme ex1 , dont le schema est le suivant :
s2
a
b
s1
c
LIBRARY ieee; -- bibliotheques a charger
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY ex1 IS -- commentaires
PORT ( -- declaration des entrees/sorties physiques
a, b, c : IN STDLOGIC ;
s1, s2 : OUT STDLOGIC -- pas de point virgule
) ;
END ex1 ;
ARCHITECTURE numero1 OF ex1 IS -- description de l`application
BEGIN
s1 a AND b ;
s2 (NOT a) OR (a AND b AND c) ;
END numero1 ;
Conclusion:
- Utiliser le symbole , revient a tracer une equipotentielle entre 2 points sur une saisie
de schema.
- Les 2 instructions s1 . et s2 ... sont concurrentes : l`ordre dans lequel
elles sont ecrites n`a pas d`importance, puisqu`au Iinal, il s`agit d`associer des portes
logiques. On dit que VHDL est un langage a execution parallele. Le terme execution n`est
d`ailleurs pas tres bien choisi : ici, contrairement un programme crit en PASCAL ou en
C, rien ne sera jamais excut. L'objectif de la description JHDL est d'aboutir un
routage de circuits logiques dans un composant programmable. Il Iaudra toujours garder
ceci a l`esprit chaque Iois qu`on ecrira un texte VHDL.
- VHDL ne distingue pas les majuscules des minuscules. Dans ce cours, les mots reserves du
langage seront ecrits en majuscules.
- Les bibliotheques declarees au depart permettent d`utiliser les types STD-LOGIC deIinis
depuis 1993. Un signal de type STDLOGIC est un signal sur un bit (materialise par un
Iil !). Le langage VHDL a Iait l`objet de 2 normalisations, l`une en 1987, l`autre en 1993.
Cours VHDL 5 J.M.
- l`ENTITY est la bote avec ses entrees et ses sorties physiques. L`ARCHITECTURE
contient la description du Ionctionnement de la bote et possede son propre nom. Certains
outils de developpement autorisent plusieurs descriptions d`une mme application. Le choix
est Iait au moment de la compilation.
- Il existe une priorite entre operateurs. Le plus simple est d`utiliser des parentheses.
- Les autres operateurs sont : XOR (ou exclusiI), NAND, NOR, & (concatenation),
(addition), - (soustraction), * (multiplication), / (division).
2- Description structurelle ou comportementale
On pourrait decrire l`exemple precedent sous la Iorme suivante :
ARCHITECTURE numero2 OF ex1 IS
BEGIN
s1 1` WHEN (a`1` AND b`1` ) ELSE 0` ;
s2 1` WHEN (( a`0`) OR (a`1` AND b`1` AND c`1`)) ELSE 0` ;
END numero2 ;
Conclusion:
- numero1 est une description structurelle : elle est tres proche d`une saisie de schema.
- numero2 est une description comportementale. Le schema logique equivalent ne se deduit
pas immediatement.
- En logique combinatoire, il Iaut TOUJOURS prevoir toutes les lignes de la table de verite
(autrement dit, ici, il ne Iaut pas omettre ELSE). Sinon, par deIaut, le compilateur VHDL
generera une Ionction sequentielle de memorisation.
Exemple: multiplexeur:
e0
e1
s
c
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY ex2 IS
PORT (
e0, e1, c:IN STDLOGIC ;
s : OUT STDLOGIC
) ;
END ex2 ;
ARCHITECTURE archi OF ex2 IS
BEGIN
s e0 WHEN c 0` ELSE e1;
END archi;
Les parentheses sont inutiles ici, le compilateur repere les mots reserves.
Cours VHDL 6 J.M.
3- Notion de signal
En VHDL, un SIGNAL est un bit ou un bus interne. Il a une realite physique (c`est une
equipotentielle).
On reprend ici le premier exemple :
s2
a
b
s1
c
x
ARCHITECTURE numero3 OF ex1 IS
SIGNAL x . STDLOGIC ,
BEGIN
s1 a AND b ,
x a AND b AND c ,
s2 (NOT a) OR x ,
END numero3 ,
Le SIGNAL x n`est ni une entree, ni une sortie, mais il a une realite physique. Ici x est utilise
par commodite, pour alleger l`ecriture de la sortie s2.
Un autre exemple :
s2
a
b
s1
c
x
LIBRARY ieee,
USE ieee.stdlogic1164.all,
USE ieee.stdlogicarith.all,
ENTITY ex3 IS
PORT (
a,b,c . IN STDLOGIC,
S1, S2 . OUT STDLOGIC
),
END ex3,
ARCHITECTURE archi1 OF ex3 IS
SIGNAL x . STDLOGIC,
BEGIN
x a AND b ,
s2 (NOT c) OR x ,
s1 x,
END archi1,
Le langage VHDL interdit d`utiliser une sortie pour generer de la logique. Concretement, ici
ecrire s2 (NOT c) OR s1 , conduirait a une erreur de compilation. La sortie s1 ne peut
pas se situer a droite du symbole d`aIIectation. Le signal x est ici un artiIice de description.
Physiquement, x et s1 sont sur la mme equipotentielle.
L`exemple precedent aurait pu tre traite plus simplement en Iaisant appel au type BUFFER.
Il s`agit d`une sortie physique que l`on peut utiliser pour generer de la logique (plus
concretement, que l`on peut trouver a droite du symbole ) :
Cours VHDL 7 J.M.
s2
a
b
s1
c
LIBRARY ieee,
USE ieee.stdlogic1164.all,
USE ieee.stdlogicarith.all,
ENTITY ex3 IS
PORT (
a,b,c . IN STDLOGIC,
S1 : BUFFER ;
S2 . OUT STDLOGIC
),
END ex3,
ARCHITECTURE archi2 OF ex3 IS
BEGIN
S1 a AND b ,
S2 (NOT c) OR S1 ,
END archi2,
4- Bus et nombres, oprateurs de test, oprateurs arithmtiques
Comment, en VHDL, deIinir des bus ?
Un 1
er
exemple (description VHDL et resultats de simulation) :
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY combi1 IS
PORT (
a :IN STDLOGICVECTOR(3 DOWNTO 0); -- bus 4 Iils
b :IN STDLOGICVECTOR(3 DOWNTO 0); -- bus 4 Iils
S : OUT STDLOGICVECTOR(11 DOWNTO 0); -- bus 12 Iils
T : OUT STDLOGICVECTOR(7 DOWNTO 0) -- bus 8 Iils
);
END combi1;
ARCHITECTURE archi OF combi1 IS
ALIAS op1:STDLOGICVECTOR (3 DOWNTO 0) IS S(3 DOWNTO 0);
ALIAS op2:STDLOGICVECTOR (3 DOWNTO 0) IS S(7 DOWNTO 4);
BEGIN
op1 a AND b;
op2 a OR '1010;
T a & b; -- concatenation
S(8) 1` WHEN a ~ b ELSE 0`;
S(9) 1` WHEN a '0000 ELSE 0`;
S(10) 1` WHEN a '0011 ELSE 0`;
S(11) `1` WHEN a '1001 ELSE 0`;
END archi;
Cours VHDL 8 J.M.
Conclusion:
- Le type STDLOGICVECTOR est utilise pour decrire des bus avec lesquels on
eIIectue des operations logiques. Les bus sur lesquels portent ces calculs doivent avoir la
mme taille.
- Les operations de comparaison sont possibles aussi, elles se Iont binaire naturel : les
resultats de simulation montrent que 0xA est superieur a 0x4.
- Les operations arithmetiques (addition, soustraction, multiplication, division) ne sont pas
possibles.
- Via la declaration ALIAS , on eIIectue des calculs sur une partie des bus.
- On peut acceder aux bus bit par bit.
- L`operateur DIFFERENT DE s`ecrit /
- Dans la declaration 3 DOWNTO 0 , le bit de poids Iort est le n3.
Un 2eme exemple (description VHDL et resultats de simulation) : le bus vu comme le nombre
entier qu`il permet de coder.
LIBRARY ieee,
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY combi2 IS
PORT (
a : IN INTEGER RANGE 0 TO 15; -- bus 4 Iils
b : IN INTEGER RANGE 0 TO 15; -- bus 4 Iils
c : IN INTEGR RANGE 8 TO 7 ; -- bus 4 Iils
U : OUT INTEGER RANGE 0 TO 15;
Y : OUT STDLOGICVECTOR(2 DOWNTO 0); -- bus 3 Iils
T : OUT INTEGER RANGE 0 TO 31 -- bus 5 Iils
);
END combi2;
ARCHITECTURE archi OF combi2 IS
BEGIN
U a - 4;
T a b;
Y(2) 1` WHEN a12 ELSE 0`; -- 12 est un nombre exprime en base 10
Y(1) 1` WHEN a ~ b ELSE 0`;
Y(0) 1` WHEN c~1 ELSE 0`; -
END archi;
Cours VHDL 9 J.M.
Conclusion:
- Le type INTEGER est utilise pour decrire des bus avec lesquels on eIIectue des
operations arithmetiques.
- Un INTEGER est signe. Il peut donc tre negatiI.
- Ainsi, les operations de comparaison sont possibles, elles se Iont binaire signe.
- Les operations logiques ne sont pas possibles.
- On ne peut pas acceder aux bus bit par bit.
- L`operateur DIFFERENT DE s`ecrit /
- Declarer un INTEGER RANGE 0 TO 200 ou bien un INTEGER RANGE 0 TO 255
revient au mme : cela creera un bus 8 Iils.
- Les additions se Iont avec generation de retenue. Les bus operandes doivent avoir la mme
taille. Le bus representant le resultat peut-tre de taille superieure.
- Certains compilateurs n`autorisent les multiplications ou divisions que par une puissance de
2 (c`est le cas du compilateur ALTERA).
- On ne peut pas combiner les INTEGER et les STDLOGICVECTOR. Si necessaire, on
utilise une Ionction de conversion. Ces Ionctions de conversion ne sont pas standards :
Si X est un bus 8 bits et Y un entier compris entre 0 et 255, on pourra ecrire (compilateur
ALTERA)
X CONJSTDLOGICJECTOR(Y,8) , pour utiliser X a la place de Y.
Exemple :
LIBRARY ieee,
USE ieee.stdlogic1164.all,
USE ieee.stdlogicarith.all,
ENTITY combi2bis IS
PORT (
a .IN INTEGER RANGE 0 TO 15, --4 bits
b .IN INTEGER RANGE 0 TO 15,
somme . OUT STDLOGICJECTOR(3 DOWNTO 0), -- 4 bits
nona . OUT STDLOGICJECTOR(3 DOWNTO 0) -- 4 bits
),
END combi2bis,
ARCHITECTURE archi OF combi2bis IS
SIGNAL xa . STDLOGICJECTOR(3 DOWNTO 0),
BEGIN
Cours VHDL 10 J.M.
-- somme a b , genere une erreur
somme CONJSTDLOGICJECTOR(a b, 4),
xa CONJSTDLOGICJECTOR(a,4), -- a et xa sont le mme bus
nona NOT(xa), -- loperation logique devient possible
END archi,
Il existe aujourd`hui 2 types permettant d`utiliser les operateurs arithmetiques et logiques, le
SIGNED INTEGER et le UNSIGNED INTEGER :
La declaration
a .IN STDLOGICJECTOR(8 DOWNTO 0), -- bus 8 fils
sera remplacee par
a .IN UNSIGNED INTEGER,
-- bus 8 fils, pouvant aussi tre interprete comme un nombre compris entre 0 et 255
ou bien par
a .IN STDLOGICJECTOR(3 DOWNTO 0),
-- bus 8 fils, pouvant aussi tre interprete comme un nombre compris entre -128 et 127
selon le besoin.
4- Constante
Une constante est un signal interne porte a un niveau logique Iixe. Elle se declare avec les
SIGNAL et s`utilise de la mme Iaon.
ARCHITECTURE archi OF exemple IS
SIGNAL x . STDLOGIC,
CONSTANT :ero . STDLOGIC . 0,
CONSTANT octet:ero . STDLOGICJECTOR (7 DOWNTO 0) . '00000000`,
5- WITH . SELECT
Comment decrire, de Iaon comportementale, une equation logique a plusieurs variables ?
Exemple: multiplexeur 1 voie parmi 4:
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
Cours VHDL 11 J.M.
e0
e1
s
c1
c0
e2
e3
ENTITY combi3 IS
PORT (
c :IN INTEGER RANGE 0 TO 3;
e : IN STDLOGICVECTOR(3 DOWNTO 0);
s : OUT STDLOGIC
);
ARCHITECTURE archi1 OF combi3 IS
BEGIN
WITH c SELECT
s e(0) WHEN 0,
e(1) WHEN 1,
e(2) WHEN 2,
e(3) WHEN 3;
END archi1;
Il Iaut mentionner tous les cas possibles, sinon une Ionction registre sera generee.
6- IF . ELSE - Notion de process
L`instruction WITH . SELECT est d`un usage limite. Elle ne permet de calculer qu`un seul
signal. Voici 2 structures plus elaborees :
Exemple: On reprend celui du multiplexeur 1 voie parmi 4:
e0
e1
s
c1
c0
e2
e3
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY combi3 IS
PORT (
c :IN INTEGER RANGE 0 TO 3;
e : IN STDLOGICVECTOR(3 DOWNTO 0);
s : OUT STDLOGIC
);
ARCHITECTURE archi2 OF combi3 IS
BEGIN
PROCESS (c)
BEGIN
IF (c 0) THEN s e(0);
ELSIF (c 1) THEN s e(1);
ELSIF (c 2) THEN s e(2);
Cours VHDL 12 J.M.
ELSE s e(3);
END IF;
END PROCESS;
END archi2;
Conclusion:
- Un PROCESS est un ensemble d`instructions qui doivent tre toutes analysees par le
compilateur pour generer la logique correspondante. Dans un PROCESS les instructions
ne sont plus concurrentes (ou paralleles), mais sequentielles. Elles doivent tre ecrites dans un
ordre bien determine.
- A la diIIerence de l`instruction WITH . SELECT plusieurs instructions peuvent tre ecrites
entre THEN et ELSE ou ELSIF . Elles sont separees par le symbole ;
- Comme vu precedemment, il Iaut envisager tous les cas possibles, sinon il y aura generation
d`une Ionction registre.
- La liste de signaux inscrits entre parentheses apres le mot PROCESS se nomme la liste
des sensibilites. Elle contient tous les signaux dont un changement d`etat inIlue sur la valeur
du signal que l`on calcule dans le PROCESS . Quand on genere de la logique
combinatoire, les signaux testes suIIisent. Elle ne peut pas contenir un signal de sortie que s`il
a ete declare BUFFER , . Elle peut tre vide. Si elle contient des signaux inutiles, ils sont
ignores par le compilateur.
- On peut eIIectuer un test sur plusieurs conditions :
PROCESS ( a, b)
BEGIN
IF (a 1` AND b 0`) THEN ...
- Les signaux testes peuvent tre
- des INTEGER par exemple IF a 3
- des STDLOGIC par exemple IF a 0`
- des STDLOGICVECTOR par exemple IF a 00100001
- On peut ajouter, dans le test, autant de parentheses que necessaire a la comprehension et a la
lisibilite.
7-CASE
Le mme exemple:
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
Cours VHDL 13 J.M.
ENTITY combi4 IS
PORT (
c :IN INTEGER RANGE 0 TO 3;
e : IN STDLOGICVECTOR(3 DOWNTO 0);
S : OUT STDLOGIC);
END combi4;
ARCHITECTURE archi OF combi4 IS
BEGIN
PROCESS (c)
BEGIN
CASE c IS
WHEN 0 ~ s e(0);
WHEN 1 ~ s e(1);
WHEN 2 ~ s e(2);
WHEN 3 ~ s e(3);
END CASE;
END PROCESS;
END archi;
Conclusion:
- Comme vu precedemment, il Iaut envisager tous les cas possibles, sinon il y aura generation
d`une Ionction registre.
- Si des cas ne sont pas listes, on utilise WHEN OTHERS ~ ..
- Les tests possibles sont les mmes qu`avec IF
- On peut ecrire autant d`instructions que necessaires entre ~ et WHEN . Elles sont
separees par le symbole ; .
- On peut au sein d`un bloc CASE introduire un bloc IF ou inversement, a condition
de respecter la hierarchie des blocs.
Exemple: multiplexeur une voie parmi 4 avec entree de validation:
Cours VHDL 14 J.M.
e0
e1
s
c1
c0
e2
e3
val
le multiplexeur Ionctionne si val vaut 1
sinon s vaut 0
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY combi5 IS
PORT (
val : IN STDLOGIC;
c :IN INTEGER RANGE 0 TO 3;
e : IN STDLOGICVECTOR(3 DOWNTO
0);
s : OUT STDLOGIC
);
END combi5;
ARCHITECTURE archi OF combi5 IS
BEGIN
PROCESS(c, val)
BEGIN
IF ( val 0` ) THEN s`0`;
ELSE
CASE c IS
WHEN 0 ~ s e(0);
WHEN 1 ~ s e(1);
WHEN 2 ~ s e(2);
WHEN 3 ~ s e(3);
END CASE;
END IF;
END PROCESS;
END archi;
8- Boucle et variable de boucle
On peut eIIectuer une iteration via une instruction de boucle et un compteur de boucle. La
variable servant de compteur de boucle est purement virtuelle, elle ne correspond a rien de
physique dans le Iutur circuit et ne doit pas tre declaree.
Exemple: codage de donnees:
Le cahier des charges est le suivant :
s0 a0
Cours VHDL 15 J.M.
pour i>0 S
i
a
i
. a
i-1
+ /a
i
. /a
i-1

4 4
a S
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY combi6 IS
PORT (
a: IN STDLOGICVECTOR(3 DOWNTO 0);
s : OUT STDLOGICVECTOR(3 DOWNTO 0)
);
END combi6;
ARCHITECTURE archi OF combi6 IS
BEGIN
s(0) a(0);
PROCESS
BEGIN
FOR i IN 1 TO 3 LOOP
S(i) (a(i) AND a(i-1)) OR ( NOT a(i) AND NOT a(i-1));
END LOOP;
END PROCESS;
END archi;
Dans cet exemple, la liste de sensibilites est vide. Aucun signal n`est teste dans le PROCESS.
9- Notion de variable
On peut utiliser une variable (en generale entiere), pour que le compilateur puisse eIIectuer
des calculs intermediaires. Cette variable ne correspond a rien de physique. Elle est utilisee
par le compilateur pour synthetiser la logique de l`application. Cette variable sera Iorcement
localisee dans un PROCESS.
Exemple: un autre codage de donnees:
Le cahier des charges est le suivant : le nombre S en sortie indique, en binaire, le nombre de
signaux d`entree a 1.
Si a 1001 alors S 010
Cours VHDL 16 J.M.
Si a 1100 alors S 010
Si a 1111 alors S 100
4 3
a S
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY combi7 IS
PORT (
a: IN STDLOGICVECTOR(3 DOWNTO 0);
S : OUT INTEGER RANGE 0 TO 4
);
END combi7;
ARCHITECTURE archi OF combi7 IS
BEGIN
PROCESS(a)
VARIABLE resultat : INTEGER;
BEGIN
resultat : 0;
FOR i IN 0 TO 3 LOOP
IF (a (i) 1`) THEN
resultat : resultat 1;
END IF;
END LOOP;
s resultat;
END PROCESS;
END archi;
Conclusion:
- Cet exemple pourrait aussi tre decrit via une table de verite grce a l`instruction CASE .
- On peut ici preciser la notion de PROCESS : le compilateur prend en compte la totalite
du PROCESS, et genere la logique correspondante. On peut Iaire cohabiter plusieurs
PROCESS dans un mme programme VHDL. Ils deviennent concurrents : les logiques
correspondantes sont generees independamment l`une de l`autre.
- D`un point de vue methodologique, on essaiera toujours de decomposer une application de
logique en blocs Ionctionnels. A chaque bloc, correspondra, si necessaire, un PROCESS.
Exemple:
Cours VHDL 17 J.M.
A
8
B
8
8
S
OV
A, B, S en binaire sign
S = A plus B
OV vaut 1 s 'il y a
dpassement de
capacit Comp= 1ssiA > B
Comp
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY combi8 IS
PORT (
a,b: IN INTEGER RANGE -128 TO 127;
s : BUFFER INTEGER RANGE -128 TO 127;
OV, Comp : OUT STDLOGIC
);
END combi8;
ARCHITECTURE archi OF combi8 IS
BEGIN
s a b; -- 1er bloc Ionctionnel
PROCESS (a,b,s) -- 2eme bloc Ionctionnel
BEGIN
IF (a~0 AND b~0 AND s 0) THEN OV '1';
ELSIF (a0 AND b0 AND s ~0) THEN O '1';
ELSE OV '0';
END IF;
END PROCESS;
PROCESS (a,b) -- 3eme bloc Ionctionnel
BEGIN
IF a~b THEN Comp '1' ; ELSE Comp '0' ;
END PROCESS;
END archi;
Dans cet exemple on aurait pu ecrire le 3
eme
bloc Ionctionnel sous la Iorme :
Comp 1` WHEN a~b ELSE 0` ;
Sans passer par un PROCESS.
10 - Le problme des glitches
Il s`agit d`impulsions parasites generees lorsque des portes situees sur le mme etage de
logique ont des temps de propagation diIIerents, et lorsque plusieurs entrees changent d`etat
en mme temps.
Les operations arithmetiques sont tres generatrices de glitches
Exemple:
Cours VHDL 18 J.M.
s2
a
b
s1
porte parIaite,
pas de temps de propagation
temps de propagation de 2 ns
t
a
t
b
S2 theorique
S1 reel
t
t
t
S2 reel
impulsion parasite de 2 ns
Exemple en VHDL :
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY combi9 IS
PORT (
a,b: IN STDLOGIC;
s1 : BUFFER STDLOGIC;
s2 : OUT STDLOGIC;
x,y : IN INTEGER RANGE 0 TO 255;
somme : OUT INTEGER RANGE 0 TO 511
);
END combi9;
ARCHITECTURE archi OF combi9 IS
BEGIN
somme x y;
s1 NOT a;
s2 s1 OR b;
END archi;
Remede :
On ne cherche en general pas a supprimer ces impulsions parasites. La tendance actuelle est
de synchroniser toutes les sorties via des bascules D, a une Irequence d`horloge suIIisamment
Iaible pour rendre les glitches invisibles , et suIIisamment rapide pour satisIaire aux
exigences temporelles de l`application.
Cours VHDL 19 J.M.
LOGIQUE SEQUENTIELLE
1- Bascule D LATCH
d
ena
q
Si ena 0, la sortie q est Iigee.
Si ena 1, la sortie q recopie l`entree d.
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY seq1 IS
PORT (
d,ena : IN STDLOGIC;
q: BUFFER STDLOGIC
);
END seq1;
ARCHITECTURE archi OF seq1 IS
BEGIN
PROCESS (ena,d)
BEGIN
IF ena 1` THEN q d;
ELSE q q;
END IF;
END PROCESS;
END archi;
Remarques:
- Le signal de sortie q est declare de type BUFFER pour ecrire q < q ;
- En VHDL, dans les instructions IF . ELSE et CASE , les cas non mentionnes
generent l`eIIet memoire. Le PROCESS precedent pourrait tre ecrit ainsi :
- Quand on genere de la logique sequentielle, il Iaut mentionner dans la liste de sensibilites du
PROCESS, tous les signaux qui inIluent sur ce que l`on calcule.
PROCESS (ena,d)
BEGIN
IF ena 1` THEN test d;
END IF;
END PROCESS;
Dans ce cas, q est declare comme un signal de type OUT.
Cours VHDL 20 J.M.
2- Bascule D Edge Triggered
d
H
q
Au Iront d`horloge, la sortie q recopie l`entree
d.
Entre 2 Ironts d`horloge, la sortie q est Iigee.
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY seq2 IS
PORT (
d, h: IN STDLOGIC;
q: OUT STDLOGIC
);
END seq2;
ARCHITECTURE archi OF seq2 IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL h`1`;
q d;
END PROCESS;
END archi;
Conclusion:
Ici, l`execution du PROCESS est suspendue jusqu`au passage de 0 a 1 du signal
d`horloge.
Le PROCESS ne comporte pas de liste de sensibilites. On utilise l`instruction WAIT
lorsque l`on veut generer de la logique totalement synchrone.
Cours VHDL 21 J.M.
3- Bascule D avec entres de prpositionnement asynchrones :
d
H
q
prn
cln
Si prn cln 1, la bascule
Ionctionne comme precedemment.
Si cln 0, la sortie q est mise a 0,
independamment des autres entrees.
Si cln 1 et prn 0, la sortie q
est mise a 1, independamment
des autres entrees.
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY seq3 IS
PORT (
d, h: IN STDLOGIC;
Prn, Cln : IN STDLOGIC;
q: OUT STDLOGIC
);
END seq3;
ARCHITECTURE archi OF seq3 IS
BEGIN
PROCESS ( Prn, Cln, h)
BEGIN
IF Cln 0` THEN q 0`;
ELSIF Prn 0` THEN q 1`;
ELSIF h`EVENT AND h 1` THEN q d;
END IF;
END PROCESS;
END archi;
Conclusion:
- Le PROCESS n`est plus totalement synchrone.
- L`instruction IF h`EVENT AND h 1` permet de detecter un Iront montant d`horloge.
Cours VHDL 22 J.M.
4-Registre parallle
Les registres paralleles sont constitues de bascules dont les signaux de contrle sont communs
(ena, H, Cln, Prn). Leur description VHDL se deduit immediatement de celle des bascules.
Ci-dessous pour un registre 8 bits actiI sur Iront d`horloge, sans signaux asynchrones :
d
H
q
8 8
Au Iront d`horloge, le bus de
sortie q recopie le bus d`entree d.
Entre 2 Ironts d`horloge, le bus
de sortie q est Iige.
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY seq4 IS
PORT (
h: IN STDLOGIC;
d : IN STDLOGICVECTOR (7 DOWNTO 0);
q: OUT STDLOGICVECTOR (7 DOWNTO 0)
);
END seq4;
ARCHITECTURE archi OF seq4 IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL h`1`;
q d;
END PROCESS;
END archi;
Conclusion:
On pourra, sur le modele des diIIerentes bascules D, deIinir un registre de type LATCH, ou
bien des entrees de pre positionnement asynchrones.
Cours VHDL 23 J.M.
5-Suppression des glitches gnrs par de la logique combinatoire, par
synchronisation des sorties sur un signal d`horloge:
On reprend une partie de l`exemple COMBI9 :
x
8
y
8
9
Somm
COMBI9
SEQ4
SEQ5
D
Q
9
Rsultat
x+y
synchronis
H
H
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY seq5 IS
PORT (
x,y: IN INTEGER RANGE 0 TO 255;
h: IN STDLOGIC;
resultat : OUT INTEGER RANGE 0 TO 511
);
END seq5;
ARCHITECTURE archi OF seq5 IS
SIGNAL somme: INTEGER RANGE 0 TO
511;
BEGIN
somme x y;
PROCESS -- synchronisation
BEGIN
WAIT UNTIL h '1';
resultat somme;
END PROCESS;
END archi;
Conclusion :
Les glitches ont disparu !
Les sorties changent d`etat au Iront d`horloge.
Cours VHDL 24 J.M.
6-Compteur
Les compteurs decrits ci-dessous reposent sur le principe suivant :
- La sortie du compteur est prise a la sortie d`un registre parallele.
- L`entree de ce registre est commandee par le resultat d`une addition : la sortie du registre 1.
d
H
q
8 8
s a b
8
a
Sortie du compteur
00000001
H
additionneur
registre
compteur 8 bits
b
8
Un premier compteur 3 bits simple, sans remise a 0, construit sur le modele de SEQ2 :
H
q
3
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY seq6 IS
PORT (
h: IN STDLOGIC;
q: BUFFER INTEGER RANGE 0 TO 7
);
END seq6;
ARCHITECTURE archi OF seq6 IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL h`1`;
q q 1;
END PROCESS;
END archi;
Conclusion :
Pour pouvoir ecrire q q 1 ; on a declare q comme BUFFER.
Cours VHDL 25 J.M.
Un deuxieme compteur 3 bits, avec remise a 0 asynchrone, construit sur le modele de SEQ3 :
H
q
3
cln
ENTITY seq7 IS
PORT (
h, Cln: IN STDLOGIC;
q: BUFFER INTEGER RANGE 0 TO 7
);
END seq7;
ARCHITECTURE archi OF seq7 IS
BEGIN
PROCESS (Cln, h)
BEGIN
IF Cln 0` THEN q 0;
ELSIF h`EVENT AND h 1` THEN q q 1;
END IF;
END PROCESS;
END archi;
Conclusion :
Comme precedemment, il Iaut declarer q en tant que BUFFER.
Un compteur DCBN a un chiIIre :
Ce compteur s`incremente sauI quand il atteint 9. Ce qui revient a l`organigramme suivant :
Avant le Iront d'horloge
Compteur 9 ?
Apresle Iront d'horloge
Compteur 0
Apres le Iront d'horloge
Compteur Compteur 1
LIBRARY ieee,
USE ieee.stdlogic1164.all,
USE ieee.stdlogicarith.all,
ENTITY seq7bis IS
PORT (
h. IN STDLOGIC,
Cours VHDL 26 J.M.
H
q
4
cln
q. BUFFER INTEGER RANGE 0 TO 9 ),
END seq7bis,
ARCHITECTURE archi OF seq7bis IS
BEGIN
PROCESS
BEGIN
WAIT until h1,
IF q 9 THEN q 0,
ELSE q q 1,
END IF,
END PROCESS,
END archi,
A partir de ces 3 modeles et des outils combinatoires, on pourra multiplier les options :
compteur/decompteur, compteur prepositionnable, compteur DCBN, signalisation de Iin de
comptage etc .
On veillera a toujours ecrire un organigramme avant de se lancer dans la redaction de ce type
de compteur.
Cours VHDL 27 J.M.
GRAPHE D`ETATS
Le modele choisi est celui de Machine de MOORE : Les etats sont codes en binaire (bits
d`etat). Ce code est materialise par les sorties d`un registre.
Les sorties du systeme sont des Ionctions combinatoires des bits d`etat.
L`etat Iutur du systeme est calcule par une Ionction combinatoire dependant de l`etat actuel et
des entrees.
Une entree de remise a 0 synchrone est prevue, permettant le retour a l`etat initial a tout
moment (apres un Iront d`horloge).
d
H
q
p
sorties du
systeme
H
registre
Machine de MOORE
n
logique combinatoire
n m
bits d `etat
etat actuel du systeme
logique combinatoire
entrees du
systeme
etat Iutur du systeme
calcul de
l `etat Iutur
calcul des
sorties
Si necessaire, les sorties du systeme peuvent tre resynchronisees sur l`horloge, via un
registre.
Exemple :
0
/a./b./c
3
a./b. c
2
a./b./c
1
/a. b. c
4
/a. b. c
y./init
/y./init
init x./init
init init
z./init
z./init
init init
/z./init
/z./init
/init
init /x
Cours VHDL 28 J.M.
Une description totalement synchrone :
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY seq8 IS -- machine d`etats
PORT ( h, x, y, z, init : IN STDLOGIC;
a, b, c : OUT STDLOGIC);
END seq8;
ARCHITECTURE archi OF seq8 IS
SIGNAL etat : INTEGER RANGE 0 TO 7;
BEGIN
PROCESS
BEGIN
WAIT UNTIL h 1`;
CASE etat IS
WHEN 0 ~ IF init 0` AND x 1` THEN etat 1;
END IF;
WHEN 1 ~ IF init `1` THEN etat 1 ;
ELSIF y 1` THEN etat 3 ;
ELSE etat 2 ;
END IF;
WHEN 2 ~ IF init `1` THEN etat 0 ;
ELSIF z 1` THEN etat 4 ;
END IF;
WHEN 3~ IF init `1` THEN etat 0 ;
ELSIF z 1` THEN etat 4 ;
END IF;
WHEN 4 ; ~ IF init `1` THEN etat 0 ;
END IF;
WHEN OTHERS ~ etat 0 ; -- pour envisager les etats non decrits
END CASE;
END PROCESS;
a 1` WHEN etat 2 OR etat 3 ELSE 0`; -- Equation des sorties
b 1` WHEN etat 1 OR etat 4 ELSE 0`;
c 1` WHEN etat 1 OR etat 3 OR etat 4 ELSE 0`;
END archi;
H
a
b
c
x
y
z
Init
Cours VHDL 29 J.M.
Le mme exemple en deIinissant un type etat :
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY seq9 IS -- machine d`etats
PORT ( -- autrement
h, x, y, z, init : IN STDLOGIC;
a, b, c : OUT STDLOGIC
);
END seq9;
ARCHITECTURE archi OF seq9 IS
TYPE STATETYPE IS (s0,s1,s2,s3,s4);
SIGNAL etat : STATETYPE;
BEGIN
PROCESS
BEGIN
WAIT UNTIL h 1`;
CASE etat IS
WHEN s0 ~ IF init 0` AND x 1` THEN etat s1;
END IF;
WHEN s1 ~ IF init `1` THEN etat s0;
ELSIF y 1` THEN etat s3;
ELSE etat s2;
END IF;
WHEN s2 ~ IF init `1` THEN etat s0;
ELSIF z 1` THEN etat s4;
END IF;
WHEN s3 ~ IF init `1` THEN etat s0;
ELSIF z 1` THEN etat s4;
END IF;
WHEN s4 ~ IF init `1` THEN etat s0;
END IF;
WHEN OTHERS ~ etat s0; -- pour envisager les etats non decrits
END CASE;
END PROCESS;
-- Equation des sorties
a 1` WHEN etat s2 OR etat s3 ELSE 0`;
b 1` WHEN etat s1 OR etat s4 ELSE 0`;
c 1` WHEN etat s1 OR etat s3 OR etat s4 ELSE 0`;
END archi;
Conclusion :
Le nom des etats peut tre quelconque : debut , demarrage , vitesse etc .
Il s`agit d`un type enumere, qui generera des entiers prenant la valeur 0, 1, 2 etc .
Cours VHDL 30 J.M.
Le mme exemple avec un signal de remise a zero asynchrone :
d
H
q
p
sorties du
systeme
H
registre
Machine de MOORE
n
logique combinatoire
n m
bits d `etat
etat actuel du systeme
logique combinatoire
entrees du
systeme
etat Iutur du systeme
calcul de
l `etat Iutur
calcul des
sorties
Reset
Init
Le graphe d`etats se simpliIie comme ci-dessous :
0
/a./b./c
3
a./b. c
2
a./b./c
1
/a. b. c
4
/a. b. c
y
/y.
x
z
z
/z
/z
/x
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
ENTITY seq10 IS -- machine d`etats
PORT ( -- avec reset asynchrone
h, x, y, z, init : IN STDLOGIC;
a, b, c : OUT STDLOGIC
);
END seq10;
ARCHITECTURE archi OF seq10 IS
TYPE STATETYPE IS (s0,s1,s2,s3,s4);
SIGNAL etat : STATETYPE;
BEGIN
PROCESS (h,init,x,y,z,etat)
BEGIN
IF init `1` THEN etatS0; --Reset asynchrone
Cours VHDL 31 J.M.
ELSIF h`EVENT AND h`1` THEN
CASE etat IS
WHEN s0 ~ IF x 1` THEN etat s1;
END IF;
WHEN s1 ~ IF y 1` THEN etat s3;
ELSE etat s2;
END IF;
WHEN s2 ~ IF z 1` THEN etat s4;
END IF;
WHEN s3 ~ IF z 1` THEN etat s4;
END IF;
WHEN s4 ~ etat s4;
WHEN OTHERS ~ etat s0, -- pour envisager les etats non decrits
END CASE,
END IF;
END PROCESS;
-- Equation des sorties
a 1` WHEN etat s2 OR etat s3 ELSE 0`;
b 1` WHEN etat s1 OR etat s4 ELSE 0`;
c 1` WHEN etat s1 OR etat s3 OR etat s4 ELSE 0`;
END archi;
Cours VHDL 32 J.M.
LIGNE 3 ETATS
La ligne S1 ci-dessous, peut-tre utilisee
1- Comme une entree , on a alors S2 S1 c. La porte 3 etats doit tre placee en haute
impedance via la commande CS (a 0).
2- Comme une sortie , on a alors S1 a.b, et S2 a.b c. La porte 3 etats doit tre placee en
basse impedance via la commande CS (a 1).
Elle sera declare selon le type INOUT.
LIBRARY ieee;
USE ieee.stdlogic1164.all;
USE ieee.stdlogicarith.all;
LIBRARY altera;
USE altera.maxplus2.all; -- contient la primitive TRI
ENTITY trivhd IS
PORT (
a,b,c,CS :IN STDLOGIC;
S2 : OUT STDLOGIC;
S1: INOUT STDLOGIC
);
END trivhd;
ARCHITECTURE archi OF trivhd IS
SIGNAL X: STDLOGIC;
BEGIN
S2 S1 OR c ;
X a AND b;
MonbuIIer : TRI PORT MAP (x, cs, S1); -- utilisation de la primitive TRI
END archi; -- on passe les parametres speciIies dans la doc
-- on peut retrouver la declaration de la primitive dans
-- c:\maxplus2\vhdl93\altera\maxplus2.vhd
Cours VHDL 33 J.M.

S-ar putea să vă placă și