TD4 VHDL Logique Sequentielle
Un livre de Wikibooks.
Sections |
[modifier] Programmation de graphes d'états et graphes d'évolutions
Nous avons déjà eu l'occasion de parler de ce problème en logique (ici (TD 8)) avec des équations de récurrence.
Une transition barrée est dite réceptive et, comme l'indique l'équivalence du dessin ci-dessus, elle sous entend que si la réceptivité est fausse on reste dans le même état.
Présentons d'abord la technique avec et sans initialisation.
-- sans initialisation BEGIN PROCESS (clock) BEGIN IF clock'EVENT AND clock='1' THEN CASE etat IS WHEN Off => IF key ='1' THEN etat <= Armed; ELSE etat <= Off; END IF; .... END CASE; END IF; END PROCESS; ....
On voit sur cet exemple partiel comment passer d'un graphe d'évolution à un CASE en VHDL.
-- avec initialisation synchrone BEGIN PROCESS (clock) BEGIN IF clock'EVENT AND clock='1' THEN IF Init='1' THEN etat <=Off; --initialisation synchrone ELSE CASE etat IS WHEN Off => IF key ='1' THEN etat <= Armed; ELSE etat <= Off; END IF; .... END CASE; END IF END IF; END PROCESS; ....
[modifier] Le codage des états
La programmation des états nécessite une déclaration symbolique comme on peut voir ci-dessous :
TYPE typetat IS (Armed, Off, Ringing); -- dans architecture SIGNAL etat : typetat;
Quand la synthèse sera demandée plusieurs solutions peuvent se présenter suivant le codage des états. Une telle déclaration débouchera sur un codage Armed=00, Off=01 et Ringing=10.
On peut modifier ce codage à l'aide de deux attributs différents : enum_encoding et state_encoding. Enum_encoding est normalisé par le standard IEEE 1076.6.
type state is (s0,s1,s2,s3); attribute enum_encoding of state:type is "00 01 10 11";
La directive state_encoding spécifie la nature du code interne pour les valeurs d'un type énuméré.
attribute state_encoding of type-name:type is value;
Les valeurs légales de la directive state_encoding sont sequential, one_hot_zero, one_hot_one, and gray.
- sequential : on code en binaire au fur et à mesure de l'énumération avec autant de bits que nécessaire.
- one_hot_zero : on code la première valeur par zéro, puis le reste en utilisant à chaque fois un seul un : N états nécessiteront donc N-1 bits.
- one_hot_one : idem à one_hot_zero sauf que l'on n'utilise pas le code zéro. N états nécessiteront donc N bits.
- Gray : les états suivent un code GRAY.
Exemples :
type state is (s0,s1,s2,s3); attribute state_encoding of state:type is one_hot_zero;
type s is (s0,s1,s2,s3); attribute state_encoding of s:type is gray;
[modifier] Exercice
Concevez une machine d'état capable de détecter la présence de la sequence « 1111010 ».
a) Dessiner le graphe d'évolution.
b) Réaliser le programme VHDL correspondant.
[modifier] Les forçages synchrones et asynchrones
Il existe deux façons pour initialiser en utilisant les fronts d'horloge (synchrone) ou non (asynchrone). La technique de programmation est très similaire à celle des compteurs du TD précédent.
[modifier] Forçage asynchrone
-- gestion de l'asynchrone process(clk,reset) begin if reset='1' then -- avant horloge donc asynchrone q<= "0000"; elsif clk'event and clk='1' then -- ici le synchrone end if; end process;
[modifier] Forçage synchrone
[modifier] Première façon
-- initialisation synchrone process(clk) begin if clk'event and clk='1'then -- equations de récurrence + -- init ou -- equations de récurrence --./init end if; end process;
[modifier] Deuxième façon
if clk'event and clk='1'then if init ='1' then q<= "0000"; else -- ici case ou equations de -- récurrences end if; end if;
[modifier] Exercice
Un étudiant a utilisé active-FSM (outil de dessin de graphes d'évolution) et généré un programme VHDL correspondant au dessin ci-dessous. Puis il a réalisé un projet pour compiler et prétend que les extraits ci-dessous sont tirés du fichier de rapport correspondant. On vous demande de dire si l'étudiant a raison ou pas. Pour cela on vous propose de remplir l'habituelle table de transitions ci-dessous (ou tableau état présent état futur) et d'en déduire s'il correspond bien au dessin du diagramme d'évolution ci-dessous.
Pour remplir le tableau, vous utiliserez naturellement les équations de récurrence du fichier rapport. Dans ce fichier, la notation truc.D signifie truc+ et truc.Q signifie truc. On notera sregSBV_0 tout simplement s0.
- Table de transitions
| Entrées | Sortie | |
| Etat Présent | Conditions | Etat futur |
| s s0 | e0 e1 Init | s+ s0+ |
| 0 0 | 0 X 0 | |
| 0 0 | 1 X 0 | |
| 0 1 | 0 X 0 | |
| 0 1 | 1 X 0 | |
| 1 0 | 0 X 0 | |
| 1 0 | 1 X 0 | |
| 1 1 | 1 X 0 | |
Fichier rapport
| | | | | | |
_________________
-| |-
-| |-
-| |-
-| CYPRESS |-
-| |-
-| |- Warp VHDL Synthesis Compiler:
-| |- Copyright (C) 1991, 1992, 1993,
|_______________| Cypress Semiconductor
| | | | | | |
....
State variable 'sreg0' is represented by a Bit_vector(0 to 1).
State encoding (sequential) for 'sreg0' is:
etat0 := b"00";
etat1 := b"10";
etat2 := b"01";
-----------------------------------------------------------------------
PLD Compiler Software: PLA2JED.EXE 21/SEP/1998 [v4.02 ] 5.1 IR 14
DESIGN EQUATIONS (19:08:48)
sreg0SBV_0.D = /e0 * /init * sreg0SBV_0.Q
+ e1 * /init * s.Q
s.D = e0 * /init * /s.Q * /sreg0SBV_0.Q
+ /e1 * /init * s.Q
........
C20V8C
__________________________________________
clock =| 1| |24|* not used
init =| 2| |23|* not used
e1 =| 3| |22|* not used
e0 =| 4| |21|* not used
not used *| 5| |20|* not used
not used *| 6| |19|* not used
not used *| 7| |18|* not used
not used *| 8| |17|* not used
not used *| 9| |16|= (sreg0SBV_0)
not used *|10| |15|= s
not used *|11| |14|* not used
not used *|12| |13|* Reserved
__________________________________________
[modifier] Retour à la page principale du document
Retour à conception et VHDL

