Академический Документы
Профессиональный Документы
Культура Документы
DX
9+'/
rvq (('
8Br
Introduction au VHDL
eivd
22 juin 1998
,1752'8&7,21
Cette introduction VHDL n'a pas la prtention de couvrir tous les aspects de ce langage.
En fait, elle suppose une connaissance pralable du langage ADA. Nous nous attarderons
d'avantage sur une mthode de travail avec le VHDL que sur la grammaire de ce langage.
Il existe pour cette dernire une quantit de livres dont certains sont cits dans la
bibliographie en fin de manuel. De plus, pour une rfrence sre, il est galement possible
de commander la norme VHDL 1993 (IEEE 1164).
Ce cours d'introduction se compose de trois modules :
1) une prsentation gnrale du langage qui permet dcrire trs rapidement des applications
simples.
2) une partie plus pousse sur le langage oriente vers lcriture de programmes plus
complexes.
3) une srie dexemples utilisables, de procdures utiles et de trucs et astuces.
%S@ACDTUPSDRV@
Le VHDL - WHSIC (Very High Speed Integrated Circuit) Cardware 9escription Ganguage
, linstar de lADA, a t demand par le DOD (Dpartement de la dfense amricain)
pour dcrire les circuits complexes, de manire tablir un langage commun avec ses
fournisseurs. Cest un langage, standard IEEE 1076 depuis 1987, qui aurait du assurer la
portabilit du code pour diffrents outils de travail (simulation, synthse pour tous les
circuits et tous les fabricants). Malheureusement, ce nest pour linstant pas le cas, bien que
plusieurs vendeurs aient tendance se rapprocher du VHDL utilis par Synopsis.
Une mise jour du langage VHDL sest faite en 1993 (IEEE 1164) et en 1996, la norme
1076.3 a permis de standardiser la synthse VHDL.
8UDGDUe9V9+'/
Le VHDL est un langage de spcification, de simulation et galement de conception.
cgx
v.1
1.1 (2)
Introduction au VHDL
eivd
22 juin 1998
Contrairement dautres langages (CUPL, ABEL) qui se trouvaient tre en premier lieu des
langages de conception, VHDL est dabord un langage de spcification. La normalisation
a dabord eu lieu pour la spcification et la simulation (1987) et ensuite pour la synthse
(1993). Cette notion est relativement importante pour comprendre le fonctionnement du
langage et son volution. Grce la normalisation, on peut tre certain quun systme dcrit
en VHDL standard est lisible quel que soit le fabricant de circuits. Par contre, cela demande
un effort important aux fabricants de circuits pour crer des compilateurs VHDL adapts
et autant que possible optimiss pour leurs propres circuits.
!
Tppvsvphv
Etabli en premier lieu pour de la spcification, cest dans ce domaine que la norme est
actuellement la mieux tablie. Il est tout--fait possible de dcrire un circuit en un VHDL
standard pour quil soit lisible de tous. Certains fabricants (de circuits ou de CAO) adaptent
ce langage pour donner lutilisateur quelques facilits supplmentaires, au dtriment de la
portabilit du code. Heureusement, il y a une nette tendance de la part des fabricants revoir
leurs positions et uniformiser le VHDL. Le rapprochement se fait, comme prcit, autour
du VHDL de Synopsis. Il est donc probable que lon sapproche dun vrai standard VHDL
et non plus dun standard thorique. Il y aura toujours des ajouts de la part des fabricants,
mais il ne sagira plus dune modification du langage (aussi lgre soit elle), mais de macros
offertes lutilisateur pour optimiser le code VHDL en fonction du circuit cible (en vue de
la synthse).
Cette possibilit de dcrire des circuits dans un langage universel est aussi trs pratique pour
viter les problmes de langue. De longues explications dans une langue peuvent ainsi tre
compltes par du code VHDL pour en faciliter la comprhension.
!!
Tvyhv
Le VHDL est galement un langage de simulation. Pour ce faire, la notion de temps, sous
diffrentes formes, y a t introduite. Des modules, destins uniquement la simulation,
peuvent ainsi tre crs et utiliss pour valider un fonctionnement logique ou temporel du
code VHDL.
La possibilit de simuler avec des programmes VHDL devrait considrablement faciliter
lcriture de tests avant la programmation du circuit et viter ainsi de nombreux essais sur
un prototype qui sont beaucoup plus coteux et dont les erreurs sont plus difficiles
trouver.
cgx
v.1
1.2 (3)
Introduction au VHDL
eivd
22 juin 1998
Bien que la simulation offre de grandes facilits de test, il est toujours ncessaire de
concevoir les circuits en vue des tests de fabrication, cest--dire en permettant laccs
certains signaux internes.
!"
8prv
Le VHDL permet la conception de circuits avec une grande quantit de portes. Les circuits
actuels comprennent, pour les FPGA par exemple, entre 500 et 100'000 portes et ce nombre
augmente trs rapidement. Lavantage dun langage tel que celui-ci par rapport aux langages
prcdents de conception matrielle est comparable lavantage dun langage informatique
de haut niveau (Pascal, ADA, C) vis--vis de lassembleur. Ce qui veut aussi dire que malgr
lvolution fulgurante de la taille des circuits, la longueur du code VHDL na pas suivi la
mme courbe. Cependant, ce langage tant conu en premier lieu pour de la spcification,
certaines variantes du langage ne sont pour l'instant pas utilisables pour la conception.
Il faut noter que lorsquil sagit de concevoir quelque chose en VHDL, il ne faut pas le faire
tte baisse. Le VHDL, bien que facilement accessible dans ses bases, peut devenir
extrmement compliqu sil sagit doptimiser le code pour une architecture de circuit. Cest
pour cette raison que de plus en plus de fabricants offrent des macros, gratuites pour les
fonctions sans grandes difficults et payantes pour les autres. Donc avant de concevoir une
ALU, un processeur RISC, une interface PCI ou dautres lments de cette complexit, il
peut tre judicieux de choisir un circuit cible en fonction des besoins et dacheter la macro
offerte par le constructeur. Il est bien vident quil faudra valuer les besoins (performance
du code ncessaire, quantit de pices produire) et le cot dune telle macro.
cgx
v.1
1.3 (4)
Introduction au VHDL
eivd
22 juin 1998
6rhiyvr)
ADA est un langage pour crire des logiciels, VHDL est destin dcrire, simuler et
synthtiser des circuits. Il faut toujours faire attention ce que lon veut faire lorsque lon
programme en VHDL, sinon de mauvaises surprises peuvent apparatre.
6USV8UVS@9@TQSPBS6HH@T
La structure est celle de l'ADA. Par contre, VHDL a des particularits spcifiques la
modlisation de circuits. De nouveaux types sont dfinis, ainsi que de nouveaux mots
rservs. Ceux-ci sont directement lis laspect physique de la conception de circuits. De
plus, la notion de temps intervient dans le VHDL de la mme manire que dans la ralit.
/@TTDBI6VY
Un nouveau mot rserv fait son apparition avec VHDL, il sagit du mot vthy. Il permet
de dsigner les signaux qui seront utiliss dans le circuit intgr. Certains types particuliers,
souvent des types numrs, sont utiliss pour un signal. Par exemple le type BIT (0,1),
qui est pr-dfini en VHDL, ou des types plus complets comme le BIT_ETENDU
(0,1,X,Z). [BIT_ETENDU nest pas un type prdfini en VHDL]
cgx
v.1
2.1 (5)
Introduction au VHDL
eivd
22 juin 1998
7`Q@TQC`TDRV@T
De nouveaux types, les types physiques (distance, capacit, rsistance, ...), permettent de
dfinir des valeurs concrtes et de calculer partir de celles-ci. Certains de ces types seront
donns dans les annexes, ainsi que des exemples de calculs. Pour illustrer cela, un exemple
est donn ci-dessous pour reprsenter les temps. Ce type est prdfini en VHDL.
U`Q@ time DTS6IB@ -9_223_372_036_854_775_808 UP
9_223_372_036_854_775_807
VIDUT fs;
ps=1000 fs;
ns=1000 ps;
us=1000 ns;
ms=1000 us;
sec=1000 ms;
min=60 sec;
hr=60 min;
---------
@I9VIDUT;
Ce type est pr-dfini cause de la notion de temps qui a t ajoute au VHDL. Lunit de
base est la femtoseconde et toutes les autres units sont dfinies partir de celle-ci. De
mme les autres types physiques se dfinissent partir dune unit et on peut rfrencer
toutes les autres la premire. Il sera donc possible de reprsenter, par exemple, la dure
de la charge dun condensateur qui se trouverait lentre du circuit intgr, ce qui rendra
les simulations de plus en plus ralistes.
1PUDPI9@U@HQT
Un ajout important du VHDL par rapport lADA est la notion de temps. Si celle-ci
apparat quand mme dans lADA, mais de manire lie lhorloge, elle sexprime en units
de temps sous VHDL qui pourraient tout aussi bien tre convertis en pas de simulation.
Cette notion permet de tenir compte des temps de retard des portes logiques ou de crer des
programmes pour la simulation des circuits.
Il faut galement savoir qu chaque assignation de signal, cette notion de temps est utilise.
Pour mieux comprendre cela, quelques exemples sont donns ci-dessous avec leurs
particularits.
r h;25i0
cgx
v.1
2.2 (6)
Introduction au VHDL
eivd
22 juin 1998
r h;25i$)7(50
Les deux assignements ci-dessus ont exactement la mme signification. On appelle temps
delta le temps nul, quil soit reprsent ou non par le code after 0ns. En effet, il est
impossible pour un systme dvaluer immdiatement une sortie, par consquent on place
sur la droite de lquation (A$B) la valeur future quaura la partie gauche de lquation
(Somme), avec le temps de retard impos par la logique ncessaire. Il est tout--fait
possible, pour une simulation, que lon ne dsire pas tenir compte des temps de transfert des
portes, on crira alors les quations sous lune des deux formes ci-dessus, mais nous aurons
alors une simulation purement fonctionnelle. La figure 2 reprsente le temps de rponse de
la sortie et ce qui sera affich lors dune simulation si lon choisi un temps de 0ns.
Dhtr!
r h;25i$)7(5 0
Cette quation indique que la valeur future de Somme vaut A$B, cette modification
interviendra 10ns aprs un changement sur lune des deux variables.
!#
9rrqrqpyhv)vrvryrh
Ci-dessus, nous avons vu la possibilit davoir un dlai entre laction sur lentre et laction
sur la sortie et cela sans nous occuper de quelle manire ce dlai tait utilis. Il existe deux
types de dlais en VHDL, lun agit soit comme un retard, soit comme un filtre (le dlai
inertiel) et lautre comme un retard pur (le dlai transport).
cgx
v.1
2.3 (7)
Introduction au VHDL
!#
eivd
22 juin 1998
Grqpyhvvrvry
Le dlai inertiel est le dlai dfini par dfaut dans VHDL. Il peut scrire de deux manires:
somme
somme
Il agit comme un filtre, cest--dire que toutes les impulsions de dure infrieure celle
indique sont supprimes. Celles qui sont gales ou suprieures sont retardes de cette
valeur. Les deux exemples ci-dessous reprsentent mieux cela.
Exemple 1 :
somme
Dhtr"
Il est possible de voir dans cet exemple que limpulsion qui se trouve 35ns et qui ne dure
que 7.5ns est limine car elle est infrieure aux 10ns spcifies. Le reste du signal est
report de 10ns.
Exemple 2:
retard
cgx
v.1
2.4 (8)
Introduction au VHDL
eivd
22 juin 1998
Dhtr#
A nouveau, cet exemple montre que limpulsion 35ns et ne durant que 5ns nest pas prise
en compte et laisse le signal de sortie la valeur 1 avec toujours le mme retard de 10ns. Il
est impratif de lire ces diagrammes temporels de gauche droite, sinon on commettra
l'erreur de vouloir supprimer limpulsion 1 qui se trouve 40ns et qui dure 2.5ns.
!# !
Grqpyhvh
somme
Avec ce type de dlai, toutes les impulsions sont transmises, mais avec le retard indiqu. Il
faut toujours prendre garde placer le mot-cl h si lon veut un retard pur sans
soccuper de filtrer des impulsions de dure infrieure celle indique.
figure 4
cgx
v.1
2.5 (9)
Introduction au VHDL
eivd
22 juin 1998
La mme impulsion 35ns durant 7.5ns qui avait t supprime en dlai inertiel est
conserve ci-dessus. Seul le retard de 10ns subsiste.
!#!
Vvyvhvqrrvrrhq
Une dernire question subsiste : pourquoi avoir dfini cette notion de temps ?
Deux raisons principales cela :
Premirement tout circuit rel a des temps de retard et il faut bien les exprimer dune
manire ou dune autre.
Deuximement, la notion de temps est ncessaire pour la simulation.
Il semble vident quun circuit logique gnre un retard entre son entre et sa sortie,
cependant, jusqu prsent aucun compilateur ne tenait compte de ce facteur. Etant donn
que VHDL a aussi t conu pour la simulation, il est dsormais possible den tenir compte
la conception dj. Le temps indiqu pour un retard sera alors utilis par la simulation pour
rendre celle-ci plus raliste. Il est bien entendu que ces temps ne sont utiliss que pour la
simulation. La synthse n'en tiendra pas compte. Il n'est, par consquent, pas possible de
gnrer un signal dhorloge enVHDL.
Figure 6
Sur la figure 6, qui reprsente un additionneur 1 bit, il y a deux portes logiques. Pour dcrire
un tel systme, il est possible dvaluer le retard de chacune des portes pour lintroduire
dans le code VHDL de la manire suivante :
somme 12 a YPS b 6AU@S 5ns;
report 12 a 6I9 b 6AU@S 4ns;
Ce code indiquera au simulateur les temps de propagation lis aux diffrentes fonctions du
cgx
v.1
2.6 (10)
Introduction au VHDL
eivd
22 juin 1998
circuit. Par contre, il ne sera pas tenu compte de ces temps pour crer le fichier qui sera
utilis pour la programmation du circuit. Le circuit aura les retards rels gnrs par ses
portes internes.
!#"
Vvyvhvqrqyrqrvyhv
VHDL permet de crer des modules qui ne servent qu simuler un systme. Dans ces
modules apparatront une suite de modifications des signaux dentre du systme qui
viteront au concepteur de les entrer manuellement. Un exemple trs simple est donn ciaprs, mais ce point sera trait plus tard dans ce cours. Cet exemple gnre un fichier
dentre pour le schma de la figure 6.
a 12 0 6AU@S 0ns,1 6AU@S 100ns,0
300ns;
b 12 0 6AU@S 0ns,1 6AU@S 200ns;
(WeI@H@IUT@UUS6IT68UDPIT
Dans un programme concurrent, cest la modification dun signal qui dclenche
lexcution du code. Deux types de modifications existent et sont dfinis sous les noms de
hhpv et pprr. Une dfinition de ces deux termes suffira au lecteur pour
reconnatre ce qui se cache sous chacun d'eux.
Evnement :
Transaction : une transaction a lieu lorsquune valeur est assigne un signal aprs un
temps donn. Si la valeur du signal est diffrente de celle qu'il avait
prcdemment (l'instant d'avant), alors elle gnre un vnement.
cgx
v.1
2.7 (11)
Introduction au VHDL
eivd
22 juin 1998
1PUDPI9
@Ye8VUDPI8PI8VSS@IU@@UTeRV@IUD@GG@
Dans un langage informatique, toutes les instructions se droulent de manire squentielle.
Par contre sur un circuit intgr, toutes les portes fonctionnent simultanment et tous les
signaux sont transmis de manire concurrente. Cest une erreur trs frquente dans un
langage de modlisation de circuits comme le VHDL quil y ait des confusions entre les
deux notions.
Pour viter celles-ci par la suite, une dfinition de quelques termes est donne ici.
Programme concurrent :
Programme squentiel :
Systme combinatoire :
Systme squentiel :
Pour linstant, il ne sera pas parl de la manire de coder en VHDL des systmes
combinatoires et squentiels. Ceci sera trait par la suite dans ce cours. Par contre quelques
notions seront donnes pour mieux discerner la manire dcrire du code pour des lments
concurrents par rapport un programme informatique, qui se veut squentiel. Prenons des
exemples, lun concurrent et lautre squentiel.
cgx
v.1
2.8 (12)
Introduction au VHDL
!%
eivd
22 juin 1998
Qthrjrppvpprr)
1234567-
Dhtr&
Sur cette figure n 7, le rsultat des oprations est donn de manire brute sans voir de
quelle manire elles ont eu lieu. Une autre figure ci-dessous reprsente les mmes
oprations, mais cette fois-ci en indiquant tous les changements qui ont lieu, ce qui
permettra de voir que lordre des oprations dans un programme concurrent na aucune
importance, ce qui en complique gnralement la comprhension.
cgx
v.1
2.9 (13)
Introduction au VHDL
eivd
22 juin 1998
Dhtr'
Les temps t1, t2, t3, t4 et t5 sont des temps infiniment courts. En portant une tude
sur chacun de ces temps, il est possible de voir dans quel ordre les oprations se sont
droules.
t1 :
t2 :
t3 :
t4 :
t5 :
- changement de lentre c
- changement de la sortie d ligne 6 du code VHDL
- changement de la sortie c ligne 5 du code VHDL
- changement de la sortie b ligne 4 du code VHDL
- changement de lentre b
- changement de la sortie c ligne 5 du code VHDL
- changement de la sortie b ligne 4 du code VHDL
- changement de lentre a
- changement des sorties b & d lignes 4 & 6 du code VHDL
- changement de lentre a
- changement des sorties b & d lignes 4 & 6 du code VHDL
- changement de lentre a
- changement des sorties a, b & d lignes 3, 4 & 6 du code VHDL
- changement de la sortie c ligne 5 du code VHDL
L
L
L
L
L
L
L
En ralit, il y a aussi un temps delta entre deux changements simultans de signaux, mais
il najoute rien la comprhension de lordre de lexcution dun code concurrent.
Il est donc possible de voir ci-dessus que lordre des instructions dans le programme na
aucune importance, cest les modifications de la valeur des signaux qui dicteront lordre
dexcution des instructions.
cgx
v.1
2.10 (14)
Introduction au VHDL
!%!
eivd
22 juin 1998
Qthrjrppvprvryyr
Pour viter lutilisation de tel ou tel langage, du pseudo-code sera utilis pour lexemple.
1- Constante max_compteur = 10;
2- Dbut du programme
3- compteur = 0;
compteur
Initialise
le
Le droulement squentiel dun programme est trs ais comprendre puisque le lecteur sait
exactement quelle est linstruction excute par le programme. Les instructions se droulent
dans un ordre trs prcis et il ny a aucun calcul faire pour rechercher linstruction
excute. Cest de cette manire que se droule lexcution des divers programmes
utilisation informatique. Cependant il est trs probable quapparaissent des programmes de
type informatique qui auront une excution dite concurrente. En effet les prochaines
technologies permettront probablement de reprogrammer les processeurs (VISC - Variable
Instruction Set Computer) partir dun logiciel. Cela permettra doptimiser ceux-ci, par
contre le code devra grer une quantit dinformations actuellement inexistantes [voir
Electronique n65- Dcembre 1996].
Certaines parties du code VHDL scrivent et sexcutent de manire squentielle, comme
par exemple ce qui se trouve dans le corps dun processus. Les signaux ragiront
diffremment selon quil sagisse de signaux inertiels ou transports.
Soit deux transactions, appelons-les premire et seconde selon leur ordre dapparition
dans le listing dun processus.
TRANSPORT
INERTIAL
Ecrit par-dessus la
premire transaction
Ajoute la seconde
transaction au signal
cgx
v.1
2.11 (15)
Introduction au VHDL
eivd
22 juin 1998
7@BDI
QSP8@TT
7@BDI
sortie
sortie
X6DU0
@I9QSP8@TT0
@I90
-- premiere transaction
-- seconde transaction
1b) Transport avec la seconde transaction qui a lieu avant la premire (fig.9)
7@BDI
QSP8@TT
7@BDI
sortie
sortie
X6DU0
@I9QSP8@TT0
@I90
Dhtr(
2) Inertiel avec la seconde transaction qui a lieu aprs la premire, valeurs semblables (fig.
10)
7@BDI
QSP8@TT
7@BDI
sortie
sortie
X6DU0
@I9QSP8@TT0
@I90
cgx
v.1
-- premiere transaction
-- seconde transaction
2.12 (16)
Introduction au VHDL
eivd
22 juin 1998
Dhtr
3) Inertiel avec la seconde transaction qui a lieu aprs la premire, valeurs diffrentes (fig.
11)
7@BDI
QSP8@TT
7@BDI
sortie <=1
sortie <=0
X6DU0
@I9QSP8@TT0
@I90
6AU@S 10ns;
6AU@S 15ns;
-- premiere transaction
-- seconde transaction
Dhtr
Ltat '1' qui aurait d exister entre t=10ns et t=15ns a t filtr (supprim).
4) Transport avec la seconde transaction qui a lieu aprs la premire (fig. 12)
7@BDI
QSP8@TT
7@BDI
sortie
transaction
sortie
cgx
v.1
- -
p r e m i e r e
-- seconde transaction
2.13 (17)
Introduction au VHDL
eivd
22 juin 1998
Dhtr !
'DAAeS@I8@@IUS@GVUDGDT6UDPI9VI@W6SD67G@@U9VITDBI6G
Maintenant, il reste savoir quel moment utiliser un signal, plutt quune variable. Pour
exprimer cette diffrence, nous allons reprendre une remarque de Navabi [1 - p.40].
- Les vth ont une reprsentation matrielle. De plus, une composante de temps leur est
associe. Les signaux peuvent autant tre utiliss dans des corps squentiels ou concurrents,
par contre leur dclaration ne se fait que dans une partie concurrente du code VHDL.
Lassignement se fait par les deux symboles 12 (< et =).
Exemples:
1) et_prov 12 a0 6I9 a1 6AU@S 10ns, 1 6AU@S 60ns;
Par cette instruction (utilise pour un programme de simulation), nous indiquons que le
signal ET_PROV vaut A0&A1 aprs 10ns et que 50ns plus tard (cd 60ns aprs le dbut),
il vaut 1.
2) sortie_et 12 a 6I9 b 6AU@S 40ns;
Cette instruction (utilise pour un programme de conception de circuit) nous indique que
SORTIE_ET vaut le ET logique de A et B et quil ne change quaprs 40ns. Ces 40ns ne
seront pas utilises par un synthtiseur. Par contre, cela permet dvaluer par simulation des
temps de retard sur un circuit que lon conoit.
- Les hvhiyr nont au contraire pas de notion de temps qui leur soit associe. Elles sont
souvent utilises pour dfinir des valeurs intermdiaires dans un code de type
comportemental. Ds le moment o lon veut rcuprer la valeur dune de ces variables pour
la reprsenter physiquement, il faut la convertir en signal. Elles ne peuvent tre dclares et
utilises que dans les parties squentielles dun code VHDL (processus, fonctions,
cgx
v.1
2.14 (18)
Introduction au VHDL
eivd
22 juin 1998
procdures).
Lassignement se fait par les deux symboles )2 (: et =).
Exemple:
increment
)2 increment 3;
'DAAeS@I8@@IUS@G@7DU@UG@7PPG@6I
Le type iv est un type associ un signal. Ce type est donc directement li au circuit luimme.
Le type iyrh, au contraire, na pas de reprsentation physique. Il est utilis pour les
oprations logiques du programme VHDL.
Pourquoi expliquer la diffrence entre ces deux types ? A cause de lutilisation qui en est
faite. Certaines personnes font la confusion entre ces deux types au dbut de leur
apprentissage du VHDL. En effet, ces deux types peuvent travailler avec les mmes
oprateurs et leur rsultats semblent quivalents. Pourtant quelques nuances existent, et
pour les cerner il faut observer les rsultats obtenus avec les diffrents oprateurs.
Les oprateurs logiques hqhqr donnent un rsultat du mme type que les
oprandes. Il existe des portes logiques de ce nom avec lesquelles on utilisera le type bit
pour reprsenter les entres et les sorties et il s'agit aussi d'oprateurs boolens comme dans
d'autres langages informatique. Ce sont donc bien deux types distincts ne s'utilisant pas pour
les mmes choses qui peuvent travailler avec ces oprateurs.
Les oprateurs relationnels 22313212 gnrent automatiquement un rsultat
boolen. Ce qui est tout--fait normal, puisquil est impossible de dfinir une valeur pour
une comparaison. Il nest possible que de dire si le rsultat de la comparaison est vrai ou
faux, ce qui correspond au type boolen. Si on veut faire une comparaison entre deux bits,
il faudra selon le rsultat assigner la valeur 0 ou 1 la sortie dsire.
Loprateur de concatnation & sutilisera avec un type bit. Cela permet de regrouper
plusieurs bits en un vecteur de bits. Cest trs pratique pour dfinir des bus.
cgx
v.1
2.15 (19)
Introduction au VHDL
eivd
'e%876 (1 9+'/
0eUCP9@9@US6W6DG
22 juin 1998
C
C
cgx
v.1
3.1 (20)
Introduction au VHDL
eivd
22 juin 1998
I d e d u c ir c u it
D e s c r ip tio n
c o m p o r te m e n ta le
S im u l a ti o n d e l a
d e s c r ip ti o n
c o m p o r te m e n ta le
( a v e c te m p s n u ls )
D o c u m e n t a t i o n , P r p a r a t i o n d u d e s i g n , V a l id a t io n d e s s p c i f i c a t i o n s
D e s c r i p t io n
c o m p o rte m e n ta le
m o d if i e p o u r l a
s y n th s e
D e s c r ip tio n p a r flo t
de donnes
S y n th s e d e la
d e s c r ip tio n p a r f lo t
de donnes
S y n th s e d e la
d e s c r ip tio n
c o m p o r te m e n ta le
S im u l a ti o n d e l a
d e s c r ip tio n p a r f lo t
de donnes
S i m u la ti o n d e c e tte
d e s c r ip ti o n
c o m p o r te m e n ta le
( a v e c te m p s m o y e n s )
( a v e c te m p s m o y e n s )
O p t im is a t io n e n v u e
d u c ir c u i t c i b l e
S i m u la ti o n d e c e tte
o p t im is a t io n
( a v e c te m p s m o y e n s )
P s e u d o - c o d e , m a c h i n e s d ' t a t s
S t ru c tu re s d e b u s e t d e re g is tre s
D e s c r i p t io n
s t r u c t u r e l le ( o u d e s s in
du schm a)
S im u la tio n c o m p l t e
(a v e c te m p s m o ye n s )
I n t e r c o n n e c t io n s e n t r e l e s m o d u l e s , N e t l is t
P la c e m e n t, ro u ta g e
D e s c r i p t i o n p h y s iq u e
( a v e c te m p s c a lc u l s )
F a b r ic a t io n
T e s t fin a l
S im u l a t i o n
L a y o u t , li s t e d e s l m e n t s
P ro to ty p e
U t il i s a t i o n d u p r o d u i t
Dhtr "
cgx
v.1
3.2 (21)
Introduction au VHDL
eivd
22 juin 1998
6Qe8DAD86UDPI@UT`IUCT@
Deux tapes particulires apparaissent dans la figure 13, celle de la spcification et de la
synthse. En VHDL, il convient de bien distinguer ces deux tapes, car le code crit pour
lune ou lautre nest pour linstant pas compltement identique. Avant de commencer
lapprentissage du VHDL, il est donc ncessaire de les dfinir.
La spcification est la partie dun dveloppement qui consiste valider par la simulation ce
qui a t demand par le mandataire. Elle permet de corriger un cahier des charges incorrect
ou de complter celui-ci. La spcification en VHDL permet de crer une sorte de maquette
qui a, vu de l'extrieur, le comportement du systme dsir.
La synthse permet de gnrer automatiquement partir du code VHDL un schma de
cblage permettant la programmation du circuit cible. La description du code pour une
synthse est, en thorie, indpendante de larchitecture du circuit. En pratique, le style utilis
aura une influence sur le rsultat de la synthse, influence lie au type de circuit et au
synthtiseur utilis. Le code devra tre optimis pour un type circuit. Si le besoin
doptimisation nest pas trs important, cette partie peut se drouler trs rapidement, alors
quau contraire, si le besoin doptimisation est grand, les subtilits pour coder de manire
adquate en VHDL obligeront le concepteur y consacrer beaucoup de temps. Dailleurs,
ce nest souvent plus en VHDL que lon optimisera, car ce langage se rvle, pour linstant
en tout cas, peu adapt cet usage. Il faudra travailler un niveau plus proche du circuit ou
acheter des macros pr-existantes.
/DIU@SA68@9+'/
Avant dcrire un programme en VHDL, il faut dfinir linterface entre lintrieur du circuit
et le monde extrieur (reprsentation graphique sur la figure 14, 28). Il ne suffit pas davoir
un programme qui dcrit un certain comportement. Ce comportement ragit selon des
entres et agit sur des sorties (ou des entres-sorties) et tous ces ports seront connects
une carte externe au circuit. Toutes ces connexions correspondent cette interface.
cgx
v.1
3.3 (22)
Introduction au VHDL
eivd
22 juin 1998
Dhtr #
La figure 14, 28 reprsente les besoins dun concepteur. Il a un certain nombre dentres,
de sorties et dentres-sorties, de plus quelques valeurs par dfaut lui sont connues (comme
par exemple le dlai typique dune porte logique simple). A ce moment de la conception, il
ne connat pas encore ce quil va programmer. Il possde juste ces informations et le nom
du module quil doit crer (fqrfyfrvr). La manire de coder cette figure en VHDL
est la suivante :
-- --------------------------------------------------------------- declaration et utilisation des bibliotheques necessaires
-- --------------------------------------------------------------
VT@ work.bibliotheques_necessaires.6GG;
-- --------------------------------------------------------------- declaration de lentite et de ses ports dentree-sortie
-- --------------------------------------------------------------
@IUDU` nom_de_l_entite DT
B@I@SD8 (parametres_generiques: type := Valeur_par_defaut);
QPSU (ports_d_entree : DI type_ports_d_entree;
ports_de_sortie : PVU type_ports_de_sortie;
ports_d_entree_sortie : DIPVU type_ports_entree_sortie);
@I9 nom_de_l_entite;
-- --------------------------------------------------------------- architecture du programme, structure interne
-- --------------------------------------------------------------
cgx
v.1
3.4 (23)
Introduction au VHDL
eivd
22 juin 1998
@I9 type_de_description;
On dclare en premier lieu les diffrentes bibliothques qui seront utilises. Le code se
dcompose en deux parties principales, lentit et larchitecture.
Entit :
Lentit est la vue externe de llment cr. On y dclare les ports dentre
et de sortie et on y donne un nom llment (fqrfyfrvr pour
lexemple ci-dessus). Il est aussi possible de dfinir des paramtres
gnriques, cest--dire des paramtres qui ont une valeur utilise par dfaut
si lutilisateur de cette entit nen donne pas une autre. Par exemple, si une
architecture appelle lentit ci-dessus sans spcifier de temps de dlai, alors
la valeur Whyrfhfqrsh sera utilise.
/@9+'/QPVSG@8PH7DI6UPDS@
Ltude du VHDL pour des circuits concrets ne se fera pas selon lapproche classique qui
consiste donner une liste des instructions pour les utiliser ensuite, mais elle sappuiera sur
les besoins, les outils tant alors fournis. Cela double parfois les informations, mais permet
de ne pas avoir besoin de comprendre tout le VHDL avant de dmarrer un petit projet.
Une premire tape traitera du dveloppement de programmes VHDL pour de la logique
combinatoire et une deuxime soccupera de la logique squentielle.
Regardons dabord quelques modules classiques en combinatoire. La description de chacun
de ces modules sera faite sous la forme la plus approprie.
Tqr
cgx
Urqrqrpvv
Qhtr
25
structurelle
30
table de vrit
flot de donnes
28
v.1
3.5 (24)
Introduction au VHDL
eivd
22 juin 1998
Tqr
"#
Urqrqrpvv
Qhtr
flot de donnes
26
multiplexeur
flot de donnes
27
lments en cascade
structurelle
30
comparateur
comportementale
31
9rpvvhsyqrqpr
Pour dcrire des lments simples, des tables de vrit ou autres multiplexeurs, il est trs
pratique dutiliser la description dite hsyqrqpr. Ce type de description se droule
de manire concurrente. Tous les signaux sont assigns en mme temps. Il suffit de placer
la droite dune quation ce que lon veut assigner au signal qui se trouve la gauche de
lquation.
"#
Ghqqvvr
Dhtr $
cgx
v.1
3.6 (25)
Introduction au VHDL
eivd
22 juin 1998
Code VHDL :
@IUDU` demi_add_1bit DT
QPSU (entree_a : DI bit;
entree_b : DI bit;
sortie
: PVU bit;
report
: PVU bit);
@I9 demi_add_1bit;
6S8CDU@8UVS@ flot_de_donnees PA demi_add_1bit DT
7@BDI
Report 12 entree_a 6I9 entree_b;
Sortie 12 entree_a YPS entree_b;
@I9 flot_de_donnees;
"# !
GhihpyrSThpur
La bascule RS asynchrone est aussi un exemple trs simple pour une description
combinatoire par flot de donnes. Il compltera lexemple de ladditionneur.
@IUDU` bascule_RS DT
B@I@SD8 (delai: UDH@ := 5 ns); -- delai par defaut, modifiable
QPSU (set, reset :DI
bit;
sortie
:DIPVU bit);
@I9 bascule_RS;
6S8CDU@8UVS@ flot_de_donnees PA bascule_RS DT
7@BDI
sortie 12 set PS (sortie 6I9IPU reset) 6AU@S delai;
@I9 flot_de_donnees;
cgx
v.1
3.7 (26)
Introduction au VHDL
"# "
eivd
22 juin 1998
Gryvyrr
Les deux exemples prcdents placent toujours la mme quation sur la sortie, mais si le
concepteur veut raliser un multiplexeur, il devra assigner, suivant le code de slection, la
valeur des entres la sortie. Il existe en VHDL une commande qui permet cela, le mot
rserv ur. Elle permet de donner une condition lors dun assignement.
Prenons le cas dun multiplexeur 8 entres et 3 bits de slection. Le symbole est reprsent
sur la figure 16.
Dhtr %
Code VHDL :
@IUDU` mux8 DT
B@I@SD8 (delai: UDH@ := 5 ns); -- delai par defaut, modifiable
QPSU (e7, e6, e5, e4, e3, e2, e1, e0: DI bit;
G2, G1, G0: DI bit;
sortie: PVU bit);
@I9 mux8;
6S8CDU@8UVS@ flux_de_donnees PA mux8 DT
TDBI6G adresse : bit_vector(2 9PXIUP 0);
7@BDI
adresse 12 G2G1G0;
delai
delai
delai
delai
delai
delai
XC@I
XC@I
XC@I
XC@I
XC@I
XC@I
v.1
000,
001,
010,
011,
100,
101,
3.8 (27)
Introduction au VHDL
eivd
22 juin 1998
"# #
Ghhiyrqrpvp
De mme, il est aussi possible dutiliser avantageusement ce mot rserv when pour crer
une table de vrit. Lexemple utilis est trs simple comprendre puisquil sagit dafficher
sur un affichage 7 segments la valeur dun code BCD. Les cas non dsirs afficheront un X.
9"
9!
9
T&
T%
T$
T#
T"
T!
0011
L 1001111
@IUDU` sept_seg DT
B@I@SD8 (delai: UDH@ := 5 ns); -- delai par defaut, modifiable
QPSU (code_binaire: DI bit_vector(3 9PXIUP 0); -- code dentree
S7, S6, S5, S4, S3, S2, S1: PVU bit); -- affichage 7 seg.
cgx
v.1
3.9 (28)
Introduction au VHDL
eivd
22 juin 1998
@I9 sept_seg;
6S8CDU@8UVS@ TDV_flot_de_donnees PA sept_seg DT
TDBI6G code_sept_seg : bit_vector(6 9PXIUP 0);
7@BDI
XDUC code_binaire T@G@8U
code_sept_seg 12 "0111111" 6AU@S delai XC@I "0000",
"0000110" 6AU@S delai XC@I "0001",
"1011011" 6AU@S delai XC@I "0010",
"1001111" 6AU@S delai XC@I "0011",
"1100110" 6AU@S delai XC@I "0100",
"1101101" 6AU@S delai XC@I "0101",
"1111101" 6AU@S delai XC@I "0110",
"0000111" 6AU@S delai XC@I "0111",
"1111111" 6AU@S delai XC@I "1000",
"1101111" 6AU@S delai XC@I "1001",
"1110110" XC@IPUC@ST; -- X
S7
S6
S5
S4
S3
S2
S1
12
12
12
12
12
12
12
-----------
0
1
2
3
4
5
6
7
8
9
code_sept_seg(6);
code_sept_seg(5);
code_sept_seg(4);
code_sept_seg(3);
code_sept_seg(2);
code_sept_seg(1);
code_sept_seg(0);
@I9 TDV_flot_de_donnees;
"# $
Spp
VT@ work.bibliotheques_necessaires.6GG;
@IUDU` nom_de_l_entite DT
B@I@SD8 (parametres_generiques: type := Valeur_par_defaut);
QPSU (ports_d_entree
: DI
type_ports_d_entree;
type_ports_de_sortie;
ports_de_sortie
: PVU
ports_d_entree_sortie : DIPVU type_ports_entree_sortie);
@I9 nom_de_l_entite;
6S8CDU@8UVS@ type_de_description PA nom_de_l_entite DT
7@BDI
signal_sortie_1 12action_1;
signal_sortie_2 12 action_2 XC@I condition_1,
action_3 XC@I condition_2,
action_4 XC@IPUC@ST;
...
@I9 type_de_description;
cgx
v.1
3.10 (29)
Introduction au VHDL
"#!
eivd
22 juin 1998
9rpvvpryyr
Cette description correspond un assemblage de modules. Chacun des modules est dcrit
de manire comportementale ou par flot de donnes et fait partie ensuite dune bibliothque
de modules. Ils sont alors utiliss de la mme manire que la structure dun schma. Un
additionneur 4 bits donnera un bon exemple de ce type de description. Pour ce faire, le
module dun additionneur 1 bit sera utilis.
Elment se trouvant en bibliothque : (additionneur 1 bit)
@IUDU` addit_1_bit DT
QPSU (entree_a: DI bit;
entree_b: DI bit;
report_prec: DI bit;
somme: PVU bit;
report_suiv: PVU bit);
@I9 addit_1_bit;
6S8CDU@8UVS@ flot_de_donnees PA addit_1_bit DT
7@BDI
report_suiv 12 (entree_a 6I9 entree_b) PS (entree_a 6I9 report_prec)
PS (entree_b 6I9 report_prec);
somme 12 entree_a YPS entree_b YPS report_prec;
@I9 flot_de_donnees;
Additionneur 4 bits :
@IUDU` addit_4_bits DT
QPSU (nombre1, nombre2 : DI bit_vector (3 9PXIUP 0);
report_in
: DI bit;
total
: PVU bit_vector (3 9PXIUP 0);
report_out
: PVU bit);
@I9 addit_4_bits;
6S8CDU@8UVS@ structurelle PA addit_4_bits DT
8PHQPI@IU bloc1 QPSU (entree_a, entree_b, report_prec : DI bit;
somme, report_suiv : PVU bit);
@I98PHQPI@IU;
APS6GG: bloc1 VT@@IUDU`XPSF.addit_1_bit (flot_de_donnees);
TDBI6G report0, report1, report2 : bit;
7@BDI
g0 : bloc1 QPSUH6Q
(nombre1(0), nombre2(0), report_in, total(0), report0);
g1 : bloc1 QPSUH6Q
(nombre1(1), nombre2(1), report0, total(1), report1);
cgx
v.1
3.11 (30)
Introduction au VHDL
eivd
22 juin 1998
g2 : bloc1 QPSUH6Q
(nombre1(2), nombre2(2), report1, total(2), report2);
g3 : bloc1 QPSUH6Q
(nombre1(3), nombre2(3), report2, total(3), report_out);
@I9 structurelle;
"#!
Spp
VT@ work.bibliotheques_necessaires.6GG;
@IUDU` nom_de_l_entite DT
B@I@SD8 (parametres_generiques: type := Valeur_par_defaut);
QPSU (ports_d_entree
: DI
type_ports_d_entree;
type_ports_de_sortie;
ports_de_sortie
: PVU
ports_d_entree_sortie : DIPVU type_ports_entree_sortie);
@I9 nom_de_l_entite;
6S8CDU@8UVS@ type_de_description PA nom_de_l_entite DT
8PHQPI@IU nom_du_composant_local QPSU (
type_des_entrees;
entrees_du_comp
: DI
type_des_sorties;
sorties_du_comp
: PVU
entrees_sorties_comp : DIPVU type_entrees_sorties);
@I98PHQPI@IU;
APS6GG : nom_du_composant_local
VT@@IUDU`XPSFnom_entite_comp (nom_arch_composant);
7@BDI
@I9 type_de_description;
"#"
9rpvvprrhyr
v.1
3.12 (31)
Introduction au VHDL
eivd
22 juin 1998
Dhtr '
@IUDU` comparateur DT
B@I@SD8 (delai: UDH@ := 7 ns); -- delai par defaut, modifiable
QPSU (vecteur1, vecteur2 : DI bit_vector (3 9PXIUP 0);
pg, egal, pp : DI bit;
v1pgv2, v1egalv2, v1ppv2 : PVU bit);
@I9 comparateur;
6S8CDU@8UVS@comportementale PA comparateur DT
7@BDI
QSP8@TT (vecteur1, vecteur2, pg, egal, pp)
7@BDI
v1pgv2 12 0;
v1egalv2 12 0;
v1ppv2 12 0;
-----
initialisation obligatoire,
sinon des bascules sont
rajoutees pour synchroniser les
signaux
v.1
3.13 (32)
Introduction au VHDL
eivd
22 juin 1998
des cas, des valeurs de sorties appropries sont donnes aprs un dlai. Chaque fois quune
des valeurs se trouvant entre parenthses aprs le mot-cl pr est modifie,le processus
est activ et toutes les instructions sont excutes squentiellement.
"#"
Spp
@I9QSP8@TT;
@I9 type_de_description;
/@9+'/QPVSVIT`TUH@TeRV@IUD@G
La plupart des systmes logiques sont squentiels et peuvent tre crits en VHDL. A
nouveau, la prsentation de cette partie se fera selon les besoins et non les outils.
Tqr
Urqrqrpvv
Qhtr
36, 41
3.14 (33)
Introduction au VHDL
eivd
22 juin 1998
Tqr
Urqrqrpvv
Qhtr
comportementale
18
machine dtats
machine dtats
47
compteurs
52
structurelle
52
structurelle
52
Dhtr (
v.1
3.15 (34)
Introduction au VHDL
eivd
22 juin 1998
- On spare laction de lhorloge des actions que lon veut sur les signaux.
- Il nest pas utile de vrifier chaque fois la structure du code. Une fois correcte, elle le reste.
Cette structure est la suivante :
VT@ work.bibliotheques_necessaires.6GG;
@IUDU` nom_de_l_entite DT
B@I@SD8 (parametres_generiques: type := Valeur_par_defaut);
QPSU (ports_d_entree
: DI
type_ports_d_entree;
type_ports_de_sortie;
ports_de_sortie
: PVU
ports_d_entree_sortie : DIPVU type_ports_entree_sortie);
@I9 nom_de_l_entite;
6S8CDU@8UVS@ type_de_description PA nom_de_l_entite DT
TDBI6G present, futur : type_des_signaux;
7@BDI
--------------------------------------------------------------------- ce premier processus est celui qui decode letat futur de la
-- bascule, on lappellera processus dentree
--------------------------------------------------------------------
QSP8@TT (liste_de_sensibilite_du_processus)
7@BDI
Comportement_du_decodeur_d_etat_futur;
@I9QSP8@TT;
QSP8@TT
7@BDI
X6DUVIUDG clock@W@IU and clock = 1;
sortie_bascule <= valeur_d_entree 6AU@S delai;
@I9QSP8@TT0
--------------------------------------------------------------------- le processus suivant est celui du decodeur de sortie
-- on lappellera processus de sortie
--------------------------------------------------------------------
QSP8@TT (liste_de_sensibilite_du_processus)
7@BDI
Comportement_du_decodeur_de_sortie;
@I9QSP8@TT0
@I9 type_de_description;
Chaque partie est reprsente par un processus. Il est bien sr possible de dcouper les
dcodeurs dtat futur et de sortie en plusieurs processus pour permettre le dveloppement
de petites entits rutilisables pour dautres dveloppements. Le processus de mmorisation
cgx
v.1
3.16 (35)
Introduction au VHDL
eivd
22 juin 1998
est en quelque sorte une de ces entits: conu une fois pour toutes, le processus nest plus
touch pour des dveloppements ultrieurs.
Lexcution des processus est la suivante :
- Tous les processus sexcutent de manire parallle entre eux.
- Lexcution lintrieur dun processus se fait de manire squentielle.
Un processus est activ ds quun des signaux de la liste de sensibilit change dtat. Cette
liste de sensibilit peut prendre deux formes : soit elle apparat entre parenthses juste aprs
le mot-cl pr (a), soit elle fait partie dune ligne hvvy lintrieur du processus
(b). La nouvelle norme prconise plutt la deuxime, mais elle nest pour linstant pas trs
bien accepte par les synthtiseurs.
a - QSP8@TT (liste de sensibilit)
....
@I9QSP8@TT0
b - QSP8@TT
....
....
@I9QSP8@TT0
Cette liste de sensibilit doit comprendre tous les signaux susceptibles de modifier le
comportement du systme.
"$
9rpvvprrhyr
Le premier exemple VHDL squentiel et le plus classique est celui dune bascule D. Son
code est le suivant :
----------------------------------------------------------------------- Nom du fichier : basculeD.vhd
-- Auteur
: C. Guex
-- Date
: avril 1997
-- Version
: 1.0
-- Modifications :
-- Auteur
:
Date :
----------------------------------------------------------------------- But
: exemple du cours VHDL dune bascule D
----------------------------------------------------------------------
@IUDU` bascule_d DT
B@I@SD8 (delai: time := 7 ns);
QPSU (entree_D, clock : DI bit;
cgx
v.1
3.17 (36)
Introduction au VHDL
eivd
22 juin 1998
@I9 bascule_d;
-- signal intermediaire
-- signal intermediaire
7@BDI
----------------------------------------------------------------------- ce premier processus est celui qui decode letat futur de la
-- bascule, on lappellera processus dentree
----------------------------------------------------------------------
QSP8@TT (entree_D)
7@BDI
entree_bascule 12 entree_D;
@I9QSP8@TT;
QSP8@TT
7@BDI
X6DUVIUDG clock@W@IU and clock = 1;
sortie_bascule 12 entree_bascule 6AU@S delai;
@I9QSP8@TT;
----------------------------------------------------------------------- le processus suivant est celui du decodeur de sortie
-- on lappellera processus de sortie
----------------------------------------------------------------------
QSP8@TT (sortie_bascule)
7@BDI
sortie 12 sortie_bascule;
@I9QSP8@TT;
@I9 flot_de_donnees;
Dans ce cas particulier, les processus dentre et de sortie ne font rien. Il ny a donc aucun
dlai spcifier pour ces deux processus. Par contre, le processus de mmorisation a un
dlai correspondant au temps de transfert dune bascule. Ce dlai est choisir en fonction
du circuit pressenti pour le dveloppement, ce pour amliorer la qualit de la simulation. Il
ne faut pas oublier que ce dlai na une valeur que pour la simulation. Il nest pas possible
de dfinir une sorte dhorloge interne au circuit.
Etant donn que les processus d'entre et de sortie ne font rien, le code se simplifiera de la
manire suivante :
----------------------------------------------------------------------- Nom du fichier : basculeD.vhd
-- Auteur
: C. Guex
-- Date
: avril 1997
cgx
v.1
3.18 (37)
Introduction au VHDL
eivd
22 juin 1998
-- Version
: 1.0
-- Modifications :
-- Auteur
:
Date :
----------------------------------------------------------------------- But
: exemple du cours VHDL dune bascule D
----------------------------------------------------------------------
@IUDU` bascule_d DT
B@I@SD8 (delai: time := 7 ns);
QPSU (entree_D, clock : DI bit;
sortie : PVU bit);
@I9 bascule_d;
6S8CDU@8UVS@ flot_de_donnees PA bascule_d DT
7@BDI
-- processus du decodeur detat futur inexistant
----------------------------------------------------------------------- ce processus est celui qui soccupe de la gestion des bascules
-- on lappellera processus de memorisation
----------------------------------------------------------------------
QSP8@TT
7@BDI
X6DUVIUDG clock@W@IU and clock = 1;
sortie 12 entree_D 6AU@S delai;
@I9QSP8@TT;
-- processus du decodeur de sortie inexistant
@I9 flot_de_donnees;
Une bascule un peu plus complte sera donne comme deuxime exemple. Il sagit dune
bascule D avec enable et deux entres supplmentaires que sont le set synchrone et le reset
asynchrone. Le schma, dcoup selon les trois processus est le suivant (figure 22):
Dhtr!
cgx
v.1
3.19 (38)
Introduction au VHDL
eivd
22 juin 1998
Dhtr!
Dhtr!!
Lenable na pas t plac directement sur la bascule, car il na pas de rapport direct avec
elle. Il sagit en fait dun multiplexeur qui slectionne soit la valeur dentre, soit lancienne
valeur de la bascule selon ltat du signal rhiyr. Le processus de mmorisation soccupe
lui de traiter lhorloge et les informations indpendantes de lentre, comme le set et le reset.
Pour terminer, le dcodeur de sortie est trivial et vaut sa propre entre. Ce qui donne le code
VHDL suivant :
----------------------------------------------------------------------- Nom du fichier : b_D_RSE.vhd
-- Auteur
: C. Guex
-- Date
: avril 1997
-- Version
: 1.0
-- Modifications :
-- Auteur
:
Date :
----------------------------------------------------------------------- But
: exemple du cours VHDL dune bascule D avec reset
-asynchrone, set synchrone et enable pour valider
-le transfert dune entree sur la sortie
----------------------------------------------------------------------
@IUDU` bascule_d_ar_ss_en DT
B@I@SD8 (delai: time := 7 ns); -- delai de transfert dune porte
cgx
v.1
3.20 (39)
Introduction au VHDL
eivd
QPSU (entree_D : DI
clock
: DI
a_reset
: DI
s_set
: DI
enable
: DI
sortie
: PVU
@I9 bascule_d_ar_ss_en;
bit;
bit;
bit;
bit;
bit;
bit);
22 juin 1998
-------
entree de la bascule D
horloge de la bascule D
reset asynchrone de la bascule D
set synchrone de la bascule D
validation de la bascule D
sortie de la bascule D
7@BDI
----------------------------------------------------------------------- ce premier processus est celui qui decode letat futur de la
-- bascule, on lappellera processus dentree
----------------------------------------------------------------------
QSP8@TT
7@BDI
X6DUVIUDG (a_reset = 1) PS (clock@W@IU 6I9 clock = 1);
DA a_reset = 1 UC@I
sortie_bascule 12 0 6AU@S delai;
-- reset asynchrone
-- prioritaire
@GT@
DA s_set = 1 UC@I
sortie_bascule 12 1 6AU@S delai; -- set synchrone en
-- deuxieme priorite
@GT@
@I9DA;
@I9DA;
@I9QSP8@TT;
cgx
v.1
3.21 (40)
Introduction au VHDL
eivd
22 juin 1998
QSP8@TT
7@BDI
sortie 12 sortie_bascule;
@I9QSP8@TT;
@I9 comportementale;
Toutes les bascules peuvent tre construites selon le modle prcdent. Il est aussi possible
de conserver cette bascule en bibliothque sous forme dlment rutilisable. Quelques
autres exemples de modules squentiels vont encore tre donns pour illustrer ce langage.
Il existe galement une autre forme dcriture, moins pratique, que nous allons voir dans le
prochain paragraphe.
"$!
9rpvvhsyqrqpr
En effet, il est aussi possible de dcrire des modules squentiels par flot de donnes. Ces
descriptions peuvent prendre deux formes, selon les exemples donns ci-aprs. Cependant,
ce type de description nest pas des plus appropri pour un module squentiel et il nen sera
pas fait grand tat.
Cette description est trs semblable celle utilise dans la partie combinatoire. Il suffit
dajouter aux quations la synchronisation avec lhorloge de la manire suivante :
sortie 12 entree XC@I (horloge = 1 6I9IPU horlogeTU67G@) @GT@ sortie;
Le handicap dune telle mthode est quil faut crire pour chaque sortie cette condition. Il
existe un moyen dviter ceci en crant un bloc. Toutes les oprations se trouvant alors dans
ce bloc ne se drouleront que si la condition dentre est vraie. Ce qui veut dire que si nous
plaons lattente du flanc montant de lhorloge comme condition dentre, tous les signaux
internes au bloc seront synchroniss.
Lexemple dune bascule D est donn ci-aprs [selon les pages 180-181 de Navabi]. Deux
architectures sont crites pour montrer la diffrence entre une synchronisation de lhorloge
sur un seul signal ou sur tout un bloc.
@IUDU` d_flipflop DT
B@I@SD8 (delai1: time := 4 ns; delai2: time := 5 ns);
QPSU(d, c : DI bit;
q, qb : PVU bit);
cgx
v.1
3.22 (41)
Introduction au VHDL
eivd
22 juin 1998
@I9 d_flipflop;
-- exemple de signaux gardes (bloc)
7@BDI
q 12 BV6S9@9
d 6AU@S delai1;
qb 12 BV6S9@9IPU d 6AU@S delai2;
@I97GP8F ff;
@I9 guarding;
-- exemple de signaux assignes
Lexemple dun bloc est celui correspondant la premire architecture. Le bloc commence
par un irtv et se termine par un rq. A lintrieur de celui-ci, tous les signaux qui ont le
mot cl thqrq sur leur affectation ne changent pas tant que la condition de bloc nest pas
remplie (en loccurrence, le flanc montant de lhorloge). Ce qui veut dire que les signaux q
et qb ne ragissent quau flanc de lhorloge. On dit de ces signaux quils sont gards.
Contrairement la premire architecture, la deuxime ne modifie que le signal etat_interne
au flanc de lhorloge, les deux signaux q et qb changent uniquement lors dune variation de
etat_interne.
Pour mieux comprendre le principe, un fichier de test et son rsultat graphique sont donns
ci-dessous :
@IUDU` flipflop_test DT
@I9 flipflop_test;
6S8CDU@8UVS@ input_output PA flipflop_test DT
8PHQPI@IU
flop QPSU (d, c : DI bit;
q, qb : PVU bit);
@I98PHQPI@IU;
APS c1: flop VT@@IUDU` XPSF.d_flipflop (assignement);
APS c2: flop VT@@IUDU` XPSF.d_flipflop (guarding);
TDBI6G dd, cc, q1, q2, qb1, qb2 : bit;
7@BDI
cgx
v.1
3.23 (42)
Introduction au VHDL
eivd
22 juin 1998
Rsultat graphique :
Dhtr!"
Ce graphique rvle la diffrence entre qb1 et qb2 selon la description VHDL. le signal qb1
est bel est bien l'inverse du signal q1, contrairement qb2 par rapport q2.
Mais comme cela a dj t dit, cette mthode pour dcrire un systme squentiel nest pas
des plus lisible et nest que peu employe, on lvitera donc.
cgx
v.1
3.24 (43)
Introduction au VHDL
"$"
eivd
22 juin 1998
:+(1 etat_1
:+(1 etat_2
,)
(/6,)
condition_1
condition_2
,)
action 1
action 2
:+(1 etat_n
...
condition_3
(/6(
action 3
action 4
(/6(
,)
condition_4
(/6(
action 6
action 7
action 5
Dhtr!#
v.1
Introduction au VHDL
eivd
22 juin 1998
sorties 12 valeur_a_mettre_sur_les_sorties;
futur 12 etat_futur_dans_ce_cas;
@GTDA not condition_d_entrees UC@I
sorties 12 valeur_a_mettre_sur_les_sorties;
futur 12 etat_futur_dans_ce_cas;
@GT@
valeur_avant_synchro 12 maintien_de_la_sortie;
futur 12 etat_de_trappe;
@I9DA0
.
.
.
XC@I cas_n 23
DA autre_condition_d_entrees then
sorties 12 valeur_a_mettre_sur_les_sorties;
futur 12 etat_futur_dans_ce_cas;
@GTDA not autre_condition_d_entrees UC@I
sorties 12 valeur_a_mettre_sur_les_sorties;
futur 12 etat_futur_dans_ce_cas;
@GT@
valeur_avant_synchro 12 maintien_de_la_sortie;
futur 12 etat_de_trappe;
@I9DA0
@I986T@0
@I9QSP8@TT0
@I9 machine_etats;
"$"
Uhvvvpqvvryyr
Regardons de manire plus prcise les diffrentes transitions, conditionnelles ou non pour
les coder en VHDL.
Une transition inconditionnelle scrit de la manire suivante :
XC@I etat_1 23
futur 12 etat_futur_dans_ce_cas;
Aucune condition vs nest dfinie pour passer ltat suivant. Par consquent, une fois
arriv dans ltat 1, le dcodeur dtat futur passera de toute manire un seul tat futur,
celui indiqu droite de lassignation.
cgx
v.1
3.26 (45)
Introduction au VHDL
"$"!
eivd
22 juin 1998
Uhvvpqvvryyr
Une transition conditionnelle se dfini par linstruction vsurryr. Il faut placer ltat
futur dans la branche correspondant sa condition.
XC@I etat_1 23
DA condition_d_entrees UC@I
futur 12 etat_futur_dans_ce_cas;
@GTDA autre_condition_d_entrees UC@I
futur 12 etat_futur_dans_ce_cas;
@GT@
futur 12 etat_de_trappe;
@I9DA0
"$""
Tvrvpqvvryyr
Quant aux sorties inconditionnelles, de la mme manire que pour une transition
inconditionnelle, on place directement droite de lassignation la valeur que la sortie doit
prendre.
XC@I etat_1 23
sorties 12 valeur_a_mettre_sur_les_sorties;
"$"#
Tvrpqvvryyr
Les sorties conditionnelles peuvent scrire sous deux formes. Lune o lon donne la
condition dsire en lieu et place dune valeur, lautre en insrant lassignation de la sortie
dans une branche correspondant la condition souhaite. Il est aussi possible de cumuler
ces deux mthodes pour placer une condition sur les sorties, alors quelles se trouvent dj
dans une branche de condition.
XC@I etat_1 23
sorties 12 condition_a_mettre_sur_les_sorties;
ou
cgx
v.1
3.27 (46)
Introduction au VHDL
eivd
22 juin 1998
XC@I etat_1 23
DA condition_d_entrees UC@I
-- selon les entrees
sorties 12 valeur_ou_condition_a_mettre_sur_les_sorties;
@GTDA autre_condition_d_entrees UC@I
sorties 12autre_valeur_ou_condition_a_mettre_sur_les_sorties;
@GT@
valeur_avant_synchro 12 maintien_de_la_sortie;
@I9DA0
"$"$
Spp
-- sortie inconditionnelle
-- sortie conditionnelle
-- (condition 1)
DA condition_2 UC@I
sortie 12 valeur_2;
-- sortie conditionnelle
-- (condition 2)
futur 12 etat_futur_dans_ce_cas; -- transition conditionnelle
@GTDA condition_3 UC@I
sortie 12 condition_4;
-- sortie conditionnelle
-- (cond. 3 et 4)
futur 12 etat_futur_dans_ce_cas; -- transition conditionnelle
@GT@
valeur_avant_synchro 12 maintien_de_la_sortie;
futur 12 etat_de_trappe;
@I9DA0
XC@I etat_2 23
futur 12 etat_futur_dans_ce_cas; -- transition inconditionnelle
"$"%
Tvrpuvpr
Pour post-synchroniser une sortie, il faut crer une sortie intermdiaire qui sera ensuite
place sur lentre dune bascule.
cgx
v.1
3.28 (47)
Introduction au VHDL
"$"&
eivd
22 juin 1998
@ryr)qprprqrr
Lexemple utilis pour reprsenter une machine tats en VHDL est lun des plus
classiques, puisquil sagit dun dtecteur de sens.
Son fonctionnement est le suivant :
Un disque peut tourner dans deux sens. Deux capteurs se trouvent dun ct du disque pour
lire la position de celui-ci. Il sagit alors de dterminer dans quel sens tourne le disque.
Dhtr!$
La sortie est active tant quil tourne dans le sens anti-horaire. (Sortie de Mealy postsynchronise active haute).
Il faut noter que le graphe d'tats prsent ci-dessous n'est pas le graphe le plus optimal,
mais il permet de prsenter diffrents aspects du codage VHDL en un seul exemple.
cgx
v.1
3.29 (48)
Introduction au VHDL
eivd
22 juin 1998
Dhtr!%
@IUDU` detecteur_sens DT
B@I@SD8 (delai: time := 7 ns);-- delai de transfert dune porte
QPSU (entree_a: DI bit;
-- entree a du detecteur de sens
-- entree b du detecteur de sens
entree_b: DI bit;
-- horloge de la bascule D
clk
: DI bit;
-- reset asynch. de la bascule D
reset
: DI bit;
-- set synchrone de la bascule D
set
: DI bit;
sens_anti_horaire : PVU bit);-- sens de rotation
@I9 detecteur_sens;
----------------------------------------------------------------------- Architecture comportementale dune bascule D avec reset asynchrone
-- et set synchrone. Un enable autorise ou non le transfert de
-- lentree D.
----------------------------------------------------------------------
cgx
v.1
3.30 (49)
Introduction au VHDL
eivd
22 juin 1998
-------
depart: position_1
etat futur
valeur intermediaire que
prendra la sortie
valeur de letat futur de la
bascule
7@BDI
----------------------------------------------------------------------- processus des decodeurs detat futur et de sortie
----------------------------------------------------------------------
v.1
3.31 (50)
Introduction au VHDL
eivd
22 juin 1998
valeur_avant_synchro 12 0;
futur 12 position_4;
@GTDA entree_a = 1 6I9 entree_b = 0 UC@I
valeur_avant_synchro 12 1;
futur 12 position_2;
@GT@
valeur_avant_synchro 12 sortie_bascule;
futur 12 position_3;
@I9DA;
XC@I position_4 23
DA entree_a = 0 6I9 entree_b = 0 UC@I
valeur_avant_synchro 12 0;
futur 12 position_1;
@GTDA entree_a = 1 6I9 entree_b = 1 UC@I
valeur_avant_synchro 12 1;
futur 12 position_3;
@GT@
valeur_avant_synchro 12 sortie_bascule;
futur 12 position_4;
@I9DA;
@I986T@;
@I9QSP8@TT;
----------------------------------------------------------------------- processus de memorisation de letat interne et de la post-synchro
-- de la sortie
----------------------------------------------------------------------
QSP8@TT
7@BDI
X6DUVIUDG (clk@W@IU 6I9 clk=1) PS (reset=1);
DA reset = 1 UC@I
sortie_bascule 12 0 6AU@S delai; -- reset asynchrone
present 12 position_1 6AU@S delai;
@GT@
DA set = 1 UC@I
-- prioritaire
-- retour a letat initial
@GT@
cgx
v.1
3.32 (51)
Introduction au VHDL
eivd
22 juin 1998
QSP8@TT (sortie_bascule)
7@BDI
sens_anti_horaire 12 sortie_bascule;
@I9QSP8@TT;
@I9 comportementale;
On peut remarquer dans cet exemple quil est possible et mme trs recommand de donner
un nom mnmonique (un nom rappelant le rle jou par cet tat dans le fonctionnement de
la MSS) chaque tat. Une fois ces noms choisis, il faut dclarer un type numr pour
dfinir ces diffrents tats. Pour le codage de ceux-ci, plusieurs compilateurs offrent une
fonction enum_encoding, malheureusement, elle nest pas standard et par consquent nest
pas utilisable partout. Si elle nexiste pas, il faut placer les tats dans lordre de leur code
dans la dclaration du type (A VERIFIER).
De mme, un etat dinitialisation peut tre choisi, ainsi quun etat de trappe. Les tats non
utiliss peuvent aussi avoir des noms prvus.
Sil faut dcrire plusieurs machines dtats en parallle, il vaut mieux crer des fichiers
VHDL pour chacune des machines et ensuite utiliser une description structurelle pour lier
le tout.
"$#
9rpvvpryyr
Il ny a aucune diffrence entre une description structurelle dun systme squentiel et celle
dun systme combinatoire. Un tel type de description na normalement un sens que pour
un systme modulaire. Lexemple sera celui dune cascade de compteurs 1 bit pour raliser
un compteur 4 bits.
Elment se trouvant en bibliothque : (compteur 1 bit)
@IUDU` compt_1_bit DT
QPSU (horloge
: DI
report_prec : DI
sortie
: PVU
report_suiv : PVU
@I9 compt_1_bit;
bit;
bit;
bit;
bit);
v.1
3.33 (52)
Introduction au VHDL
eivd
22 juin 1998
Compteur 4 bits :
@IUDU` compt_4_bits DT
QPSU (horloge
: DI
report_in
bit;
: DI bit;
-- enable du
compteur
valeur_compteur : PVU bit_vector (3 9PXIUP 0);
report_out
: PVU bit);
@I9 compt_4_bits;
g0 : bloc1 QPSUH6Q
(horloge, report_in, valeur_compteur(0), report0);
g1 : bloc1 QPSUH6Q
(horloge, report0, valeur_compteur(1), report1);
g2 : bloc1 QPSUH6Q
(horloge, report1, valeur_compteur(2), report2);
g3 : bloc1 QPSUH6Q
(horloge, report2, valeur_compteur(3), report_out);
@I9 structurelle;
Voil les diffrents principes de base pour dcrire un circuit en VHDL. Mais ce nest pas
tout, car lun des intrts majeurs du langage est la possibilit de simuler par le mme
langage les diffrents modules. Sur les quelques pages suivantes, nous verrons donc les
bases pour crer un fichier de test pour la simulation.
cgx
v.1
3.34 (53)
Introduction au VHDL
eivd
22 juin 1998
/6TDHVG6UDPI
Pour tre efficace, une simulation doit tre la plus complte possible, sans tre redondante.
Une bonne simulation pure de tous les tests doubls permettra une bonne conomie tant
pour le temps consacr cette simulation que pour les tests sur circuit ensuite. De plus, le
fichier crit pour la simulation peut tre avantageusement utilis pour tous les tests ultrieurs
(sur le prototype, en fabrication, etc).
Comme prcit, un systme de test fournissant les stimulis et vrifiant les rponses peut
aussi tre crit en VHDL. Un module de simulation (test bench) sera cr et lintrieur de
celui-ci, nous intgrerons le module tester. En code VHDL, nous aurons ceci :
@IUDU` sim_nom_entite DT
@I9 sim_nom_entite;
----------------------------------------------------------------------- Architecture de la simulation
----------------------------------------------------------------------
: PVU type_sorties);
sorties
@I98PHQPI@IU0
APS
6GG
)nom_composant
(arch_mod_a_tester);
VT@
: DI type_entrees;
entrees_sorties : DIPVU
@IUDU`
XPSFent_mod_a_tester
7@BDI
a1: nom_composant QPSUH6Q (entrees, entrees_sorties, sorties);
QSP8@TT
-- simulation
@I9QSP8@TT0
@I9 simulation;
Pour tester plusieurs parties distinctes dun mme fichier VHDL, il est possible de crer
plusieurs processus de simulation. Par contre, il est prfrable pour une meilleure
comprhension davoir un droulement temporel pour tous les signaux ayant un rapport
entre eux. Expliquons-nous : en VHDL, il est possible de donner toutes les caractristiques
temporelles dun signal en une seule fois, ce qui permet de dcrire toutes les entres de
manire parallle comme lexemple ci-dessous :
cgx
v.1
3.35 (54)
Introduction au VHDL
eivd
22 juin 1998
@I9 simulation_par_signal;
Malheureusement, il est trs difficile de se retrouver avec une telle simulation, car il faut
vrifier tous les signaux pour voir s'il y a un changement ou non. La chronologie des
vnements nest absolument pas vidente et il faudrait reclasser les signaux pour en avoir
une ide (1re action sur les entres 1 et 3, puis deux fois sur la 3, ensuite une action sur
lentre 2 pour continuer par lentre 1, etc.). Il vaut donc mieux avoir une simulation
chronologique, parfois plus longue crire, mais nettement plus comprhensible et
rutilisable. Cette simulation peut se trouver sous deux formes, lune rfrence au temps
t0 et lautre au dernier vnement qui a eu lieu.
Code VHDL pour une simulation chronologique rfrence au temps t0 :
@IUDU` sim_nom_entite DT
@I9 sim_nom_entite;
6S8CDU@8UVS@ simulation_chronologique_t0 PA sim_nom_entite DT
TDBI6G entree_1 : bit :=0;
TDBI6G entree_2 : bit :=0;
TDBI6G entree_3 : bit :=1;
7@BDI
QSP8@TT
7@BDI
entree_1
entree_3
entree_3
entree_3
entree_2
entree_1
entree_3
entree_1
entree_2
entree_1
entree_2
X6DU;
12
12
12
12
12
12
12
12
12
12
12
US6ITQPSU
US6ITQPSU
US6ITQPSU
US6ITQPSU
US6ITQPSU
US6ITQPSU
US6ITQPSU
US6ITQPSU
US6ITQPSU
US6ITQPSU
US6ITQPSU
0;
0;
1 6AU@S
0 6AU@S
1 6AU@S
1 6AU@S
1 6AU@S
0 6AU@S
0 6AU@S
1 6AU@S
1 6AU@S
10
14
17
23
25
35
35
45
52
ns;
ns;
ns;
ns;
ns;
ns;
ns;
ns;
ns;
@I9QSP8@TT;
@I9 simulation_chronologique_t0;
cgx
v.1
3.36 (55)
Introduction au VHDL
eivd
22 juin 1998
entree_1 12 0;
entree_3 12 0;
X6DUAPS 10 ns;
entree_3 12 1;
X6DUAPS 4 ns;
entree_3 12 0;
X6DUAPS 3 ns;
entree_2 12 1;
X6DUAPS 6 ns;
entree_1 12 1;
X6DUAPS 2 ns;
entree_3 12 1;
X6DUAPS 10 ns;
entree_1 12 1;
entree_2 12 0;
X6DUAPS 10 ns;
entree_1 12 1;
X6DUAPS 7 ns;
entree_2 12 1;
@I9QSP8@TT0
@I9 simulation_chronologique;
Si la premire forme semble plus lisible, cest la deuxime qui est utilise pour crer des
procdures facilitant une simulation par cycles dhorloge. En effet, pour faciliter la
simulation, deux procdures et un processus peuvent tre crs. Une procdure pour dfinir
un cycle dhorloge, lautre pour dfinir le pas de simulation, et le processus pour dfinir la
squence dun cycle dhorloge. Les simulations pourront alors scrire sous la forme
suivante :
QSP8@TT
7@BDI
cycle;
entree_1 12 valeur_de_l_entree;
cgx
v.1
3.37 (56)
Introduction au VHDL
eivd
22 juin 1998
entree_2 12 valeur_de_l_entree;
sim(10);
-- cycle dhorloge
-- 5 cycles dhorloge
@I9QSP8@TT0
Srhr)
Les signaux dclarer et les procdures sont les suivantes (attention, seul ce qui est en gras
peut tre modifi) :
8PITU6IUrvqr)vr)2 0rvqrquytr
8PITU6IUvrfv)vr)2 0vrqrrvvhyr
TDBI6Gvfrq)iyrh)2shyr0svqryhvyhv
TDBI6Guytr)iv0vthyquytr
TDBI6Gqrifppyr)iv0
vqvryrqriqppyrquytr
Qrrqrhqrvyhvhrpyvrqrrvvhyr
QSP8@9VS@virfqfvrfqrfr)Drtr)2 DT
7@BDI
cgx
v.1
3.38 (57)
Introduction au VHDL
eivd
22 juin 1998
X6DUAPSirfqfvrfqrfrvrfv0
@I9v0
Qprqrrrhqryhvrhryvrppyrquytr
Grrvrhryqryhprqrrvryrppyrrprqrv
pryvpvrhvhpyrhrryr)vhshvryr
hqrvyhvpuvrhhrrhpur
pivhvr
QSP8@9VS@ppyrirfqrfppyr)Drtr)2 DT
7@BDI
APSvDI UPirfqrfppyrGPPQ
X6DUVIUDGqrifppyr@W@IU6I9qrifppyr2 0
@I9GPPQ0
@I9ppyr0
7@BDI
prprtrrrruytryhvyhv
QSP8@TT
7@BDI
DAIPUvfrqUC@I
uytr12
6AU@Srvqr#
6AU@S!rvqr#
6AU@S"rvqr#0
qrifppyr12
6AU@Svrfv0
X6DUAPSrvqr0
@GT@X6DU0
@I9DA0
@I9QSP8@TT0
Pour illustrer ces fichiers de simulation, un fichier de test pour le dtecteur de sens vu
auparavant est donn ci-dessous :
----------------------------------------------------------------------- Nom du fichier : m_etats.vhd
-- Auteur
: C. Guex
-- Date
: avril 1997
-- Version
: 1.0
-- Modifications :
-- Auteur
:
Date :
----------------------------------------------------------------------- But
: exemple du cours VHDL dune simulation dune
-machine detats avec reset asynchrone et set
-synchrone
cgx
v.1
3.39 (58)
Introduction au VHDL
eivd
22 juin 1998
----------------------------------------------------------------------
@IUDU` sim_detecteur_sens DT
@I9 sim_detecteur_sens;
----------------------------------------------------------------------- Architecture du module de simulation du detecteur de sens
----------------------------------------------------------------------
@I98PHQPI@IU;
sim_end : boolean :=
entree_a, entree_b :
set, reset : bit;
horloge : bit;
debut_cycle : bit;
verif_sortie : bit;
erreur : bit;
false;
bit;
-- signal dhorloge
-- indique le debut dun cycle dhorloge
cgx
v.1
3.40 (59)
Introduction au VHDL
eivd
22 juin 1998
QSP8@TT
7@BDI
DAIPU sim_endUC@I
horloge 12 0,
1 6AU@S periode 4,
1 6AU@S 2 periode 4,
0 6AU@S 3 periode 4;
debut_cycle 12 1,
0 6AU@Sunite_min;
X6DUAPS periode;
@GT@X6DU;
@I9DA;
@I9QSP8@TT;
a1: detect_sens QPSUH6Q
(entree_a, entree_b, horloge, reset, set, verif_sortie);
QSP8@TT
7@BDI
-- Attention, le premier cycle doit etre double pour un fonctionnement
-- correct ou alors, le plus simple est de toujours commencer par un
-- cycle inactif
cycle;
-- cycle inactif
reset 12 1;
sim(10);
reset 12 0;
cycle;
set 12 0;
entree_a 12 0;
entree_b 12 0;
cycle;
entree_a 12 0;
entree_b 12 1;
cycle(4);
erreur 12 verif_sortie
entree_a 12 1;
entree_b 12 1;
cycle;
erreur 12 verif_sortie
entree_a 12 1;
entree_b <= 0;
cycle;
erreur 12 verif_sortie
entree_a 12 0;
entree_b 12 0;
cycle;
erreur 12 verif_sortie
cgx
YPS 1;
YPS 1;
YPS 1;
YPS 1;
v.1
3.41 (60)
Introduction au VHDL
eivd
entree_a 12 1;
entree_b 12 0;
cycle;
erreur 12 verif_sortie
entree_a 12 1;
entree_b 12 1;
cycle;
erreur 12 verif_sortie
entree_a 12 0;
entree_b 12 1;
cycle;
erreur 12 verif_sortie
entree_a 12 0;
entree_b 12 0;
cycle;
erreur 12 verif_sortie
22 juin 1998
YPS 0;
YPS 0;
YPS 0;
YPS 0;
sim_end 12 true;
@I9QSP8@TT;
@I9 simul_det_sens;
Pour tester les sorties, la solution la plus simple est dutiliser une fonction ou exclusif et de
comparer la valeur relle de la sortie par rapport la valeur souhaite. La valeur du signal
rr devrait toujours valoir 0. Nous aurons donc :
erreur 12 sortie YPS valeur souhaitee;
Ir)
3PG6SDUe9@T@IUSe@TTPSUD@T
La polarit des signaux en VHDL peut scrire de manire trs simple si lon se donne une
norme. Pour dcrire le fonctionnement dun systme, il est beaucoup plus ais dcrire en
polarit positive, plutt quen polarit mixte. Cest donc dans cette optique quune interface
peut tre cre entre le module dcrivant le fonctionnement du systme (crit en polarit
positive) et le monde extrieur.
La reprsentation graphique de cette interface est la suivante :
cgx
v.1
3.42 (61)
Introduction au VHDL
eivd
22 juin 1998
Dhtr!&
@IUDU` module_exterieur DT
QPSU (d0_L : DI bit;
d1_H : DI bit;
d2_L : DI bit;
d3_H : DI bit;
q0_L : PVU bit;
q1_L : PVU bit;
q2_H : PVU bit);
@I9 module_exterieur;
--------
entree
entree
entree
entree
sortie
sortie
sortie
0
1
2
3
0
1
2
active
active
active
active
active
active
active
basse
haute
basse
haute
basse
basse
haute
v.1
3.43 (62)
Introduction au VHDL
eivd
22 juin 1998
VT@@IUDU`XPSF.ent_module_interieur (arch_module_interieur);
TDBI6G d3, d2, d1, d0, q2, q1, q0 : bit;
7@BDI
pol1 : module_interieur QPSUH6Q (d0, d1, d2, d3, q0, q1, q2);
-d0
d1
d2
d3
entrees
12IPU d0_L;
12
d1_H;
12IPU d2_L;
12
d3_H;
-- sorties
q0_L 12IPU q0;
q1_L 12IPU q1;
q2;
q2_H 12
@I9 polarite;
QRPBGXBVLJQDOfC
QRPBGXBVLJQDOfG
ryhvpvvr
ryhvppthvr
vyrqryhvpqvthyvyvprjyrpvrqqyrhypprh
!vthjyhvpvrrqhyvrshprhvvyvrhhyrvthq
qyrvpvrr)pyxfGrpyxfC
cgx
v.1
3.44 (63)
Introduction au VHDL
eivd
6USV8UVS@BeIeS6G@9VIQSPBS6HH@9+'/
22 juin 1998
VT@ work.bibliotheques_necessaires.6GG;
-- --------------------------------------------------------------- declaration de lentite et de ses ports dentree-sortie
-- --------------------------------------------------------------
@IUDU` nom_de_l_entite DT
B@I@SD8 (parametres_generiques: type := Valeur_par_defaut);
QPSU (ports_d_entree : DI type_ports_d_entree;
ports_de_sortie : PVU type_ports_de_sortie;
ports_d_entree_sortie : DIPVU type_ports_entree_sortie);
@I9 nom_de_l_entite;
-- --------------------------------------------------------------- architecture du programme, structure interne
-- --------------------------------------------------------------
@I9 type_de_description;
cgx
v.1
4.1 (64)
Introduction au VHDL
eivd
22 juin 1998
/@T7D7GDPUCRV@T
9psvvv)
Dclaration :
VT@ work.bibliotheques_necessaires.6GG;
#!
Rrrqhriviyvuqr4
#!!
8rqppyhrriviyvuqrqhsvpuvrWC9G4
Pour utiliser des lments dans un fichier VHDL, il faut dabord savoir si lon veut utiliser
un lment de notre espace de travail (fichier VHDL cr par lutilisateur) ou si lon veut
utiliser un lment qui se trouve dans une bibliothque externe.
#!!
Gpyprjvyvrshvhvrqrrrhprqrhhvywr
En VHDL, on assimile lespace de travail une bibliothque (bien quil nen soit pas une).
Pour y utiliser un lment, la plupart des compilateurs VHDL emploient le mot XPSF
comme nom de bibliothque. Ds lors, tous les lments crs par lutilisateur peuvent tre
rutiliss dans un autre fichier VHDL du mme projet : il suffit de dclarer les lments de
la bibliothque WORK que lon dsire utiliser.
cgx
v.1
4.2 (65)
Introduction au VHDL
eivd
22 juin 1998
Par exemple, si lutilisateur a cr un paquetage (fichier VHDL dans lequel on trouve une
srie de variables, constantes, signaux, fonctions et procdures), il peut lutiliser en dclarant
la ligne suivante au dbut de son nouveau fichier VHDL :
.nom_du_paquetage.6GG0
VT@XPSF
Lorsque cest un element que lon dsire utiliser, la dclaration est la suivante :
FOR ALL : nom_element USE ENTITY XPSF.entite_element(arch_element);
VT@ XPSF
ou
VT@
nom_bibliotheque_utilisateur.nom_du_paquetage.6GG;
Exemple :
VT@XPSFhrhtrfrfytvr6GG0
ou
VT@rhrhtrfrfytvr6GG0
#!!!
Gpyprjvyvrshvhvrqrhriviyvuqr
Pour utiliser un lment dune bibliothque, il faut dabord dclarer celle-ci dans notre
fichier VHDL, puis il faut spcifier quels sont les parties de la bibliothque utiliser.
Ce qui donne le code suivant :
nom_de_bibliotheque;
VT@ nom_de_bibliotheque.nom_du_paquetage.6GG;
GD7S6S`
Exemple pour utiliser le paquetage de simulation (la description suit dans quelques pages):
einev;
VT@ einev.simulation_pkg.6GG;
GD7S6S`
cgx
v.1
4.3 (66)
Introduction au VHDL
eivd
36RV@U6B@TDHVG6UDPI
22 juin 1998
$
Qppqrrspvvyvhiyr
Nous trouverons ci-dessous toutes les procdures et fonctions utilisables dans ce paquetage:
Les lments entre crochets [ ] sont des lments optionnels. Il nest pas ncessaire de les
mettre.
v0
v
v(a);
v
Exemple : v$0
v(b unite_temps);
cgx
v.1
5.1 (67)
Introduction au VHDL
eivd
unite_temps
22 juin 1998
Exemple : v 0
v(a, b unite_temps);
v
unite_temps
ppyr(n);
ppyr
Exemple : ppyr$0
rpu(texte [, nom_de_fichier]);
cgx
v.1
5.2 (68)
Introduction au VHDL
eivd
22 juin 1998
rpu
texte
nom_de_fichier
Exemples :
rpu9riqryhvyhv0
rpuAvpr0
rpu(valeur [, nom_de_fichier]);
rpu
valeur
nom_de_fichier
Exemples :
rpurh0
rpu 0
rpurhpr0
texte
valeur
nom_de_fichier
Exemples :
cgx
rpuivqrh2rh0
rpurrr2 0
rpuivqrh2rhpr0
v.1
5.3 (69)
Introduction au VHDL
eivd
22 juin 1998
rpuf(vecteur [, string(nom_de_fichier)]);
rpuf
vecteur
nom_de_fichier
Exemples :
rpufrprfh0
rpuf 0
rpufrprfhpr0
rpuf vtpr0
vecteur
nom_de_fichier
Exemples :
rpufyrrprhh)rprfh0
rpufyrrprh2rprfhpr0
Attention :
rpufyrrprh2 0
rpuyrrprh2 0
vecteur_a vecteur_b;
cgx
v.1
5.4 (70)
Introduction au VHDL
eivd
vecteur_a
Premier vecteur.
vecteur_b
Deuxime vecteur.
Exemples :
22 juin 1998
r12pr 0
r12 pr0
r12prfhprfi0
rprfh12rprfhrprfi0
vecteur_a
valeur_a_tester
nom_de_fichier
Exemples :
purpxpr 0
purpxpr prv0
vqvrfvfrr(vecteur [, nom_de_fichier]);
cgx
vqvrfvfrr
vecteur
Vecteur tester.
nom_de_fichier
v.1
5.5 (71)
Introduction au VHDL
Exemples :
eivd
22 juin 1998
vqvrfvfrrr0
vqvrfvfrrrpr0
vecteur_a
vecteur_b
ecrire
nom_de_fichier
Exemples :
$ !
cgx
r12pfrprh 0
r12pfrprh v0
r12pfrprh vpr0
8hr
hfqrfvyhvfv
fsvpuvr
vrfqrfrfv
5.6 (72)
Introduction au VHDL
$ "
Tvth
qrifppyr
22 juin 1998
Ur
hpprr
$ #
eivd
&P9@9VQ6RV@U6B@9@TDHVG6UDPI
---------------------------------------------------------------------------- Auteur
: Claude Guex
-- Date
: octobre 1997
-- But
: faciliter la simulation en VHDL
-- Remarques : 1) Plusieurs procedures et fonctions utilisent le paquetage
-standard textio pour les acces aux fichiers. Ce paquetage
-etant refuse par plusieurs compilateurs, il sera peut-etre necessaire de les modifier. Il sagit de :
-- toutes les procedures ECHO (3 procedures)
-- de la procedure INDIQUER_SI_ERREUR
-- de la fonction CMP_VECT
---------------------------------------------------------------------------- Modifications :
-- Auteur
:
Date :
-- But
:
---------------------------------------------------------------------------- Ajout de procedures et fonctions :
-- Auteur
:
Date :
-- But
:
---------------------------------------------------------------------------
86( std.textio.$//;
3$&.$*( simulation_pkg ,6
---------------------------------------------------------------------------- ZONE MODIFIABLE PAR LUTILISATEUR
--------------------------------------------------------------------------&2167$17 pas_de_simulation_min : time := 100 ns;
&2167$17 nom_fichier : string := "resultat.txt";
---------------------------------------------------------------------------- FIN DE LA ZONE MODIFIABLE PAR LUTILISATEUR
---------------------------------------------------------------------------
cgx
v.1
5.7 (73)
Introduction au VHDL
eivd
22 juin 1998
v.1
5.8 (74)
Introduction au VHDL
eivd
22 juin 1998
5(7851 bit;
---------------------------------------------------------------------------- Fonction permettant de faire loperation "ou exclusif" sur des vecteurs
-- Le "ou exclusif" se fait bit a bit.
-- PAS AU POINT. A TERMINER
---------------------------------------------------------------------------
,6
%(*,1
:$,7 )25 (nombre_d_unites_de_temps * unite_min);
(1' sim;
---------------------------------------------------------------------------- Procedure permettant des pas de simulation avec lunite minimale
---------------------------------------------------------------------------
v.1
5.9 (75)
Introduction au VHDL
eivd
22 juin 1998
nombre_d_unites_de_temps : integer := 1 )
,6
%(*,1
:$,7 )25 (nombre_d_unites_de_temps * unite_min);
(1' sim;
---------------------------------------------------------------------------- Procedure permettant plusieurs cycles dhorloge
-- Le premier appel de la procedure termine le cycle precedent si celui-ci
-- netait pas complet (par exemple : si on a fait quelques pas de
-- simulation non synchronises avant, reset asynchrone, combinatoire, ...)
---------------------------------------------------------------------------
(1' cycle;
---------------------------------------------------------------------------- Procedure qui indique dans un fichier si un vecteur est nul ou non
---------------------------------------------------------------------------
precedent";
0);
%(*,1
,) somme = vecteur_int 7+(1
write (pointeur_pour_fichier,texte);
writeline(fichier_resultats,pointeur_pour_fichier);
(/6(
write (pointeur_pour_fichier,texte2);
writeline(fichier_resultats,pointeur_pour_fichier);
(1' ,);
(1' indiquer_si_erreur;
---------------------------------------------------------------------------- Procedure permettant decrire dans un fichier un texte.
---------------------------------------------------------------------------
,6
%(*,1
(1'
write (pointeur_pour_fichier,texte_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo;
v.1
5.10 (76)
Introduction au VHDL
eivd
nom_du_fichier: string := nom_fichier)
22 juin 1998
,6
%(*,1
(1'
write (pointeur_pour_fichier,valeur_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo;
,6
write (pointeur_pour_fichier,vecteur_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo_v;
,6
%(*,1
(1'
write (pointeur_pour_fichier,texte_a_ecrire);
write (pointeur_pour_fichier,valeur_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo;
,6
%(*,1
(1'
write (pointeur_pour_fichier,texte_a_ecrire);
write (pointeur_pour_fichier,vecteur_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo_v;
v.1
,6
5.11 (77)
Introduction au VHDL
eivd
22 juin 1998
(/6(
write (pointeur_pour_fichier,erreur1);
write (pointeur_pour_fichier,valeur_2);
write (pointeur_pour_fichier,erreur2);
write (pointeur_pour_fichier,valeur_1);
writeline(fichier_resultats,pointeur_pour_fichier);
(1' ,);
(1' check;
---------------------------------------------------------------------------- Procedure qui compare ce que lutilisateur desire et le calcul resultant
-- de la description VHDL. Indique la valeur fausse sil y en a.
---------------------------------------------------------------------------
%(*,1
$66(57 (vecteur_1/(1*7+ = vecteur_2/(1*7+)
5(3257 "Attention, les deux vecteurs sont de taille differente"
6(9(5,7< error;
,) vecteur_1 = vecteur_2 7+(1
write (pointeur_pour_fichier,enordre);
writeline(fichier_resultats,pointeur_pour_fichier);
(/6(
write (pointeur_pour_fichier,erreur1);
write (pointeur_pour_fichier,vecteur_2);
write (pointeur_pour_fichier,erreur2);
write (pointeur_pour_fichier,vecteur_1);
writeline(fichier_resultats,pointeur_pour_fichier);
(1' ,);
(1' check;
---------------------------------------------------------------------------- Fonction qui verifie lidenticite de deux vecteurs.
-- Elle ne fait quindiquer si les deux vecteurs sont identiques (0) ou
-- non (1) a laide dun bit.
---------------------------------------------------------------------------
5(7851 bit ,6
v.1
5.12 (78)
Introduction au VHDL
eivd
22 juin 1998
(/6(
,) ecrire_fichier = oui 7+(1
write(pointeur_pour_fichier,differents);
writeline(fichier_resultats,pointeur_pour_fichier);
(1' ,);
5(7851 1;
(1' ,);
(1' cmp_vect;
---------------------------------------------------------------------------- Fonction permettant de faire loperation "ou exclusif" sur des vecteurs
-- Le "ou exclusif" se fait bit a bit.
-- Il est obligatoire de redefinir les vecteurs dentree, En effet
-- lutilisateur de cette fonction peut entrer deux vecteurs de meme taille
-- mais avec des bornes differentes :
-vecteur_1(7 downto 0), vecteur_2(1 to 8)
-- Mais il peut encore entrer un vecteur directement par sa valeur, ce qui
-- implique quil naura pas de bornes (ex : "0011010").
-- Il est des lors impossible de parcourir les vecteurs dune borne a
-- lautre, car elles peuvent etre soit differentes, soit inexistantes !
-- Attention : on peut ecrire
vecteur_a <= vecteur_a xor vecteur_b;
-mais pas
vecteur_b <= vecteur_a xor vecteur_b;
---------------------------------------------------------------------------
(/6(
vecteur_intermediaire(i) := 1;
(1' ,);
compteur_interne := compteur_interne - 1;
(1' /223;
5(7851 vecteur_intermediaire;
(1' "xor";
(1' simulation_pkg;
&P9@9VQ6RV@U6B@9@TDHVG6UDPIQPVSG@TU9BGPBD8B
---------------------------------------------------------------------------- Auteur
: Claude Guex
-- Date
: octobre 1997
-- But
: faciliter la simulation en VHDL
-- Remarques : 1) Plusieurs procedures et fonctions utilisent le paquetage
cgx
v.1
5.13 (79)
Introduction au VHDL
eivd
22 juin 1998
86( std.textio.$//;
/,%5$5< ieee;
86( ieee.std_logic_1164.$//;
86( ieee.std_logic_textio.$//;
3$&.$*( simulation_std_logic_pkg ,6
---------------------------------------------------------------------------- ZONE MODIFIABLE PAR LUTILISATEUR
--------------------------------------------------------------------------&2167$17 pas_de_simulation_min : time := 100 ns;
&2167$17 nom_fichier : string := "resultat.txt";
---------------------------------------------------------------------------- FIN DE LA ZONE MODIFIABLE PAR LUTILISATEUR
---------------------------------------------------------------------------
cgx
v.1
5.14 (80)
Introduction au VHDL
eivd
22 juin 1998
cgx
v.1
5.15 (81)
Introduction au VHDL
eivd
22 juin 1998
(1' simulation_std_logic_pkg;
,6
%(*,1
:$,7 )25 (nombre_d_unites_de_temps * unite_min);
(1' sim;
---------------------------------------------------------------------------- Procedure permettant des pas de simulation avec lunite minimale
---------------------------------------------------------------------------
,6
%(*,1
:$,7 )25 (nombre_d_unites_de_temps * unite_min);
(1' sim;
---------------------------------------------------------------------------- Procedure permettant plusieurs cycles dhorloge
-- Le premier appel de la procedure termine le cycle precedent si celui-ci
-- netait pas complet (par exemple : si on a fait quelques pas de
-- simulation non synchronises avant, reset asynchrone, combinatoire, ...)
---------------------------------------------------------------------------
precedent";
9$5,$%/( vecteur_int : std_logic_vector(somme+,*+ '2:172 somme/2:):=(27+(56
=> 0);
9$5,$%/( pointeur_pour_fichier : line;
),/( fichier_resultats : text ,6 287 nom_du_fichier;
%(*,1
,) somme = vecteur_int 7+(1
write (pointeur_pour_fichier,texte);
writeline(fichier_resultats,pointeur_pour_fichier);
(/6(
cgx
v.1
5.16 (82)
Introduction au VHDL
eivd
22 juin 1998
write (pointeur_pour_fichier,texte2);
writeline(fichier_resultats,pointeur_pour_fichier);
(1' ,);
(1' indiquer_si_erreur;
---------------------------------------------------------------------------- Procedure permettant decrire dans un fichier un texte.
---------------------------------------------------------------------------
,6
%(*,1
(1'
write (pointeur_pour_fichier,texte_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo;
,6
%(*,1
(1'
write (pointeur_pour_fichier,valeur_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo;
,6
%(*,1
(1'
write (pointeur_pour_fichier,vecteur_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo_v;
,6
%(*,1
(1'
write (pointeur_pour_fichier,texte_a_ecrire);
write (pointeur_pour_fichier,valeur_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo;
---------------------------------------------------------------------------
cgx
v.1
5.17 (83)
Introduction au VHDL
eivd
22 juin 1998
,6
%(*,1
(1'
write (pointeur_pour_fichier,texte_a_ecrire);
write (pointeur_pour_fichier,vecteur_a_ecrire);
writeline(fichier_resultats,pointeur_pour_fichier);
echo_v;
%(*,1
,) valeur_1 = valeur_2 7+(1
write (pointeur_pour_fichier,enordre);
writeline(fichier_resultats,pointeur_pour_fichier);
(/6(
write (pointeur_pour_fichier,erreur1);
write (pointeur_pour_fichier,valeur_2);
write (pointeur_pour_fichier,erreur2);
write (pointeur_pour_fichier,valeur_1);
writeline(fichier_resultats,pointeur_pour_fichier);
(1' ,);
(1' check;
---------------------------------------------------------------------------- Procedure qui compare ce que lutilisateur desire et le calcul resultant
-- de la description VHDL. Indique la valeur fausse sil y en a.
---------------------------------------------------------------------------
(/6(
write (pointeur_pour_fichier,erreur1);
cgx
v.1
5.18 (84)
Introduction au VHDL
eivd
22 juin 1998
write (pointeur_pour_fichier,vecteur_2);
write (pointeur_pour_fichier,erreur2);
write (pointeur_pour_fichier,vecteur_1);
writeline(fichier_resultats,pointeur_pour_fichier);
(1' ,);
(1' check;
---------------------------------------------------------------------------- Fonction qui verifie lidenticite de deux vecteurs.
-- Elle ne fait quindiquer si les deux vecteurs sont identiques (0) ou
-- non (1) a laide dun std_logic.
---------------------------------------------------------------------------
5(7851 std_logic ,6
(/6(
,) ecrire_fichier = oui 7+(1
write(pointeur_pour_fichier,differents);
writeline(fichier_resultats,pointeur_pour_fichier);
(1' ,);
5(7851 1;
(1' ,);
(1' cmp_vect;
(1' simulation_std_logic_pkg;
)D8CD@S9@TDHVG6UDPI9V9e8P9@VST@QUT@BH@IUT
-- Auteur : Claude Guex
-- Date
: octobre 1997
-- But
: Test un comparateur
/,%5$5< einev;
86( einev.simulation_pkg.$//;
(17,7< sim_sept_segments ,6
(1' sim_sept_segments;
$5&+,7(&785( simulation 2) sim_sept_segments ,6
&20321(17 sept_seg_a 3257 (code_binaire : ,1 bit_vector (3 '2:172 0);
S7, S6, S5, S4, S3, S2, S1 : 287 bit);
(1' &20321(17;
cgx
v.1
5.19 (85)
Introduction au VHDL
eivd
22 juin 1998
%(*,1
a1: sept_seg_a
v.1
5.20 (86)
Introduction au VHDL
eivd
22 juin 1998
cgx
v.1
5.21 (87)
Introduction au VHDL
eivd
sim_end
22 juin 1998
true;
:$,7;
(1' 352&(66;
(1' simulation;
)D8CD@S9@TDHVG6UDPI9V8PHQ6S6U@VS
-- Auteur : Claude Guex
-- Date
: octobre 1997
-- But
: Test un comparateur
/,%5$5< einev;
86( einev.simulation_pkg.$//;
(17,7< sim_comparateur ,6
(1' sim_comparateur;
$5&+,7(&785( simulation 2) sim_comparateur ,6
&20321(17 comparateur1 3257 (vecteur1,vecteur2 : ,1 bit_vector (3 '2:172 0);
pg, egal, pp : ,1 bit;
v1pgv2, v1egalv2, v1ppv2 : 287 bit);
(1' &20321(17;
)25 $// : comparateur1 86( (17,7< :25..comparateur(comportementale);
6,*1$/
6,*1$/
6,*1$/
6,*1$/
6,*1$/
6,*1$/
6,*1$/
%(*,1
a1: comparateur1
vappvb );
352&(66 (comparaison_precedente)
%(*,1
pg
comparaison_precedente(2);
egal comparaison_precedente(1);
pp
comparaison_precedente(0);
(1' 352&(66;
352&(66 (vapgvb, vaegalvb, vappvb)
%(*,1
resultat_comparaison(2) vapgvb;
cgx
v.1
5.22 (88)
Introduction au VHDL
eivd
resultat_comparaison(1)
resultat_comparaison(0)
(1' 352&(66;
22 juin 1998
vaegalvb;
vappvb;
352&(66
%(*,1
echo("---- debut de la simulation");
comparaison_precedente "000";
echo("---- vecteur_a = vecteur_b = 0, pas de report");
vecteur_a "0000";
vecteur_b "0000";
sim;
erreur resultat_comparaison ;25 "010"; --pour verifier graphiquement
check (resultat_comparaison, "010");
--verification par fichier
echo("---- vecteur_a = vecteur_b = 0, egal = 1");
comparaison_precedente "010";
vecteur_a "0000";
vecteur_b "0000";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = 0, pp = 1");
comparaison_precedente "001";
vecteur_a "0000";
vecteur_b "0000";
sim;
erreur resultat_comparaison ;25 "001";
check (resultat_comparaison, "001");
echo("---- vecteur_a = vecteur_b = 0, pg = 1");
comparaison_precedente "100";
vecteur_a "0000";
vecteur_b "0000";
sim;
erreur resultat_comparaison ;25 "100";
check (resultat_comparaison, "100");
echo("---- vecteur_a = vecteur_b = 1, egal = 1");
comparaison_precedente "010";
vecteur_a "0001";
vecteur_b "0001";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = 2, egal = 1");
vecteur_a "0010";
vecteur_b "0010";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = 3, egal = 1");
vecteur_a "0011";
vecteur_b "0011";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = 4, egal = 1");
vecteur_a "0100";
cgx
v.1
5.23 (89)
Introduction au VHDL
eivd
22 juin 1998
vecteur_b "0100";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = 5, egal = 1");
vecteur_a "0101";
vecteur_b "0101";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = 6, egal = 1");
vecteur_a "0110";
vecteur_b "0110";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = 7, egal = 1");
vecteur_a "0111";
vecteur_b "0111";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = 8, egal = 1");
vecteur_a "1000";
vecteur_b "1000";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = 9, egal = 1");
vecteur_a "1001";
vecteur_b "1001";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = a, egal = 1");
vecteur_a "1010";
vecteur_b "1010";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = b, egal = 1");
vecteur_a "1011";
vecteur_b "1011";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = c, egal = 1");
vecteur_a "1100";
vecteur_b "1100";
sim;
erreur resultat_comparaison ;25 "010";
check (resultat_comparaison, "010");
echo("---- vecteur_a = vecteur_b = d, egal = 1");
vecteur_a "1101";
vecteur_b "1101";
sim;
cgx
v.1
5.24 (90)
Introduction au VHDL
eivd
22 juin 1998
cgx
v.1
5.25 (91)
Introduction au VHDL
eivd
sim_end
22 juin 1998
true;
:$,7;
(1' 352&(66;
(1' simulation;
)D8CD@S9@TDHVG6UDPI9V8PHQU@VS7DUT
----------------------------------------------------------------------- Nom du fichier : comptsim.vhd
-- Auteur
: C. Guex
-- Date
: mai 1997
-- Version
: 1.0
-- Modifications :
-- Auteur
:
Date :
----------------------------------------------------------------------- But
: exemple du cours VHDL : simulation dun compteur
----------------------------------------------------------------------
/,%5$5< einev;
86( einev.simulation_pkg.$//;
(17,7< sim_compteur ,6
(1' sim_compteur;
----------------------------------------------------------------------- Architecture pour la simulation du compteur
----------------------------------------------------------------------
%(*,1
----------------------------------------------------------------------- ce processus genere une horloge pour la simulation
----------------------------------------------------------------------
cgx
v.1
5.26 (92)
Introduction au VHDL
eivd
352&(66
%(*,1
,) 127 sim_end 7+(1
horloge
0,
1 $)7(5
1 $)7(5
0 $)7(5
debut_cycle
1,
0 $)7(5
:$,7 )25 periode;
(/6( :$,7;
(1' ,);
(1' 352&(66;
a1: compteur
22 juin 1998
periode / 4,
2 * periode / 4,
3 * periode / 4;
unite_de_temps_min;
352&(66
%(*,1
-- Attention, le premier cycle doit etre double pour un fonctionnement correct
-- ou alors, le plus simple est de toujours commencer par un cycle inactif
cycle;
enable
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
enable
cycle;
erreur
cycle;
erreur
enable
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
erreur
cycle;
cgx
-- cycle inactif
1;
valeur_compteur
;25 "0001";
valeur_compteur
;25 "0010";
valeur_compteur
;25 "0011";
valeur_compteur
;25 "0100";
valeur_compteur
;25 "0101";
valeur_compteur
;25 "0110";
valeur_compteur
;25 "0111";
valeur_compteur
0;
valeur_compteur
valeur_compteur
1;
valeur_compteur
;25 "1001";
valeur_compteur
;25 "1010";
valeur_compteur
;25 "1011";
valeur_compteur
;25 "1100";
valeur_compteur
;25 "1101";
valeur_compteur
;25 "1110";
valeur_compteur
;25 "1111";
valeur_compteur
;25 "0000";
;25 "1000";
;25 "1000";
;25 "1000";
v.1
5.27 (93)
Introduction au VHDL
eivd
erreur
sim_end
valeur_compteur
22 juin 1998
;25 "0001";
true;
(1' 352&(66;
(1' simul_compteur;
)D8CD@S9@TDHVG6UDPI9V9eU@8U@VS9@T@IT
---------------------------------------------------------------------------- Nom du fichier : m_etats.vhd
-- Auteur
: C. Guex
-- Date
: avril 1997
-- Version
: 1.0
-- Modifications
:
-- Auteur
:
Date :
---------------------------------------------------------------------------- But
: exemple du cours VHDL dune simulation dune machine
-detats avec reset asynchrone et set synchrone
---------------------------------------------------------------------------
/,%5$5< einev;
86( einev.simulation_pkg.$//;
(17,7< sim_detecteur_sens ,6
(1' sim_detecteur_sens;
---------------------------------------------------------------------------- Architecture pour la simulation du detecteur de sens
---------------------------------------------------------------------------
%(*,1
cgx
v.1
5.28 (94)
Introduction au VHDL
eivd
22 juin 1998
352&(66
%(*,1
,) 127 sim_end 7+(1
horloge
0,
1 $)7(5
1 $)7(5
0 $)7(5
debut_cycle
1,
0 $)7(5
:$,7 )25 periode;
(/6( :$,7;
(1' ,);
(1' 352&(66;
a1: detect_sens
verif_sortie);
3257
periode / 4,
2 * periode / 4,
3 * periode / 4;
unite_de_temps_min;
0$3
(entree_a,
entree_b,
horloge,
reset,
set,
352&(66
%(*,1
-- Attention, le premier cycle doit etre double pour un fonctionnement correct
-- ou alors, le plus simple est de toujours commencer par un cycle inactif
cycle;
-- cycle inactif
reset 1;
sim(10);
reset 0;
cycle;
set 0;
entree_a 0;
entree_b 0;
cycle;
entree_a 0;
entree_b 1;
cycle(4);
erreur verif_sortie
entree_a 1;
entree_b 1;
cycle;
erreur verif_sortie
entree_a 1;
entree_b 0;
cycle;
erreur verif_sortie
entree_a 0;
entree_b 0;
cycle;
erreur verif_sortie
entree_a 1;
entree_b 0;
cycle;
erreur verif_sortie
entree_a 1;
entree_b 1;
cycle;
erreur verif_sortie
entree_a 0;
entree_b 1;
cgx
;25 1;
;25 1;
;25 1;
;25 1;
;25 0;
;25 0;
v.1
5.29 (95)
Introduction au VHDL
eivd
cycle;
erreur
entree_a
entree_b
cycle;
erreur
sim_end
verif_sortie
0;
0;
verif_sortie
22 juin 1998
;25 0;
;25 0;
true;
(1' 352&(66;
(1' simul_det_sens;
cgx
v.1
5.30 (96)
Introduction au VHDL
eivd
$11(;(6
/@TPQeS6U@VST9+'/
22 juin 1998
Tous les oprateurs existants en VHDL se trouvent dans la liste ci-dessous dans lordre
dcroissant de leur priorit :
pqr
9+'/
pyhr
vvp
rryr
hi
valeur absolue
op. divers
abs A
non logique
op. divers
not A
puissance
op. divers
A**B
multiplication
op. de multiplication
A*B
division
op. de multiplication
A/B
modulo
op. de multiplication
A mod B
remainder
op. de multiplication
A rem B
plus
op. de signe
+A
moins
op. de signe
-A
addition
op. daddition
A+B
soustraction
op. daddition
A-B
concatnation
op. daddition
- D1&D0
- vh&dl
quivalent
op. relationnels
when A=B
2
diffrent de
op. relationnels
when A/=B
plus petit
op. relationnels
when A<B
op. relationnels
when A<=B
plus grand
op. relationnels
when A>B
12
3
cgx
v.1
6.1 (97)
Introduction au VHDL
eivd
9+'/
pqr
vvp
rryr
op. relationnels
when A>=B
hq
et
op. logiques
A and B
ou
op. logiques
A or B
hq
et invers
op. logiques
A nand B
ou invers
op. logiques
A nor B
ou exclusif
op. logiques
A xor B
/@THPUTSeT@SWeT
abs
access
after
alias
all
and
architecture
array
assert
attribute
begin
block
body
buffer
bus
case
component
configuration
constant
cgx
pyhr
32
22 juin 1998
disconnect
downto
else
elsif
end
entity
exit
file
for
function
generate
generic
guarded
if
in
inout
is
label
library
linkage
loop
package
port
procedure
process
map
mod
range
record
register
rem
report
return
units
until
use
variable
nand
new
next
nor
not
null
of
on
open
or
others
out
v.1
wait
when
while
with
xor
select
severity
signal
subtype
then
to
transport
type
6.2 (98)
Introduction au VHDL
eivd
22 juin 1998
36TT6B@9@$7@G@I9+'/
$EHO
9+'/
(QWUpHVVRUWLHV
(QWUpHVVRUWLHV
qyr route
rv route v
9rpyhhv
entree QDI;
A1, A0 QDI;
A = [A1, A0];
entree: v STD_LOGIC;
A: v STD_LOGIC_VECTOR(1 q 0);
sortie: STD_LOGIC;
S: STD_LOGIC_VECTOR(1 q 0);
entree_sortie: v STD_LOGIC;);
rq;
Apvrr
Apvrr
9rpyhhv
...
...
@hv
rq behavioral;
...
cgx
9ppyhhvqryuytr
9ppyhhvqryuytr
bascule.pyx2 horloge;
bascule )2 entree_bascule;
pr (horloge)
vs horloge'rr hq horloge 2 '1'
ur bascule 12 entree_bascule;
rqvs;
rqpr;
6vthv
6vthv
)2, 2
12
v.1
6.3 (99)
Introduction au VHDL
eivd
22 juin 1998
$EHO
9+'/
Gtvr
Gtvr
, , ,
hq, , ,
Hhpuvrjph
Hhpuvrjph
Thrfqvhth machine
phr machine v
Thr etat_1:
ur etat_1 23
sortie 2 1;
BU etat_futur;
sortie 12 1;
machine 12 etat_futur;
Thr etat_2:
ur etat_2 23
sortie 2 1;
DA condition UC@I
etat_futur
@GT@DA (condition) UC@I
etat_1;
sortie 12 1;
vs condition ur
machine 12 etat_futur;
ryvs condition ur
machine 12 etat_1;
ryr
machine 12 etat_initial;
rqvs0
urur23
machine 12 etat_trappe;
rqphr;
cgx
v.1
6.4 (100)
Introduction au VHDL
eivd
/@TQ6RV@U6B@TTU6I96S9T
%#
Thqhq
22 juin 1998
%#!
Urv
v.1
6.5 (101)
Introduction au VHDL
eivd
22 juin 1998
version 1994 (une nouvelle dition est publie tous les 5 ans environ)
%#"
Tqfytvpf
%#
cgx
v.1
6.6 (102)
Introduction au VHDL
eivd
%,%/,2*5$3+,(
/@TDI9DTQ@IT67G@T
cgx
[1]
[2]
22 juin 1998
/@T6VUS@T
[3]
[4]
[5]
v.1
7.1 (103)
Introduction au VHDL
eivd
22 juin 1998
,1'(;
abrviations
DOD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
VHSIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
VISC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
code VHDL
after . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
inertial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
transport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
when . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
combinatoire
description comportementale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
description par flot de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
description structurelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Commandes de simulation
cmp_vect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70, 71
cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
indiquer_si_erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68, 69
sim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
description
comportementale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31, 36
flot de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25, 41
structurelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29, 51
DOD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
mots rservs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5, 96
norme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
paquetages
Standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Std_logic_1164 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Textio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
squentiel
description comportementale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
description par flot de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
description structurelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
machines d'tat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
types physiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
temps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
VHSIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
cgx
v.1
8.1 (104)
Introduction au VHDL
eivd
22 juin 1998
1.1 (2)
1.1 (2)
1.1 (2)
1.2 (3)
1.2 (3)
1.3 (4)
v.1
9.1 (105)
Introduction au VHDL
eivd
22 juin 1998
v.1
9.2 (106)
Introduction au VHDL
eivd
22 juin 1998
Auteur
E-mail
Ecole
Tlphone
Fax
Nom du fichier
Version
Date / heure
: Claude Guex
: guex@einev.ch
: eivd - Ecole d'ingnieurs du Canton de Vaud, rte de Cheseaux 1, 1400 Yverdon-les-Bains, Suisse
: +41 (0) 24 423.21.11
accs direct : +41 (0) 24 423.22.51
: +41 (0) 24 425.00.50
: VHDL_IMP.WPD
:1
: 22 juin 1998 / 11h01
cgx
mail : boada@einev.ch
mail : gaumain@einev.ch
mail : messerli@einev.ch
mail : cedric.bornand@einev.ch
v.1
9.3 (107)