TD4 VHDL Logique Sequentielle 1 TD4 VHDL Logique Sequentielle Dans ce chapitre

TD4 VHDL Logique Sequentielle 1 TD4 VHDL Logique Sequentielle Dans ce chapitre nous présentons toute la logique séquentielle appelée non régulière. Définition On appelle logique séquentielle non régulière toute logique séquentielle pour laquelle le calcul de l'état futur en fonction de l'état présent ne peut pas se faire avec des opérateurs simples (sur plusieurs bits). Le lecteur de ce chapitre devra essayer d'appréhender les techniques communes à tout ce qui a été présenté au chapitre précédent, surtout ce qui concerne le problème des initialisations. Programmation des graphes d'évolutions Nous allons nous intéresser 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 réveil. Le diagramme d'évolution comme moyen de spécifier le calcul de l'état futur en fonction de l'état présent '' Principe de fonctionnement du réveil : à partir de "Off", "key"=1 arme le réveil. Si "trip" passe à 1 (c'est à dire que l'heure courante devient égale à l'heure de réveil) le réveil passe en "ringing" et sonne. "trip" ne reste pas très longtemps à un (1 seconde). Son retour à 0 ne suffit pas à errêter la sonnerie. Seul le passage de "key" à 0 peut l'arrêter. 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 récurrences. Mais comme nos diagrammes d'évolutions se sont compliqués (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. Présentons Programmation sans initialisation Le principe consiste à déclarer d'abord un type énuméré avec une définition symbolique de chacun des états (ici Armed, Off, Ringing) : TYPE typetat IS (Armed, Off, Ringing); -- dans architecture SIGNAL etat : typetat; TD4 VHDL Logique Sequentielle 2 Ensuite dans un « case when » on détaillera toutes les transitions possibles comme montré ci-dessous dans le cas où l'on ne s'intéresse 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'idée générale est donc d'utiliser un « case » sur les états avec des « if » pour gérer l'ensemble des transitions. Voici le programme complet du réveil : 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 séquentielle 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 3 Ring<='1'; ELSE Ring <='0'; ENDIF END PROCESS; END ar; Intéressez-vous à la seule partie séquentielle 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'entrée d'initialisation (ici reset) dans la liste des sensibilités 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 4 Notez en ligne 5 l'utilisation d'un "elsif" en lieu et place d'un "else if" dont l'intérêt est d'économiser un "end if". Le codage des états La programmation des états nécessite une déclaration symbolique comme on peut voir ci-dessous : --********* VHDL 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. --********* VHDL 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é. --********* VHDL 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 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 5 Exercice 1 Concevez une machine d'état capable de détecter la présence de la sequence « 1111010 ». 1°) Dessiner le graphe d'évolution. 2°) Quel code des états sur combien de bits proposez vous 3°) Réaliser le programme VHDL correspondant. Utilisation du tableau des états pour obtenir les équations de récurrences Une fois le choix du codage des états réalisé, il n'est pas difficile de réaliser le tableau état présent/état futur pour en déduire les équations de récurrences. Pour l'exemple du réveil, déjà présenté, et rappelé ci-dessus, on choisit le code : "OFF" -> 00 "Armed" -> 01 "ringing" -> 10 Il n'est pas très difficile d'en déduire la table de transition : Table de transitions du réveil Entrées Sortie Etat Présent Conditions Etat futur q1 q0 key trip q1+ q0+ 0 0 0 X 0 0 0 0 1 X 0 1 0 1 1 0 0 1 0 1 0 X 0 0 0 1 X 1 1 0 1 0 0 X 1 0 1 0 1 X 0 0 1 1 X X 0 0 '' Remarque : Cette table est ambiguë : cette ambiguité était déjà présente 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 réveil avec priorité TD4 VHDL Logique Sequentielle 6 Entrées Sortie Etat Présent Conditions Etat futur q1 q0 key trip q1+ q0+ 0 0 0 X 0 0 0 0 1 X 0 1 0 1 1 0 0 1 0 1 0 X 0 0 0 1 1 1 1 0 1 0 0 X 1 0 1 0 1 X 0 0 1 1 X X 0 0 Les deux équations de récurrences s'en déduisent immédiatement. Exercice 2 Active-FSM est un outil ancien présent avec le compilateur warp. Il permet de faire un dessin d'un graphe d'évolution et de générer la programme VHDL entier correspondant. Un étudiant a utilisé active-FSM et généré un programme VHDL correspondant au dessin ci-contre. Puis il a réalisé un projet pour compiler et obtenu le fichier de rapport ci-dessous. 1°) Remplir le tableau état présent état futur ci-contre en choisissant comme état futur de l'état 00. 2°) Trouver les équations de récurrences 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 récurrence du fichier rapport. Dans ce fichier, la notation truc.D signifie et truc.Q signifie truc (état présent). On notera sregSBV_0 tout simplement s0. Table de transitions TD4 VHDL Logique Sequentielle 7 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 |- -| |- -| uploads/Philosophie/ td4-vhdl 1 .pdf

  • 19
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager