Vous êtes sur la page 1sur 20

TD1 VHDL

TD1 VHDL
Dans ce chapitre, nous allons nous intresser trois problmes diffrents : la programmation de la logique combinatoire en partant des tables de vrit la programmation de la logique squentielle en partant des graphes dvolutions la programmation structurelle, c'est dire l'assemblage de composants Une relecture de logique combinatoire et de logique squentielle ne fera donc aucun mal au lecteur du prsent chapitre.

Retour sur les styles de programmation VHDL


Tout programme VHDL comporte au moins trois parties : la premire est la dclaration de la ou des bibliothques que l'on va utiliser par la suite, la deuxime est une entit dont l'objectif est de dfinir quelles sont les entres et les sorties ainsi que leurs noms, la troisime est une architecture dont l'objectif est de dcrire le fonctionnement.
''

Remarque : la bibliothque est associe l'entit qui la suit, et cette entit seulement. Si un fichier source comporte plusieurs entits, il faudra dclarer autant de fois les bibliothques qu'il y a d'entits ! Dans ce chapitre, nous allons revenir sur les programmes VHDL correspondants au combinatoire et au squentiel simple. La table de vrit, lment central du combinatoire, sera donc notre point de dpart.

Table de vrit
La table de vrit est l'outil de spcification idal pour la logique combinatoire. Cette section se contente donc d'explorer comment crire des programmes VHDL qui dcrivent du combinatoire spcifi par une table de vrit. Nous prsentons la technique des BIT_VECTOR ainsi que l'ensemble des styles de programmation. Imaginons que l'on ait la table de vrit (4 entres 2 sorties) suivante : Table de vrit
Entres Sorties

a3 a2 a1 a0 s1 s0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0

(ce qui n'est pas mentionn dans cette table correspond 00 en sortie) Une table de vrit permet de reprer les entres ( 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;

-- 4 entres -- 2 sorties

Si l'on peut utiliser cette dclaration on lui prfrera 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" dcrit plus loin.

TD1 VHDL -- entit utilise pour la prsentation des styles de cette section ENTITY demo IS PORT( a : in BIT_VECTOR(3 DOWNTO 0); -- 4 entres s : out BIT_VECTOR(1 DOWNTO 0)); -- 2 sorties END demo; L'criture de cette entit utilise comme indiqu prcdemment des "BIT_VECTOR". Une consquence importante est que ce qui est not a3 dans la table de vrit 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 ncessaire, mais un dbutant est trop habitu cette convention pour qu'on se permette de la changer maintenant. Si ncessaire rvisez votre algbre de Boole, particulirement la minimisation des expressions logiques.

Les quations concurrentes


Il est toujours possible de partir d'une table de vrit, et d'utiliser des tableaux de Karnaugh pour en dduire des quations simplifies. Ces quations peuvent tre transcrites simplement en VHDL.
-- ******** VHDL ************* ARCHITECTURE mydemo OF demo IS -- avec minimum de parenthses BEGIN s(1) <= ( not a(3) and a(2) and not a(1) and a(0) ) OR ( a(3) and a(2) and not a(1) and a(0) ); s(0) <= ( not a(3) and a(2) and not a(1) and a(0) ) OR ( not a(3) and a(2) and a(1) and a(0) ); END mydemo;

Malheureusement, VHDL est un langage qui utilise beaucoup parenthses car l'oprateur ET n'est pas prioritaire sur l'oprateur OU. En fait il n'y a aucune priorit dans les oprateurs VHDL. Ces parenthses peuvent constituer un frein l'apprentissage du langage, mais si vous faites bien attention utiliser systmatiquement des formes conjonctives ou disjonctives vous verrez que finalement il ne faut pas tant de parenthses que cela !
''

Remarques : Comme dans tout langage, il vaut mieux utiliser trop de parenthses que pas assez. Si vous ne voulez pas simplifier vos quations, il est possible de laisser ce travail au compilateur VHDL. Il est temps de passer au style "with select when".

Le style "with select when"


L'architecture en VHDL utilisant le style "with select when" peut s'crire : -- ******** VHDL ************* ARCHITECTURE mydemo OF demo IS BEGIN WITH a SELECT --style with select when s <= "11" WHEN "0101", -- premiere ligne "01" WHEN "0110", -- deuxieme ligne "10" WHEN "1101", -- troisieme ligne "00" WHEN OTHERS; END mydemo;

TD1 VHDL C'est le style que l'on privilgiera lorsqu'une table de vrit est fournie. Pourquoi ? Parce que ce style a les mmes proprits que la table de vrit. Une table de vrit est sense reprsenter toutes les possibilits sur ses entres, et le style "with select when" fait la mme chose puisqu'il se termine OBLIGATOIREMENT par un "WHEN OTHERS;". Pour tre complet on va quand mme prsenter d'autres styles dans la suite de ce paragraphe.
''

Remarques : le style "with select when" devient vite fastidieux quand le nombre d'entres augmente. Le nombre de lignes tant une puissance de deux du nombre d'entre on a dj 64 lignes pour six entres. Pour remdier cette augmentation vous pouvez regrouper les lignes qui donnent la mme sortie dans le when. Mais, attention, le sparateur est alors | et non OR ou AND ! prenez le temps de faire la correspondance entre une table de vrit et une criture "with select when" : ce qui est gauche de la table de vrit passe droite aprs le when et inversement ! Explorons encore d'autres styles.

Le style "when else"


On crirait le mme programme en style "when else" : -- ******** VHDL ************* ARCHITECTURE mydemo OF demo IS BEGIN -- style when else s <= "11" WHEN a="0101" ELSE -- premiere ligne "01" WHEN a="0110" ELSE -- deuxieme ligne "10" WHEN a="1101" ELSE -- troisieme ligne "00"; END mydemo; Ce programme correspond la table de vrit donne plus haut dans ce chapitre.
''

Remarque : la structure "when else" ne ncessite pas des conditions mutuellement exclusives. Elle engendre alors une architecture avec priorit. Par exemple dans

-- ******** VHDL ************* j<= w when a='1' else x when b='1' else 0; les conditions ne sont pas mutuellement exclusives. Pour vous en convaincre, essayer de rpondre la question : que se passe-t-il quand a=1 et b=1 simultanment ? On ne pourrait pas d'emble utiliser une structure "with select when" qui ncessite des conditions absolument exclusives. En tout cas si on veut le faire, il faut choisir une rponse la question prcdente, ce qui revient choisir une priorit. Remarquez aussi l'criture compacte de cet exemple donn en VHDL. Une table de vrit ncessiterait quatre variables "a", "b", "x" et "w" comme entres soit 16 lignes. Passons maintenant un style appel squentiel. Contrairement ce que cet adjectif "squentiel" pourrait suggrer, ce style est destin aussi dcrire du combinatoire.

TD1 VHDL

Le style "case when"


Le style case when peut tre aussi utilis. Il est simple et ressemble au style "with select when". Voici un exemple : -- ******** VHDL ************* ARCHITECTURE mydemo OF demo IS BEGIN PROCESS(a) BEGIN CASE a is --style case when WHEN "0101" => s <="11"; -- premiere ligne WHEN "0110" => s <="01"; -- deuxieme ligne WHEN "1101" => s <="10"; -- troisieme ligne WHEN OTHERS => s <="00"; END CASE; END PROCESS; END mydemo; Ce programme correspond encore la table de vrit donne plus haut dans ce chapitre.
''

Remarque : en combinatoire comme en squentiel, le style "case when" ncessite un process... et un process est suivi par une liste de sensibilit qui correspond aux entres en combinatoire. Il est impossible d'crire un "CASE" sans process mme en combinatoire. Passons maintenant au style le plus emblmatique du VHDL. Son grand problme est sa ressemblance avec l'algorithmique.

Le style "if then else"


Il nous est impossible d'interdire ce style surtout plus tard en squentiel. Il faut cependant viter le plus possible de l'utiliser tant que l'on reste dbutant. Il a des proprits diaboliques : un if sans else crera automatiquement un lment de mmorisation, c'est dire de la logique squentielle. C'est aussi un style qui ncessite un process est le "if then else" : -- ******** VHDL ************* ARCHITECTURE mydemo OF demo IS BEGIN PROCESS(a) BEGIN IF a="0101" THEN s <="11"; -- premiere ligne ELSIF a="0110" THEN s <="01"; -- deuxieme ligne ELSIF a= "1101" THEN s <="10"; -- troisieme ligne ELSE s <="00"; END IF; END PROCESS; END mydemo; Remarquez le constructeur "elsif" sans "e" et en un seul mot. Il est trs pratique car ne ncessite pas de "end if" contrairement au "else if" en deux mots. Essayez de vous convaincre de lire ce style comme une table de vrit pour le moment.

TD1 VHDL

Conclusion
La dcouverte des nombreux styles de programmation en VHDL dconcerte le dbutant juste titre. Pour matriser le combinatoire, seuls les deux premiers styles sont absolument ncessaires. Il vous faut donc apprendre comment crire une quation en VHDL et comment transformer une table de vrit en "with select when". L'apprentissage du style "if then else" s'avre assez catastrophique chez les dbutants car amne une confusion avec la structure de contrle correspondante des langages algorithmiques. Exercice 1 Ecrire un programme VHDL pour un additionneur 1 bit avec un style "with select when". Cet exercice termine nos rappels sur la programmation de la logique combinatoire en VHDL. Nous allons aborder maintenant la logique squentielle (ce qui nous prendra plusieurs chapitres).

Le squentiel
Dfinition La logique squentielle est caractrise par un calcul au sens large de l'tat futur en fonction de l'tat prsent, tout cela au rythme de fronts d'horloges.

Pourquoi parle-t-on de calcul au sens large ? Parce qu'il ne s'agit pas forcment d'un calcul ralis par un oprateur connu (comme l'addition, la soustraction, ...) mais aussi d'un calcul ralis par une quation boolenne. Nous utiliserons le schma ci-dessous pour rappeler cette dfinition (de calcul au sens large) :

Calcul au sens large de l'tat futur en fonction de l'tat prsent

On a omis la partie squentielle dans ce schma. Elle n'est pas difficile ajouter si, comme dj souvent indiqu ailleurs, on se rappelle que l'tat prsent est une sortie de bascule D, tandis que l'tat futur en est une entre.
''

Principe ne pas oublier : L'ensemble des sorties des bascules D correspondent toujours l'tat prsent (not EP dans la figure ci-dessus). L'ensemble des entres des bascules D correspondent toujours l'tat futur (not EF dans la figure ci-dessus). Il existe de nombreux outils de descriptions du squentiel. Dans cette section nous utiliserons le plus simple d'entre eux : le diagramme dvolution. Nous aurons l'occasion d'en aborder d'autres dans le TD4.

TD1 VHDL

Le squentiel simple (diagramme d'volution) avec quations de rcurrence


Ce problme a dj t trait dans le cours Logique squentielle au chapitre Diagrammes d'volution, quations de rcurrence, o l'on apprend transformer un diagramme d'volution en quations de rcurrences. Cela se fait trs simplement l'aide d'un tableau tat prsent/tat futur. Il est important de matriser les quations de rcurrences mme si souvent, on peut les viter comme le montre la section suivante.

Le squentiel simple (diagramme d'volution) sans quations de rcurrence


Implanter un diagramme d'volution en VHDL peut se faire de manire systmatique :
ENTITY demo IS PORT( clock : IN BIT; q : INOUT BIT_VECTOR(1 DOWNTO 0)); END demo; ARCHITECTURE mydemo OF demo IS BEGIN PROCESS(clock) BEGIN IF clock'EVENT AND clock='1' THEN CASE q IS --style case when WHEN "00" => q <="01"; WHEN "01" => q <="10"; WHEN "10" => q <="11"; WHEN OTHERS => q <="00" ; END CASE; END IF; END PROCESS; END mydemo;

Vous pouvez remarquez la dtection d'un front d'horloge par "IF clock'EVENT AND clock='1' THEN". Comme dj indiqu le case est entour par un process. La liste de sensibilit du process (ce qu'il y a entre parenthses derrire le mot clef process) est au moins constitue par l'horloge.
''

Remarque gnrale : Le style "case when" est au squentiel ce que le style "with select when" est au combinatoire : tous les deux permettent d'viter les quations (combinatoires ou de rcurrences). Deuxime remarque : Si vous concevez un diagramme d'volution comme un calcul (au sens large) de l'tat futur partir de l'tat prsent, vous tes sur la bonne voie... Sinon, forcez-vous le faire. Comme vous pouvez le remarquer, ce calcul au sens large ne s'crit pas forcment l'aide d'un oprateur mais ici l'aide d'une srie de conditions dans un case. Exercice 2 Raliser un compteur GRAY sur 3 bits en utilisant ces deux mthodes. Un compteur GRAY gnre un code GRAY sur front d'horloge : la suite des tats du diagramme d'volution suit un code Gray.

TD1 VHDL

Assembler des composants en VHDL


Le langage VHDL est destin aux lectroniciens qui ont l'habitude d'assembler des composants lectroniques simples pour en faire d'autres un peu plus complexes etc... VHDL se doit donc de pouvoir grer ces situations. Les composants assembler peuvent ou non se trouver dans des bibliothques. Le style de programmation qui consiste assembler des composants s'appelle programmation structurelle. On parle aussi parfois de Netlist ou liste de connexions. Nous allons commencer par examiner comment tout ceci s'articule.

Programme comportant plusieurs composants


Il existe plusieurs faons d'crire un programme comportant plusieurs composants. Quelque soit la mthode, vous commencez par compter les composants diffrents et vous en obtenez N. Si vous avez deux composants ET, vous ne le comptez qu'une seule fois. Il vous faudra un couple entit architecture par composant. Par exemple, le schma ci-contre comporte N=3 composants (ET, OU, NON). Vous aurez crire autant de couples entit - architecture qu'il y a de composants plus un couple entit - architecture pour la description globale. Vous aurez donc N+1 couples. Ce N et N+1 sont lis la notion de hirarchie explique dans la section suivante.

Notre ensemble de composants de dpart

Cette programmation structurelle revient dcrire un schma ; dans la terminologie lectronique, cela s'appelle aussi une Netlist. Nous pouvons utiliser un seul ou plusieurs fichiers pour raliser ce type de programmation.

La notion de hirarchie
Le style de programmation dit structurel fait appel la notion de hirarchie.

Dcomposition hirarchique d'un schma

Nous avons repris dans cette figure, la figure originale gauche, pour la transformer et progressivement montrer la hirarchie (sur deux niveaux seulement). Nous ne raliserons pas systmatiquement cette transformation dans nos schmas : il vous faudra la raliser dans votre tte. En effet, ajouter le nom des entres et sorties de chaque composant peut vite rendre un schma illisible ! Chaque rectangle dans cette figure reprsente une entit. Nous avons ajout dans nos rectangles bleu clairs le nom des entres et des sorties (ce qui diminue la lisibilit du schma). Ces petits rectangles bleus sont assembls pour en faire un quatrime plus gros (de couleur grise). On a donc bien un gros rectangle compos de 3 petits. Le grand rectangle gris reprsente le haut de la hirarchie tandis que les bleus reprsentent le bas. La hirarchie peut encore

TD1 VHDL continuer...et les rectangles bleus devenir eux-mmes composs par d'autres... Arrtez vous ici tant que vous n'avez pas compris. Aller plus loin ncessite de comprendre cette notion de hirarchie.

Version en un seul fichier


L'utilisation d'un seul fichier se fait en dclarant des signaux et des composants avant le begin de l'architecture globale. Voici l'exemple de la figure ci-dessus. -- fichier unique : 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 dclars avant le begin de l'architecture SIGNAL e0e1,e2bar : BIT; -- Les components sont dclars avant le begin de l'architecture COMPONENT et PORT(e0,e1 : IN BIT; s : OUT BIT); END COMPONENT; COMPONENT ou 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 -- Voici la description des composants ENTITY et IS PORT(e0,e1 : IN BIT; s : OUT BIT); END et; ARCHITECTURE aet OF et IS BEGIN s<=e0 AND e1; END aet; ENTITY ou IS PORT(e0,e1 : IN BIT;

TD1 VHDL s : OUT BIT); END ou; ARCHITECTURE aou OF ou IS BEGIN s<=e0 OR e1; END aou; ENTITY inverseur IS PORT(e : IN BIT; s : OUT BIT); END inverseur; ARCHITECTURE ainv OF inverseur IS BEGIN s<= NOT e; END ainv; Apprenez lire les "PORT MAP". Le signe "=>" doit tre lu est reli . Ce qui est gauche de ce signe appartient toujours au composant que l'on est en train de cbler, et ce qui est droite peut tre soit un signal (c'est dire un fil) soit une entre ou sortie du composant suprieur (dans la hirarchie).

Cblage de composants

Pour essayer de vous faire comprendre tout cela, la figure ci-dessus vous montre comment les "PORT MAP" fonctionnent : remarquez que les flches du dessin partent toujours de l'intrieur du composant (que l'on cble avec le PORT MAP) une sortie peut tre relie un fil (flche rouge) ou une sortie du composant plus haut de la hirarchie (flche mauve) une entre peut tre relie un fil (flche rouge) ou une entre du composant plus haut de la hirarchie (flche mauve) Il vous faut encore prendre du temps pour comprendre et assimiler cela. C'est une science exacte, aucune drogation. Quand le compilateur lit "e0 => e0" il ne se mlange pas les pinceaux contrairement ce qui se passe pour vous si vous n'y accordez pas le temps ncessaire la comprhension. Pour la premire fois (peut-tre ?), vous rencontrez un programme VHDL qui comporte plusieurs entits et plusieurs architectures. Un tel programme doit avoir autant d'entits que d'architectures.

TD1 VHDL Votre programme dcrit une hirarchie : des composants sont assembls pour raliser un grand composant. Tous les composants assembls sont aussi dclars en "component". Notre problme va tre maintenant de dcouper ce fichier unique en plusieurs fichiers.

10

Version avec deux fichiers


Il est possible de couper ce fichier unique en deux aprs la premire architecture. En effet, la majorit des environnements de dveloppement intgrs sont capables de grer 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 dclars avant le begin de l'architecture SIGNAL e0e1,e2bar : BIT; -- Les components sont dclars avant le begin de l'architecture COMPONENT et PORT(e0,e1 : IN BIT; s : OUT BIT); END COMPONENT; COMPONENT ou 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 deuxime fichier. -- fichier secondaire : composants.vhd -- Voici la description des composants ENTITY et IS PORT(e0,e1 : IN BIT; s : OUT BIT);

TD1 VHDL END et; ARCHITECTURE aet OF et IS BEGIN s<=e0 AND e1; END aet; ENTITY ou IS PORT(e0,e1 : IN BIT; s : OUT BIT); END ou; ARCHITECTURE aou OF ou IS BEGIN s<=e0 OR e1; END aou; ENTITY inverseur IS PORT(e : IN BIT; s : OUT BIT); END inverseur; ARCHITECTURE ainv OF inverseur IS BEGIN s<= NOT e; END ainv; Le deuxime fichier est termin, il comporte trois entits et trois architectures. Quel est l'intrt de couper les fichiers ? Tout simplement pour avoir des fichiers moins grands ! Tout ce qui a t mis au point peut se trouver dans un fichier spar auquel on ne touche plus !

11

Version deux fichiers dont un package


On dsire regrouper les composants que l'on va assembler dans une bibliothque. VHDL utilise plutt le mot package pour dcrire ce que l'on appelle une bibliothque. Comme dans tout langage de programmation, la notion de librairie est associe la programmation spare, c'est dire en plusieurs fichiers. Voici donc un exemple utilisant deux fichiers. Ralisation du package Voici en condens comment on ralise un package : -- fichier : composants.vhd PACKAGE mesportes IS COMPONENT et PORT(e0,e1 : IN BIT; s : OUT BIT); END COMPONENT; COMPONENT ou PORT(e0,e1 : IN BIT; s : OUT BIT); END COMPONENT; COMPONENT inverseur PORT(e : IN BIT; s : OUT BIT);

TD1 VHDL END COMPONENT; END mesportes; -- l'entte du package est termine ENTITY et IS PORT(e0,e1 : IN BIT; s : OUT BIT); END et; ARCHITECTURE aet OF et IS BEGIN s<=e0 AND e1; END aet; ENTITY ou IS PORT(e0,e1 : IN BIT; s : OUT BIT); END ou; ARCHITECTURE aou OF ou IS BEGIN s<=e0 OR e1; END aou; ENTITY inverseur IS PORT(e : IN BIT; s : OUT BIT); END inverseur; ARCHITECTURE ainv OF inverseur IS BEGIN s<= NOT e; END ainv; Et le fichier principal Qu'est-ce qui change dans le fichier principal ? Le voici, essayez de deviner avant de lire plus loin. -- top.vhd USE work.mesportes.ALL; ENTITY Fct IS PORT(e0,e1,e2 : IN BIT; s : OUT BIT); END Fct; ARCHITECTURE truc OF Fct IS SIGNAL e0e1,e2bar : BIT; 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; La dclaration des composants est maintenant remplace par "USE work.mesportes.ALL;"
''

12

TD1 VHDL Remarque : les lecteurs peu habitus aux environnements de dveloppement intgrs peuvent se demander comment le compilateur va retrouver "mesportes" puisque l'instruction "USE work.mesportes.ALL;" ne fait rfrence aucun nom de fichier ! C'est la notion de projet qui nous sauve. Le compilateur n'a pas besoin de lire "work", le rpertoire de travail par dfaut 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 problmes de portabilit. A noter quand mme une initiative avec LPM (Library of Parameterized Modules), initiative d'Altera mais non suivie par Xilinx.

13

Les bibliothques usuelles


Mme 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 bibliothques usuelles.

Bibliothque standard
Le VHDL fait appelle de manire implicite une bibliothque dite standard. Celle-ci dfini 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 utiliss jusqu' maintenant sont les bit et bit_vector . Un bit prend seulement deux valeurs et ne permet pas de grer le trois tats par exemple. IEEE propose en supplment une bibliothque appele std_logic.

TD1 VHDL

14

Bibliothque IEEE-1164 standard logic


Les lignes suivantes importent la librairie IEEE-1164 standard logic. library ieee; use ieee.std_logic_1164.all; Cette bibliothque dclare les types std_logic et std_logic_vector dont les valeurs acceptes sont : 0 : Niveau logique bas basse impdance (mise la masse via une faible impdance) 1 : Niveau logique haut basse impdance (mise Vcc via une faible impdance) Z : Niveau logique flottant (entre dconnecte) L : Niveau logique bas haute impdance (mise la masse via une rsistance de pull-down) H : Niveau logique haut haute impdance (mise Vcc via une rsistance de pull-up) W : Niveau logique inconnu haute impdance (pouvant tre 'L', 'Z' ou 'H') X : Niveau logique inconnu (pouvant tre '0', 'L', 'Z', 'H' ou '1') U : Non dfini - : 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(), utilises pour synchroniser un process sur une horloge :
WIKI: process(CLK_IN) is begin if rising_edge(CLK_IN) then -- Les instructions suivantes seront excutes chaque front montant du signal CLK_IN end if; end process WIKI;

qui remplacent avantageusement le test classique, dont la couverture en simulation est incomplte (la transition 'X' -> '1' tant interprte au mme titre que la transition '0' -> '1') : if ((CLK_IN'event) and (CLK_IN = '1')) then Bibliothque IEEE-1164 standard logic et assemblage de composants Jusqu' prsent nos entits utilisaient le type bit prdfini (ou le type bit_vector) : ENTITY demo IS PORT( a : in BIT_VECTOR(3 DOWNTO 0);-- 4 entres 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 raliser un "port map" entre un bit et un std_logic. Une autre manire de dire les choses : si un seul composant ncessite un std_logic vous serez oblig de l'utiliser pour tous les composants. L'entit prcdente sera alors remplace par : library ieee; use ieee.std_logic_1164.all; ENTITY demo IS PORT( a : in STD_LOGIC_VECTOR(3 DOWNTO 0);-- 4 entres s : out STD_LOGIC_VECTOR(1 DOWNTO 0));

TD1 VHDL -- 2 sorties END demo; Ce n'est pas trs compliqu sauf que pour nos assemblages de composants, chaque entit devra tre prcde de library ieee; use ieee.std_logic_1164.all; Voici donc une version complte 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 dclars avant le begin de l'architecture SIGNAL e0e1,e2bar : STD_LOGIC; -- Les components sont dclars 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

15

TD1 VHDL BEGIN s<=e0 AND e1; END aet; library ieee; use ieee.std_logic_1164.all; ENTITY ou IS PORT(e0,e1 : IN STD_LOGIC; s : OUT STD_LOGIC); END ou; ARCHITECTURE aou OF ou IS BEGIN s<=e0 OR e1; END aou; library ieee; use ieee.std_logic_1164.all; ENTITY inverseur IS PORT(e : IN STD_LOGIC; s : OUT STD_LOGIC); END inverseur; ARCHITECTURE ainv OF inverseur IS BEGIN s<= NOT e; END ainv; Vous notez qu'en fait il n'y a pas beaucoup de changements. Prenez donc l'habitude d'utiliser les std_logic en lieu et place de bit. Cela s'avre absolument ncessaire ds qu'il y a un compteur comme on le verra dans un prochain chapitre.

16

Et pour finir, quelques exemples combinatoires


Le WikiBook (en) VHDL for FPGA Design fournit quelques exemples combinatoires que nous reproduisons maintenant.

Dcodeur
Dfinition On appelle dcodeur un circuit positionnant une sortie en fonction d'une entre de slection : la sortie peut tre positionne un parmi des zros ou, l'inverse, zro parmi des uns.

Pour ceux qui connaissent le dmultiplexeur, un dcodeur est un dmultiplexeur avec une entre fixe (soit 0 ou soit 1). Cette entre tant fixe, il n'est absolument pas ncessaire de la dessiner.

TD1 VHDL

17

Code VHDL du dcodeur


Un dcodeur peut simplement tre dcrit en VHDL. library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Decoder is port ( Sel : in std_logic_vector(2 downto 0); y : out std_logic_vector(7 downto 0) ); end entity Decoder; architecture Behavioral of Decoder is begin y <= "00000001" when Sel="000" else "00000010" when Sel="001" else "00000100" when Sel="010" else "00001000" when Sel="011" else "00010000" when Sel="100" else "00100000" when Sel="101" else "01000000" when Sel="110" else "10000000"; end architecture Behavioral; Vous remarquez le un qui se "ballade" parmi des zros en fonction de l'entre de slection ?

TD1 VHDL

18

Simulation Waveform

Le multiplexeur
Dfinition Le multiplexeur est un interrupteur plusieurs positions command par une entre de slection. L'entre qui est lectriquement relie la sortie est choisie parmi plusieurs possibilits.

Le code VHDL du multiplexeur


library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Multiplexer_VHDL is port ( a, b, c, d, e, f, g, h : in std_logic; Sel : in std_logic_vector(2 downto 0); Output : out std_logic ); end entity Multiplexer_VHDL; architecture Behavioral of Multiplexer_VHDL is begin process (a, b, c, d, e, f, g, h, Sel) is begin

TD1 VHDL case Sel is when "000" => Output when "001" => Output when "010" => Output when "011" => Output when "100" => Output when "101" => Output when "110" => Output when others => Output end case; end process; end architecture Behavioral;

19

<= <= <= <= <= <= <= <=

a; b; c; d; e; f; g; h;

Remarquez les 8 entres : une est choisie en fonction de l'entre de slection.

Simulation Waveform

Sources et contributeurs de larticle

20

Sources et contributeurs de larticle


TD1 VHDL Source: http://fr.wikibooks.org/w/index.php?oldid=395310 Contributeurs: JackPotte, Matthieu Michon, Patxinou, SergeMoutou, 52 modifications anonymes

Source des images, licences et contributeurs


File:CalculSeq.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:CalculSeq.png Licence: GNU Free Documentation License Contributeurs: SergeMoutou Image:LogiqueSequ1.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:LogiqueSequ1.png Licence: Creative Commons Attribution-Sharealike 3.0,2.5,2.0,1.0 Contributeurs: SergeMoutou Image:Td2fig3.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:Td2fig3.png Licence: inconnu Contributeurs: Original uploader was SergeMoutou at fr.wikibooks File:AssemblageComposants.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:AssemblageComposants.png Licence: GNU Free Documentation License Contributeurs: SergeMoutou File:AssemblageComposants2.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:AssemblageComposants2.png Licence: GNU Free Documentation License Contributeurs: SergeMoutou Image:Decoder_fin.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:Decoder_fin.png Licence: GNU Free Documentation License Contributeurs: MOJO1985 Image:Multiplexer final.png Source: http://fr.wikibooks.org/w/index.php?title=Fichier:Multiplexer_final.png Licence: GNU Free Documentation License Contributeurs: MOJO1985

Licence
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/