leçon 5 : FSM avec Fizzim

Dans ce TP, nous allons utiliser ISE pour construire un contrôleur. C’est avec l'outil graphique Fizzim que vous développerez ce contrôleur. A partir d'un automate composé d'états et de transitions cet outil génère du code VHDL qu'il faudra ensuite insérer dans votre projet ISE. Un symbole pourra y être associé comme pour un développement d'un circuit schématique. Vous vérifierez par simulation puis par exécution sur la carte que les comportements de votre automate correspondent à vos spécifications. Cet apprentissage sera réutilisé par la suite pour construire l’unité de contrôle de votre processeur S3.

L'ancienne version est toujours disponible ici, sans Fizzim la FSM est écrite directement en VHDL.

Programmation d’un FSM avec Fizzim

La meilleure façon de représenter un comportement temporel consiste à utiliser une FSM (Finite State Machine). Cette FSM permet de définir ce qu’il faut déclencher comme signaux à chaque instant et cela en fonction du contexte dans lequel elle évolue. La réalisation d’une FSM peut se faire en schématique et vous l’avez déjà fait pour la réalisation de l’afficheur 4 chiffres. L’utilisation d’un compteur d’état et ensuite de multiplexeurs avec éventuellement des bascules de transition d’état permettent de réaliser un tel circuit. Néanmoins pour une FSM conséquente, il commence à falloir pas mal de composants. Il me semble que la conception d'un automate graphique via Fizzim est plus lisible et maintenable (c'est aussi vrai en VHDL). C’est pourquoi je vous propose lors de cette séance une mise en œuvre avec cet outil. Cette leçon utilise donc un outil de conception externe à Xilinx, il est open source et freeware. Je vais cette fois encore vous guider vers une utilisation simple des fonctionnalités de Fizzim.

Connaissances requises

Automates, FSM, les TP précedents.

Objectifs

Dans ce TP, nous allons utiliser ISE pour construire un contrôleur. C’est avec l'outil graphique Fizzim que vous développerez ce contrôleur. A partir d'un automate composé d'états et de transitions cet outil génère du code VHDL qu'il faudra ensuite insérer dans votre projet ISE. Un symbole pourra y être associé comme pour un développement d'un circuit schématique. Vous vérifierez par simulation puis par exécution sur la carte que les comportements de votre automate correspondent à vos spécifications. Cet apprentissage sera réutilisé par la suite pour construire l’unité de contrôle de votre processeur S3.

Le projet

Vous allez concevoir un composant et son symbole de gestion des feux de circulation. Avec Fizzim vous allez construire l'automate qui accepte quelques signaux en entrée et produit en sortie un afficheur sur les leds, les 6 lampes d’un croisement (2 x [Rouge + Orange + Vert]). Il faudra ensuite instancier ce symbole dans un schéma qui intègre les entrées/sorties soit les switches et les leds de la carte. Plusieurs niveaux de difficulté pour la FSM seront successivement abordés.

Un contrôleur de feux de circulation

Nos spécifications du système initial se limitent à un automate à 4 états pour un croisement perpendiculaire de deux rues Nord-Sud (NS) et Est-Ouest (EO). On définit ces 4 états de la façon suivante :

RougeVert: Rouge sur NS et Vert sur EO

RougeOrange: Rouge su NS et Orange sur EO

VertRouge: Vert sur NS et Rouge sur EO

OrangeRouge: Orange su NS et Rouge sur EO

L’automate est lui aussi très simple, il s’agit d’une boucle cyclique infinie sur 4 états. Le système change d’état à chaque top d’horloge et pour chaque top il allume les leds correspondantes : les trois leds de droite représentent led(2)=>Rouge, led(1)=> Orange et led(0)=>Vert d’un sens de circulation. Les trois leds les plus à gauche représentent led(7)=>Rouge, led(6)=>Orange et led(5)=> Vert de l’autre sens. Voici une représentation de l’automate qui positionne ces leds à chaque top d’horloge sur le front montant. La valeur des leds est ici validée à chaque top en fonction de l’état correspondant.

Figure 59 Automate feux tricolores

Vous allez créer votre nouveau projet TP5, insérez de suite un Schematic de nom toplevel et placez les deux Properties pour ucf et JTAG. Vous allez ensuite créer une New Source de type VHDL Module que vous nommerez fsm. ISE vous guide dans la définition du module. Ici vous n'avez pas besoin de créer des signaux en entrée.sortie car nous allons ensuite remplacer ce fichier par le résultat de Fizzim. Enfin validez la création.

Figure 60 Création du Fichier vhdl pour la fsm

Ise vous ouvre l’éditeur sur le fichier fsm.vhd. La spécification de l’architecture et de l'entity est vide. Fermez la fenêtre contenant ce fichier.

Utilisation de Fissim chez vous

Fizzim fonctionne sous linux comme sous Windows. C'est du java et du perl . Si vous utilisez ce TP en dehors des salles de classe de l'université de Lille , il faut bien sûr installer le software chez vous :

http://www.fizzim.com/download/

Une fois installé il faut remplacer le fichier fizzim.pl par celui que vous trouverez ici en bas de page. J'ai modifié ce fichier afin de corriger quelques omissions dans la génération du code VHDL. Indispensable pour faire tourner ces TP.

Vous pouvez dans un nouveau terminal lancer la commande Fizzim, lancer la commande : fizzim-gui . Lors du premier accès le dossier fizzim se copiera automatiquement dans le HOME utilisateur. Le script perl figurera dans le HOME/fizzim.

Lors du lancement de Fizzim, une FSM vide est instanciée, nous allons y ajouter les spécifications de notre projet.

Dans la fenêtre Fizzim, cliquez droit et New State. Vous allez ainsi créer successivement les 4 états RougeVert, RougeOrange, VertRouge et OrangeRouge.

Ensuite dans le menu cliquez sur Global Attributes>State Machine. Changez le nom de votre automate en fsm. En choisissant l'onglet Reset vous pouvez choisir le signal resetN et le nom de l'état initial, ici RougeVert. Placez aussi ResetN à Positive ( ResetN sera actif quand il vaudra '1')

Cliquez sur l'onglet Outputs. Puis choisissez Multibit Output, il suffit de renommer la sortie par défaut en led[7:0] et d'y mettre la valeur par défaut à "00000000".

Avant d’enregistrer, il vous faut aussi ajouter sur l'onglet Inputs , le signal clk pour notre horloge et resetN pour le reset de l'automate. On ne se servira pas de ce reset dans le design mais il est nécessaire pour créer un code VHDL correct.

Sur chaque état un double clic va vous permettre d'ouvrir la fenêtre de spécification de cet état , il faut y placer la valeur de la sortie associée à led pour cet état. A faire pour les 4 états.

Il vous reste à créer les transitions entre les états , ici c'est très simple on passe d'un état au suivant à chaque top. Un clic droit sur l'état puis Add State Transition To vous permet de créer cette transition directement.

Voici le résultat final, vous pouvez sauvegarder le fichier dans TP5, appelez le tricolore.fzm :

Dans votre HOME/fizzim vous avez un fichier perl qui va transformer le dessin de votre automate en code VHDL reconnu par ISE.

Voici la commande à lancer sous Windows :

perl -f ...../fizzim.pl -nowarn R -nowarn F -nowarn I -language vhdl <tricolore.fzm >fsm.vhd

Voici la commande sous Linux :

perl ..../fizzim.pl -nowarn R -nowarn F -nowarn I -language vhdl < tricolore.fzm > fsm.vhd

En ouvrant le fichier fsm.vhd dans ISE , vous trouverez le résultat de votre design, si vous êtes curieux prenez le temps de regarder le code... C'est assez intuitif pour en comprendre le fonctionnement, faites vous aider par l'enseignant si cela vous intéresse...

Simulation

Vous êtes en mesure de lancer la simulation. Vous pouvez ajouter une nouvelle source de type VHDL Test Bench nommée fsm_tb. Associez ce testbench à fsm. ISE va anticiper votre travail, il reconnait clk comme une horloge et va créer le process qui stimule ce signal. Il vous reste ici à commenter le process de stimuli stim_proc car seul clk sera généré par le simulateur. Le résultat obtenu vous valide la périodicité des affichages de Led. Vous pouvez créer le symbole de fsm.

Figure 61 Simulation de la fsm

Allez-y pour la synthèse, il vous faut donc ajouter à votre projet une copie du fichier S3.ucf modifié lors du TP4, ajoutez aussi une copie de clkdiv.sch dont vous allez produire le symbole. Placez dans toplevel une instance de clkdiv, une instance de fsm. Connectez clksec à l’entrée de votre fsm. Placez les deux I/O Marker sur les ports clk et Led(7:0). ISE créera pour vous directement les deux fil et bus qu’il faudra renommer clk et led(7:0). Placez le symbol GND pour forcer le resetN à '0'. La compilation peut être lancée puis chargez le toplevel.bit sur la carte.

Figure 62 Toplevel tricolore

FSM avec une entrée

Figure 63 FSM tricolore avec travaux

Avant toute chose je vous propose de recopier votre fichier tricolore.fzm vers tricolore_travaux .fsm. Ouvrez tricolore_travaux.fzm avec Fizzim.

Vous allez transformer votre fsm de telle sorte que lorsque le switches(0) est actif, les feux se mettent en mode travaux c’est-à-dire en clignotement Orange sur les deux axes. Les contraintes de réactivité étant faible pour ce système, je vous propose de passer en mode travaux seulement quand votre automate est dans l’état RougeVert. Il faut donc transformer votre automate en ajoutant deux nouveaux états OrangeON, OrangeOFF. Les modifications à apporter à votre FSM sont de plusieurs types :

    1. Ajoutez un port en entrée, nommé travaux.
    2. Ajoutez deux nouveaux états dans votre schéma : OrangeON et OrangeOFF. Placez y la valeur de led à "01000010" et "00000000"/
    3. Ajoutez les transitions entres ces nouveaux états. Vous allez pouvoir conditionner ces transitions en clic droit sur la transition Edit State Transition Properties:
    • de RouvertVert vers OrangeON : l’équation de transition est travaux='1'
    • de OrangeON vers RougeOrange : l'équation de transition est travaux='0'
    • de OrangeON vers OrangeOFF : l’équation de transition est travaux='1'
    • deOrangeOFF vers OrangeON : l'équation est par défaut 1

Vous pouvez générer le fichier fsm.vhd en lançant le perl sur ce fichier en entrée. En lanèant la comme dans TP5, ISE prendra en compte cette nouvelle fsm dans le projet .

La simulation par fsm_tb ne fonctionne plus, puisque travaux n’était pas défini auparavant. Je vous propose de créer une nouvelle source VHDL test bench nommée fsmtravaux_tb qui sera associée à votre nouvelle fsm. Il faut cette fois stimuler le signal travaux pendant un certain laps de temps. Il suffit pour cela d’ajouter dans le process Stim_proc le bout de code suivant :

La simulation est lancée sur fsmtravaux_tb. Vous observez le comportement suivant.

Figure 64 Simulation fsm avec travaux

Pour la vérification sur la carte il vous faut modifier toplevel. 1 Avant tout il faut recréer le symbole associé à fsm par un Create schematic symbol visible en mode implementation : les ports ne sont plus les mêmes, il y a maintenant un port d’entrée travaux qui doit apparaître. Pour mettre à jour ce symbole dans toplevel, il suffit de faire un clic gauche sur la page, vous obtenez la liste des symboles obsolètes avec la possibilité de le mettre à jour en cliquant Update. Allez-y pour fsm. En rouvrant la fenêtre associée à toplevel, on obtient un autre écran de mise à jour des symboles obsolètes du même genre.

Figure 65 Mise à jour des symboles obsolètes

Ajouter un bus et son I/O Marker nommé switches(7:0).Placez un Bus Tap entre switches(0) et le port travaux. Ça doit être prêt pour la compilation et exécution sur la carte. À vous de tester la réactivité du switches(0).

Figure 66 Toplevel fsm avec travaux

FSM avec Loopback

La construction de l’automate reste le point crucial de la conception, ensuite ce n’est qu’un travail de traduction en VHDL. D’ailleurs votre outils le fait pour vous :-). Néanmoins je vous conseille de construire si possible des automates simples donc avec le moins d’états possible.

Vous allez ajouter à votre automate une nouvelle fonctionnalité à vos feux de croisement. On vous demande d’avoir un temps d’affichage d’un feu vert 8 fois plus long sur un axe, on choisira l'axe associé à l'état VertRouge. Comment modifier votre automate ? Vous pourriez ajouter 7 autres nœuds VertRouge1… VertRouge7. Ces états intermédiaires s’intercaleraient entre Vert_Rouge et Orange_Rouge et ne seraient utiles que pour laisser passer le temps. Je vous propose plutôt d’utiliser un compteur externe à la FSM. Celui-ci doit être initialisé à '0' quand l’état courant est Rouge-Orange. Le compteur est incrémenté à chaque top d'horloge. Ce compteur doit conserver sa valeur entre deux tops de l'automate, il faut donc placer un registre de stockage pour en conserver la valeur. Il suffit alors de valider ou non le passage à l’état suivant Orange_Rouge en fonction de la valeur de ce compteur.

Figure 67 FSM avec compteur sur un axe

Vous pouvez copier tricolore_travaux.fzm dans tricolore_compteur.fzm. Ouvrez Fizzim sur ce nouveau fichier.

    1. Ajoutez un port en entrée multibit cpt (2:0) et en sortie un reset_cpt avec comme valeur par défaut = '0'
    2. Placez '1' dans le signal reset_cpt pour l'état RougeOrange
    3. Ajouter une équation Loopback sur l'état VertRouge. Son équation est cpt/="111"
    4. Modifiez l’équation de transition entre VertRouge et OrangeRouge : cpt="111"

Afin de structurer le design je vous propose de créer un schematic controleur.sch. Vous pouvez alors générer le symbole associé à FSM et en placez une instance dans votre schéma controleur.sch. Recherchez dans la liste des symboles le CB4CE , c'est un compteur 4 bit avec un reset sur le CLR. La sortie reset_cpt doit être connectée à l’entrée CLR (Clear) du CB4CE. Placez un bus en entrée de Cpt et nommez-le Cpt. Avec 3 Bus Tap connectez les sorties Q2 Q1 Q0 aux fils du bus Cpt de même indice (commencez par Q2 sur Cpt(2)). Le même fil d’horloge clk est connecté à C et clk de chacun des composants, placez-y de suite l’I/O Marker. IL faut aussi un I/O Marker sur led(7:0) et sur travaux. IL manque le GND sur les resetN de votre fsm. Enfin l’entrée CE (Chip Enable) est forcée à 1 par un symbole Vcc. Vous pouvez créer le symbole controleur pour la suite.

Figure 68 Contrôleur avec compteur

Pour la simulation de votre contrôleur, créez un fichier controleur_tb de type VHDL test bench. Il suffit de générer l’horloge clk pour observer le comportement de notre composant. Vous l’avez déjà fait lors de la leçon 4.

Par simulation on observe bien les 8 cycles sur une direction.

Figure 69 Simulation du contrôleur

Dernière étape, vous allez placez un composant controleur dans toplevel à la place de fsm. Vous pouvez ensuite le tester sur la carte.

Figure 70 Toplevel avec contrôleur

A vous de jouer

Proposez un feu de croisement avec 8 cycles sur NS et 4 cycles sur EO. Un seul compteur devrait suffire…

Réponses

1. Il arrive que le fichier ne soit plus visible dans la hiérarchie de design. Dans ce cas il faut sous l’onglet Files cliquer droit sur le fichier et remettre le Source Properties> View Association à All.