Archi1 Synthese Automates

De Ensiwiki
Aller à : navigation, rechercher
AttentionCette page est maintenue uniquement par les enseignants. Afin de ne pas perturber le déroulement des cours, elle n'a pas vocation à être modifiée par les élèves. Mais si vous avez des modifications à proposer, merci d'en discuter ou d'envoyer un e-mail aux auteurs de la page (cf. historique)


Laptop.png  Première Année  Puce.png  Matériel 

Travail Préparatoire

Les questions 1, 2 et 3 de l'exercice 2 doivent être préparées avant l'arrivée en séance de TP.

Objectifs du TP

  • apprendre à représenter des circuits simples avec un langage de description d'architecture (Hardware Description Language)
  • comprendre les étapes fondamentales des flots de conception de circuits numériques : simulation, synthèse logique, programmation de la carte FPGA

Prise en main sur un exemple connu

Contrairement à ce que nous avons fait dans les 2 premières séances, un ingénieur souhaitant concevoir un circuit numérique n'en assemble pas directement les transistors ou les portes logiques, car la complexité de la tâche le limiterait à des circuits très simples. Il s'appuie donc sur des outils de CAO (Conception Assisté par Ordinateur) pour décrire, simuler et générer son circuit pour la cible matérielle retenue (ASIC, FPGA).

Nous utilisons à l'Ensimag une cible FPGA, c'est à dire un réseau programmable de portes combinatoires (basées sur des LUTs) et de portes séquentielles. Ce composant programmable est dans notre cas intégré sur une carte qui est composée :

  • d'un FPGA Spartan3 de Xilinx XC3S1000 avec 1 million de portes logiques, 432 Kbit de mémoires embarquées, 24 multiplieurs 18x18 et 4 gestionnaires d'horloge numérique ;
  • d'une PROM de 2 Mbit pour sauvegarder des configurations du FPGAs ;
  • d'une mémoire SRAM asynchrone de 1 MO ;
  • d'un quartz générant une horloge à 50 MHz et une entrée d'horloge auxiliaire ;
  • des ports de connexion : un port VGA (écran), un port série, un port PS/2 (souris, clavier), un JTAG pour la programmation du FPGA, et des ports d'extension ;
  • des interfaces d'entrée-sortie : 4 afficheurs 7-segments, 8 LED, 8 interrupteurs et 4 boutons poussoirs.

Afin de vous faire gagner du temps, vous n'aurez pas à manipuler directement la suite d'outils ISE de Xilinx (version 12.2) qui permet de gérer le flot de conception en allant de la description du projet jusqu'à la programmation des produits Xilinx. En lieu et place, nous vous proposons un flot automatique et simplifié utilisant make, un outil largement utilisé pour automatiser des tâches de génération et que vous étudierez en détails dans le cours sur Unix.

On va prendre comme exemple un circuit étudié lors des TD et TP précédents : le LFSR, dont on rappelle le schéma logique ci-dessous :

Archi1 LFSR.png

Description du circuit LFSR en VHDL

Dans ce TP, nous utilisons le langage de description d'architecture nommé VHDL. Attention la syntaxe du VHDL est très proche de celle de ADA : ne perdez pas de vue que la finalité de ce langage est de décrire des circuits et non des algorithmes. C'est pourquoi il est impératif d'avoir dessiné le circuit que l'on veut représenter avant d'écrire du code VHDL.

Question : téléchargez l'archive contenant les sources de départ et décompressez-la à l'endroit de votre choix. Placer vous dans le sous-répertoire src_etd créé et tapez la commande source /Xilinx/env-12.2.sh pour initialiser les variables d'environnement nécessaires aux logiciels Xilinx utilisés.

Attention : toutes les commandes données dans l'énoncé sont à taper dans un terminal positionné dans le répertoire std_etd. Si vous lancez la commande make dans un mauvais répertoire, un message d'erreur du type « pas de règles pour fabriquer la cible » sera affiché.

Question : le fichier vhd/lfsr.vhd contient un squelette de description pour le circuit LFSR. Les commentaires fournis forment un mini-tutoriel qui vous permettra d'appréhender aisément le vaste monde du VHDL. Ouvrez ce fichier avec votre éditeur de texte préféré et complétez le en ajoutant les port map manquants à la fin du fichier.

Question : effectuez la synthèse logique de votre circuit en utilisant la commande : make synthese TOP=lfsr.

Nous allons maintenant vérifier le circuit généré avec le logiciel ISE : pour cela tapez ise dans votre console, puis ouvrez le fichier lfsr.ngr généré par la synthèse File -> Open. Dans la fenêtre de dialogue qui apparaît, sélectionnez Start with a schematic of the top level block. Vous devriez obtenir une vue graphique de votre composant lfsr, avec ses deux entrées et sa sortie. Double-cliquez sur le composant pour observer son contenu (adaptez le niveau de zoom avec F6).

Question : vérifiez que le schéma obtenu correspond au schéma donné dans l'énoncé.

Question : fermez ISE puis reprenez le fichier vhd/lfsr.vhd. Inversez 2 affectations concurrentes dans la description (par exemple le XNOR et le NOT), et observez le circuit généré (n'oubliez pas de relancer la synthèse, puis de fermer et rouvrir les fichiers générés). Que constatez-vous ?

Simulation comportementale

Un des grands avantages des langages HDL réside dans la possibilité de simuler le comportement des circuits décrits. Outre les entrées-sorties du circuit, la simulation permet d'accéder à l'ensemble des signaux internes du circuit. Un atout incontournable pour mettre au point un circuit !

Afin de simuler un composant, il faut créer un banc d'essai (testbench) qui instancie ce composant et lui fournir en entrée un ensemble de stimuli.

Question : ouvrez le fichier vhd/tb_lfsr.vhd pour contempler le banc d'essai proposé et en comprendre les subtilités (mini-tutorial inclus). Quelles sont dans ce fichier les entrées générées ?

Question : lancez la simulation avec l'outil ISim sur ce banc d'essai en utilisant la commande : make run_simu TOP=lfsr et appuyez sur F6 pour adapter le niveau de zoom. Vérifiez sur le chronogramme que le résultat attendu est correct.

On rappelle la séquence de valeurs pseudo-alétatoires que doit générer le LFSR : 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1.

Implantation sur la carte FPGA

Après avoir vérifié le bon fonctionnement de notre circuit, on peut l'implanter sans crainte sur la cible matérielle, ici un FPGA. Le FPGA est relié aux différents périphériques par des pattes (i.e. les petits fils qu'on voit sortir de la puce) numérotées. Si on veut utiliser ces périphériques, il faut donc préciser l'association entre le nom des entrées et sorties logiques des schémas (e.g. les entrées clk et reset et la sortie s du LFSR) et les numéros des pattes correspondant aux périphériques à utiliser. Le fichier lfsr.ucf permet à l'utilisateur de spécifier ces associations.

Question : ouvrez le fichier lfsr.ucf pour comprendre la syntaxe très simple utilisée pour définir les contraintes.

Avec ces informations, le flot de conception est capable de générer un fichier décrivant la programmation du FPGA. Cette opération prend un temps conséquent au vu des nombreuses étapes à réaliser. Il faut ensuite transférer le fichier généré vers la carte pour la programmer.

La carte FPGA est connectée au PC via un câble appelé JTAG. D'un côté de ce câble, on trouve un connecteur DB-25 qu'il faut brancher au dos du PC. De l'autre, un connecteur dédié qui doit être branché à la carte FPGA comme illustré ci-dessous :

Archi1 conn fpga.png

Question : branchez la carte en suivant les instructions de vos enseignants. Programmez le FPGA en tapant la commande : make run_fpga TOP=lfsr. Une fois la carte programmée avec succès, réglez la fréquence du GBF sur 2Hz pour avoir un affichage lisible sur les LEDS de la carte FPGA.

Implantation d'un automate reconnaisseur de séquence

Question : donnez le graphe d’états d’un automate reconnaisseur de la séquence 10^+11 respectant le modèle de Moore (on rappelle que la notation x^+ signifie « une ou plusieurs (mais pas zéro) fois x »

L'entrée e et la sortie z de l'automate sont chacune codées sur 1 bit. On impose le codage ci-contre pour les états : TODO.

Question : donnez les équations minimisées des transitions et de la sortie de l'automate.

Question : dessinez le circuit correspondant à cet automate.

Question : complétez le fichier auto.vhd afin d'y décrire l'automate dessiné.

Question : vérifiez le circuit généré en tapant make synthese TOP=auto puis ouvrez le fichier auto.ngr dans ISE. Simulez son fonctionnement grâce au testbench tb_auto.vhd en tapant make run_simu TOP=auto.

Le testbench tb_auto.vhd fourni génère une suite de stimuli qu'il applique en entrée de votre automate. Cette suite est construite de manière à tester toutes les transitions de l'automate. Pour chaque entrée, le testbench regarde la sortie de l'automate et la compare à une valeur de référence. Si les deux valeurs diffèrent, cela signifie que vous avez une erreur dans votre automate. Le simulateur vous préviendra par un message d'erreur dans sa console, du type

at 120 ns: Error: ==== ERREUR: Sortie de l'automate inattendue ====

En revanche, le message ** Failure:Simulation terminée n'est pas une erreur en soit, mais indique simplement que la suite de stimuli a été entièrement appliquée.

Assemblage du LFSR et de l'automate reconnaisseur de séquences

Question : complétez le fichier global.vhd de manière à y instancier un composant LFSR connecté à un composant reconnaisseur de séquences. Vous ne devez bien sûr pas copier-coller le code des composants !

Question : vérifiez en simulation le circuit global à l'aide de la commande make run_simu TOP=global. Il faut que la sortie de l'automate passe bien à 1 lorsqu'on détecte la séquence 10^+11 en sortie du LFSR.

Pour générer le circuit global sur la carte FPGA, le flot utilise le fichier de contraintes global.ucf.

Question : adaptez au besoin ce fichier et programmez la carte en tapant make run_fpga TOP=global.

Une fois la carte programmée, on doit voir s'afficher sur la LED 0 la sortie de l'automate, qui s'allumera donc quand la séquence a été détectée.

Question subsidiaire 1

S'il vous reste du temps, reliez la carte FPGA à l'oscilloscope pour afficher la sortie du LFSR et celle de l'automate reconnaisseur de séquences. Pour cela, vous pouvez rajouter deux nouvelles sorties. Reliez la sortie l à la patte D5 et la sortie s à la patte D6, et branchez deux sondes, une sur la patte numéro PA35 et l'autre sur la patte numéro PA33 de la carte d'extension (breadboard). Utilisez la troisième entrée de l'oscilloscope pour l'horloge sortant du GBF, réglé à 2KHz.

Il va de soi qu'il faut modifier les fichiers global.ucf et global.vhd en conséquence et reprogrammer la carte avec vos modifications.