Notation : P1 = 1 ; P2 = 1 ; P3 = 1
Dans cette leçon, Vous allez réaliser votre première conception (j’utiliserai aussi le mot design) simple qui va vous permettre de découvrir les entrées et sorties de la carte Nexys3. Ces concepts d’entrées/sorties seront utilisés dans toutes les séances suivantes. Par la même occasion, ce TP vise à fournir une initiation à l’utilisation des outils de Xilinx et Digilent. De par sa simplicité, c’est aussi un bon exemple pour comprendre le fonctionnement de la chaîne de transformation : comment à partir d’un code de description ou un schéma de circuit vous allez, par ISE, produire un fichier mondesign.bit. Ce fichier est ensuite chargé sur la carte afin d’implanter sur celle-ci le circuit spécifié dans ISE...
La Figure suivante identifie les principaux éléments de l’interface du Navigateur de Projet ISE utilisé dans ces TPs. Normalement les TP sont installées de telle sorte que vous pouvez directement passé au point 6 !
Pour installer ce logiciel sur les machines de l’université de Lille 1 :
Récupérer le fichier de licence et l'enregistrer sur votre compte l'adresse vous sera donnée par l'enseignant. Sur votre machine personnelle utilisez votre propre licence.
Depuis un terminal, lancer le gestionnaire de licences par la commande: /opt/Xilinx/12.4/ISE_DS/common/bin/lin64/xlcm
Dans l'interface de gestion de licences choisir "Get free webpack licence"
Cliquer sur "connect now" puis sur "copy licence"
Charger le fichier de licence puis cliquer sur "close". Remarque: les étapes de 1 à 5 ci-dessus sont à réaliser par chacun sur son propre compte (une seule fois pour tout le semestre)
Le logiciel ISE est maintenant prêt à être utiliser. Il se lance avec la commande: /opt/Xilinx/12.4/ISE_DS/ISE/bin/lin64/ise
Alias ISE
Si vous utilisez bash, rajoutez dans .bashrc la ligne suivante:
alias ise='/opt/Xilinx/12.4/ISE_DS/ISE/bin/lin64/ise'
enregistrez et fermez .
ensuite la commande source .bashrc pour recharger le nouveau bashrc dans votre terminal
Dans cette leçon, vous allez réaliser votre première conception (j’utiliserai aussi le mot design) simple qui va vous permettre de découvrir les entrées et sorties de la carte Nexys3. Ces concepts d’entrées/sorties seront utilisés dans toutes les séances suivantes. Par la même occasion, ce TP vise à fournir une initiation à l’utilisation des outils de Xilinx et Digilent. De par sa simplicité, c’est aussi un bon exemple pour comprendre le fonctionnement de la chaine de transformation : comment à partir d’un code de description ou un schéma de circuit vous allez, par ISE, produire un fichier mondesign.bit. Ce fichier est ensuite chargé sur la carte afin d’implanter sur celle-ci le circuit spécifié dans ISE.
C’est parti! Connectez la carte via le câble USB et placez l’interrupteur en position ON. Lancez le logiciel ISE 12.4 ! Si vous avez installé vous-même ISE et la licence vous l’avez déjà lancé. Pour ceux qui ont accès à une machine d’une salle TP préinstallée, cela a déjà été expliqué.
Il y a trois travaux à réaliser, chaque partie doit être validée par l'enseignant afin d'obtenir le point correspondant:
Le premier exercice concerne la mise en œuvre de la chaine ISE qui relie les switches aux leds sans autre logique.
Ensuite, vous allez utiliser ISE pour construire des circuits logiques schématiques par assemblage de portes logiques élémentaires. Vous vérifierez par simulation puis par exécution sur la carte que les tables de vérité correspondent effectivement à vos observations. C’est via l’interface interactive d’Isim, l’outil de simulation proposé avec ISE, que vous programmerez la simulation.
Enfin vous allez reprendre l'exercice 3 du TD1 que vous allez devoir valider sur la carte.
Nexys3
Pour cette première expérience, nous aborderons les dispositifs de communication directe avec la carte Nexys, le vecteur de 8 switches (interrupteurs), les 8 Leds. Cette première partie est assez simple: vous afficherez sur les 8 Leds les résultats des 8 switches : ‘0’ ou ‘1’ pour éteint ou allumé.
Les schémas sont propres à ISE et donc utilisable seulement sous ISE, le code généré lui respecte le standard VHDL. C’est un langage de conception que vous découvrirez peut être plus tard en master. Cela ne vous empêche pas de regarder d’un peu plus près ce puissant langage de synthèse dont vous ne verrez lors des séances de TP que quelques éléments. Des milliers de références sur le net, ce lien Syntaxe VHDL vous sera néanmoins suffisant pour vos développements.
Le choix entre code ou schéma n’est pas exclusif et parfois on préférera avoir une vision structurelle d’une portion du circuit et donc adaptée à la vue schématique, parfois on voudra exprimer un comportement et la vision « algorithme » est alors favorisée. Dans vos séances, nous nous limiterons à la vision schématique qui est très intuitive et ne demande pas un apprentissage du langage VHDL en tant que tel, même si la rigueur dont il faut faire preuve lors de l’assemblage graphique est parfois laborieuse. Mais « c’est en designant qu’on devient designer »
Pour commencer la conception, il faut créer un nouveau projet avec File>New Project. Lorsque vous spécifiez le nom du projet et le répertoire, évitez les espaces dans le chemin, j’ai choisi TP1.
Figure 2 Création du projet TP1
La prochaine étape sert à préciser le type de FPGA que vous ciblez. C'est pour nous celui de la carte Nexys3.
Figure 4 Caractéristiques de la carte Nexys3
Enfin, Next puis Finish vont clôturer cette partie.
Pour décrire le système, vous ajoutez un nouveau fichier à votre projet. Ce fichier contiendra le schéma du circuit que vous allez définir. Donc ici vous sélectionnez Project>New Source…, puis remplissez la boîte de dialogue permettant à l’outil de créer un nouveau fichier toplevel.sch en sélectionnant Schematic et donc le nom toplevel.
Figure 5 Création d'un schématique
En cliquant Next et Finish, vous créez le fichier toplevel.sch et ISE ouvre de suite la fenêtre de conception schématique pour ce fichier. Vous comprendrez vite qu’ISE est capable d’ouvrir plusieurs fenêtres et que l’on passe de l’une à l’autre par les onglets associés à chacun des noms. Le logo
apparaît devant toplevel.sch et indique la racine de votre projet.
Les principaux boutons de saisies (les mêmes actions sont accessibles par le menu Add) permettent de manipuler des symboles, des fils, des bus2.
La construction du circuit va pouvoir commencer. La première étape est simple, vous allez relier les 8 switches aux 8 leds sur la carte. Aucune logique n’est nécessaire, c’est comme si vous réalisiez par ISE la «soudure» de fils entre les switches et les leds. Même simpliste, c’est quand même une architecture qui sera programmée!
Vous allez donc placer dans votre schéma toplevel, un ibuf8 et un obuf8 (ce sont des buffers nécessaires pour les entrées/sorties de la carte). En cliquant sur le bouton ajouter un symbole (Add Symbol), une liste de symboles disponibles apparaît. Choisissez dans la sous-liste IO les deux symboles cités précédemment. Cliquez sur le nom dans la liste et recliquez dans la fenêtre associée au schéma pour créer une instance. (Ctrl Z pour annuler une action)
Si vous avez besoin de savoir ce que fait un symbole, il suffit de le sélectionner et de cliquer sur Symbol Info.
Figure 6 Sélection d'un symbole
Vous ajoutez 3 fils (Figure 8) en sélectionnant le bouton correspondant Add Wire et en cliquant sur l’emplacement d’une extrémité puis en cliquant sur l’emplacement de l’autre, une double clic permet de rester en mode création entre deux fils. ATTENTION il faut être attentif à ce que les fils soient bien connectés au composant, n’hésitez pas à zoomer afin de mieux voir les 4 petits carrés sous le curseur qui vous garantissent la bonne connexion une fois le curseur sur le port du composant. Ajoutez deux I/O Marker aux deux extrémités libres de vos fils, là encore en sélectionnant le bon bouton et en cliquant sur les 2 extrémités libres. Il vous reste à renommer les 2 I/O Marker. Pour cela sélectionnez un à un les fils connectés aux deux I/O Marker. Utilisez le bouton nommer un fil. Il vous suffira de nommer switches(7:0) l’entrée et led(7:0) la sortie. Une fois le nom saisi, placez-le dans le schéma par un clic sur le fil concerné.
Figure 7 Nommage des fils et bus
Voici les résultats de votre saisie, vous devriez sauver votre projet. Sans effort vous venez de créer un circuit qui est composé de 8 fils associant chaque switches(i) à la led(i) de votre carte. Cet ensemble de 8 fils est appelé un BUS la représentation sous ISE correspond à la notation name(Upper:Lower).
Figure 8 Votre toplevel.sch
Remarque : Pour vous simplifier la vie, ISE insère les iobuf par défaut. Ici ils sont explicites car ils permettent de spécifier deux noms différents aux deux I/O Marker.
Vous avez utilisé des noms logiques choisis par vous-même (sous mon influence) pour vos fils et I/O Marker. Pour qu’ISE puisse associer ces noms logiques aux noms physiques des broches de votre puce programmable, il faut explicitement donner toutes les correspondances :
un nom logique = un nom physique
Pour ce faire, vous devez créer une nouvelle source de type Implementation Constraints File (.ucf). Cela sera fait par Project > New Source.
Figure 9 Création du fichier S3.ucf
Next et Finish comme toujours créent le fichier et ISE ouvre l’éditeur sur ce fichier pour sa saisie. Il faut ici insérer le code qui correspond à la carte Nexys3.
UCF de la Nexys3
Voici les noms des broches du Spartan6 et ses connexions sur la carte.
Figure 11 Les broches sur la carte Nexys3 - document Digilent
Voici le code correspondant à insérer et à sauvegarder dans le fichier S3.ucf.
Le fichier S3.ucf apparaît aussi sous la hiérarchie de toplevel.sch.
Il n’y a pas grand-chose à simuler sur cet exemple, par contre vous allez pouvoir tester le circuit sur la carte!
ISE vous propose un mode simulation et un mode implementation. Il vous faudra choisir implementation en revenant sous l’onglet design.
Figure 12 Chaîne de compilation
C’est la partie la plus simple ! C’est ISE qui va faire le travail. Il reste néanmoins un ensemble d’informations à lui donner pour qu’il s’en sorte.
Il vous reste à positionner le mode de l’horloge utilisé lors du chargement du FPGA. Sélectionnez toplevel.sch, puis dans la fenêtre processes, cliquez droit sur Generate Programming File et dans le menu déroulant sur Process Properties. Positionnez la FPGA Start-UP Clock à JTAG Clock dans Startup Options. Pour chaque nouveau projet, il faudra lors de la première compilation vérifier ce paramètre. Vous pouvez générer le fichier toplevel.bit avec un double clic sur Generate Programming File.
Figure 13 Option JTAG
Lorsque la compilation est un succès, il vous reste à charger le code produit sur la carte. Celle-ci doit être connectée et allumée. Vous allez pour cela utiliser le logiciel Adept que Digilent vous a fourni.
Chargement sous windows
Le fichier généré se trouve dans votre projet et se nomme ici toplevel.bit. Lancez Adept depuis le menu demarrer de votre PC. Il vous suffit de sélectionner le bon fichier avec Browse et une fois effectué vous pouvez charger le code produit par ISE sur le FPGA de la carte Nexys. Cliquez sur Program.
Figure 15 Chargement sur Nexys3 sous Windows
Chargement sous linux :
Le chargement du design sur le FPGA sous Linux se réalise en mode ligne de commande. Vérifiez que votre carte FPGA soit branchée et allumée. Ouvrez un terminal, seulement 2 commandes sont utiles.
La commande djtgcfg enum : cette commande permet de lister toutes les cartes connectées à l’ordinateur.
La commande djtgcfg -d Nexys3 prog -i 0 -f toplevel.bit permet de charger le fichier sur la carte Nexys3.
A vous de vérifier que la position des switches positionne les leds correspondantes. Faites valider cette première étape!
2. Un bus est un ensemble de fil ayant le même nom. On y ajoute un indice c’est un tableau de fils. Exemple : Bus(15:0)
Vous allez utiliser ISE pour construire des circuits logiques schématiques par assemblage de portes logiques élémentaires. Vous vérifierez par simulation puis par exécution sur la carte que les tables de vérité correspondent effectivement à vos observations. C’est via l’interface interactive d’Isim, l’outil de simulation proposé avec ISE, que vous programmerez la simulation. L’exécution sur la carte réutilisera les concepts introduits précédemment ...
La description schématique : par un schéma électronique. Pour cela, Xilinx met à disposition des bibliothèques de composants usuels (mémoires, compteurs…) et bien sûr des portes élémentaires.
La description textuelle : langage de description VHDL (il existe d’autres langages, Verilog).
Portes logiques, algèbre de Boole.
Une fois ISE lancé, vous pouvez créer un projet TP2 avec les mêmes caractéristiques que le TP1 (Figure 2, Figure 4). Créez un nouveau project>new source en sélectionnant Schematic avec comme nom de fichier firstsch.
Figure 25 Incrément des noms des fils
Enfin vous placez deux fils verticaux a et b, sur lesquels vous pourrez tirer des fils vers les entrées des portes logiques. Une fois le circuit réalisé, et afin de spécifier les ports de votre composant et par la suite ceux de votre symbole, placez vos I/O marker sur les 2 entrées et les 7 sorties. Là encore ISE propose une méthode rapide, une fois le bouton I/O marker sélectionné, au lieu de cliquer un à un sur les fils, on peut sélectionner une zone rectangulaire sur le schéma et c’est tous les fils non connectés qui reçoivent l’I/O marker avec le nom du fil par défaut. Vous obtenez le circuit suivant.
Figure 26 Schéma de firstsch
Avant de poursuivre la conception, vous pouvez pas à pas vérifier par simulation le bon comportement d’un composant. C’est une bonne habitude de travail, chaque brique de base est testée avant assemblage.
Figure 27a Fenêtre de gestion de projet
Il faut vous placer dans le mode simulation. Vous devriez obtenir d’office le niveau de simulation Behevioral, si ce n’est pas le cas à vous de le positionner. Ensuite c’est toujours pareil, sélectionnez le composant et lancez dans la fenêtre processes l’action qui vous intéresse. Ici, vous lancez la simulation Isim par Simulate Behavioral Model.
Isim va s’ouvrir sur la fenêtre suivante.
Figure 27b Lancement de Isim
Isim permet d’observer les valeurs sur chacun des fils du composant à tout moment de la simulation. En particulier Isim représente cette évolution par un chronogramme où les fils (ou signaux) valent normalement ‘0’ ou ‘1’. Pour l’instant vos fils sont soit ‘u’ pour undefined, soit ‘x’ pour quelconque. C’est normal a et b n’ont pas été initialisés!
A vous donc d’initier a et b. Dans la fenêtre chronogramme sous la colonne Name il suffit de faire un clic droit sur a et de sélectionner dans le menu déroulant Force constant. On peut alors initialiser a à ‘0’. On refait la même chose pour b à ‘0’.
Figure 27 Forcer un port à 0 ou 1
Vous pouvez alors poursuivre la simulation pour une nouvelle microseconde. Isim nous propose 4 boutons qui permettent de replacer le simulateur à l’instant zéro, de lancer la simulation, d’avancer la simulation d’un pas de temps, ici 1.00us. Vous lancez le simulateur pour un pas de temps. Les fils deviennent verts, ils sont tous définis. Recommencez la même manipulation en plaçant b à 1 puis un pas de simulation, ensuite a à 1 et b à 0 et un pas de simulation, enfin b à 1 pour le dernier pas de simulation. En utilisant le bouton zoom
vous obtenez une vue globale de la simulation pour les 5 microsecondes. Gardez la fenêtre ouverte pour validation par la suite.
Figure 28 Simulation des 4 cas possibles
Je vous laisse vérifier que les chronogrammes produits correspondent effectivement aux portes logiques utilisées. Cette utilisation interactive de Isim n’est adaptée que pour des composants présentant un nombre réduit de combinaisons des entrées. Vous apprendrez par la suite une autre façon d’utiliser Isim en mode piloté, en générant par programme les valeurs des entrées à différents instants de la simulation.
Avant de générer le code binaire à charger sur la carte, il faut comme toujours faire le lien avec les broches du FPGA. Vous vous souvenez du fichier .ucf, vous allez ici créer une nouvelle sourceTP2 de type Implementation Constraints File afin de lier a et b aux switches 0 et 1 et les sorties s0 à s6 aux leds 0 à 6. Vous pourriez choisir vos propres liens si vous le vouliez. Voici néanmoins le fichier TP2.ucf pour la configuration proposée.
Carte Nexys3
Sans oublier de positionner votre JTAG (Figure 13), vous êtes prêt pour la génération du code par Generate Programming File. Ensuite avec Adept chargez le code firstsch.bit sur la carte Nexys et à nouveau, validez vos différentes portes en essayant les différentes combinaisons pour les switches 0 et 1, les autres switches n’ont aucun effet.
Faites valider cette partie sur la carte et sur la simulation.
Vous allez modifier le projet TP2 tout seul afin d'implémenter le circuit suivant.
On désire implémenter un circuit à 3 entrées , une entrée sélectionne le mode de fonctionnement , et pour chaque mode la sortie produit en sortie la valeur de A AND B ou A OR B .
1 Proposez une implantation de ce circuit sur la carte et donnez-en le code UCF associé. Utilisez une version avec les switches et une version qui utilise un bouton pour le changement de mode.
2 optionnel : La réalisation d'un tel circuit peut utiliser un langage de description d 'architecture. Remplissez les zones de textes ............ intuitivement
entity exo1 is Port ( A : in STD_LOGIC; B : in STD_LOGIC; mode : in STD_LOGIC; S : out STD_LOGIC);end exo1;3 Vous allez réaliser ce circuit sur la carte :
Le Mux2 est en bibliothèque de symboles. Il faudra revoir aussi le fichier TP2.ucf.
Faites le valider avant la fin de séances.
Pour ceux que çà intéresse, l'année passée, cause covid, nous avons fait la même chose mais avec un simulateur sur le net .
Voici une présentation de cet outil
le fichier LicenceAny.lic placez le dans votre environnement
# ----- REMOVE LINES ABOVE HERE --------------------------
#
# This license is valid from Mon May 30 07:51:18 GMT+00:00 2011.
#
# This is license NODELOCKED to HOSTID=ANY;
# there is no need to run lmgrd for this license.
#
#
# This is a permanent license generated on Mon May 30 07:51:18 GMT+00:00 2011
INCREMENT Web_Package xilinxd 2012.05 permanent uncounted \
BAF1336D301F \
VENDOR_STRING=jean-luc.dekeyser@Lifl.fr,Web_Package,software,permanent,_205238990_0_0_579 \
HOSTID=ANY ISSUER="Xilinx Inc" START=30-May-2011 TS_OK
#
#
# ----------------------------------------------------------------------
# The following PACKAGE definition is a REQUIRED part of this license:
#
PACKAGE Web_Package xilinxd 2012.05 C7EA8C0AA2AD \
COMPONENTS="PlanAhead WebPACK" OPTIONS=SUITE
#
# ------------------------------------------------------------------------------
#
# ----- REMOVE LINES BELOW HERE --------------------------