Cour VHDL Amami 5 - 2016 PDF
Cour VHDL Amami 5 - 2016 PDF
Cour VHDL Amami 5 - 2016 PDF
Introduction
Lobjet de ce document est de prsenter les principes de base sur lesquels repose le
dveloppement dun systme laide dune description VHDL. Les lments fondamentaux
du langage VHDL ainsi que les diffrentes mthodes de programmation y sont dcrits et
illustrs par des exemples trs varis allant de la simulation de la porte logique and
lacquisition des donnes par la carte Spartan 3 E. Chaque exemple est dcrit par son schma
logique, sa table de vrit, sa description par la conception flots de donnes, par la
conception comportementale et par la conception structurelle ainsi que sa simulation sur ISE
de Xilinx et la carte Spartan 3 E. Le code VHDL est donn pour chaque exemple fin dd
faciliter lapprentissage.
1.
Un circuit logique programmable, ou rseau logique programmable, est un circuit intgr logique qui peut tre reprogramm aprs sa fabrication.
Il est compos de nombreuses cellules logiques lmentaires et bascules logiques librement connectables. C'est la reconfiguration, ou
programmation, du composant qui dfinit les connexions faites entre portes logiques. On ne parle pas de programmation au sens logiciel
(contrairement un microprocesseur), on parlera de reconfiguration plutt que de reprogrammation (on modifie des connexions ou le
comportement du composant, on connecte des portes logiques entre elles, etc.).
Il s'agit
de rseaux logiques reconfigurables et modifiables. Ce type de composant lectronique est communment dsign par
diffrents appellations en anglais dont notamment :
Bien que fondamentalement synonymes, ces termes ne sont gnralement pas interchangeables dans le vocabulaire commercial des fabricants :
1.1.
Un circuit FPGA est un composant lectronique qui contient des milliers, voire des millions de transistors connects ensemble pour raliser des
fonctions logiques simples telles que des additions ou des soustractions ou des fonctions complexes telles que la mise en uvre dun contrleur
DSP (digital signal processor) ou bien microprocesseur.
les interconnexions.
IOB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
DCM
IOB
IOB
IOB
IOB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
Mulziplier
IOB
Block SelectRAM
CLK
DCM
Mulziplier
Block SelectRAM
IOB
IOB
CLK
CLB
CLB
IOB
CLB
IOB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
CLB
IOB
..
..
..
..
..
..
IOB
Mulziplier
Block SelectRAM
Mulziplier
Block SelectRAM
IOB
IOB
..
..
IOB
CLK
Rseau dinterconnexions
Les blocs logiques, prsents en grand nombre sur la puce (de quelques milliers quelques millions) sont connects entre eux par une matrice de
routage configurable. Ceci permet la reconfiguration volont du composant.
Afin de pouvoir finaliser un FPGA, il est ncessaire d'utiliser un langage de description matriel. Aprs compilation de cette description, on
obtient un fichier de configuration pour le FPGA choisi. VHDL et Verilog sont les deux langages de description les plus rpandus.
Langage VHDL
V(Vhsic: Very High Speed Integrated Circuit)H(Hardware)D(Description)L(Language), est un langage de description de systmes matriels. Ce
nest pas un langage de programmation, mais plutt un langage formel pour la spcification des systmes digitaux, aussi bien au niveau
comportemental que structurel. Il permet de faire la description, la simulation et la synthse des systmes digitaux.
2.1.
Historique
En 1981, le Dpartement de la Dfense (DoD) des Etats-Unis d Amrique a initi puis dirig le projet "Very High Speed Integrated Circuit"
(VHSIC). Ce projet avait pour but de formaliser la description des circuits intgrs dvelopps pour le DoD dans un langage commun. Lintrt
premier tait de dfinir, au travers du langage, une spcification complte et non ambigu du circuit dvelopper indpendante de la technologie
employe et des outils de CAO.
Le Dveloppement du langage a t confi par le DoD aux socits IBM, Intermetrics et Texas Instruments. Ce langage est baptis VHDL
(VHSIC Hardware Description Language). En 1987, il fait lobjet dune normalisation par lIEEE (Institute of Electrical and Electronic
Engineers). Le groupe VASG (VHDL Analysis and Standardization Group) est un groupe de travail IEEE responsable du Manuel de rfrence du
langage VHDL. La norme VHDL IEEE 1076 comme toute norme IEEE doit tre rvise et affine au moins une fois tous les 5 ans. Ses rvisions
successives sont P1076-87, P1076-93, P1076-2000, P1076-2002, les derniers digits indiquent lanne de rvision de la norme. a rvision P10762006 est en cours de normalisation. Des groupes de travail distincts du VASG, sont chargs de normaliser des extensions, des restrictions du
langage VHDL pour des besoins spcifiques.
2.2.
Programme VHDL
Pour dvelopper une application en VHDL, il faudra suivre la dmarche ci-dessous :
La cration du code source VHDL peut tre faite au moyen d'un diteur de texte ou d'outils graphiques permettant de dcrire la structure du
systme modliser sous la forme de schmas ou de diagrammes de blocs et son comportement sous la forme de machines dtats, de
chronogrammes ou de tables de vrit.
Lanalyseur (ou compilateur) vrifie la syntaxe dune description VHDL. Il permet la dtection derreurs locales, qui ne concernent que de lunit
compile. Lapproche compile produit directement du code machine, ou, dans certains cas, du code C qui sera lui-mme compil.
Chaque concepteur possde une bibliothque de travail (working library) de nom logique WORK (le nom est standard) dans laquelle sont placs
tous les modles compils. Le lien du nom logique avec lemplacement physique de la bibliothque dpend de loutil de simulation ou de synthse
utilis. Il est aussi possible de faire rfrence, en mode de lecture seule, dautres bibliothques, des bibliothques de ressources, contenant
2.4.
VHDL nous intresse en tant que langage pour la description, simulation et synthse des systmes digitaux. Au plus haut niveau d'abstraction, un
systme digital est vu comme une "bote noire" ou (structure logique) , dont on connat l'interface avec l'extrieur mais dont on ignore le contenu
Library ;Toute description VHDL utilise pour la synthse a besoin de bibliothques. LIEEE (Institut of Electrical and Electronics Engineers)
les a normalises et plus particulirement la bibliothque IEEE1164. Elles contiennent les dfinitions des types de signaux lectroniques, des
fonctions et sous programmes permettant de raliser des oprations arithmtiques et logiques,...
Syntaxe de la dclaration de la bibliothque
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
Cette dernire bibliothque est souvent utilise pour lcriture de compteurs
La directive Use permet de slectionner les bibliothques utiliser.
Dans la bibliothque IEEE STD_LOGIC_1164 TYPE les types usuels sont dj dclars. Le type std_logic contient 9 lments de base.
A et B sont des entres de type std_logic, C est une sortie de type std_logic
VHDL dfinit quatre modes qui dterminent le sens de transfert dune donne au travers du port :
in : Lentit lit un signal dentre fourni par lextrieur (ex : load, reset, clock, donne unidirectionnelles)
out : Lentit fournit un signal de sortie, mais ne peut pas relire ce signal
buffer : Larchitecture de lentit fabrique un signal utilisable en sortie, qui peut aussi tre relu par lentit comme un signal interne (ex
: sorties dun compteur dont ltat doit tre test)
Flots de donnes (Data flow) : larchitecture est dclare sous forme dquations logiques
Structurel: larchitecture est dclare sous forme structure, c'est--dire sous forme de composants (component) interconnects avec des
signaux interne. un assemblage de sous-blocs, similaire la liste d'interconnexions d'un schma logique (netlist)
Syntaxe de dclaration de larchitecture sous forme flot de donnes
Signal, dclare un signal permettant la communication entre les tats concurrents l'intrieur d'une architecture. Dans la dfinition, on doit
spcifier un type au signal et l'on peut attribuer une valeur par dfaut.
Syntaxe de dclaration dun signal lintrieur dune architecture
Description en VHDL de la porte logique and avec la conception Flots de donnes et sa simulation
Etape 1 : Ouvrir le navigateur Xilinx ISE Design Suite 13.1 et crer un nouveau projet nomm And_g
10
Etape 5 : Crer le code qui doit dcrire le comportement de votre circuit numrique
dans la zone de lditeur de texte de sur Xilinx ISE Design Suite 13.1
11
Etape 6 : Compiler votre code. Les trois tapes suivant doit tre valides
Remarque :
Il est fortement conseill de vrifier la syntaxe de la description, en faisant appel la fonction "Check Syntax" dans la partie "Synthetize XST".
Cette tape est assez rapide et ne ncessite pas de connatre la cible, contrairement ltape daprs. Viens ensuite la phase de synthse
("Synthetize XST") puis de placement et de routage ("Implement Design"). Ces tapes ncessitent la connaissance, dune part, de la cible (FPGA)
et, dautre part, de lenvironnement du circuit (entres/sorties associes aux autres composants de la maquette). Il est donc ncessaire, avant de
raliser ces tapes-l, de faire lassignation des broches du composant avec la description fournie. Pour cela, vous pouvez vous aider de la
fonction "Assign Package Pins" dans la partie "User Constraints" et de la documentation de la maquette. Il est aussi possible ce stade de lancer
diffrentes simulation :s
Temporelle : permettant, aprs ltape de routage, de valider les contraintes temporelles associes au placement des "composants".
Ces diffrentes phases doivent tre rptes pour lensemble des modules composant lapplication. La dernire tape consiste
produire le fichier de programmation ("Generate Programming File") et le transfrer dans la mmoire du FPGA.
12
Etape 7 : Simuler votre circuit logique sur ISE de Xilinx : Le processus de simulation es compos de trois partie :
Le systme tester
Slectionner simulation sur Xilinx ISE Design Suite 13.1 et crer une nouvelle source (slectionner module test bench)
13
14
15
Etape 9 : Compiler nouveau le code et lancer la simulation avec simulate behavioral model
16
On obtient :
Remarque ;
On peut simuler un circuit sur ISE directement sans laborer un fichier test bench. Pou cela il faut suivre les tapes suivantes :
Etape 1 : Crer un nouveau projet et Slectionner Simulation et ajouter une nouvelle source.
17
18
Etape 3 : Ajouter le code VHDL qui dcrit le comportement de votre circuit logique
Etape 4 : Compiler dabord votre code et lancer la simulation avec simulate Bihavioral model
19
20
21
22
On obtient
Simulation sur la carte spartan 3 E de porte logique and avec la conception Flots de donnes
Pour simuler la porte logique and sur la carte spartan 3 E, il faut crer un fichier.UCF ( net list) pour spcifier les connections
internes (voir la liste netlist de la carte spartan 3 E en annexe) en slectionnant implementation Constraints File :
Ensuite, il faut affecter les entres et les sorties de la porte and aux composants de la carte qui sont spcifis dans le data-sheet de votre
carte . On associe lentre A de la porte and linterrupteur 1 qui se trouve connecte la ligne L13 de la carte spartan 3 E, lentre B
de la porte and linterrupteur 2 qui se trouve connecte la ligne L14 de la carte spartan 3 E et la sortie C de la porte and la diode
Led (1) qui se trouve connecte la ligne E12 de la carte spartan 3 E. Ce qui donne comme fichier UCF suivant :
23
"C"
LOC = "E12" | IOSTANDARD=LVTTL;
"A" LOC = "L13" | IOSTANDARD=LVTTL;
"B" LOC = "L14" | IOSTANDARD=LVTTL;
Il faut compiler nouveau puis suivre les tapes ci-dessous pour gnrer un fichier bit.file qui sera excut par la FPGA de la carte
Spartan 3 E :
24
25
26
27
Le demi additionneur est un circuit combinatoire qui permet de raliser la somme arithmtique de deux nombres A et B chacun sur un bit. A la
sotie on va avoir la somme S et la retenu Cout (Carry).
Circuit : demi-additionneur
Cout
S = A and B
Cout = A xor B
Simuler le circuit demi additionneur avec la conception flots de donnes sur le logiciel ISE.
28
29
Cin
Cout
0
1
1
1
Simuler en VHDL le circuit additionneur complet 1bit avec la conception flots de donnes
Simuler le mme circuit sur la carte spartan 3 E
Pour larchitecture, on peut exprimer les quations du premier et du second additionneur. Le lien entre les deux additionneurs est fait laide de
C0. C0 est un lien interne il est dfini dans larchitecture par le mot signal. Linstruction SIGNAL dclare un signal permettant la communication
entre les tats concurrents l'intrieur d'une architecture. Dans la dfinition, on doit spcifier un type au signal et l'on peut attribuer une valeur par
dfaut.
Remarque
On na pas besoin de dfinir la direction dun signal car cest une connexion interne
30
A
00
00
00
00
01
01
01
01
10
10
10
10
11
11
11
11
B
00
01
10
11
00
01
10
11
00
01
10
11
00
01
10
11
Cin
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Cout
0
0
0
0
0
0
0
1
0
0
1
1
0
1
1
1
S
00
01
10
11
01
10
11
00
10
11
00
01
11
00
01
10
Simuler en VHDL du circuit additionneur complet 2bits avec la conception flots de donnes
Simuler ce circuit sur la carte spartan 3 E
Pour sa simulation sur carte Spartan 3E il faut crer le fichier.UCF ( net list) suivant pour spcifier les connections internes :
NET
NET
NET
NET
A(0)
A(1)
B(0)
B(1)
LOC
LOC
LOC
LOC
=
=
=
=
"L13"
"L14"
"H18"
"N17"
|
|
|
|
IOSTANDARD
IOSTANDARD
IOSTANDARD
IOSTANDARD
=
=
=
=
LVTTL
LVTTL
LVTTL
LVTTL
|
|
|
|
PULLUP
PULLUP
PULLUP
PULLUP
31
;
;
;
;
2.5.
Les instructions squentielles du type if, then, else... sont trs puissantes et permettent la ralisation de boucles conditionnelles intressantes. De
plus, la syntaxe qui leur est associe ne prsente pas de difficults particulires et permet une criture des descriptions trs lisible. Vous trouverez
ci-dessous quelques exemples de traductions de boucles ou densembles dinstructions conditionnelles.
Syntaxe de linstruction IF
La combinaison IF THEN permet d'effectuer un test d'une expression logique. La suite du droulement dpend du rsultat. Deux
imbrications sont possibles : ELSIF suivi d'un autre test et ELSE qui contrle les rsultats FALSE.
Remarques :
Il est possible dimbriquer plusieurs boucles IF les unes dans les autres.
WHILE est une instruction de bouclage. Elle s'utilise avec LOOP. On place la condition de fin de sortie dans l'instruction mme contrairement au
LOOP seul o on est oblig d'avoir recourt la commande EXIT. On peut toutefois utiliser EXIT ou NEXT.
Le bouclage se fait tant que la condition reste TRUE.
FOR est une instruction de bouclage. Elle s'utilise avec LOOP. On place la condition de fin de sortie dans l'instruction mme contrairement au
LOOP seul o on est oblig d'avoir recourt la commande EXIT. On peut toutefois utiliser EXIT ou NEXT.
Exemple :
32
Linstruction EXIT se combine avec FOR, WHILE et LOOP pour sortir d'une boucle.
Linstruction CASE, souvent appele switch case, convient parfaitement pour dcrire un diagramme d'tat, un grafcet ou tout autre formalisme
de structures squentielles (voir plus loin state machine ou machine etat). L'instruction When others n'est pas obligatoire, mais son ajout en
fin de liste, permet de donner une action tous les choix qui n'ont pu tre trouvs dans la liste.
Dans la fonctionnalit, SELECT est quivalent l'instruction CASE. SELECT ne peut toutefois affecter qu'une seule variable.
exemple
33
2.6.
Fonction PROCESS
Une architecture en VHDL est un ensemble de processus excuts en parallle (en concurrence). L'ordre relatif des processus l'intrieur d'une
architecture n'a pas d'importance. Il existe deux types de processus :
1.
le processus implicite ou phrase concurrente
2.
le processus explicite
Chaque composant interne du systme sera un processus (process) de l'architecture
Les processus de l'architecture sont interconnects par le biais des signaux (signal), quivalent des fils ou cbles d'interconnexion dans
le monde rel
Un processus explicite est un ensemble de phrases excutes squentiellement: l'intrieur d'un processus l'ordre des phrases a donc une
importance Un processus ne peut pas tre dclar l'intrieur d'un autre Processus.
Tout signal dont le changement de valeur a une influence sur le processus doit apparatre dans la liste de sensibilit. Dans le cas contraire, la
simulation pourrait donner des rsultats faux puisqu'elle ne serait pas enclenche. Pour viter des erreurs, on peut mettre dans la liste de sensibilit
tous les signaux tests ou apparaissant droite d'une affectation, l'intrieur du processus.
34
WAIT est utilis dans une dclaration squentielle de type PROCESS ou PROCEDURE (voir ci-dessous).
WAIT remplace une liste de sensibilit pour contrler l'excution et la suspension d'un PROCESS.
WAIT peut tre plac n'importe o dans le PROCESS.
Sans WAIT ou sans liste de sensibilit, un PROCESS se boucle indfiniment.
WAIT ON est quivalent une liste de sensibilit. La liste des signaux suit.
Ainsi : les deux codes sont quivalents
35
La fonction COMPONENT permet d'crire un programme sous la forme structurelle. En effet, il faut dclarer et dfinir les composants de la
fonction puis dans le corps de l'architecture, il suffit de les connecter en suivant un schma structurel. Cette mthode d'criture permet aussi la
description
hirarchique.
Quatre blocs sont distinguer dans une telle dfinition :
Affectation des liaisons du schma aux broches des composants. Cette phase correspond raliser la NETLIST du schma ceci se
fait grce la fonction FOR MAP avec la syntaxe suivante :
Attribution des circuits leur ENTITY. Cette phase permet de contrler le modle comportemental qui va dterminer le
fonctionnement du composant. La fonction CONFIGURATION permet de raliser ceci avec la syntaxe suivante :
Syntaxe de dclaration dune CONFIGURATION
36
La dclaration d'un composant est similaire la dclaration d'une entit: c'est simplement la liste des ports de sa bote noire
Pour pouvoir simuler ou synthtiser un composant, il doit exister ailleurs une paire entit-architecture qui le dcrive. Le nom du
composant doit tre le mme que celui de l'entit correspondante. Les noms des signaux du composant doivent tre identiques aux
noms des signaux de l'entit correspondante
Chaque instance d'un composant doit possder une tiquette. Chaque signal dans la liste des ports du composant (les noms formels)
doit tre connect un signal dans l'architecture (les noms rels). Ces associations peuvent tre explicites ou implicites (donnes par
l'ordre dans la liste)
TP 9 : Description en VHDL du circuit additionneur complet 1bit avec la conception structurelle
On reprend ladditionneur complet 1bit de lexemple 3 vu ci-dessus pour le modliser en utilisant la conception structurelle. Dans ce type de
description, on relie entre eux des composants pralablement dcrits en VHDL.
Avant d'utiliser (instancier) un composant, il doit tre dclar, La dclaration d'un composant est similaire la dclaration d'une entit: c'est
simplement la liste des ports de sa bote noire
Pour pouvoir simuler ou synthtiser un composant, il doit exister ailleurs une paire entit -architecture qui le dcrive. Le nom du composant doit
tre le mme que celui de l'entit correspondante. Les noms des signaux du composant doivent tre identiques aux noms des signaux de l'entit
correspondante. Chaque instance d'un composant doit possder une tiquette. Chaque signal dans la liste des ports du composant (les noms
formels) doit tre connect un signal dans l'architecture (les noms rels). Ces associations peuvent tre explicites ou implicites (donnes par
l'ordre dans la liste)
Le circuit principal est constitu de 5 composants (U1, U2, U3, U4, et U5) mais seulement 3 entits (and, or et xor). Les 5 composants sont relis
entre eux par 3 signaux internes (in1, in2 et in3).
Procdure suivre :
1.
2.
Dclarer tous les composants qui seront utiliss (ici 3 composant : and2, or2, xor2)
3.
Dclarer les signaux qui assureront la liaison entre tous les composants (ici In1, In2, In3)
4.
Faire laffectation des liaisons du schma aux broches des composants avec la fonction PORT MAP pour tous le composant ( ici 5
composants)
linstruction PORT MAP (a => in1, b => cin, q => sum); affecte lentre a du
composant U3 (Xor) au signal intermdiaire(interne) In1 et affecte lentre b du
composant U3 (Xor) lentre principale Cin du circuit additionneur et enfin il
Pr. Benaissa
Amami,
FSTcomposant
Tanger
la sortie
q du
U3 (Xor) la sortie principale du circuit
37affecte
additionneur complet sum
5.
Il ne faut pas oublier de dclarer les entits et les architectures des composants (ici 3 composants and2, or2 et xor2)
Lentit and2
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
ENTITY and2 IS
PORT (a,b : IN std_logic;q : OUT std_logic);
END and2;
ARCHITECTURE behv OF and2 IS
BEGIN
q<=a and b;
END behv;
Lentit or2
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
ENTITY or2 IS
PORT (a,b : IN std_logic;q : OUT std_logic);
END or2;
ARCHITECTURE behv OF or2 IS
BEGIN
q<=a or b;
END behv;
Lentit xor2
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
ENTITY xor2 IS
PORT (a,b : IN std_logic;q : OUT std_logic);
END xor2;
ARCHITECTURE behv OF xor2 IS
BEGIN
q<=((not a) and b) or (a and (not b));
END behv;
38
6.
Il faut attribuer les composants leur entit (voir tape 5) avec la fonction CONFIGURATION
Linstruction FOR u1,u3: xor2 USE ENTITY WORK.xor2; veut dire que u1 et u3
hritent du comportement de xor2 dfini dans un fichier part
Le programme complet en langage VHDL pour dcrire (modliser) ladditionneur1bit dune manire structurelle est le suivant :
39
Le ou les composants utiliss dans larchitecture doivent tre dfinis par le mot component suivi du nom lentit utiliser et la description de la
nature des ports du composant.
dditionneur1 et additionneur2 sont les deux additionneurs utiliss, la liste des connexions est indique dans lordre :
(additionneur1: A A(0), B B(0), Cin Cin, Som Som(0), Cout Co)
(additionneur2: A A(1), B B(1), Cin Co, Som Som(1), Cout Cout)
Il existe deux manires pour laffectation des entres et les sorties aux composants de larchitecture :
1.
40
Il faut dclarer part, lentit laquelle component fait rfrence (de laquelle il hrite)
41
La fonction ('event) 'vnement est un concept important en VHDL. Elle se rapporte des signaux et il se produit sur un signal. En d'autres
termes, un vnement sur un signal provoque un changement de la valeur de ce signal. Il est possible de vrifier si un vnement s'est produit sur
un signal. Une telle information peut tre obtenue grce l'attribut 'vnement (event) prdfini. Lvnement(event) est trs utilise dans
larchitecture des compteurs.
Linstruction clk'event and clk = '1' renvoie la valeur boolenne vrair (true) si le signal clk, de type bit, vaut 1 aprs un
changement de valeur, ce qui revient tester la prsence dune transition montante de ce signal.
I ya deux faons de dtecter des fronts montants (rising_edge ) et descendants (falling_edge ) de l'horloge.
La diffrence entre les deux fonctions "clk'event and clk='1' " et "rising_edge (clk)" ou "falling_edge (clk)" concernant la dtection des fronts
de lhorloge est la suivante :
42
Dans ce cas il n y a pas de diffrence entre les deux fonctions. Considrons le programme suivant :
On peut voir que le signal 'xr' ne change pas du tout, mais les changements de x0 comme dans le premier code. C'est la diffrence fondamentale
entre les deux mthodes.
43
44
45
TP 12 : Compteur 3 bits simple, sans remise 0 et sans utiliser linstruction vnement (event)
46
TP 13 : Compteur 3 bits simple, avec remise 0 (RAZ) asynchrone, le compteur compte tant que Raz = 1
47
48
la care spartan 3E
entity counter_4bits is
port ( clk : in std_logic;
reset : in std_logic;
pause : in std_logic;
count_out : out std_logic_vector(3 downto 0));
end counter_4bits;
-- la vraie sortie
49
Voici le fichier test bench pour simuler le compteur 4 bits sur ISE
50
Voici le fichier test UCF pour simuler le compteur 4 bits sur la carte spartan 3E
NET
NET
NET
NET
NET
=
=
=
=
"F12"
"E12"
"E11"
"F11"
;
;
;
;
#
#
#
#
LED<0>
LED<1>
LED<2>
LED<3>
51
52
Voici le fichier UCF pour la simulation de compteur 8 bits sur la carte spartan 3 E
NET LED(0)
NET
NET
NET
NET
NET
NET
NET
53
3.
3.1.
Les combinaisons des entres conduisent un nombre fini de combinaisons de sortie, do lappellation machine
nombre dtats finis ou Machine Etats
Entre : E
Etat Prsent : EP
Etat Futur : EF
Sortie : S
Registre dEtat : Compos de bascules permettant de mmoriser les valeurs des tats
Etat Futur : tat dans lequel se trouvera la machine aprs une impulsion d'horloge
Table de transition : deux parties indiquant le prsent et le futur.
E : Entre linstant n
Table de transition
54
La machine tat reprsente la partie contrle, cest dire le cerveau du systme lectronique qui commande la partie oprative.
Une machine tats finis est un circuit squentiel dont les sorties dpendent dun tat et ventuellement des entres. La structure logique gnrale
dun tel circuit est reprsente sur la figure suivante :
Le bloc SM (State Memory) a pour fonction de mmoriser ltat courant de la machine. Il a par essence un comportement squentiel synchronis
sur un signal dhorloge.
Le bloc NSL (Next State Logic) a pour fonction de calculer le prochain tat en fonction de ltat courant et des entres.
Le bloc OL (output Logic) a pour fonction la gnration des signaux de sortie en fonction de ltat courant et ventuellement des entres.
La modlisation VHDL dune machine tats finis doit considrer les points suivants:
55
La description du systme se fait par un nombre fini dtats. Ci-dessus la reprsentation schmatique dun systme 4 tats (M0 M3), 2 sorties
(S1 et S2), 2 entres X et Y, sans oublier lentre dhorloge qui fait avancer le processus, et celle de remise zro qui permet de linitialiser
Ltat initial est M0. Les 2 sorties sont 0. Au coup dhorloge on passe inconditionnellement ltat M1 sauf si la condition Y=1 a t vrifie,
ce qui mne ltat M3 ou si X=0 a t valid ce qui mne M2.
De M3 on revient au coup dhorloge M0. De M1 on passe M2, et de M2 on passe M 3...
Dans chaque tat on dfinit les niveaux des sorties.
Traduisons cette machine tat en langage VHD avec :
Une entit
une ARCHITECTURE de description dtat avec 2 PROCESS : Un process asynchrone et un process synchrone.
Le 1er process (process SYNCHRONE) met jour la variable dtat en cours ( signal : etat), en la remplaant par le contenu dun autre signal
appel : etat_suiv . Ceci se fait chaque front dhorloge. Ce 1er Process gre aussi la remise zro (entre : reset).
Le 2me process (process ASYNCHRONE) met jour le signal etat-suiv en lui attribuant la valeur dun tat de la liste (M0, M1), en fonction de
conditions sur les entres ou de lordre prvu des tats. Il attribue aussi les niveaux des sorties.
PROCESS SYNCHRONE :
56
Il est appel aussi current state process . Il met jour la variable dtat et doit possder une condition IF sur un front dhorloge. Il peut
possder une RAZ (optionnel). Il assigne (sans condition) la valeur de ltat suivant (next state variable) la variable dtat courante sur un front.
Le RAZ si elle existe, assigne une valeur statique la variable dtat courante. Ce process ne peut mettre jour aucun autre signal (sortie par
exemple) ou variable !
PROCESS ASYNCHRONE :
Il est appel aussi next state process . Ne pas oublier de mettre dans sa liste de sensibilit les diffrents signaux (entres) qui seront pris en
compte dans les tats :
exemple :
PROCESS ( etat, x, y).
Ce process est la partie combinatoire de la machine dtat et ne doit pas contenir de front dhorloge. Son architecture doit tre une simple structure
de CAS. Lexpression teste dans les cas doit tre la variable dtat courante.
Les variables dtat courant et next state doivent tre du mme type (entier, std_logic vector, std_logic...).
Ce process peut seulement assigner des valeurs la next state variable (etat_suiv), mais ne peut pas lire ses valeurs.
Les variables dtat courant et next state ne peuvent pas tre un port de lentit laquelle larchitecture appartient et aucune partie du corps de
larchitecture ne peuvent lire ou crire leurs valeurs sauf les 2 process.
SI on synthtise avec un fichier source VHDL crit sans suivre ces rgles, La synthse du code sera faite mais pas en temps que state
machine.
Le programme complet de cet exemple sera le suivant :
57
en
permet
d'tat par
-- Processus asynchrone
------------ Dfinir les tats des sorties------------------sorties : process (etat, x, y)
BEGIN
CASE etat IS --Le PROCESS doit contenir une structure de CAS unique dpendant
de la variable d'tat.
WHEN M0 => S1 <= '0'; S2<= '0';
IF Y='1' then etat_suiv <= M3;
elsif X='0' then etat_suiv <= M2;
suivant n'est attribu que dans la structure CASE
58
library ieee;
use ieee.std_logic_1164.all;
entity etats_3 is
Port (
-- Inputs
-- horloge et reset globals
clk : in std_logic;
reset : in std_logic;
X : in std_logic; -- signal d'entree
-- Outputs
Y : out std_logic;
Z : out std_logic_vector(3 downto 0)
);
end entity etats_3;
architecture Behav of etats_3 is
type etat is (A, B, C);
signal etat_present , etat_suivant : etat;
begin
exemple_synchrone : process(reset , clk)
begin
if (reset = '1') then
etat_present <= A;
elsif clk'event and clk = '1' then
etat_present <= etat_suivant;
end if;
end process;
exemple_asynchrone : process(etat_present, X)
begin
59
60
: Description en VHDL dun systme avec machine tat : compteur synchrone modulo 7 (compte de 0 6 donc 3 sorties Q2 Q1
Dans cet exemple, on va parler des machines tats. Nous allons considrer la situation ou il y a une machine qui vend les films pour 5$.
Lusager a le droit de mettre des pices de 1$ ou de 2$ et des que le montant arrive a 5$ ou plus, il y a un film qui sort. Il est aussi possible de
lusager mette 6$ et dans ce cas, la machine donne un film et remet aussi la monnaie.
Nous voulons faire une machine de Moore et donc, les sorties ne dpendent que le ltat. Une information de plus est que, si la personne mettait
de largent pendant que le film sort, largent sera perdu.
61
62
Les chronogrammes des commandes denvoi dun caractre sur lcran sont les suivants :
63
Il suffit, en simplifiant, denvoyer simultanment sur lafficheur, la donne, le signal de slection et dcriture, puis, en retard de 40 ns de fournir
une impulsion de validation de largeur minimum 230 ns. Ce cot de linterface est simple, il implique une mmorisation des signaux de
commandes et des temporisations.
Signaux
64
Etat
fonctions
0
1
Ecran vide
Affichage
LCD_RS
LCD_RS
SF_CE0
SW0
SF_D8
SF_D9
SF_D10
SF_D11
Sachant que la frquence de lhorloge de la carte sprtan 3E est de 50Mhz ce qui veut dire quun cycle dhorloge est gal 20 ns. Pour afficher des
donnes sur lcran, il faut suivre les tapes suivantes :
Etape1 :
Mettre SF_CE0 = 1 pour avoir accs complet en lecture / criture cran LCD (StrataFlash dsactiv)
Etape 2 : Phase dinitialisation du lcran
Cette tape passe par plusieurs squences :
1. Attendre 15 ms (750000 cycles dhorloge) ou plus avec LCD_E = 0 bien que lafficheur est gnralement prt quand FPFA termine la
configuration.
2. Envoyer sur SF_D<11 :8> = 3 = (0011)2 avec les signaux LCD_RW=0, LCD_RS = 0 et LCD_E = 1 pendant 240 ns soit 12 cycles
dhorloge
3. Attendre 4,1 ms ou plus soit 205000 cycles dhorloge avec LCD_E = 0
4. Envoyer sur SF_D<11 :8> = 3 = (0011)2 avec les signaux LCD_RW=0, LCD_RS = 0 et LCD_E = 1 pendant 240 ns soit 12 cycles
dhorloge.
5. Attendre 100 us ou plus soit 5000 cycles dhorloge avec LCD_E = 0
6. Envoyer sur SF_D<11 :8> = 3 = (0011)2 avec les signaux LCD_RW=0, LCD_RS = 0 et LCD_E = 1 pendant 240 ns soit 12 cycles
dhorloge.
7. Attendre 40 us ou plus soit 2000 cycles dhorloge avec LCD_E = 0
8. Envoyer sur SF_D<11 :8> = 2 = (0010)2 avec les signaux LCD_RW=0, LCD_RS = 0 et LCD_E = 1 pendant 240 ns soit 12 cycles
dhorloge.
9. Attendre 40 us ou plus soit 2000 cycles dhorloge avec LCD_E = 0
10. Il faut signaler la fin de linitialisation
Etape 3 : Phase de configuration.
Cette tape passe par plusieurs squences qui font appelle plusieurs fonctions (Fonction set, Entry mode set, Display on/off, Clear display, voir
timing et tableaux si dessous de datachett de la carte spartan 3 E). Ces squences sont toutes bases sur le transfert de donnes 8 bits en deux fois
4 bits en utilisant le registre SF_D<11 :8> dont le protocole est le suivant:
Soit une donne sur 8 bit <D7 D6 D5 D4 D3 D2 D1 D0> afficher sur lcran de lafficheur,
1.
On commence par envoyer les 4 bits du poids fort <D7 D6 D5 D4 > sur le bus SF_D des 8 bits avec LCD_RS = 0 et LCD_RW = 0
pendant 1 ms
2.
Attendre 1 ms avec LCD_E=1 (criture des donnes)
3.
Attendre 1 us avec LCD_E=0 (arrter lcriture)
4.
Ensuite envoyer les 4 bits du poids faible < D3 D2 D1 D0> sur le bus SF_D
5.
Attendre 1 ms avec LCD_E=1 (criture des donnes)
6.
Attendre 1 us avec LCD_E=0 (arrter lcriture)
7.
Attendre 40 us.
Fonction set : configuration du LCD
LCD_RS et LCD_RW sont activs au niveau bas pendant le transfert des donnes En charge ensuite les bits SF_D<11:8> par la valeur (28)16 =
40 = (00101000)2 (selon le protocole ci-dessus, voir les tableaux ci-dessus) en commenant par les bits du poids fort puis les bits les plus du
poids faible tout en respectant le chronogramme reprsent ci-dessus. Ce qui donne les squences suivantes :
1. Chargement des 4 bits les plus forts dans SF_D <11:8> pendant 1 ms.
2. LCD_E est active au niveau haut pendant 1ms.
3. LCD_E est active au niveau bas pendant 1s qui est le temps entre la transmission des forts et des faibles bits.
4. Chargement des 4 bits les plus forts dans SF_D <11:8> pendant 1 ms.
5. LCD_E est active au niveau haut pendant 1ms.
6. LCD_E est active au niveau bas pendant 40s qui est le temps entre la transmission de deux donnes successives.
Entry mode set :
LCD_RS et LCD_RW sont active au niveau bas pendant le transfert des donnes. En charge ensuite les bits SF_D<11:8> par la valeur
(C)16 = 12 = (00001100)2 (voir tableaux ci-dessus : I/D=1 => Auto-incrmentation de ladresse, DB0=0 => dplacement dsactiv ) en
suivant la mme dmarche cit auparavant.
Display on/off :
65
LCD_RS et LCD_RW sont active au niveau bas pendant le transfert des donnes (voir tableaux ci-dessus). En chargement des bits
SF_D<11:8> par la valeur (C)16 = 12 = (00001100)2 (voir tableaux ci-dessus : I/D=1 => Auto-incrmentation de ladresse, DB0=0 =>
dplacement dsactiv ) en suivant la mme dmarche cit auparavant.
Clear Display :
LCD_RS et LCD_RW sont active au niveau bas pendant le transfert des donnes (voir tableaux ci-dessus). En charge ensuite les bits bits
SF_D<11:8> par la valeur (1)16 = 1 = (00000001)2 (voir tableaux ci-dessus) en suivant la mme dmarche cit auparavant.
Attendre une dure de 1,64 ms.
66
Etat dbut
Etat one
Attendre 750000
cycles clk
init_Fin = 1
Etat fin
init_dbut = 1
Etat Three
LCD_E=0
Attendre 4.1ms
(205000 cycles
clk)
Etat Nine
LCD_E=0
Attendre 40 us
(2000 cycles clk)
Etat Four
LCD_E=1
Ecrire SF_D=0X3
Attendre 240 ns
(12 cycles clk)
Etat Eight
LCD_E=1
Ecrire SF_D=0X2
Attendre 240 ns (12
cycles clk)
Etat Seven
LCD_E=0
Attendre 40 us
(2000 cycles clk)
67
Etat two
Ecrire SF_D=0X3
LCD_E=1 Attendre
240 ns (12 cycles
clk)
Etat Six
LCD_E=1
Ecrire SF_D=0X3
Attendre 240 ns (12
cycles clk)
Etat Five
LCD_E=0
Attendre 100 us
(5000 cycles clk)
Etat fin
LCD_E0 = 0
Transfert_init = 1
Etat Plus_fort1
LCD_E0=0
SF_D0 = 4 bits MSB
Attendre 2 cycles clk
Etat Pause2
Attendre
(2000 cycles clk)
Etat Plus_fort2
LCD_E0=1
SF_D0 = 4 bits MSB
Attendre 2 cycles clk
Etat Plus_faible 2
LCD_E0=1
SF_D0 = 4 bits LSB
Attendre 2 cycles clk
Etat Plus_faible 1
LCD_E0=0
SF_D0 = 4 bits LSB
Attendre 2 cycles clk
68
Etat Pause1
Attendre 1 us
(50 cycles clk)
Fin
Init
init_fin = 1
init_Fin = 1
Fonction set
LCD_RS = 0
Code acquis 0X28
Attendre 2000 cycles
clk
Char_T
Attendre 2000
cycles clk
Entry set
LCD_RS = 0
Code acquis 0X6
Attendre 2000
cycles clk
Char_S
Attendre 2000
cycles clk
Char_F
LCD_RS = 1
Code acquis 0X4
Attendre 2000
cycles clk
Set Addr
LCD_RS = 0
Code acquis 0X80
Attendre 2000
cycles clk
69
Set display
LCD_RS = 0
Code acquis 0X28
Attendre 2000
cycles clk
Pause
Attendre 82000
cycles clk
Clear display
LCD_RS = 0
Code acquis 0X01
Attendre 2000
cycles clk