Documente Academic
Documente Profesional
Documente Cultură
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.
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.
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".
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.
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
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.
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) :
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
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
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.
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.
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
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
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
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
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
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
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.
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;
Simulation Waveform
20
Licence
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/