Leçon 2 : Portes logiques

Dans ce TP, 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 lors de la leçon précédente...

Vous trouverez le fichier lecon2.pdf en fin de feuille.

Il existe plusieurs manières de décrire un circuit électronique. Deux principales s’en dégagent :

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).

Connaissances requises

Portes logiques, algèbre de Boole.

Objectifs

Dans ce TP, 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 lors de la leçon précédente.

Le projet

Vous allez concevoir un composant et son symbole qui combinent deux entrées logiques de plusieurs façons. Il faudra ensuite instancier ce symbole dans un schéma qui intègre les entrées/sorties c’est à dire les switches et les leds de la carte. La simulation puis la synthèse vous permettront de reconstruire pour toutes les entrées possibles les tables de vérité de chaque sortie. Enfin une mise en pratique sur deux circuits équivalents vous permettra de valider les acquis de cette leçon.

Votre premier circuit

Une fois ISE lancé, vous pouvez créer un projet TP2 avec les mêmes caractéristiques que le TP1 (Figure 2, Figure 3, Figure 4). Créez un nouveau project>new source en sélectionnant Schematic avec comme nom de fichier firstsch.

Figure 24 Création de firstsch

Une fenêtre firstsch.sch s’ouvre dans ISE. Un schéma est forcément composé de :

  • Symboles personnels ou prédéfinis en bibliothèque,
  • Fils de liaison entre les symboles ou/et de bus (tableau de fils),
  • Labels d’entrées/sorties qui indiquent les entrées et sorties de la fonction réalisée par le schéma.

Sauvegardez régulièrement vos fichiers…

Vous avez déjà instancié un symbole Ibuf8 et Obuf8 dans la leçon précédente. Ça n’a pas changé, pour ajouter un symbole dans un schéma, utilisez le bouton ou le menu Add>Symbol. Une liste de bibliothèques de symboles s’ouvre alors à gauche, par des clics de sélection suivis de clics d’insertion, vous pouvez ainsi placer des composants dans votre schéma firstsch. Vous allez placer successivement les portes : and2, inv, nand2, nor2, or2, xnor2, xor2 (Figure 26). Sur chacune des sorties des portes logiques, connectez un fil que vous nommerez s0, s1, … s6. ISE vous propose une méthode rapide pour incrémenter automatiquement le nom de vos fils. Il suffit de positionner Increase the name avec un premier nom initialisé à s0, Ensuite à chaque fois que vous cliquez sur un fil, vous le nommez puis le nom change automatiquement en s1, s2… C’est assez simple et très utile par la suite.

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

Vous connaissez déjà la procédure pour créer un symbole. (Design Utilities>Create Schematic Symbol)

La simulation

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.

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.

Vérification sur la carte

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.

Figure 29 Création du fichier .ucf

Carte Nexys2

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.

A vous de jouer

Je vous propose de tester vos connaissances et vos acquis avec un petit exercice. Vous allez maintenant comparer deux circuits qui, vous le verrez, font la même chose. Je vous guide dans l’exercice.

    1. Créez dans ISE un nouveau projet TP21.
    2. Créez par un new source dans ce projet le circuit1 suivant, de type schematic.
    1. En mode implementation, créez le symbole associé à ce circuit.
    2. Créez avec un second new source le circuit2 de type schematic.
    1. On peut rapidement créer ce deuxième circuit. On sélectionne tout le circuit dans circuit1. On fait un copier/coller dans circuit2. On supprime les Nand2 et on les remplace par des Nor2. Enfin on change le nom de s en t. Il existe un Check Design Rules dans Design Utilities pour vérifier que le circuit est correct.
    2. Créez le symbole correspondant à circuit2.
    3. Créez un troisième new source de type schematic appelé toplevel.
    4. En plaçant une instance de circuit1 et circuit2, réalisez les connexions sur les même entrées a, b et c. Connectez les deux sorties s et t. Placez vos I/O Marker. Une fois sauvé, toplevel.sch doit être la racine de votre projet. Le symbole devant toplevel doit être positionné. On peut le positionner si besoin via le menu de gauche par un clic sur ce symbole ou dans le menu Source par Set as Top Module.
    1. Vérifiez par simulation, en lançant Isim sur toplevel, que les sorties s et t sont équivalentes pour toutes les combinaisons de a, b et c.
    2. Ajoutez une new source TP21 de type Implementation Constraints File. Il faut dans ce fichier associer a, b et c aux switches 0, 1 et 2, et les sorties s et t aux leds 0 et 1. On peut recopier le fichier TP2.ucf, puis le modifier.
    3. Pensez au JTAG !
    4. Vous pouvez générer le code binaire toplevel.bit et le charger sur la carte pour vérification. Les deux leds doivent s’allumer et s’éteindre en même temps quelques soient les positions des switches 0, 1 et 2.
    5. Encore motivé! retrouvez les deux fonctions logiques de ces deux circuits. Transformez ces deux fonctions logiques pour en trouver une commune et la plus simple possible. Instanciez alors un troisième circuit dans toplevel pour vérifier que vos transformations allument de la même façon une troisième Led associée à une troisième sortie w.

Si il vous reste du temps...

Voici une table de vérité, simplifiez avec un tableau de Karnaugh et testez le circuit résultat sur votre carte.