elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 -...

33

Transcript of elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 -...

Page 1: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 1 J.M.

LANGAGE VHDL

Page 2: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 2 J.M.

SOMMAIRE

Page 3 Introduction

Page 4 Logique combinatoire

Page 19 Logique séquentielle

Page 27 Graphe d’états

Page 32 Ligne 3 états

Page 3: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 3 J.M.

INTRODUCTIONLe langage VHDL a été créé pour décrire des systèmes numérisés destinés à une implantation dans des circuits logiques programmables (PLD, FPGA, ASIC). Il remplace la saisie de schéma traditionnelle. La plupart des outils de développement autorisent les 2 types de saisie.Le langage VHDL est en principe standardisé. Chaque outil de développement dispose cependant de bibliothèques spécifiques.L’utilisation de ces systèmes de développement induit l’usage intensif de la simulation.Les exemples fournis dans ce cours ont été testés et simulés avec l’outil ALTERA Quartus.Pour développer une application de logique programmable, il faudra suivre la démarche ci-dessous :

Saisie du texte VHDL (ou de schéma)

VérificationGénération d ’ une NETLIST

Simulation fonctionnelle

Choix d ’un composant et routage

Simulation temporelle

Programmation du composant et test

- L’étape de vérification permet de valider la syntaxe du programme. La « netlist » est un fichier contenant la description de l’application sous forme d’équations logiques.

- Lors de l’étape de simulation fonctionnelle, on valide l’application, indépendamment de l’architecture et des temps de propagation du futur circuit cible.

- L’étape de routage génère les informations permettant d’intégrer l’application dans le circuit choisi. Une « rétro annotation » est effectuée dans la « netlist » : les temps de propagation du composant cible y sont pris en compte.

- Lors de la simulation temporelle, on peut évaluer les performances de l’application générée.

Page 4: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 4 J.M.

LOGIQUE COMBINATOIRE

1- Un exemple simple

Le texte ci-dessous décrit un circuit nommé « ex1 », dont le schéma est le suivant :

s2

ab s1

c

LIBRARY ieee; -- bibliothèques à chargerUSE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

ENTITY ex1 IS -- commentairesPORT ( -- déclaration des entrées/sorties physiques

a, b, c : IN STD_LOGIC ;s1, s2 : OUT STD_LOGIC -- pas de point virgule) ;

END ex1 ;

ARCHITECTURE numero1 OF ex1 IS -- description de l’applicationBEGIN

s1 <= a AND b ;s2 <= (NOT a) OR (a AND b AND c) ;

END numero1 ;

Conclusion:

- Utiliser le symbole « <= », revient à tracer une équipotentielle entre 2 points sur une saisie de schéma.

- Les 2 instructions s1 <= … et s2 <= ….. sont « concurrentes » : l’ordre dans lequel elles sont écrites n’a pas d’importance, puisqu’au final, il s’agit d’associer des portes logiques. On dit que VHDL est un langage à exécution parallèle. Le terme « exécution » n’est d’ailleurs pas très bien choisi : ici, contrairement à un programme écrit en PASCAL ou en C, rien ne sera jamais exécuté. L’objectif de la description VHDL est d’aboutir à un routage de circuits logiques dans un composant programmable. Il faudra toujours garder ceci à l’esprit chaque fois qu’on écrira un texte VHDL.

- VHDL ne distingue pas les majuscules des minuscules. Dans ce cours, les mots réservés du langage seront écrits en majuscules.

- Les bibliothèques déclarées au départ permettent d’utiliser les types « STD-LOGIC » définis depuis 1993. Un signal de type « STD_LOGIC » est un signal sur un bit (matérialisé par un fil !). Le langage VHDL a fait l’objet de 2 normalisations, l’une en 1987, l’autre en 1993.

Page 5: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 5 J.M.

- « l’ENTITY » est la boîte avec ses entrées et ses sorties physiques. « L’ARCHITECTURE » contient la description du fonctionnement de la boîte et possède son propre nom. Certains outils de développement autorisent plusieurs descriptions d’une même application. Le choix est fait au moment de la compilation.

- Il existe une priorité entre opérateurs. Le plus simple est d’utiliser des parenthèses.

- Les autres opérateurs sont : XOR (ou exclusif), NAND, NOR, & (concaténation), + (addition), - (soustraction), * (multiplication), / (division).

2- Description structurelle ou comportementale

On pourrait décrire l’exemple précédent sous la forme suivante :

ARCHITECTURE numero2 OF ex1 ISBEGINs1 <= ‘1’ WHEN (a=’1’ AND b=’1’ ) ELSE ‘0’ ;s2 <= ‘1’ WHEN (( a=’0’) OR (a=’1’ AND b=’1’ AND c=’1’)) ELSE ‘0’ ;END numero2 ;

Conclusion:- numéro1 est une description structurelle : elle est très proche d’une saisie de schéma.- numéro2 est une description comportementale. Le schéma logique équivalent ne se déduit pas immédiatement.

- En logique combinatoire, il faut TOUJOURS prévoir toutes les lignes de la table de vérité (autrement dit, ici, il ne faut pas omettre ELSE). Sinon, par défaut, le compilateur VHDL génèrera une fonction séquentielle de mémorisation.

Exemple: multiplexeur:e0

e1s

c

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

ENTITY ex2 ISPORT (e0, e1, c:IN STD_LOGIC ;s : OUT STD_LOGIC) ;END ex2 ;

ARCHITECTURE archi OF ex2 ISBEGINs <= e0 WHEN c = ‘0’ ELSE e1;END archi;

Les parenthèses sont inutiles ici, le compilateur repère les mots réservés.

Page 6: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 6 J.M.

3- Notion de signal

En VHDL, un « SIGNAL » est un bit ou un bus interne. Il a une réalité physique (c’est une équipotentielle). On reprend ici le premier exemple :

s2

ab s1

c x

ARCHITECTURE numero3 OF ex1 IS SIGNAL x : STD_LOGIC ;

BEGINs1 <= a AND b ; x <= a AND b AND c ;s2 <= (NOT a) OR x ;END numero3 ;

Le SIGNAL x n’est ni une entrée, ni une sortie, mais il a une réalité physique. Ici x est utilisé par commodité, pour alléger l’écriture de la sortie s2.

Un autre exemple :

s2

ab s1

c

x

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

ENTITY ex3 ISPORT (a,b,c : IN STD_LOGIC;S1, S2 : OUT STD_LOGIC);END ex3;

ARCHITECTURE archi1 OF ex3 ISSIGNAL x : STD_LOGIC;BEGINx <= a AND b ; s2 <= (NOT c) OR x ;s1 <= x;END archi1;

Le langage VHDL interdit d’utiliser une sortie pour générer de la logique. Concrètement, ici écrire s2 <= (NOT c) OR s1 ; conduirait à une erreur de compilation. La sortie s1 ne peut pas se situer à droite du symbole d’affectation. Le signal x est ici un artifice de description. Physiquement, x et s1 sont sur la même équipotentielle.

L’exemple précédent aurait pu être traité plus simplement en faisant appel au type BUFFER. Il s’agit d’une sortie physique que l’on peut utiliser pour générer de la logique (plus concrètement, que l’on peut trouver à droite du symbole « <= ») :

Page 7: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 7 J.M.

s2

ab s1

c

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

ENTITY ex3 ISPORT (a,b,c : IN STD_LOGIC;S1 : BUFFER ;S2 : OUT STD_LOGIC);END ex3;

ARCHITECTURE archi2 OF ex3 ISBEGINS1 <= a AND b ; S2 <= (NOT c) OR S1 ;END archi2;

4- Bus et nombres, opérateurs de test, opérateurs arithmétiques

Comment, en VHDL, définir des bus ?

Un 1er exemple (description VHDL et résultats de simulation) :

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

ENTITY combi1 ISPORT (a :IN STD_LOGIC_VECTOR(3 DOWNTO 0); -- bus 4 filsb :IN STD_LOGIC_VECTOR(3 DOWNTO 0); -- bus 4 filsS : OUT STD_LOGIC_VECTOR(11 DOWNTO 0); -- bus 12 filsT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) -- bus 8 fils

);END combi1;

ARCHITECTURE archi OF combi1 ISALIAS op1:STD_LOGIC_VECTOR (3 DOWNTO 0) IS S(3 DOWNTO 0); ALIAS op2:STD_LOGIC_VECTOR (3 DOWNTO 0) IS S(7 DOWNTO 4);

BEGINop1 <= a AND b;op2 <= a OR “1010”;T <= a & b; -- concaténationS(8) <= ‘1’ WHEN a > b ELSE ‘0’;S(9) <= ‘1’ WHEN a = “0000” ELSE ‘0’; S(10) <= ‘1’ WHEN a = “0011” ELSE ‘0’; S(11) <=’1’ WHEN a<= “1001” ELSE ‘0’;END archi;

Page 8: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 8 J.M.

Conclusion:

- Le type « STD_LOGIC_VECTOR » est utilisé pour décrire des bus avec lesquels on effectue des opérations logiques. Les bus sur lesquels portent ces calculs doivent avoir la même taille.- Les opérations de comparaison sont possibles aussi, elles se font binaire naturel : les résultats de simulation montrent que 0xA est supérieur à 0x4.- Les opérations arithmétiques (addition, soustraction, multiplication, division) ne sont pas possibles.- Via la déclaration « ALIAS », on effectue des calculs sur une partie des bus.- On peut accéder aux bus bit par bit.- L’opérateur « DIFFERENT DE » s’écrit /=- Dans la déclaration « 3 DOWNTO 0 », le bit de poids fort est le n°3.

Un 2ème exemple (description VHDL et résultats de simulation) : le bus vu comme le nombre entier qu’il permet de coder.

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

ENTITY combi2 ISPORT (

a : IN INTEGER RANGE 0 TO 15; -- bus 4 fils b : IN INTEGER RANGE 0 TO 15; -- bus 4 fils c : IN INTEGR RANGE –8 TO + 7 ; -- bus 4 fils

U : OUT INTEGER RANGE 0 TO 15; Y : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- bus 3 fils T : OUT INTEGER RANGE 0 TO 31 -- bus 5 fils );

END combi2;

ARCHITECTURE archi OF combi2 ISBEGINU <= a - 4;T<= a + b;Y(2) <= ‘1’ WHEN a<=12 ELSE ‘0’; -- 12 est un nombre exprimé en base 10Y(1) <= ‘1’ WHEN a > b ELSE ‘0’;Y(0)<= ‘1’ WHEN c>1 ELSE ‘0’; -END archi;

Page 9: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 9 J.M.

Conclusion:

- Le type « INTEGER » est utilisé pour décrire des bus avec lesquels on effectue des opérations arithmétiques.- Un « INTEGER » est signé. Il peut donc être négatif.- Ainsi, les opérations de comparaison sont possibles, elles se font binaire signé.- Les opérations logiques ne sont pas possibles.- On ne peut pas accéder aux bus bit par bit.- L’opérateur « DIFFERENT DE » s’écrit /=- Déclarer un « INTEGER RANGE 0 TO 200 » ou bien un « INTEGER RANGE 0 TO 255 » revient au même : cela créera un bus 8 fils.- Les additions se font avec génération de retenue. Les bus opérandes doivent avoir la même taille. Le bus représentant le résultat peut-être de taille supérieure.- Certains compilateurs n’autorisent les multiplications ou divisions que par une puissance de 2 (c’est le cas du compilateur ALTERA).- On ne peut pas combiner les INTEGER et les STD_LOGIC_VECTOR. Si nécessaire, on utilise une fonction de conversion. Ces fonctions de conversion ne sont pas standards :Si X est un bus 8 bits et Y un entier compris entre 0 et 255, on pourra écrire (compilateur ALTERA)X<= CONV_STD_LOGIC_VECTOR(Y,8) ; pour utiliser X à la place de Y.

Exemple :

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

ENTITY combi2bis ISPORT (

a :IN INTEGER RANGE 0 TO 15; --4 bits b :IN INTEGER RANGE 0 TO 15; somme : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- 4 bits non_a : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) -- 4 bits );

END combi2bis;

ARCHITECTURE archi OF combi2bis ISSIGNAL xa : STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

Page 10: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 10 J.M.

-- somme <= a + b ; génère une erreursomme<= CONV_STD_LOGIC_VECTOR(a + b, 4);

xa<= CONV_STD_LOGIC_VECTOR(a,4); -- a et xa sont le même busnon_a <= NOT(xa); -- l'operation logique devient possible

END archi;

Il existe aujourd’hui 2 types permettant d’utiliser les opérateurs arithmétiques et logiques, le SIGNED INTEGER et le UNSIGNED INTEGER :

La déclaration a :IN STD_LOGIC_VECTOR(8 DOWNTO 0); -- bus 8 fils

sera remplacée para :IN UNSIGNED INTEGER;

-- bus 8 fils, pouvant aussi être interprété comme un nombre compris entre 0 et 255

ou bien par a :IN STD_LOGIC_VECTOR(3 DOWNTO 0);

-- bus 8 fils, pouvant aussi être interprété comme un nombre compris entre -128 et +127

selon le besoin.

4- Constante

Une constante est un signal interne porté à un niveau logique fixe. Elle se déclare avec les « SIGNAL » et s’utilise de la même façon.

ARCHITECTURE archi OF exemple ISSIGNAL x : STD_LOGIC;CONSTANT zero : STD_LOGIC := ‘0’;CONSTANT octet_zero : STD_LOGIC_VECTOR (7 DOWNTO 0) := “00000000”;

5- WITH … SELECT

Comment décrire, de façon comportementale, une équation logique à plusieurs variables ?

Exemple: multiplexeur 1 voie parmi 4:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

Page 11: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 11 J.M.

e0e1

s

c1c0

e2e3

ENTITY combi3 ISPORT (

c :IN INTEGER RANGE 0 TO 3; e : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

s : OUT STD_LOGIC );

ARCHITECTURE archi1 OF combi3 ISBEGINWITH c SELECT s <= e(0) WHEN 0, e(1) WHEN 1, e(2) WHEN 2, e(3) WHEN 3;END archi1;

Il faut mentionner tous les cas possibles, sinon une fonction registre sera générée.

6- IF … ELSE - Notion de process

L’instruction WITH … SELECT est d’un usage limité. Elle ne permet de calculer qu’un seul signal. Voici 2 structures plus élaborées :

Exemple: On reprend celui du multiplexeur 1 voie parmi 4:

e0e1

s

c1c0

e2e3

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY combi3 IS

PORT ( c :IN INTEGER RANGE 0 TO 3; e : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

s : OUT STD_LOGIC );

ARCHITECTURE archi2 OF combi3 ISBEGINPROCESS (c) BEGINIF (c = 0) THEN s<= e(0);ELSIF (c = 1) THEN s<= e(1);ELSIF (c = 2) THEN s<= e(2);

Page 12: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 12 J.M.

ELSE s<= e(3);END IF;END PROCESS;END archi2;

Conclusion:- Un « PROCESS » est un ensemble d’instructions qui doivent être toutes analysées par le compilateur pour générer la logique correspondante. Dans un « PROCESS » les instructions ne sont plus concurrentes (ou parallèles), mais séquentielles. Elles doivent être écrites dans un ordre bien déterminé.- A la différence de l’instruction WITH … SELECT plusieurs instructions peuvent être écrites entre « THEN » et « ELSE » ou « ELSIF ». Elles sont séparées par le symbole « ; » - Comme vu précédemment, il faut envisager tous les cas possibles, sinon il y aura génération d’une fonction registre.- La liste de signaux inscrits entre parenthèses après le mot « PROCESS » se nomme la liste des sensibilités. Elle contient tous les signaux dont un changement d’état influe sur la valeur du signal que l’on calcule dans le « PROCESS ». Quand on génère de la logique combinatoire, les signaux testés suffisent. Elle ne peut pas contenir un signal de sortie que s’il a été déclaré « BUFFER », . Elle peut être vide. Si elle contient des signaux inutiles, ils sont ignorés par le compilateur.- On peut effectuer un test sur plusieurs conditions :

PROCESS ( a, b)BEGINIF (a = ‘1’ AND b = ‘0’) THEN ………

- Les signaux testés peuvent être - des INTEGER par exemple IF a = 3- des STD_LOGIC par exemple IF a = ‘0’- des STD_LOGIC_VECTOR par exemple IF a = « 00100001 »

- On peut ajouter, dans le test, autant de parenthèses que nécessaire à la compréhension et à la lisibilité.

7-CASE

Le même exemple:

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

Page 13: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 13 J.M.

ENTITY combi4 ISPORT (c :IN INTEGER RANGE 0 TO 3; e : IN STD_LOGIC_VECTOR(3 DOWNTO 0); S : OUT STD_LOGIC);END combi4;

ARCHITECTURE archi OF combi4 ISBEGINPROCESS (c)BEGINCASE c ISWHEN 0 => s<= e(0);WHEN 1 => s<= e(1);WHEN 2 => s<= e(2);WHEN 3 => s<= e(3);END CASE;END PROCESS;END archi;

Conclusion:- Comme vu précédemment, il faut envisager tous les cas possibles, sinon il y aura génération d’une fonction registre.- Si des cas ne sont pas listés, on utilise « WHEN OTHERS => …… »- Les tests possibles sont les mêmes qu’avec « IF »- On peut écrire autant d’instructions que nécessaires entre => et « WHEN ». Elles sont séparées par le symbole « ; ».- On peut au sein d’un bloc « CASE » introduire un bloc « IF » ou inversement, à condition de respecter la hiérarchie des blocs.

Exemple: multiplexeur une voie parmi 4 avec entrée de validation:

Page 14: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 14 J.M.

e0e1

s

c1c0

e2e3

val

le multiplexeur fonctionne si val vaut 1sinon s vaut 0

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY combi5 IS

PORT ( val : IN STD_LOGIC; c :IN INTEGER RANGE 0 TO 3;

e : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

s : OUT STD_LOGIC );

END combi5;

ARCHITECTURE archi OF combi5 ISBEGINPROCESS(c, val)BEGINIF ( val = ‘0’ ) THEN s<=’0’;ELSECASE c ISWHEN 0 => s<= e(0);WHEN 1 => s<= e(1);WHEN 2 => s<= e(2);WHEN 3 => s<= e(3);END CASE;END IF;END PROCESS;END archi;

8- Boucle et variable de boucle

On peut effectuer une itération via une instruction de boucle et un compteur de boucle. La variable servant de compteur de boucle est purement virtuelle, elle ne correspond à rien de physique dans le futur circuit et ne doit pas être déclarée.

Exemple: codage de données:Le cahier des charges est le suivant : s0 = a0

Page 15: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 15 J.M.

pour i>0 Si = ai . ai-1 + /ai . /ai-1

4 4a S

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY combi6 IS

PORT (a: IN STD_LOGIC_VECTOR(3 DOWNTO 0); s : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );

END combi6;

ARCHITECTURE archi OF combi6 ISBEGINs(0) <= a(0);

PROCESSBEGINFOR i IN 1 TO 3 LOOPS(i)<= (a(i) AND a(i-1)) OR ( NOT a(i) AND NOT a(i-1));END LOOP;END PROCESS;END archi;

Dans cet exemple, la liste de sensibilités est vide. Aucun signal n’est testé dans le PROCESS.

9- Notion de variable

On peut utiliser une variable (en générale entière), pour que le compilateur puisse effectuer des calculs intermédiaires. Cette variable ne correspond à rien de physique. Elle est utilisée par le compilateur pour synthétiser la logique de l’application. Cette variable sera forcément localisée dans un PROCESS.

Exemple: un autre codage de données:Le cahier des charges est le suivant : le nombre S en sortie indique, en binaire, le nombre de signaux d’entrée à 1.Si a = 1001 alors S = 010

Page 16: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 16 J.M.

Si a = 1100 alors S = 010Si a = 1111 alors S = 100

4 3a S

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY combi7 IS

PORT ( a: IN STD_LOGIC_VECTOR(3 DOWNTO 0);

S : OUT INTEGER RANGE 0 TO 4 );

END combi7;

ARCHITECTURE archi OF combi7 ISBEGINPROCESS(a)VARIABLE resultat : INTEGER;BEGINresultat := 0;FOR i IN 0 TO 3 LOOP

IF (a (i) = ‘1’) THEN resultat := resultat + 1; END IF;END LOOP;s <= resultat;END PROCESS;END archi;

Conclusion:- Cet exemple pourrait aussi être décrit via une table de vérité grâce à l’instruction « CASE ».- On peut ici préciser la notion de « PROCESS »: le compilateur prend en compte la totalité du PROCESS, et génère la logique correspondante. On peut faire cohabiter plusieurs PROCESS dans un même programme VHDL. Ils deviennent « concurrents »: les logiques correspondantes sont générées indépendamment l’une de l’autre. - D’un point de vue méthodologique, on essaiera toujours de décomposer une application de logique en blocs fonctionnels. A chaque bloc, correspondra, si nécessaire, un PROCESS.

Exemple:

Page 17: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 17 J.M.

A8

B8

8 S

OV

A, B, S en binaire signéS = A plus BOV vaut 1 s ’il y adépassementdecapacitéComp= 1ssiA > B

Comp

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY combi8 ISPORT ( a,b: IN INTEGER RANGE -128 TO 127;

s : BUFFER INTEGER RANGE -128 TO 127; OV, Comp : OUT STD_LOGIC );END combi8;

ARCHITECTURE archi OF combi8 ISBEGINs <= a + b; -- 1er bloc fonctionnel

PROCESS (a,b,s) -- 2ème bloc fonctionnelBEGINIF (a>=0 AND b>=0 AND s <0) THEN OV <= '1';ELSIF (a<0 AND b<0 AND s >=0) THEN O <= '1';ELSE OV <= '0'; END IF;END PROCESS;

PROCESS (a,b) -- 3ème bloc fonctionnelBEGIN IF a>b THEN Comp <= '1' ; ELSE Comp <= '0' ;END PROCESS;END archi;

Dans cet exemple on aurait pu écrire le 3ème bloc fonctionnel sous la forme :Comp <= ‘1’ WHEN a>b ELSE ‘0’ ;Sans passer par un PROCESS.

10 – Le problème des « glitches »

Il s’agit d’impulsions parasites générées lorsque des portes situées sur le même étage de logique ont des temps de propagation différents, et lorsque plusieurs entrées changent d’état en même temps.Les opérations arithmétiques sont très génératrices de « glitches »

Exemple:

Page 18: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 18 J.M.

s2a

bs1

porte parfaite, pas de temps de propagation

temps de propagation de 2 ns ta

tb

S2 théorique

S1 réel t

t

t

S2 réel

impulsion parasite de 2 nsExemple en VHDL :

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY combi9 IS

PORT ( a,b: IN STD_LOGIC; s1 : BUFFER STD_LOGIC; s2 : OUT STD_LOGIC;

x,y : IN INTEGER RANGE 0 TO 255; somme : OUT INTEGER RANGE 0 TO 511

);END combi9;

ARCHITECTURE archi OF combi9 ISBEGINsomme <= x + y; s1 <= NOT a;s2 <= s1 OR b;END archi;

Remède :

On ne cherche en général pas à supprimer ces impulsions parasites. La tendance actuelle est de synchroniser toutes les sorties via des bascules D, à une fréquence d’horloge suffisamment faible pour rendre les « glitches » « invisibles », et suffisamment rapide pour satisfaire aux exigences temporelles de l’application.

Page 19: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 19 J.M.

LOGIQUE SEQUENTIELLE

1- Bascule D LATCH

d

ena

q

Si ena = 0, la sortie q est figée.

Si ena = 1, la sortie q recopie l’entrée d.

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY seq1 IS

PORT ( d,ena : IN STD_LOGIC; q: BUFFER STD_LOGIC );

END seq1;

ARCHITECTURE archi OF seq1 ISBEGIN

PROCESS (ena,d)BEGINIF ena = ‘1’ THEN q <= d;

ELSE q <= q;END IF;END PROCESS;

END archi;

Remarques:- Le signal de sortie q est déclaré de type BUFFER pour écrire q <= q ;- En VHDL, dans les instructions « IF … ELSE » et « CASE », les cas non mentionnés génèrent l’effet mémoire. Le PROCESS précédent pourrait être écrit ainsi :- Quand on génère de la logique séquentielle, il faut mentionner dans la liste de sensibilités du PROCESS, tous les signaux qui influent sur ce que l’on calcule.

PROCESS (ena,d)BEGINIF ena = ‘1’ THEN test <= d;END IF;END PROCESS;

Dans ce cas, q est déclaré comme un signal de type OUT.

Page 20: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 20 J.M.

2- Bascule D « Edge Triggered »

d

H

q

Au front d’horloge, la sortie q recopie l’entrée d.

Entre 2 fronts d’horloge, la sortie q est figée.

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY seq2 IS

PORT ( d, h: IN STD_LOGIC; q: OUT STD_LOGIC );

END seq2;

ARCHITECTURE archi OF seq2 ISBEGINPROCESS BEGINWAIT UNTIL h=’1’;q <= d;END PROCESS;

END archi;

Conclusion:Ici, l’exécution du « PROCESS » est suspendue jusqu’au passage de 0 à 1 du signal d’horloge.Le « PROCESS » ne comporte pas de liste de sensibilités. On utilise l’instruction « WAIT » lorsque l’on veut générer de la logique totalement synchrone.

Page 21: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 21 J.M.

3- Bascule D avec entrées de prépositionnement asynchrones :

d

H

qprn

cln

Si prn = cln = 1, la bascule fonctionne comme précédemment.

Si cln = 0, la sortie q est mise à 0, indépendamment des autres entrées.

Si cln = 1 et prn = 0, la sortie q est mise à 1, indépendamment des autres entrées.

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

ENTITY seq3 ISPORT (

d, h: IN STD_LOGIC; Prn, Cln : IN STD_LOGIC; q: OUT STD_LOGIC );

END seq3;

ARCHITECTURE archi OF seq3 IS BEGIN

PROCESS ( Prn, Cln, h)BEGINIF Cln = ‘0’ THEN q <= ‘0’; ELSIF Prn = ‘0’ THEN q <= ‘1’;ELSIF h’EVENT AND h = ‘1’ THEN q <= d;END IF;END PROCESS;

END archi;

Conclusion:- Le « PROCESS » n’est plus totalement synchrone.- L’instruction « IF h’EVENT AND h = ‘1’ » permet de détecter un front montant d’horloge.

Page 22: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 22 J.M.

4-Registre parallèle

Les registres parallèles sont constitués de bascules dont les signaux de contrôle sont communs (ena, H, Cln, Prn). Leur description VHDL se déduit immédiatement de celle des bascules. Ci-dessous pour un registre 8 bits actif sur front d’horloge, sans signaux asynchrones :

d

H

q8 8

Au front d’horloge, le bus de sortie q recopie le bus d’entrée d.

Entre 2 fronts d’horloge, le busde sortie q est figé.

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY seq4 IS

PORT ( h: IN STD_LOGIC; d : IN STD_LOGIC_VECTOR (7 DOWNTO 0); q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)

);END seq4;

ARCHITECTURE archi OF seq4 IS

BEGIN

PROCESS BEGINWAIT UNTIL h=’1’;q <= d;END PROCESS;

END archi;

Conclusion:On pourra, sur le modèle des différentes bascules D, définir un registre de type LATCH, ou bien des entrées de pré positionnement asynchrones.

Page 23: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 23 J.M.

5-Suppression des « glitches » générés par de la logique combinatoire, par synchronisation des sorties sur un signal d’horloge:

On reprend une partie de l’exemple COMBI9 :

x8

y8

9Somm

COMBI9 SEQ4SEQ5

DQ

9Résultatx+ysynchroniséH

H

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY seq5 ISPORT (x,y: IN INTEGER RANGE 0 TO 255; h: IN STD_LOGIC;resultat : OUT INTEGER RANGE 0 TO 511

);END seq5;

ARCHITECTURE archi OF seq5 ISSIGNAL somme: INTEGER RANGE 0 TO 511;BEGIN

somme <= x + y;

PROCESS -- synchronisationBEGINWAIT UNTIL h = '1';resultat <= somme;END PROCESS;END archi;

Conclusion :Les « glitches » ont disparu !Les sorties changent d’état au front d’horloge.

Page 24: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 24 J.M.

6-Compteur

Les compteurs décrits ci-dessous reposent sur le principe suivant :- La sortie du compteur est prise à la sortie d’un registre parallèle.- L’entrée de ce registre est commandée par le résultat d’une addition : la sortie du registre +1.

d

H

q8 8

s = a + b8

aSortie du compteur

00000001

H

additionneur registre

compteur 8 bits

b

8

Un premier compteur 3 bits simple, sans remise à 0, construit sur le modèle de SEQ2 :

H

q 3

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY seq6 IS

PORT (h: IN STD_LOGIC; q: BUFFER INTEGER RANGE 0 TO 7 );END seq6;

ARCHITECTURE archi OF seq6 ISBEGIN

PROCESS BEGINWAIT UNTIL h=’1’;q <= q+ 1;END PROCESS;

END archi;

Conclusion :Pour pouvoir écrire q <= q + 1 ; on a déclaré q comme BUFFER.

Page 25: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 25 J.M.

Un deuxième compteur 3 bits, avec remise à 0 asynchrone, construit sur le modèle de SEQ3 :

H

q 3

cln

ENTITY seq7 ISPORT (

h, Cln: IN STD_LOGIC; q: BUFFER INTEGER RANGE 0 TO 7 );END seq7;ARCHITECTURE archi OF seq7 ISBEGIN

PROCESS (Cln, h)BEGINIF Cln = ‘0’ THEN q <= 0; ELSIF h’EVENT AND h = ‘1’ THEN q <= q + 1;END IF;END PROCESS;

END archi;

Conclusion :Comme précédemment, il faut déclarer q en tant que BUFFER.

Un compteur DCBN à un chiffre :Ce compteur s’incrémente sauf quand il atteint 9. Ce qui revient à l’organigramme suivant :

Avant le front d'horlogeCompteur = 9 ?

Aprèsle front d'horlogeCompteur <= 0

Après le front d'horlogeCompteur <= Compteur + 1

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY seq7bis IS

PORT ( h: IN STD_LOGIC;

Page 26: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 26 J.M.

H

q 4

cln

q: BUFFER INTEGER RANGE 0 TO 9 );END seq7bis;

ARCHITECTURE archi OF seq7bis ISBEGIN

PROCESS BEGINWAIT until h='1';IF q = 9 THEN q <= 0; ELSE q <= q + 1;END IF;END PROCESS;

END archi;

A partir de ces 3 modèles et des outils combinatoires, on pourra multiplier les options : compteur/décompteur, compteur prépositionnable, compteur DCBN, signalisation de fin de comptage etc …

On veillera à toujours écrire un organigramme avant de se lancer dans la rédaction de ce type de compteur.

Page 27: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 27 J.M.

GRAPHE D’ETATS

Le modèle choisi est celui de Machine de MOORE : Les états sont codés en binaire (bits d’état). Ce code est matérialisé par les sorties d’un registre.Les sorties du système sont des fonctions combinatoires des bits d’état.L’état futur du système est calculé par une fonction combinatoire dépendant de l’état actuel et des entrées.Une entrée de remise à 0 synchrone est prévue, permettant le retour à l’état initial à tout moment (après un front d’horloge).

d

H

qp sorties du

système

H registre

Machine de MOORE

n

logique combinatoire

n m

bits d ’étatétat actuel du système

logique combinatoire

entrées dusystème

état futur du système

calcul del ’état futur

calcul dessorties

Si nécessaire, les sorties du système peuvent être resynchronisées sur l’horloge, via un registre.

Exemple :

0/a./b./c

3 a./b. c

2 a./b./c

1/a. b. c

4/a. b. c

y./init/y./init

initx./init

initinit

z./initz./init

initinit

/z./init/z./init

/init

init + /x

Page 28: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 28 J.M.

Une description totalement synchrone :

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY seq8 IS -- machine d’états

PORT ( h, x, y, z, init : IN STD_LOGIC; a, b, c : OUT STD_LOGIC);

END seq8;ARCHITECTURE archi OF seq8 ISSIGNAL etat : INTEGER RANGE 0 TO 7; BEGINPROCESS BEGINWAIT UNTIL h = ‘1’;CASE etat ISWHEN 0 => IF init = ‘0’ AND x = ‘1’ THEN etat <= 1;

END IF;WHEN 1 => IF init =’1’ THEN etat <= 1 ;

ELSIF y = ‘1’ THEN etat <= 3 ;ELSE etat <= 2 ;END IF;

WHEN 2 => IF init =’1’ THEN etat <= 0 ;ELSIF z = ‘1’ THEN etat <= 4 ;END IF;

WHEN 3=> IF init =’1’ THEN etat <= 0 ;ELSIF z = ‘1’ THEN etat <= 4 ;END IF;

WHEN 4 ; => IF init =’1’ THEN etat <= 0 ;END IF;

WHEN OTHERS => etat <= 0 ; -- pour envisager les etats non décritsEND CASE;END PROCESS;

a <= ‘1’ WHEN etat = 2 OR etat = 3 ELSE ‘0’; -- Equation des sortiesb <= ‘1’ WHEN etat = 1 OR etat = 4 ELSE ‘0’;c <= ‘1’ WHEN etat = 1 OR etat = 3 OR etat = 4 ELSE ‘0’;END archi;

H

abc

xyz

Init

Page 29: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 29 J.M.

Le même exemple en définissant un « type état » :

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY seq9 IS -- machine d’états

PORT ( -- autrementh, x, y, z, init : IN STD_LOGIC;

a, b, c : OUT STD_LOGIC);

END seq9;ARCHITECTURE archi OF seq9 ISTYPE STATE_TYPE IS (s0,s1,s2,s3,s4);SIGNAL etat : STATE_TYPE;BEGINPROCESS BEGINWAIT UNTIL h = ‘1’;CASE etat ISWHEN s0 => IF init = ‘0’ AND x = ‘1’ THEN etat <= s1;

END IF;WHEN s1 => IF init =’1’ THEN etat <= s0;

ELSIF y = ‘1’ THEN etat <= s3;ELSE etat <= s2;END IF;

WHEN s2 => IF init =’1’ THEN etat <= s0;ELSIF z = ‘1’ THEN etat <= s4;END IF;

WHEN s3 => IF init =’1’ THEN etat <= s0;ELSIF z = ‘1’ THEN etat <= s4;END IF;

WHEN s4 => IF init =’1’ THEN etat <= s0;END IF;

WHEN OTHERS => etat <=s0; -- pour envisager les etats non décritsEND CASE;END PROCESS;-- Equation des sortiesa <= ‘1’ WHEN etat = s2 OR etat = s3 ELSE ‘0’;b <= ‘1’ WHEN etat = s1 OR etat = s4 ELSE ‘0’;c <= ‘1’ WHEN etat = s1 OR etat = s3 OR etat = s4 ELSE ‘0’;END archi;

Conclusion :Le nom des états peut être quelconque : « debut », « demarrage », « vitesse » etc …Il s’agit d’un type énuméré, qui génèrera des entiers prenant la valeur 0, 1, 2 etc …

Page 30: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 30 J.M.

Le même exemple avec un signal de remise à zéro asynchrone :

d

H

qp sorties du

système

H registre

Machine de MOORE

n

logique combinatoire

n m

bits d ’étatétat actuel du système

logique combinatoire

entrées dusystème

état futur du système

calcul del ’état futur

calcul dessorties

Reset

Init

Le graphe d’états se simplifie comme ci-dessous :

0/a./b./c

3 a./b. c

2 a./b./c

1/a. b. c

4/a. b. c

y/y.

x

zz

/z/z

/x

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;ENTITY seq10 IS -- machine d’états

PORT ( -- avec reset asynchrone h, x, y, z, init : IN STD_LOGIC; a, b, c : OUT STD_LOGIC);

END seq10;ARCHITECTURE archi OF seq10 ISTYPE STATE_TYPE IS (s0,s1,s2,s3,s4);SIGNAL etat : STATE_TYPE;BEGINPROCESS (h,init,x,y,z,etat)BEGINIF init =’1’ THEN etat<=S0; --Reset asynchrone

Page 31: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 31 J.M.

ELSIF h’EVENT AND h=’1’ THENCASE etat ISWHEN s0 => IF x = ‘1’ THEN etat <= s1;

END IF;WHEN s1 => IF y = ‘1’ THEN etat <= s3;

ELSE etat <= s2;END IF;

WHEN s2 => IF z = ‘1’ THEN etat <= s4;END IF;

WHEN s3 => IF z = ‘1’ THEN etat <= s4;END IF;

WHEN s4 => etat <= s4;

WHEN OTHERS => etat <=s0; -- pour envisager les etats non décritsEND CASE;END IF;END PROCESS;-- Equation des sortiesa <= ‘1’ WHEN etat = s2 OR etat = s3 ELSE ‘0’;b <= ‘1’ WHEN etat = s1 OR etat = s4 ELSE ‘0’;c <= ‘1’ WHEN etat = s1 OR etat = s3 OR etat = s4 ELSE ‘0’;END archi;

Page 32: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 32 J.M.

LIGNE 3 ETATS

La ligne S1 ci-dessous, peut-être utilisée

1- Comme une entrée , on a alors S2 = S1 + c. La porte 3 états doit être placée en haute impédance via la commande CS (à 0).2- Comme une sortie , on a alors S1 = a.b, et S2 = a.b + c. La porte 3 états doit être placée en basse impédance via la commande CS (à 1).

Elle sera déclaré selon le type INOUT.

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;

LIBRARY altera;USE altera.maxplus2.all; -- contient la primitive TRIENTITY trivhd ISPORT (a,b,c,CS :IN STD_LOGIC; S2 : OUT STD_LOGIC;S1: INOUT STD_LOGIC

);END trivhd;ARCHITECTURE archi OF trivhd ISSIGNAL X: STD_LOGIC;BEGINS2 <= S1 OR c ;X <= a AND b;Mon_buffer : TRI PORT MAP (x, cs, S1); -- utilisation de la primitive TRIEND archi; -- on passe les paramètres spécifiés dans la doc

-- on peut retrouver la déclaration de la primitive dans-- c:\maxplus2\vhdl93\altera\maxplus2.vhd

Page 33: elhaouri.free.frelhaouri.free.fr/doc/pld/Langage VHDL J.M.pdf · /,˙ˇ0ˇ"(&ˇ˜"(&ˇ - 2 ˆˆ 5 - 8 6 ( ˆ ) 3 * ˛ 8 % 90#0: ; 22 ˛ ˛ (ˇ˝ ˙ ( 7$/ < ;

Cours VHDL 33 J.M.