You are on page 1of 15

TD4 VHDL Logique Sequentielle

TD4 VHDL Logique Sequentielle


Dans ce chapitre nous prsentons toute la logique squentielle appele non rgulire.
Dfinition On appelle logique squentielle non rgulire toute logique squentielle pour laquelle le calcul de l'tat futur en fonction de l'tat prsent ne peut pas se faire avec des oprateurs simples (sur plusieurs bits).

Le lecteur de ce chapitre devra essayer d'apprhender les techniques communes tout ce qui a t prsent au chapitre prcdent, surtout ce qui concerne le problme des initialisations.

Programmation des graphes d'volutions


Nous allons nous intresser dans cette section la programmation des graphes d'volutions en VHDL. C'est un sujet que nous avons abord en TD 1 mais qu'il est important d'approfondir maintenant. Pour illustrer cette partie, nous allons prendre un exemple particulier : le rveil.

Le diagramme d'volution comme moyen de spcifier le calcul de l'tat futur en fonction de l'tat prsent
''

Principe de fonctionnement du rveil : partir de "Off", "key"=1 arme le rveil. Si "trip" passe 1 (c'est dire que l'heure courante devient gale l'heure de rveil) le rveil passe en "ringing" et sonne. "trip" ne reste pas trs longtemps un (1 seconde). Son retour 0 ne suffit pas errter la sonnerie. Seul le passage de "key" 0 peut l'arrter.

Les graphes d'volutions et le style case when


On rappelle encore une fois que le style case when permet de ne pas chercher les quations de rcurrences. Mais comme nos diagrammes d'volutions se sont compliqus (par l'ajout d'tiquettes sur les transitions), il nous faudra ajouter des "if then". Cela est tellement intuitif que nous passons directement aux exemples. Prsentons

Programmation sans initialisation


Le principe consiste dclarer d'abord un type numr avec une dfinition symbolique de chacun des tats (ici Armed, Off, Ringing) : TYPE typetat IS (Armed, Off, Ringing); -- dans architecture SIGNAL etat : typetat;

TD4 VHDL Logique Sequentielle Ensuite dans un case when on dtaillera toutes les transitions possibles comme montr ci-dessous dans le cas o l'on ne s'intresse pas une 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; .... L'ide gnrale est donc d'utiliser un case sur les tats avec des if pour grer l'ensemble des transitions. Voici le programme complet du rveil : ENTITY Alarm IS PORT( clock,Key,Trip :IN BIT; Ring :OUT BIT ); END Alarm; ARCHITECTURE ar OF Alarm IS TYPE typetat IS (Armed, Off, Ringing); SIGNAL etat : typetat; BEGIN PROCESS (clock,etat) BEGIN -- partie squentielle IF Clock ='1' AND Clock'EVENT THEN CASE etat IS WHEN Off => IF key ='1' THEN etat <= Armed; ELSE etat <= Off; END IF; WHEN Armed => IF Key = '0' THEN etat <= Off; ELSIF Trip ='1' THEN etat <= Ringing; ELSE etat <= Armed; END IF; WHEN Ringing => IF Key ='0' THEN etat <= Off; ELSE etat <= Ringing; END IF; END CASE; END IF; IF etat=Ringing THEN -- partie combinatoire

TD4 VHDL Logique Sequentielle Ring<='1'; ELSE Ring <='0'; ENDIF END PROCESS; END ar; Intressez-vous la seule partie squentielle pour le moment.

Ajout d'une initialisation


Initialisation synchrone L'ajout d'une initialisation synchrone se fait dans le "if clk'event" comme indiqu ci-dessous : -- 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; .... Initialisation asynchrone Comme pour les compteurs, l'initialisation asynchrone se fait elle, avant le "if clk'event" sans oublier d'ajouter l'entre d'initialisation (ici reset) dans la liste des sensibilits du process correspondant. -- avec initialisation asynchrone BEGIN PROCESS (clock,reset) BEGIN IF Init='1' THEN etat <=Off; --initialisation asynchrone ELSIF 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; ....

TD4 VHDL Logique Sequentielle Notez en ligne 5 l'utilisation d'un "elsif" en lieu et place d'un "else if" dont l'intrt est d'conomiser un "end if".

Le codage des tats


La programmation des tats ncessite une dclaration symbolique comme on peut voir ci-dessous : --********* VHDL TYPE typetat IS (Armed, Off, Ringing); -- dans architecture SIGNAL etat : typetat; Quand la synthse sera demande plusieurs solutions peuvent se prsenter suivant le codage des tats. Une telle dclaration dbouchera sur un codage Armed=00, Off=01 et Ringing=10. On peut modifier ce codage l'aide de deux attributs diffrents : enum_encoding et state_encoding. Enum_encoding est normalis par le standard IEEE 1076.6. --********* VHDL type state is (s0,s1,s2,s3); attribute enum_encoding of state:type is "00 01 10 11"; La directive state_encoding spcifie la nature du code interne pour les valeurs d'un type numr. --********* VHDL attribute state_encoding of type-name:type is value; Les valeurs lgales 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'numration avec autant de bits que ncessaire. one_hot_zero : on code la premire valeur par zro, puis le reste en utilisant chaque fois un seul un : N tats ncessiteront donc N-1 bits. one_hot_one : idem one_hot_zero sauf que l'on n'utilise pas le code zro. N tats ncessiteront donc N bits. Gray : les tats suivent un code de GRAY. Exemples : avec codage one hot zeo --********* VHDL type state is (s0,s1,s2,s3); attribute state_encoding of state:type is one_hot_zero; avec codage de type Gray --********* VHDL type s is (s0,s1,s2,s3); attribute state_encoding of s:type is gray;

TD4 VHDL Logique Sequentielle

Exercice 1
Concevez une machine d'tat capable de dtecter la prsence de la sequence 1111010 . 1) Dessiner le graphe d'volution. 2) Quel code des tats sur combien de bits proposez vous 3) Raliser le programme VHDL correspondant.

Utilisation du tableau des tats pour obtenir les quations de rcurrences


Une fois le choix du codage des tats ralis, il n'est pas difficile de raliser le tableau tat prsent/tat futur pour en dduire les quations de rcurrences.

Pour l'exemple du rveil, dj prsent, et rappel ci-dessus, on choisit le code : "OFF" -> 00 "Armed" -> 01 "ringing" -> 10 Il n'est pas trs difficile d'en dduire la table de transition : Table de transitions du rveil
Entres Sortie

Etat Prsent Conditions Etat futur q1 q0 00 00 01 01 01 10 10 11


''

key trip 0X 1X 10 0X X1 0X 1X XX

q1+ q0+ 00 01 01 00 10 10 00 00

Remarque : Cette table est ambigu : cette ambiguit tait dj prsente dans le graphe d'volution qui ne dit pas ce qui se passe si on est dans l'tat "armed" et que key=0 avec aussi trip=1 ! Il faut choisir une priorit pour la coder ! Table de transitions du rveil avec priorit

TD4 VHDL Logique Sequentielle

Entres

Sortie

Etat Prsent Conditions Etat futur q1 q0 00 00 01 01 01 10 10 11 key trip 0X 1X 10 0X 11 0X 1X XX q1+ q0+ 00 01 01 00 10 10 00 00

Les deux quations de rcurrences s'en dduisent immdiatement.

Exercice 2
Active-FSM est un outil ancien prsent avec le compilateur warp. Il permet de faire un dessin d'un graphe d'volution et de gnrer la programme VHDL entier correspondant. Un tudiant a utilis active-FSM et gnr un programme VHDL correspondant au dessin ci-contre. Puis il a ralis un projet pour compiler et obtenu le fichier de rapport ci-dessous. 1) Remplir le tableau tat prsent tat futur ci-contre en choisissant comme tat futur de l'tat 00. 2) Trouver les quations de rcurrences correspondantes. 3) Comparer au fichier rapport. Pourquoi n'y a-t-il pas d'quation combinatoire de sortie ? O est la sortie ? Pour remplir le tableau, vous utiliserez naturellement les quations de rcurrence du fichier rapport. Dans ce fichier, la notation truc.D signifie et truc.Q signifie truc (tat prsent). On notera sregSBV_0 tout simplement s0. Table de transitions

TD4 VHDL Logique Sequentielle

Entres

Sortie

Etat Prsent Conditions Etat futur s s0 00 00 01 01 10 10 11 e0 e1 Init 0X0 1X0 0X0 1X0 0X0 1X0 1X0 s+ s0+

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

TD4 VHDL Logique Sequentielle not not not not not not used used used used used used *| 7| |18|* *| 8| |17|* *| 9| |16|= *|10| |15|= *|11| |14|* *|12| |13|* __________________________________________ not used not used (sreg0SBV_0) s not used Reserved

Un ensemble d'exemples utilisant des graphes d'volutions est prsent en TD5 :VHDL et CAO.

Programmation de graphes d'tats


Nous avons dj eu l'occasion d'introduire ce problme en logique, dans le cours Logique squentielle.

Comparaison graphe d'tats ( gauche) et diagramme d'volution ( droite)

Une transition barre est dite rceptive (comme avec les GRAFCETs) et, comme l'indique l'quivalence du dessin ci-dessus, elle sous entend que si la rceptivit est fausse on reste dans le mme tat.
''

Remarque : Il est prsent dans le cours WIKIVERSITE logique squentielle, particulirement dans le chapitre Description par graphe d'tats une mthode qui permet de passer d'un graphe d'tat des quations de rcurrences.

Utilisation du style "case when"


Il est trs facile de transformer le graphe d'volution du rveil en graphe d'tats. En comparant avec le programme donn en VHDL pour ce mme rveil il n'est pas difficile de tirer quelques rgles de codage.

Pour ne pas donner deux fois le mme programme, nous donnons le programme du rveil lgrement modifi pour remplacer les "bit" par des "std_logic". library IEEE; use IEEE.STD_LOGIC_1164.ALL; ENTITY Alarm IS

TD4 VHDL Logique Sequentielle PORT( clock,Key,Trip :IN std_logic; Ring :OUT std_logic ); END Alarm; ARCHITECTURE ar OF Alarm IS TYPE typetat IS (Armed, Off, Ringing); SIGNAL etat : typetat; BEGIN PROCESS (clock,etat) BEGIN -- partie squentielle IF Clock ='1' AND Clock'EVENT THEN CASE etat IS WHEN Off => IF key ='1' THEN etat <= Armed; ELSE etat <= Off; END IF; WHEN Armed => IF Key = '0' THEN etat <= Off; ELSIF Trip ='1' THEN etat <= Ringing; ELSE etat <= Armed; END IF; WHEN Ringing => IF Key ='0' THEN etat <= Off; ELSE etat <= Ringing; END IF; END CASE; END IF; IF etat=Ringing THEN -- partie combinatoire Ring<='1'; ELSE Ring <='0'; ENDIF END PROCESS; END ar; On vous laisse comparer la partie graphe d'volution de la figure avec le programme pour en dduire quelques rgles pour raliser votre code.

Les forages synchrones et asynchrones


Il existe deux faons pour initialiser en utilisant les fronts d'horloge (synchrone) ou non (asynchrone). La technique de programmation est trs similaire celle des compteurs du TD prcdent.

Forage asynchrone
Rappel : Un forage asynchrone est un forage pris en compte mme si aucun front d'horloge est envoy. -- gestion de l'asynchrone process(clk,reset) begin if reset='1' then

TD4 VHDL Logique Sequentielle -- avant horloge donc asynchrone q<= "0000"; elsif clk'event and clk='1' then -- ici le synchrone end if; end process; La partie commente avec par "--ici le synchrone" dsigne aussi bien un "case when" que des quations de rcurrences.

10

Forage synchrone
L'obtention des quations de rcurrences par les techniques classiques dcrites dans le cours de logique squentielle donne automatiquement les forages synchrones l'aide de l'entre que l'on a appele Init. Premire faon On rsume ici ce qui a t obtenu dans le cours de logique squentielle. -- initialisation synchrone process(clk) begin if clk'event and clk='1'then -- equations de rcurrence + init -- ou -- equations de rcurrence ./init end if; end process; Mais ce n'est pas la seule et unique faon de procder. Deuxime faon On peut retirer tout ce qui est li l'entre "Init" des quations et transformer le programme ainsi : if clk'event and clk='1'then if init ='1' then q<= "0000"; else -- ici case ou equations de -- rcurrences end if; end if; Cette technique ncessite de connatre le code de l'tat initial (ici "0000") ou au moins son nom symbolique.

TD4 VHDL Logique Sequentielle

11

Programmation des GRAFCETs en VHDL


Vous pouvez lire le WIKI GRAFCET ou les livres GRAFCET (niveau 8) et Automatisme : norme 1131-3 et GRAFCET (niveau 13) de la Wikiversit avant d'aborder ce chapitre. Les GRAFCET se dcrivent en VHDL relativement facilement en utilisant la mme technique que la section prcdente sur les graphes d'tats. On rappelle que la diffrence entre les deux est simplement qu'en aucun cas il ne peut y avoir deux jetons dans un graphe d'volution alors que cela est parfaitement autoris pour un GRAFCET. C'est pour cela que l'on parle d'tape dans un GRAFCET et d'tat dans le graphe d'volution. Lorsque plusieurs jetons se trouvent dans un GRAFCET, on parle de paralllisme. En voici un exemple simple :

Dans ce GRAFCET, quitter l'tape 10 active les deux tapes 21 et 30.

Obtenir les quations de rcurrences


La mthode simple consiste crire pour chacune des tapes les conditions d'activations (notes conditions de dsactivations (notes
Dfinition La condition d'activation s'obtient en se posant la question : comment activer l'tape i si elle n'est pas active ?

) et les

).

La condition de dsactivation s'obtient quant elle en se posant la question : quelles sont les conditions ncessaires pour que le jeton quitte l'tape i s'il est dedans ?

Avec ces conditions on va pouvoir former les quations de rcurrences : Pour la ou les tapes initiales : Pour les tapes non initiales : L'indice i parcourant toutes les tapes, il y a autant d'quations de rcurrences que d'tapes. En terme matriel, cela signifie que l'on utilisera une bascule D par tape. Bien sr, un codage des tats permet de faire des conomies de ce ct l mais rappelez-vous qu' ce point on a que des tapes et pas encore des tats. Nous allons partir d'un GRAFCET assez gnral pour raliser un exemple complet. Prenez un peu de temps pour relire l'quation de AC1 et celle de D3 qui prennent en compte le paralllisme. C'est le seul type de situation qui diffre du graphe d'tat. Voici le programme correspondant : VHDL

Notre grafcet de dpart

TD4 VHDL Logique Sequentielle


ENTITY Graf IS PORT ( -- horloge et entre init clk, Init: IN BIT; -- entres e1,e2,e3,e4 : IN BIT; -- tapes et1,et2,et3,et4,et5: INOUT BIT); END Graf; ARCHITECTURE aGraf OF Graf IS BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN -- x1+ = x3.x5.e4+x1./e1+Init et1 <= (et3 and et5 and e4) or (et1 and not e1) or Init; -- x2+ = (x1.e1+x2./e2)./Init et2 <= (et1 and e1 and not Init) or (et2 and not e2 and not Init); -- x3+ = (x2e2+x3/(e4x5))./Init et3 <= (et2 and e2 and not Init) or (et3 and not e4 and not Init) or (et3 and not et5 and not Init); -- x4+ = (x1e1+e3x4)./Init et4 <= (et1 and e1 and not Init) or (et4 and not e3 and not Init); -- x5+ = (x4e3+x5/(e4x3))./Init et5 <= (et4 and e3 and not Init) or (et5 and not e4 and not Init) or (et5 and not et3 and not Init); END IF; END PROCESS; -- grer les sorties ici s'il y en a END aGraf;

12

pour lequel on a utilis parfois, les lois de De Morgan sur les quations de rcurrences prsentes en commentaires.

Codage des tats pour un GRAFCET


Transformer un GRAFCET en graphe d'volution est toujours possible. L'intrt de la chose est qu'une fois le graphe d'volution obtenu, il est possible de compter ses tats. L'exemple de la section prcdente nous semble tre un bon point de dpart :

Cette figure transforme un GRAFCET gauche en un graphe d'tat droite. La notation {2,4} dans un tat indique que l'tat correspond l'tape 2 et l'tape 4 actives (avec un jeton) dans le GRAFCET.

TD4 VHDL Logique Sequentielle

13

Dfinition On dit que l'tat {2,4} correspond au marquage de l'tape 2 et de l'tape 4. Tout marquage doit tre accessible pour tre compt comme un tat. Par exemple le marquage symbolis par {1,2,4} n'est pas accessible, c'est dire qu'il n'existe aucune squence sur les entres qui amne le GRAFCET de son tat initial vers ce marquage.

Dans cet exemple vous obtenez un graphe d'tats qui comporte 5 tats pour un GRAFCET qui comporte 5 tapes. En principe, le graphe d'tats comporte plus d'tats que le GRAFCET comporte d'tapes. Pour coder les tats vous devez utiliser la relation ncessaire au code. Par exemple, nos 5 tats ncessitent trois bits de code. < N (tats) qui vous donne le nombre de bits M

Programmation des GRAFCETs avec "case when"


La programmation de GRAFCETs avec le style "case when" de VHDL ncessite de coder les tats. Cela signifie donc qu'il faut transformer le GRAFCET en graphe d'tats. En effet, avec le style "case when", vous crivez derrire le when une reprsentation (symbolique ou pas) d'un tat, ainsi, le graphe d'tats est invitable. Si vous avez votre graphe d'tat, reportez vous la section correspondante dans ce chapitre pour apprendre coder avec le style correspondant.

Codage des tats et quations de rcurrences


Il est possible de partir d'un GRAFCET, de le transformer en graphe d'tat comme dj prsent. Une fois que l'on connait le nombre d'tats, on peut choisir un code des tats et transformer ensuite le tout en quations de rcurrences. Voici un exemple :

Ce qui est nouveau est le tableau compltement droite d'assignation des tats des codes. Ce tableau permet de remplir ensuite le tableau tat prsent tat futur avec ces codes, pour en dduire finalement les quations de rcurrences. Il est facile de tirer de cette figure :

TD4 VHDL Logique Sequentielle


''

14

Remarque : la complexit des quations que l'on obtient est assez dpendante du code choisi pour les tats. Il existe des mthodes pour minimiser le nombre d'tats (Paull Unger) et choisir le code optimal (Huffman) mais on ne les prsente pas ici. Une mthode heuristique pour coder les tats, dj prsente dans la correction de l'exercice 1, consiste mettre le plus de zros possible sur les tats qui ont le plus de flches de transitions qui y aboutissent. Ici, l'tat {3,5} a trois transitions qui y aboutissent : il aurait donc t trs judicieux de le coder "000" au lieu de "100" !!!

Exercice 3
Si l'on intervertit dans l'exemple donn le code de {3,5} avec celui de {1}, quelles sont les quations de rcurrences qui se simplifient ?

Et pour finir, le problme des actions


Les actions des GRAFCETs ont t dlaisses jusqu' prsent. Si vous savez les grer avec les graphes d'tats, il n'y a aucune diffrence pour le GRAFCET. Il s'agit d'quations combinatoires qui sont gnralement trs simples et se compliquent un peu si l'on code les tats de manire compacte.

Sources et contributeurs de larticle

15

Sources et contributeurs de larticle


TD4 VHDL Logique Sequentielle Source: http://fr.wikibooks.org/w/index.php?oldid=342253 Contributeurs: JackPotte, SergeMoutou, 15 modifications anonymes

Source des images, licences et contributeurs


File:ReveilStateD.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:ReveilStateD.png Licence: GNU Free Documentation License Contributeurs: SergeMoutou Image:VHDLFig16.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:VHDLFig16.png Licence: inconnu Contributeurs: SergeMoutou Image:Td8fig3.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:Td8fig3.png Licence: GNU Free Documentation License Contributeurs: Original uploader was SergeMoutou at fr.wikibooks File:ReveilGraphe.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:ReveilGraphe.png Licence: GNU Free Documentation License Contributeurs: SergeMoutou Fichier:Graf7 02.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:Graf7_02.png Licence: GNU Free Documentation License Contributeurs: Original uploader was Ssire at fr.wikipedia Fichier:GRAFexmple1.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:GRAFexmple1.png Licence: GNU Free Documentation License Contributeurs: SergeMoutou File:GRAFexemple2.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:GRAFexemple2.png Licence: GNU Free Documentation License Contributeurs: SergeMoutou File:GRAFexemple3.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:GRAFexemple3.png Licence: GNU Free Documentation License Contributeurs: SergeMoutou

Licence
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/