Cour Et Exercices+Corrigés. VHDL [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

15/01/2018

TD1 VHDL — Wikilivres

Dans ce chapitre, nous allons nous intéresser à trois problèmes différents : la programmation de la logique combinatoire en partant des tables de vérité la programmation de la logique séquentielle en partant des graphes d'évolutions la programmation structurelle, c'est à dire l'assemblage de composants Une relecture de logique combinatoire et de logique séquentielle ne fera donc aucun mal au lecteur du présent chapitre.

Retour sur les styles de programmation VHDL Tout programme VHDL comporte au moins trois parties : la première est la déclaration de la ou des bibliothèques que l'on va utiliser par la suite, la deuxième est une entité dont l'objectif est de définir quelles sont les entrées et les sorties ainsi que leurs noms, la troisième est une architecture dont l'objectif est de décrire le fonctionnement. '

Remarque : la bibliothèque est associée à l'entité qui la suit, et à cette entité seulement. Si un fichier source comporte plusieurs entités, il faudra déclarer autant de fois les bibliothèques qu'il y a d'entités !

Dans ce chapitre, nous allons revenir sur les programmes VHDL correspondants au combinatoire et au séquentiel simple. La table de vérité, élément central du combinatoire, sera donc notre point de départ.

Table de vérité La table de vérité est l'outil de spécification idéal pour la logique combinatoire. Cette section se contente donc d'explorer comment écrire des programmes VHDL qui décrivent du combinatoire spécifié par une table de vérité. Nous présentons la technique des BIT_VECTOR ainsi que l'ensemble des styles de programmation. Imaginons que l'on ait la table de vérité (4 entrées 2 sorties) suivante :

Table de vérité Entrées a3 a2 a1 a0 0 1 0 1 0 1 1 0 1 1 0 1

Sorties s1 s0 1 1 0 1 1 0

(ce qui n'est pas mentionné dans cette table correspond à 00 en sortie) Une table de vérité permet de repérer les entrées (à gauche) et les sorties (à droite). Elle correspond donc à l'entité : ENTITY demo IS PORT( a3,a2,a1,a0 : in BIT; s1,s0 : out BIT); END demo; https://fr.wikibooks.org/wiki/TD1_VHDL

-- 4 entrées -- 2 sorties 1/18

15/01/2018

TD1 VHDL — Wikilivres

Si l'on peut utiliser cette déclaration on lui préfèrera souvent l'utilisation des "BIT_VECTOR". On y gagne parfois en simplicité d'écriture quand on utilise certains styles de combinatoire. Ce n'est pas le cas avec les équations mais avec le "with select when" décrit plus loin. -- entité utilisée pour la présentation des styles de cette section ENTITY demo IS PORT( a : in BIT_VECTOR(3 DOWNTO 0); -- 4 entrées s : out BIT_VECTOR(1 DOWNTO 0)); -- 2 sorties END demo;

L'écriture de cette entité utilise comme indiqué précédemment des "BIT_VECTOR". Une conséquence importante est que ce qui est noté a3 dans la table de vérité sera noté a(3) en VHDL. L'utilisation de "DOWNTO" au lieu de "TO" permet de garder le poids faible (indicé 0) à droite. Ce n'est pas nécessaire, mais un débutant est trop habitué à cette convention pour qu'on se permette de la changer maintenant. Si nécessaire révisez votre algèbre de Boole, particulièrement la minimisation des expressions logiques.

Les équations concurrentes Il est toujours possible de partir d'une table de vérité, et d'utiliser des tableaux de Karnaugh pour en déduire des équations simplifiées. Ces équations peuvent être transcrites simplement en VHDL. -- ******** VHDL ************* ARCHITECTURE mydemo OF demo IS -- avec minimum de parenthèses BEGIN s(1) " doit être lu est relié à. Ce qui est à gauche de ce signe appartient toujours au composant que l'on est en train de câbler, et ce qui est à droite peut être soit un signal (c'est à dire un fil) soit une entrée ou sortie du composant supérieur (dans la hiérarchie).

https://fr.wikibooks.org/wiki/TD1_VHDL

9/18

15/01/2018

TD1 VHDL — Wikilivres

Câblage de composants Pour essayer de vous faire comprendre tout cela, la figure ci-dessus vous montre comment les "PORT MAP" fonctionnent : remarquez que les flèches du dessin partent toujours de l'intérieur du composant (que l'on câble avec le PORT MAP) une sortie peut être reliée à un fil (flèche rouge) ou à une sortie du composant plus haut de la hiérarchie (flèche mauve) une entrée peut être reliée à un fil (flèche rouge) ou à une entrée du composant plus haut de la hiérarchie (flèche mauve) Il vous faut encore prendre du temps pour comprendre et assimiler cela. C'est une science exacte, aucune dérogation. Quand le compilateur lit "e0 => e0" il ne se mélange pas les pinceaux contrairement à ce qui se passe pour vous si vous n'y accordez pas le temps nécessaire à la compréhension. Pour la première fois (peut-être ?), vous rencontrez un programme VHDL qui comporte plusieurs entités et plusieurs architectures. Un tel programme doit avoir autant d'entités que d'architectures. Votre programme décrit une hiérarchie : des composants sont assemblés pour réaliser un grand composant. Tous les composants assemblés sont aussi déclarés en "component". Notre problème va être maintenant de découper ce fichier unique en plusieurs fichiers.

Version avec deux fichiers Il est possible de couper ce fichier unique en deux après la première architecture. En effet, la majorité des environnements de développement intégrés sont capables de gérer des écritures avec deux fichiers sans librairie (package). Voici le premier fichier : -- fichier principal : top.vhd ENTITY Fct IS PORT(e0,e1,e2 : IN BIT; s : OUT BIT); END Fct; ARCHITECTURE truc OF Fct IS -- Les signaux (fils de liaison) sont déclarés avant le begin de l'architecture SIGNAL e0e1,e2bar : BIT; -- Les components sont déclarés avant le begin de l'architecture COMPONENT et PORT(e0,e1 : IN BIT; s : OUT BIT); END COMPONENT; COMPONENT ou https://fr.wikibooks.org/wiki/TD1_VHDL

10/18

15/01/2018

TD1 VHDL — Wikilivres

PORT(e0,e1 : IN BIT; s : OUT BIT); END COMPONENT; COMPONENT inverseur PORT(e : IN BIT; s : OUT BIT); END COMPONENT; BEGIN i1:et PORT MAP(e0=>e0,e1=>e1,s=>e0e1); i2:inverseur PORT MAP(e=>e2,s=>e2bar); i3:ou PORT MAP(e0=>e0e1,e1=>e2bar,s=>s); END truc; -- comme expliqué plus bas vous pouvez couper ici

Le premier fichier est terminé. Il comporte une entité et une architecture. Et voici le deuxième fichier. -- fichier secondaire : composants.vhd -- Voici la description des composants ENTITY et IS PORT(e0,e1 : IN BIT; s : OUT BIT); END et; ARCHITECTURE aet OF et IS BEGIN se0e1); i2:inverseur PORT MAP(e=>e2,s=>e2bar); i3:ou PORT MAP(e0=>e0e1,e1=>e2bar,s=>s); END truc;

La déclaration des composants est maintenant remplacée par "USE work.mesportes.ALL;" '

https://fr.wikibooks.org/wiki/TD1_VHDL

12/18

15/01/2018

TD1 VHDL — Wikilivres

Remarque : les lecteurs peu habitués aux environnements de développement intégrés peuvent se demander comment le compilateur va retrouver "mesportes" puisque l'instruction "USE work.mesportes.ALL;" ne fait référence à aucun nom de fichier ! C'est la notion de projet qui nous sauve. Le compilateur n'a pas besoin de lire "work", le répertoire de travail par défaut en complet (ce qui pourrait prendre un temps fou) pour trouver le package "mesportes". En fait votre projet sera composé de deux fichiers top.vhd et composants.vhd qui contient ce package et ce qui n'est pas trouvé dans top.vhd est cherché dans composants.vhd.

Que mettre dans les package ? Il n'y a aucun standard sur les contenus des packages du type ci-dessus. Chaque constructeur propose son propre package pour programmer ses composants ce qui pose des problèmes de portabilité. A noter quand même une initiative avec LPM (Library of Parameterized Modules), initiative d'Altera mais non suivie par Xilinx.

Les bibliothèques usuelles Même si vous n'avez pas l'intention d'utiliser des packages pour vos programmes vous serez bien obligé, comme on le verra par la suite, d'utiliser les bibliothèques usuelles.

Bibliothèque standard Le VHDL fait appel de manière implicite à une bibliothèque dite standard. Celle-ci défini plusieurs types de base : boolean bit character severity_level integer real time delay_length now natural positive string boolean_vector bit_vector integer_vector real_vector time_vector file_open_kind file_open_status foreign Les seuls types utilisés jusqu'à maintenant sont les « bit » et « bit_vector ». Un bit prend seulement deux valeurs et ne permet pas de gérer le trois états par exemple. IEEE propose en supplément une bibliothèque appelée std_logic.

Bibliothèque IEEE-1164 standard logic Les lignes suivantes importent la librairie IEEE-1164 standard logic. library ieee; use ieee.std_logic_1164.all; https://fr.wikibooks.org/wiki/TD1_VHDL

13/18

15/01/2018

TD1 VHDL — Wikilivres

Cette bibliothèque déclare les types std_logic et std_logic_vector dont les valeurs acceptées sont : 0 : Niveau logique bas à basse impédance (mise à la masse via une faible impédance) 1 : Niveau logique haut à basse impédance (mise à Vcc via une faible impédance) Z : Niveau logique flottant (entrée déconnectée) L : Niveau logique bas à haute impédance (mise à la masse via une résistance de pull-down) H : Niveau logique haut à haute impédance (mise à Vcc via une résistance de pull-up) W : Niveau logique inconnu à haute impédance (pouvant être 'L', 'Z' ou 'H') X : Niveau logique inconnu (pouvant être '0', 'L', 'Z', 'H' ou '1') U : Non défini - : N'importe quel niveau logique (renvoie toujours true lors d'une comparaison avec les 8 autres niveaux logiques) On dispose de plus des fonctions rising_edge() et falling_edge(), utilisées pour synchroniser un process sur une horloge : WIKI: process(CLK_IN) is begin if rising_edge(CLK_IN) then -- Les instructions suivantes seront exécutées à chaque front montant du signal CLK_IN end if; end process WIKI;

qui remplacent avantageusement le test classique, dont la couverture en simulation est incomplète (la transition 'X' -> '1' étant interprétée au même titre que la transition '0' -> '1') : if ((CLK_IN'event) and (CLK_IN = '1')) then

Bibliothèque IEEE-1164 standard logic et assemblage de composants Jusqu'à présent nos entités utilisaient le type bit prédéfini (ou le type bit_vector) : ENTITY demo IS PORT( a : in BIT_VECTOR(3 DOWNTO 0);-- 4 entrées s : out BIT_VECTOR(1 DOWNTO 0)); -- 2 sorties END demo;

Si pour une raison ou pour une autre vous êtes obligé d'utiliser un type "std_logic" ou "std_logic_vector" de la librairie IEEE, alors il vous faut savoir qu'il vous sera impossible de réaliser un "port map" entre un bit et un std_logic. Une autre manière de dire les choses : si un seul composant nécessite un std_logic vous serez obligé de l'utiliser pour tous les composants. L'entité précédente sera alors remplacée par : library ieee; use ieee.std_logic_1164.all; ENTITY demo IS PORT( a : in STD_LOGIC_VECTOR(3 DOWNTO 0);-- 4 entrées s : out STD_LOGIC_VECTOR(1 DOWNTO 0)); -- 2 sorties END demo;

Ce n'est pas très compliqué sauf que pour nos assemblages de composants, chaque entité devra être précédée de

https://fr.wikibooks.org/wiki/TD1_VHDL

14/18

15/01/2018

TD1 VHDL — Wikilivres

library ieee; use ieee.std_logic_1164.all;

Voici donc une version complète un seul fichier utilisant la librairie IEEE-1164 standard logic de l'exemple d'assemblage de composants donné plus haut dans ce chapitre : -- fichier unique : top.vhd library ieee; use ieee.std_logic_1164.all; ENTITY Fct IS PORT(e0,e1,e2 : IN STD_LOGIC; s : OUT STD_LOGIC); END Fct; ARCHITECTURE truc OF Fct IS -- Les signaux (fils de liaison) sont déclarés avant le begin de l'architecture SIGNAL e0e1,e2bar : STD_LOGIC; -- Les components sont déclarés avant le begin de l'architecture COMPONENT et PORT(e0,e1 : IN STD_LOGIC; s : OUT STD_LOGIC); END COMPONENT; COMPONENT ou PORT(e0,e1 : IN STD_LOGIC; s : OUT STD_LOGIC); END COMPONENT; COMPONENT inverseur PORT(e : IN STD_LOGIC; s : OUT STD_LOGIC); END COMPONENT; BEGIN i1:et PORT MAP(e0=>e0,e1=>e1,s=>e0e1); i2:inverseur PORT MAP(e=>e2,s=>e2bar); i3:ou PORT MAP(e0=>e0e1,e1=>e2bar,s=>s); END truc; -- Voici la description des composants library ieee; use ieee.std_logic_1164.all; ENTITY et IS PORT(e0,e1 : IN STD_LOGIC; s : OUT STD_LOGIC); END et; ARCHITECTURE aet OF et IS BEGIN s