20
Initiation au conception des circuits conception des circuits Language VHDL Language VHDL Déc 2009 Introduction VHDL L’abréviation VHDL : VHSIC: Very High Speed Integrated Circuit Hardware Description Language Hardware, Description, Language Ce langage a été écrit dans les années 70 pour réaliser la simulation de circuits électroniques. Etendu ensuite pour permettre la conception (synthèse) de circuits logiques programmables (P.L.D. Programmable Logic Device). VHDL ( et VERILOG) permettent de matérialiser les structures électroniques d’un circuit. Les instructions se traduisent par une configuration logique de portes et de bascules qui est intégrée à l’intérieur des circuits. VHDL ( et VERILOG) sont des langages de haut niveau et font alors abstraction des contraintes technologies des circuits. Génèrent du code portable, c’est à dire qu’une description écrite pour un circuit peut être facilement utilisée pour un autre circuit. 2 Introduction VHDL Le VHDL est le fruit du besoin de normalisation des langages de description de matériel (Première norme IEEE1076-87 en décembre 1987). Au début des années 80, le ministère de la défense des Etats Unis (D.O.D) confiait le soin à Intermetrics, IBM et Texas Instruments de mettre au point ce langage. L’objectif était bien sûre de s’assurer une certaine indépendance vis à vis des fournisseurs de matériels et de logiciels et ainsi une assurance de maintenabilité des équipements. En 1994 la version IEEE 1076-93 suivie du standard IEEE 1164 fut établie. En 1995, afin de normaliser les méthodes de modélisation des retards des circuits ASIC ou FPGA, de grands industriels se sont associés dans la VITAL circuits ASIC ou FPGA, de grands industriels se sont associés dans la VITAL initiative” (VHDL Initiative Toward ASIC Libraries) fournissant des bibliothèques normalisées VITAL. Ceci est concrétisé par la norme IEEE 1076.4 Très récemment, le VHDL a connu une nouvelle extension avec la première IEEE 1076 1 1999 d l d déli i i li norme IEEE-1076.1-1999 du langage de modélisation mixte et multi- technologique VHDL-AMS 3 Organisation fonctionnelle de développement Diagramme Entree syntaxique Entrée Diagramme d’états Entree syntaxique Langage VHDL schématique 4

Chapitre 1 Introduction to VHDL

Embed Size (px)

Citation preview

Page 1: Chapitre 1 Introduction to VHDL

Initiation au

conception des circuitsconception des circuitsLanguage VHDLLanguage VHDL

Déc 2009

Introduction VHDL

L’abréviation VHDL : VHSIC: Very High Speed Integrated CircuitHardware Description LanguageHardware, Description, Language

Ce langage a été écrit dans les années 70 pour réaliser la simulation de circuits électroniques. Etendu ensuite pour permettre la conception (synthèse) de circuits logiques programmables (P.L.D. Programmable Logic Device).VHDL ( et VERILOG) permettent de matérialiser les structures électroniques ( ) p qd’un circuit.Les instructions se traduisent par une configuration logique de portes et de bascules qui est intégrée à l’intérieur des circuits. VHDL ( et VERILOG) sont des langages de haut niveau et font alors abstraction des contraintes technologies des circuits.Génèrent du code portable, c’est à dire qu’une description écrite pour un p , q p pcircuit peut être facilement utilisée pour un autre circuit.

22

Introduction VHDL

Le VHDL est le fruit du besoin de normalisation des langages de description de matériel (Première norme IEEE1076-87 en décembre 1987).Au début des années 80, le ministère de la défense des Etats Unis (D.O.D) confiait le soin à Intermetrics, IBM et Texas Instruments de mettre au point ce langage. L’objectif était bien sûre de s’assurer une certaine indépendance vis à vis des fournisseurs de matériels et de logiciels et ainsi une assurance de maintenabilité des équipements.En 1994 la version IEEE 1076-93 suivie du standard IEEE 1164 fut établie. En 1995, afin de normaliser les méthodes de modélisation des retards des circuits ASIC ou FPGA, de grands industriels se sont associés dans la ”VITALcircuits ASIC ou FPGA, de grands industriels se sont associés dans la VITAL initiative” (VHDL Initiative Toward ASIC Libraries) fournissant des bibliothèques normalisées VITAL. Ceci est concrétisé par la norme IEEE 1076.4Très récemment, le VHDL a connu une nouvelle extension avec la première

IEEE 1076 1 1999 d l d déli i i l inorme IEEE-1076.1-1999 du langage de modélisation mixte et multi-technologique VHDL-AMS

33

Organisation fonctionnelle de développement

DiagrammeEntree syntaxiqueEntrée  Diagramme d’états

Entree syntaxique Langage  VHDLschématique

44

Page 2: Chapitre 1 Introduction to VHDL

Organisation fonctionnelle de développement

Entrée schématique

Entree syntaxique Langage  VHDL Diagramme d’états

Vérification des erreursde syntaxe

Simulation fonctionnelle

VHDL VHDL VHDL

STIMULIModelsim de syntaxe

S thèSimulation

STIMULIOu

TESTBENCH

VHDL

VHDL

Leonardo Synthèse

O ti i ti

Après synthèseVHDL

STIMULIOu

TESTBENCHEDIF, XNF

Leonardo Spectrum

OptimisationPlacement / routagedans le circuit choisi

Simulation temporelle

JEDEC

STIMULIOu

TESTBENCH

VHDL, SDFXilinx Integrated Software Environnement

ISE

La programmation du circuit se fait soit:

•En utilisant un programmateur

•En téléchargeant le code JEDEC sur l’objet technique (JTAG ou ISP)

55

Introduction VHDL

Au plus haut niveau d’abstraction, un psystème digital est vu comme une “boîte noire” avec :-un interface avec l’extérieurun interface avec l extérieur -Un contenu

En VHDL la boîte noire est nommé entité (entity)

Une entité doit toujours être associée avec au moins une description de j pson contenu: c’est l’architecture ( architecture )

66

Introduction VHDL

77

1- L’entité ( ENTITY )

Elle définit les entrées et sorties :Exemple : Un décodeur 1 parmi 4

library ieee; Use ieee.std_logic_1164.all; Déclaration des bibliothèques

Exemple : Un décodeur 1 parmi 4.

Use ieee.numeric_std.all;

Commentaires, en VHDL ils commencent par - - Déclaration de l’entité du

‐‐ décodeur ‐‐ Un parmi quatre

ils commencent par Déclaration de l entité du décodeur Corres pondance schématique

entity DECOD1_4 is 

port( IN0, IN1: in std logic;     p ( , _ g ;D0, D1, D2, D3: out std_logic); 

end DECOD1_4;

88

Page 3: Chapitre 1 Introduction to VHDL

2-L’architecture ( ARCHITECTURE )

Déclaration de l’architecture du décodeur Correspondance schématique

architecture DESCRIPTION of DECOD1_4 is begin D0 <= (not(IN1) and not(IN0)); D1 < (not(IN1) and IN0);D1 <= (not(IN1) and IN0); D2 <= (IN1 and not(IN0)); D3 <= (IN1 and IN0); end DESCRIPTION;

99

1- L’entité ( ENTITY )library ieee; Use ieee.std_logic_1164.all;Use ieee.numeric_std.all;

Déclaration des bibliothèques

décodeur

Commentaires, en VHDL ils commencent par - -

Déclaration de l’entité du décodeur Corres pondance‐‐ décodeur 

‐‐ Un parmi quatre

i DECOD1 4 i

décodeur Corres pondance schématique

entity DECOD1_4 is port( IN0, IN1: in std_logic;     

D0, D1, D2, D3: out std_logic); end DECOD1 4;

Déclaration de l’architecture du décodeur Correspondance schématique

end DECOD1_4;

architecture DESCRIPTION of DECOD1_4 is begin D0 <= (not(IN1) and not(IN0)); D1 <= (not(IN1) and IN0); D2 <= (IN1 and not(IN0));

1010

D2 <  (IN1 and not(IN0)); D3 <= (IN1 and IN0); end DESCRIPTION;

Déclaration des bibliothèques.

Toute description VHDL utilisée pour la synthèse a besoin de p p ybibliothèques.

L’ IEEE ( I nstitut of E lectrical and E lectronics E ngineers) les a li é t l ti liè t l bibli thè IEEE1164 Ellnormalisées et plus particulièrement la bibliothèque IEEE1164 . Elles

contiennent les définitions des types de signaux électroniques, des fonctions et sous programmes permettant de réaliser des opérations arithmétiques et logiques,…

1111

Déclaration de l’entité et des entrées / sorties

Elle permet de définir le NOM de la description VHDL ainsi que les entrées et sorties utilisées l’instruction qui les définit c’est port :entrées et sorties utilisées, l instruction qui les définit c est port :Syntaxe:

entity NOM_DE_L_ENTITE isport ( Description des signaux d’entrées /sorties …);end NOM_DE_L_ENTITE;

Exemple : entity SEQUENCEMENT isport (CLOCK : in std_logic;

RESET : in std_logic;Q : out std_logic_vector(1 downto 0));

end SEQUENCEMENT;end SEQUENCEMENT;Remarque : Après la dernière définition de signal de l’instruction port il ne faut jamais mettre de point virgule.

1212

Page 4: Chapitre 1 Introduction to VHDL

Déclaration de l’entité et des entrées / sorties

L’instruction port :

Syntaxe : NOM_DU_SIGNAL : sens type

Exemple : CLOCK : in std_logic;BUS : out std_logic_vector (7 downto 0);

On doit définir pour chaque signal : - Le NOM DU SIGNAL- Le NOM_DU_SIGNAL, - Le sens et- Le type.yp

1313

Déclaration de l’entité et des entrées / sorties

Le NOM DU SIGNAL- in : pour un signal en entrée- in : pour un signal en entrée.- out : pour un signal en sortie.- inout : pour un signal en entrée sortie- buffer : pour un signal en sortie mais utilisé comme entrée dans la des-cription.

1414

Déclaration de l’entité et des entrées / sorties

LE TYPELe TYPE utilisé pour les signaux d’entrées / sorties est :- le std_logic pour un signal.

le std logic vector pour un bus composé de plusieurs signaux- le std_logic_vector pour un bus composé de plusieurs signaux.Par exemple un bus bidirectionnel de 5 bits s’écrira :LATCH : inout std logic vector (4 downto 0) ;LATCH : inout std_logic_vector (4 downto 0) ;Où LATCH(4) correspond au MSB et LATCH(0) correspond au LSB .

Les valeurs que peuvent prendre un signal de type std_logic sont :‘ ’ ‘ ’- ‘0’ ou ‘L’ : pour un niveau bas.

- ‘1’ ou ‘H’ : pour un niveau haut.- ‘Z’ : pour état haute impédance- Z : pour état haute impédance.- ‘-‘ : Quelconque, c’est à dire n’importe quelle valeur.

1515

Déclaration de l’architecture

Correspondante à l’entité : description du fonctionnement

‐L’architecture décrit le fonctionnement souhaité pour un circuit ou une partie du circuit.p

-Le fonctionnement d’un circuit est généralement décrit par plusieurs d l VHDL ( l ENTITE/ARCHITECTURE)modules VHDL (couple ENTITE/ARCHITECTURE).

L’architecture établit à travers les instructions les relations entre lesL architecture établit à travers les instructions les relations entre les entrées et les sorties. On peut avoir un fonctionnement purement combinatoire, séquentiel voire les deux séquentiel et combinatoire.

1616

Page 5: Chapitre 1 Introduction to VHDL

Exemple

D i ti VHDLDescription VHDL d’un décodeurs BCD 7 Segments

1717

Exemple

Description VHDL d’un décodeurs BCDd un décodeurs BCD 7 Segments

‐‐ Décodeurs 7 segments entity DEC7SEG4 is port (DEC :in std_logic_vector(3 downto 0); 

SEG:out std_logic_vector(0 downto 6)); end DEC7SEG4;architecture DESCRIPTION of DEC7SEG4 is begin SEG <= "1111110" when DEC = 0 else "0110000"      when DEC = 1     else "1101101"   when DEC = 2l "1111001" h DEC 3 l "0110011" h DEC 4else "1111001"     when DEC = 3  else "0110011"   when DEC = 4 

else "1011011«     when DEC = 5     else "1011111"   when DEC = 6 else "1110000"     when DEC = 7     else "1111111"    when DEC = 8  else "1111011« when DEC 9 else " ";

1818

else "1111011«     when DEC = 9      else "‐‐‐‐‐‐‐"; end DESCRIPTION;

Exemple 2 : Décodage d’adresses

MémoireR0M FFFF (8K)( )RAM0 0000 (1K)RAM1 0400 (1K)RAM2 0800 (1K)RAM3 0C00 (1K)RAM3 0C00 (1K)

Entrées SortiesINTER1 8000 (2)( )INTER2 A000 (2)INTER3 C000 (16)

MémoireMémoireR0M entre E000 FFFF (8K)RAM0 entre 0000 03FF (1K)RAM1 entre 0400 07FF (1K)RAM2 entre 0800 0BFF (1K)RAM3 entre 0C00 0FFF (1K)

1919

Exemple 2 : Décodage d’adresses

‐‐ Décodage d’adressesDécodage d adressesLibrary ieee; Use ieee.std_logic_1164.all; Use ieee.numeric_std.all;_ ;

entity DECODAGE isport ( A15, A14, A13, A12, A11, A10  : in std_logic; RAM0 : out std_logic; RAM1 : out std_logic; RAM2 : out std_logic;  Mémoire

R0M t E000 FFFF (8K)RAM3 : out std_logic; ROM : out std_logic; INTER1 : out std_logic; INTER2 d l i

R0M entre E000 FFFF (8K)RAM0 entre 0000 03FF (1K)RAM1 entre 0400 07FF (1K)RAM2 t 0800 0BFF (1K)INTER2 : out std_logic;

INTER3  : out std_logic); end DECODAGE;

RAM2 entre 0800 0BFF (1K)RAM3 entre 0C00 0FFF (1K)

2020

Page 6: Chapitre 1 Introduction to VHDL

Décodage d’adresses (suite )

architecture DESCRIPTION of DECODAGE is

signal ADRESSE: std_logic_vector(15 downto 0); 

begin g

ADRESSE <= A15 & A14 & A13 & A12 & A11 & A10 & "‐‐‐‐‐‐‐‐‐‐";‐‐ definition du bus d’adresses 

ROM <= '0' when (ADRESSE >= x"E000")  and (ADRESSE <= x"FFFF")   else   '1';RAM0 <= '0' when (ADRESSE >= x"0000") and (ADRESSE <= x"03FF")   else   '1'; RAM1 <= '0' when (ADRESSE >= x"0400") and (ADRESSE <= x"07FF")   else   '1'; RAM2 <= '0' when (ADRESSE >= x"0800") and (ADRESSE <= x"0BFF")   else   '1'; RAM3 <= '0' when (ADRESSE >= x"0C00") and (ADRESSE <= x"0FFF")   else   '1';

( ) ( )INTER1 <= '0' when (ADRESSE >= x"8000") and (ADRESSE <= x"8001")   else   '1'; INTER2 <= '0' when (ADRESSE >= x"A000") and (ADRESSE <= x"A001")  else   '1'; INTER3 <= '0' when (ADRESSE >= x"C000") and (ADRESSE <= x"C00F")   else '1';

2121end DESCRIPTION;

Les Instructions de base

« mode concurrente »

Qu’est ce que le mode « concurrent » ? Pour une description VHDL toutes les instructions sont évaluées et affectent les signaux de sortie en même temps.La description génère des structures électroniques c’est la grandeLa description génère des structures électroniques, c est la grande différence entre une description VHDL et un langage informatique classique.L’ d d i t ti t t i diffé tL’ordre des instructions concurrentes est indifférentLes objets concurrents sont reliés entre eux par des signauxPour le compilateur chaque objet concurrent est un processusPour le compilateur, chaque objet concurrent est un processus.Se situent entre BEGIN et END de l’architecture

2222

Mode concurrente

Exemple :décodeur 1 parmi 4, l’ordre dans lequel seront écrites les instructions n’a aucune importanceinstructions n a aucune importance.

L’instruction D0 à été déplacée à la troisième

architecture DESCRIPTION of DECOD1_4 is begin D0 <= (not(IN1) and not(IN0)); ‐‐ 1ère instruction

ligne, la synthèse de cette architecture est équivalente à la première.

D0   (not(IN1) and not(IN0));  1ère instruction D1 <= (not(IN1) and IN0); ‐‐ 2ème instruction D2 <= (IN1 and not(IN0)); ‐‐ 3ème instruction D3 <= (IN1 and IN0); ‐‐ 4ème instruction ( );end DESCRIPTION;L’architecture ci dessous est équivalente :architecture DESCRIPTION of DECOD1 4 isarchitecture DESCRIPTION of DECOD1_4 is begin D1 <= (not(IN1) and IN0); ‐‐ 2eme instructionD2 <= (IN1 and not(IN0)); ‐‐ 3eme instructionD2 <= (IN1 and not(IN0)); ‐‐ 3eme instruction D0 <= (not(IN1) AND not(IN0)); ‐‐ 1er instruction D3 <= (IN1 AND IN0); ‐‐ 4ième instructionend DESCRIPTION;

2323

end DESCRIPTION;

Example: 2-to-4 decoder

entity decoder isport (

A : in std_logic_vector(1 downto 0);Z t td l i t (3 d t 0)

entity decoder isport (

A : in std_logic_vector(1 downto 0);Z t td l i t (3 d t 0)

A(1)

Z(1)

Z(2)

Z(3)

A(0)rface

Z : out std_logic_vector(3 downto 0));

End decoder;

Z : out std_logic_vector(3 downto 0));

End decoder; Z(0)

Z(1)A(0)

Inte

architecture when_else of decoder isb iarchitecture when_else of decoder isb ibegin

Z <= "0001" when A = "00" else"0010" when A = "01" else"0100" when A = "10" else

beginZ <= "0001" when A = "00" else

"0010" when A = "01" else"0100" when A = "10" else on

ality A(1..0) Z(3..0)

0 0 0 0 0 10 1 0 0 1 0

"1000" when A = "11" else"XXXX";

end architecture when_else;

"1000" when A = "11" else"XXXX";

end architecture when_else; Func

tio 1 0 0 1 0 01 1 1 0 0 0

2424

F

Page 7: Chapitre 1 Introduction to VHDL

Example :Multiplexeur 4 -> 1entity mux is

port (entity mux is

port (a, b, c, d: in std_logic;s : in std_logic_vector(1 downto 0);y :out std_logic);

end entity mux;

a, b, c, d: in std_logic;s : in std_logic_vector(1 downto 0);y :out std_logic);

end entity mux;a

end entity mux;

architecture mux1 of mux is

end entity mux;

architecture mux1 of mux isc

by

beginprocess (a, b, c, d, s)begin

case s is

beginprocess (a, b, c, d, s)begin

case s is

d

case s iswhen "00“ => y <= a;when "01" => y <= b;when "10" => y <= c;

h "11" d

case s iswhen "00“ => y <= a;when "01" => y <= b;when "10" => y <= c;

h "11" d

S(1) S(0)

when "11" => y <= d;end case;

end process;end architecture mux1;

when "11" => y <= d;end case;

end process;end architecture mux1;

2525

end architecture mux1;end architecture mux1;

Les Signaux (introduction)

Pour connecter les différents composants d’un système, VHDL utilise les signaux (signal) équivalent des fils ou câbles d’interconnexionles signaux (signal), équivalent des fils ou câbles d interconnexion dans le monde réel caractérisé par – Un type déclaré – Un état en référence à ce type – Un ou plusieurs pilotes (driver) qui lui sont associés

Le pilote du signal contient une liste de couples état heure celle ci étantLe pilote du signal contient une liste de couples état-heure celle-ci étant comptée relativement à l´heure actuelle du simulateur

Pilote du signal : s <= ´0´, ´1´ AFTER 10 ns,´0´ AFTER 25 ns ;

Heure état

0 0;placera dans le pilote de s

Le pilote est en fait une mémoire associée au signal.

0 0

10 1

25 0

2626

Le pilote est en fait une mémoire associée au signal.

Affectation de signal

E l S1 S2 S3 ft 5Exemple : S1 <= S2 or S3 after 5 ns;

2727

Les Signaux (introduction)

• On peut associer certains attributs aux signaux, qui produisent une valeur Deux exemples d’attributs sont:valeur. Deux exemples d attributs sont:

- s'event : vrai si un événement arrive pendant le delta présent (c’est-à-dire, si le signal s change de valeur)

- s'active : vrai si une transaction arrive pendant le delta présent (c’est-à-dire, si le signal s est évalué, qu’il change ou pas de valeur) )

• Un signal est toujours global à une architecture donnée

• Le signal n’est modifié qu’à la fin du cycle, alors que la variable est modifiée tout de suite.

• Comme le signal n’est modifié qu’à la fin du cycle, l’utilisation desComme le signal n est modifié qu à la fin du cycle, l utilisation des signaux augmente le nombre de delta-cycles alors que les variables n’affectent pas le nombre de delta-cycles.

2828

Page 8: Chapitre 1 Introduction to VHDL

Les Signaux et variables

2929

Les Signaux et variables

3030

Les Opérateurs

1 ) L’affectation simple : <=Dans une description VHDL c’est certainement l’opérateur le plus utiliséDans une description VHDL, c est certainement l opérateur le plus utilisé.

- il permet de modifier l’état d’un signal en fonction d’autres signaux et/ou d’autres opérateurs. Exemple : S1 <= E2 and E1 ;

Les valeurs numériques que l’on peut affecter à un signal sont lesLes valeurs numériques que l’on peut affecter à un signal sont les suivantes :

- ‘1’ ou ‘H’ pour un niveau haut avec un signal de 1 bit.- ‘0’ ou ‘L’ pour un niveau bas avec un signal de 1 bit.- ‘Z’ pour un état haute impédance avec un signal de 1 bit.- ‘-’ pour un état quelconque, c’est à dire ‘0’ ou ‘1’. Cette valeur est très utilisée avec les

i i h l i h S linstructions : when … else et with …. Select ….- Pour les signaux composés de plusieurs bits on utilise les guillemets" … " , voir les exemples ci dessous :- Les bases numériques utilisées pour les bus peuvent être :

BINAIRE, exemple : BUS <= "1001" ; -- BUS = 9 en décimalHEXA, exemple : BUS <= X"9" ; -- BUS = 9 en décimal

3131

HEXA, exemple : BUS X 9 ; BUS 9 en décimalOCTAL, exemple : BUS <= O"11" ; -- BUS = 9 en décimal

Les Opérateurs

ExempleLibrary ieee;Library ieee; Use ieee.std_logic_1164.all;entity AFFEC isport ( E1 E2 : in std logic;port (  E1,E2 : in std_logic;

BUS1,BUS2,BUS3 : out std_logic_vector(3 downto 0); S1,S2,S3,S4 : out std_logic); 

end AFFEC;end AFFEC;architecture DESCRIPTION of AFFEC isbeginS1 <= '1'; ‐‐ S1 = 1 ;S2 <= '0'; ‐‐ S2 = 0 S3 <= E1;  ‐‐ S3 = E1 S4 <= '1' when (E2 ='1') else 'Z'; ‐‐ S4 = 1 si E1=1 sinon S4   

‐‐ prend la valeur haute impédance BUS1 <= "1000";   ‐‐ BUS1 = "1000" BUS2 <= E1 & E2 & "10";   ‐‐ BUS2 = E1 & E2 & 10 

3232

BUS3 <= x"A";   ‐‐ valeur en HEXA ‐> BUS3 = 10(déc)end DESCRIPTION;

Page 9: Chapitre 1 Introduction to VHDL

Les Opérateurs

2 ) Opérateur de concaténation : &.Cet opérateur permet de joindre des signaux entre euxCet opérateur permet de joindre des signaux entre eux .

Exemple :p

‐‐ Soit A et B de type 3 bits et S1 de type 8 bits ‐‐ A = "001" et B ="110"‐‐ A =  001   et B = 110  

S1 <= A & B & "01" ; 

‐‐ S1 prendra la valeur suivante après cette affectation ‐‐ S1 = "00111001" 

Valeur de B « 110 »Valeur de A « 001 »

3333

Les Opérateurs

3) Opérateurs logiques.Opérateur VHDLOpérateur  VHDL ET  andNON ET  nandOU or

Remarque : Pour réaliser des décalages logiques en synthèse logique, il est préférable d’utiliser les instructions suivantes :OU or

NON OU norOU EXCLUSIF xorNON OU EXCLUSIF xnor

préférable d utiliser les instructions suivantes :

Décalage à droite :‐‐ Si A est de type std logic vector(7 downto 0)NON OU EXCLUSIF xnor

NON  notDECALAGE A GAUCHE sllDECALAGE A DROITE  srl

Si A est de type std_logic_vector(7 downto 0) S1 <= ‘0’ & A(7 downto 1); ‐‐ décalage d’un bit à droite S1 <= "000" & A(7 downto 3);  ‐‐ décalage de trois bits à droiteDécalage à gauche :

Exemples :

ROTATION A GAUCHE rolROTATION A DROITE  ror

‐‐ Si A est de type std_logic_vector(7 downto 0) S1 <= A(6 downto 0) & ‘0’; ‐‐ décalage d’un bit à gauche S1 <= A(4 downto 0) & "000"; ‐‐ décalage de trois bits à 

hExemples :S1 <= A sll 2 ;‐‐ S1 = A décalé de 2 bits à gauche. S2 <= A rol 3 ; ‐‐ S2 = A avec une

gauche

3434

S2 <= A rol 3 ;  S2 = A avec une rotation de 3 bits à gaucheS3 <= not (R);‐‐ S3 = R

Les Opérateurs

4) Opérateurs arithmétiquesOpérateur VHDL Opérateur VHDLOpérateur VHDL Opérateur VHDLADDITION  + SOUSTRACTION -MULTIPLICATION * DIVISION /Remarque N°1 : Pour pouvoir utiliser les opérateurs ci-dessus il faut rajouter

les bi- bliothèques suivantes au début du fichier VHDL :Use ieee.numeric std.all ; _ ;Use ieee.std_logic_arith.all ;Exemples :S1 < A 3 S1 A 3 O t it 3 à l l d l’ t é / i l AS1 <= A – 3 ; ‐‐ S1 = A – 3  ‐‐ On soustrait 3 à la valeur de l’entrée / signal AS1 <= S1 + 1 ; ‐‐ On incrémente de 1 le signal S1Remarque N°2 l’utilisation de ces opérateurs avec des signaux comportant un

nombre de bits important peut générer de grandes structures électroniques.Exemples :

S1 <= A * B ;‐‐ S1 = A multiplié par B : A et B sont codés sur 4 bits

3535S2 <= A / B ;‐‐ S2 = A divisé par B : A et B sont codés sur 4 bits

Les Opérateurs

5) Opérateurs relationnels

Opérateur VHDL Egal = Non égal /=Egal Non égal /Inférieur < Inférieur ou égal <=Supérieur > Supérieur ou égal >=

Ils permettent de modifier l’état d’un signal ou de signaux suivant le résultat d’un test ou d’une condition. En logique combinatoire ils sont souvent utilisés avec les instructions :

- when … else … - with …. Select ….

3636

Page 10: Chapitre 1 Introduction to VHDL

Les instructions concurrentes1) Affectation conditionnelle :Cette instruction modifie l’état d’un signal suivant le résultat d’une conditionCette instruction modifie l état d un signal suivant le résultat d une condition 

logique entre un ou des signaux, valeurs, constantes.SIGNAL<= expression when condition

[else expression when condition ][else expression]

Remarque : l’instruction [else expression] est fortement conseillée, elle permet deRemarque : l instruction [else expression] est fortement conseillée, elle permet de définir la valeur du SIGNAL dans le cas où la condition n’est pas remplie.

l °Exemple N°1 :‐‐ S1 prend la valeur de E2 quand E1=’1’ sinon S1 prend la ‐‐ valeur ‘0’ 

S1 <= E2 when ( E1= ‘1’)   else ‘0’;

Schéma correspondant

3737

p

Les instructions concurrentes

Exemple : OUT <= S2 when cond1 else S3 when cond2 else S4;Affectation conditionnelle

Exemple : OUT <= S2 when cond1 else S3 when cond2 else S4;

-- Structure evoluée d’un -- multiplexeur 4 vers 1S2 <= E1 when (SEL= « 00 » )

E2 when (SEL= « 01 » )E3 when (SEL= « 10 » )E4 when (SEL= « 11 » )else ‘0’;else 0 ;

Schéma correspondant après synthèse

3838

synthèse

Les instructions concurrentes2) Affectation sélective Cette instruction permet d’affecter 

différentes valeurs à un signal, selon les valeurs prises par un signal dit dedifférentes valeurs à un signal, selon les valeurs prises par un signal dit de sélection.

with SIGNAL_DE_SELECTION selectSIGNAL <= expression when valeur_de_selction,

[expression when valeur_de_selction,][expression when others ];[ p ]

Remarque: l’instruction [expression when others ] n’est pas obligatoire maisfortement conseillée, elle permet de définir la valeur du SIGNAL dans le cas où 

la condition n’est pas remplie.

Remarque: when others est nécessaire car il 

‐‐Multiplexeur 4 vers 1 with SEL select 

S2 < E1 h "00"faut toujours définir les autres cas du signal de sélection pour prendre en compte toutes les valeurs possibles de celui‐ci.

Exemple 1

S2 <= E1 when "00", E2 when "01", E3  when "10", E4 when "11"

3939

Exemple 1 E4  when  11 ,'0' when others;

Les instructions concurrentes2) Affectation sélective

with CODE select

OUT < S1 ft 5 h l1OUT <= S1 after 5 ns when val1,

S2 after 5 ns when val2,;......;

4040

Page 11: Chapitre 1 Introduction to VHDL

Les instructions concurrentes

ConclusionLes descriptions précédentes donnent le même schémaLes descriptions précédentes donnent le même schéma,. L’étude des deux instructions montre toute la puissance du langage VHDL pour décrire un circuit électronique en effet si on avait été obligé d’écrire les équations avec des opérateurs de base pour chaque sortie on aurait eu leséquations avec des opérateurs de base pour chaque sortie, on aurait eu les instructions suivantes :

S2 <= (E1 and not(SEL(1)) and not (SEL(0))) or (E2 and not SEL(1) and(SEL(0)) or  (E3 and SEL(1) and not 

L’é i l i i d d i

(SEL(0))) or (E4 and SEL(1) and SEL(0));

L’équation logique ci-dessus donne aussi le même schéma, mais elle est peu compréhensible, c’est pourquoi on préfère

tili l i t ti VHDL é l é

4141

utiliser les instructions VHDL évoluées

Les instructions concurrentesExemple : Affectation sélective avec les autres cas forcés à ‘0’

ib iLibrary ieee;Use ieee.std_logic_1164.all; Use ieee.numeric_std.all;U i td l i i d llUse ieee.std_logic_unsigned.all ;entity TABLE1 is port ( E1,E2 : in std_logic; SEL : in std logic vector(1 downto 0); Schéma correspondantSEL : in std_logic_vector(1 downto 0); S2  : out std_logic); end TABLE1; architecture DESCRIPTION of TABLE1 is

Schéma correspondant après synthèse:

architecture DESCRIPTION of TABLE1 is begin 

with SEL selectS2 <= E1 when "00",S2 <  E1 when 00 ,       

E2  when "01",       '0' when others;  

‐‐ Pour les autres cas de SEL S2       

4242‐‐ prendra la valeur 0 logiqueend DESCRIPTION;

Les instructions concurrentesExemple : Affectation sélective avec les autres cas à une valeur quelconque ‘-’.

Library ieee;Library ieee; Use ieee.std_logic_1164.all; Use ieee.numeric_std.all; Use ieee std logic unsigned all;Use ieee.std_logic_unsigned.all; entity TABLE3 is port ( E1,E2 : in std_logic; SEL : in std logic vector(1 downto 0);

Schéma correspondant après synthèse:

SEL : in std_logic_vector(1 downto 0); S2  : out std_logic); end TABLE3;architecture DESCRIPTION of TABLE3 isfbegin with SEL select

S2 <= E1  when "00",       E2  when "01",       '‐' when others; 

‐‐ Pour les autres cas de SEL S2        

4343

‐‐ prendra la valeur quelconque end DESCRIPTION;

Les instructions séquentiellesle langage VHDL propose un jeu très complet d'instructions séquentielles identiques à celles que l'on trouve dans les langages q q q g gde programmation évolués C++, Pascal,…etc

P blProblemeces types d'instructions ne peuvent être utilisés pour décrire les phénomènes (évolution de signaux indépendants) que l'on p ( g p ) qrencontre dans les montages à base de composants logiques

sol tionsolutionle langage VHDL propose une solution simple qui consiste à créer des ensembles appelés “process”, regroupant des instructions gséquentielles et se comportant, d'un point de vue externe, comme des instructions concurrentes

4444

Page 12: Chapitre 1 Introduction to VHDL

Les instructions séquentiellesExemple d'équivalence entre deux descriptions, l'une à base

d'instructions concurrentes et l'autre à base d'instructionsd instructions concurrentes et l autre à base d instructions séquentielles regroupées au sein d'un

4545

Les instructions séquentielles1) Définition d’un PROCESS.

Un process est une partie de la description d’un circuit dans laquelle lesUn process est une partie de la description d un circuit dans laquelle les instructions sont exécutées séquentiellement. Il permet d’effectuer des opérations sur les signaux en utilisant les instructions standard de la programmation structurée comme dans les systèmes à microprocesseurs.L’exécution d’un process est déclenchée par un ou des changementsL exécution d un process est déclenchée par un ou des changements d’états de signaux logiques. Le nom de ces signaux est défini dans la liste de sensibilité lors de la déclaration du process.

[Nom du process : ] process(Liste de sensibilité nom des signaux)[Nom_du_process : ] process(Liste_de_sensibilité_nom_des_signaux)Begin

-- instruction du processend process [Nom_du_process] ;Remarque: Le nom du process entre crochet est facultatif, mais il peut être

très utile pour repérer un process parmi d’autres lors de phases de

4646

très utile pour repérer un process parmi d autres lors de phases de mise au point ou de simulations

Les instructions séquentielles

4747

Les instructions séquentielles

Résultat de l thèla synthèse

4848

Page 13: Chapitre 1 Introduction to VHDL

Les instructions séquentielles

2) Règles de fonctionnement d’un process :

1. L’exécution d’un process a lieu à chaque changement d’état d’un signal de la liste de sensibilité. ( Ex: le process dont la déclaration est la suivante : process (A, B) va être exécuté à chaque changement d'état de l'un (ou des deux) signal (aux) A et B )changement d état de l un (ou des deux) signal (aux) A et B.)

2. L'exécution d'un process est concurrente même si les instructions qu'il contient sont séquentiellescontient sont séquentielles.

3. Les changements d’état des signaux par les instructions du process sont pris en compte à la fin du processprocess sont pris en compte à la fin du process.

4949

3) Les deux principales structures utilisées dans un process.L’assignation conditionnelle L’assignation sélective

if condition then I t ti

case signal_de_slection ish l d él ti i t tiInstructions

[elsif condition then instructions] [else instructions] end if ;

when valeur_de_sélection => instructions [when others => instructions]   end case;Exemple:end if ;

Exemple:

Exemple: case SEL is

when “000” => S1 <= E1; when “001” => S1 <= ‘0’;

if ( RESET =’1’) then SORTIE <= ”0000”;end if ;

when 001  => S1 <=  0 ; when “010” | “011” => S1 <=’1’; 

‐‐ La barre | permet de réaliser ‐‐ un ou logique entre les deuxun ou logique entre les deux‐‐ valeurs “010” et “011” when others => S1 <= ‘0’;   end case;

5050

;

Remarque : ne pas confondre => (implique) et <= (affecte).

Instruction "if...then....else”IF condition1 THENinstructions séquentielles; INSTRUCTION   I FELSIF condition2 THEN instructions séquentielles;ELSIF condition3 THEN instructions séquentielles;ELSE  instructions séquentielles;END IF;

Début de IF

Condition 1SI condition1 ALORSinstructions séquentielles;SINON SI condition2 ALORS  instructions séquentielles; Instructions C diti 2

q ;SINON SI condition3 ALORS  instructions séquentielles;SINON  instructions séquentielles;FIN DU SI;

séquentielles

Instructionsséquentielles

Condition2

IF

ESLSIF

Instructions séquentielles

Condition nESLSIF

Instructionsséquentielles

ESLSIF

ESLS

5151Fin de IF

ESLS

Instruction "case"

CASE signal ISWHEN valeur1 => instructions séquentielles;

INSTRUCTION CASE

L'instruction “When others” n'est pas obligatoire, elle représente une facilité d'écriture.

WHEN valeur1 => instructions séquentielles;WHEN valeur2 => instructions séquentielles;WHEN valeur3 => instructions séquentielles;WHEN OTHERS =>  instructions séquentielles;END CASE;

Début de case

END CASE;

vqleur 1CAS possibles de l’expression ESTLORSQUE signal = valeur1 => instructions séquentielles; Instructions vqleur2When valeur1LORSQUE signal = valeur2 => instructions séquentielles;LORSQUE signal = valeur3 => instructions séquentielles;LORSQUE signal = AUTRES => instructions séquentielles;FIN DE CAS;

séquentielles

Instructionsséquentielles

vqleur2

l

When valeur2

Instructionsséquentielles

vqleur n

When valeur n

Instructionsséquentielles

When others

5252Fin CASE

Page 14: Chapitre 1 Introduction to VHDL

Instruction "for...while...loop"

53

Exemples de processDéclaration d’une bascule D

Flip-floparchitecture rtl of D_FF isbeginarchitecture rtl of D_FF isbegin

D QD Qprocess (Clock, Reset) isbegin

if Reset = ‘1’ thenQ <= ‘0’;

process (Clock, Reset) isbegin

if Reset = ‘1’ thenQ <= ‘0’;

ClockR

Q <= 0 ;if rising_edge(Clock) then

Q <= D;end if;

Q <= 0 ;if rising_edge(Clock) then

Q <= D;end if;

Resetend process;end architecture rtl;

end process;end architecture rtl;

5454

Commentaires :

Seul le signal CLK fait partie de la liste de sensibilité. D’après les è l d f ti t é é é éd t lrègles de fonctionnement énoncées précédemment, seul un

changement d’état du signal CLK va déclencher le process et par conséquent évaluer les instructions de celui-ci.L’instruction if (CLK'event and CLK='1') then permet de détecter un front montant du signal CLK. La détection de front est réalisée par l’attribut event appliqué à l’horloge CLK Si on veut unl attribut event appliqué à l horloge CLK. Si on veut un déclenchement sur un front descendant, il faut écrire l’instruction suivante : if (CLK'event and CLK='0').L bibli thè IEEE èd t d i t ti tt t dLes bibliothèques IEEE possèdent deux instructions permettant de détecter les fronts montants ) rising_edge(CLK) ou descendants falling_edge(CLK).Si la condition est remplie alors le signal de sortie S sera affecté avec la valeur du signal d’entrée D.

5555

Exemples de processExemple N°2 : Même exemple queMême exemple que précédemment mais avec des entrées de présélections de mise à zéro RESET prioritaire surà zéro RESET prioritaire sur l’entrée de mise à un SET, toutes les deux sont synchrones de ’ Cl’horloge CLK.

Set

D QD S

ClkR

5656Reset

Page 15: Chapitre 1 Introduction to VHDL

Exemples de processSchéma correspondant après synthèse:

5757

Exemples de process

Exemple N°3 : Même exemple queMême exemple que précédemment mais avec des entrées de résélections, de mise à zéro RESET prioritaire sur l’entrée de mise à un SET toutes lesmise à un SET, toutes les deux sont asynchrones de l’horloge CLK.

5858

Exemples de processCommentaire L’entrée RESET est prioritaire sur l’entrée SET qui est à son tourL entrée RESET est prioritaire sur l entrée SET qui est à son tour prioritaire sur le front montant de l’horloge CLK. Cette description est asynchrone car les signaux d’entrée SET et RESET sont mentionnés y gdans la liste de sensibilité du process.

Schéma correspondantcorrespondant après synthèse

5959

Exemples de process

Exemple N°4 : Bascule TBascule T

Bascule T

D QD SD Q

Clk

D S

ClkR

6060

Page 16: Chapitre 1 Introduction to VHDL

Exemples de process

S héSchéma correspondant après synthèse

Commentaires :La description ci-dessus fait appel à un signal interne appelé S_INTERNE, pourquoi faire appel à celui-ci ?pourquoi faire appel à celui-ci ?La réponse est que le signal S est déclaré comme une sortie dans l’entité, et par conséquent on ne peut pas utiliser une sortie en entrée. Pour contourner cette difficulté on utilise un signal interne qui peut être à la fois une entrée ou une sortie. Avec cette façon d’écrire, les signaux de sortie d’une description ne sont jamais utilisés comme des entrées. Cela permet une plus

6161

p j p pgrande portabilité du code.

Exemples de process

Si on ne déclare pas de signal interne, le synthétiseur renverra certainement une erreur du type :

E t d t t [ d b ff i t]Error, cannot read output: s; [use mode buffer or inout].

Le synthétiseur signale qu’il ne peut pas lire la sortie S et par conséquent celle-ci doit être du type buffer ou inoutconséquent, celle ci doit être du type buffer ou inout.

Remarque : Si on souhaite ne pas utiliser de variable interne on peut déclarer le signal S de type buffer ou inout.

Ce qui donne pour descriptionsCe qui donne pour descriptions

6262

Exemples de processCommentaires : On peut constater que S est bien du type inout.

Commentaires : On peut constaterque S est bien du type buffer.

6363

Les compteurs

Ils sont très utilisés dans les Library ieee;Use ieee.std logic 1164.all;

d’un compteur peut être très simple comme très compliquée. Ils font appels aux process.

_ g _ ;Use ieee.numeric_std.all;Use ieee.std_logic_unsigned.all;entity CMP4BITS ispp p

4.1) Compteur simple :entity CMP4BITS isPORT ( CLOCK : in std_logic;

Q : inout std_logic_vector(3 downto 0));end CMP4BITS;architecture DESCRIPTION of CMP4BITS isBegin g

process (CLOCK)Begin if (CLOCK ='1' and CLOCK'event) then

Q <= Q + 1;Q <= Q + 1; end if;

end process;Compteur de "0" à "15", et qui fonctionne sur front montant

6464

end DESCRIPTION;

Page 17: Chapitre 1 Introduction to VHDL

Les compteurs

Commentaires :Le déclenchement du process se fera sur un changement du CLOCKLe déclenchement du process se fera sur un changement du CLOCK, l’incrémentation de la sortie Q se fera sur le front montant de l’horloge CLOCK. • L’incrémentation du compteur est réalisée par l’opérateur + associé à la valeur 1.

Cela est logique, mais elle l’est beaucoup moins pour les PLDs et les synthétiseurs, pourquoi ? La réponse est que les entrées et sorties ainsi que les signaux sont déclarés de type std_logic ou std_logic_vector, et par conséquent

t l i d l tiè dé i lon ne peut pas leur associer de valeur entière décimale.• Un signal peut prendre comme valeur les états ‘1’ ou ‘0’ et un bus n’importe quelle

valeur, du moment qu’elle est écrite entre deux guillemets "1010" ou X"A" ou o"12", mais pas une valeur comme par exemple 1,2,3,4. Ces valeurs décimales sont interprétées par le synthétiseur comme des valeurs entières (integer), on ne peut pas par défaut additionner un nombre entier 1 avec un bus de type él t i ( t l i t ) ’ t l l’ j t d l tiélectronique (st_logic_vector), c’est pour cela que l’on rajoute dans la partie déclaration des bibliothèques les lignes :

6565

Les compteursCommentaires :Use ieee.numeric_std.all;_Use ieee.std_std_ligic_unsigned.all;

Ces deux bibliothèques ont des fonctions de conversions de types et ellesCes deux bibliothèques ont des fonctions de conversions de types et elles permettent d’associer un entier avec des signaux électroniques. Elles permettent d’écrire facilement des compteurs, décompteurs, additionneurs, soustracteurssoustracteurs, …..

Remarque 1: Il ne faut pas oublier de les rajouter dans les descriptions.

Remarque 2 : Le signal Q est déclaré dans l’entité de type inout, cela est logique car il est utilisé à la fois comme entrée et comme sortie pour permettre l’incrémentation du compteur. Ce type d’écriture est peu utilisé car elle ne permet pas au code d’être portable, on préféra utiliser un signal interne, celui-ci peut être à la fois une entrée et une sortie.

6666

Les compteurs

Avec bus interne :Library ieee;Use ieee.std_logic_1164.all;U i i d llAvec bus interne :

Même description en utilisant un bus interne:

Use ieee.numeric_std.all;Use ieee.std_logic_unsigned.all;entity CMP4BITS isutilisant un bus interne:PORT ( CLOCK : in std_logic;

Q : out std_logic_vector(3 downto 0));end CMP4BITS;

CMP4BITSCLOCk

architecture DESCRIPTION of CMP4BITS isSignal Q_BUS_INTERNE : std_logic_vector(3 downto 0));CLOCk Q0

Q1Q2

Begin process (CLOCK)Begin if (CLOCK ='1' and CLOCK'event) then

Q3g ( )

Q_BUS_INTERNE <= Q_BUS_INTERNE + 1; end if;

end process;

6767

end process;Q <= Q_BUS_INTERNE – affectation du Bus interne à Qend DESCRIPTION;

Les compteurs

Compteur mise à un SET et mise à éro

Library ieee; Use ieee.std_logic_1164.all; Use ieee numeric std all;SET et mise à zéro

RESETCompteur 3 bits avec remise

Use ieee.numeric_std.all;Use ieee.std_logic_unsigned.all;entity CMP3BITS isPORT (CLOCK : in std_logic; Compteur 3 bits avec remise

à zéro asynchrone.RESET : in std_logic; Q : out std_logic_vector(2 downto 0));

end CMP3BITS;architecture DESCRIPTION of CMP3BITS isarchitecture DESCRIPTION of CMP3BITS issignal CMP: std_logic_vector (2 downto 0);Begin process (RESET,CLOCK) CMP3BITSBegin

if RESET ='1' then CMP <= "000";elsif (CLOCK ='1' and CLOCK'event) then

CLOCk Q0Q1

Reset elsif (CLOCK 1 and CLOCK event) then CMP <= CMP + 1; end if;

end process;Q CMP

Q2Reset

6868

Q <= CMP;end DESCRIPTION;

Page 18: Chapitre 1 Introduction to VHDL

Les compteursCompteur 3 bits avec remise 

à zéro synchroneLibrary ieee;     Use ieee.std logic 1164.all;     à zéro synchrone

Quelle différence entre les deux descriptions ? Le signal RESET

_ g _ ;Use ieee.numeric_std.all;Use ieee.std_logic_unsigned.all;entity CMP3BITS isPORT (CLOCK i td l in’est plus dans la liste de

sensibilité, le process ne sera déclenché que par le CLOCK

PORT (CLOCK : in std_logic;   RESET : in std_logic; Q : out std_logic_vector(2 downto 0));

end CMP3BITS;déclenché que par le CLOCK. La remise à zéro ne se fera que si un front montant sur CLOCK a lieu

CMP3BITS

;architecture DESCRIPTION of CMP3BITS issignal CMP: std_logic_vector (2 downto 0);Begin       

(CLOCK)CMP3BITS

CLOCk Q0Q1

process (CLOCK)     Begin   

elsif (CLOCK ='1' and CLOCK'event)  thenif RESET ='1' then  Q1

Q2CMP <= "000";   else  CMP <= CMP + 1;   end if; end if;

end process;

6969Reset

end process;Q <= CMP;end DESCRIPTION;

Les compteurs

Compteur générique use ieee.numeric_std.all; entity counter isuse ieee.numeric_std.all; entity counter is

avec mise à ZEROCompteur générique à n

sorties

ygeneric (n : integer := 4); port (

clk : in std_logic;t i td l i

ygeneric (n : integer := 4); port (

clk : in std_logic;t i td l isorties reset: in std_logic;

count: out std_logic_vector(n-1 downto 0) );end entity counter;

reset: in std_logic;count: out std_logic_vector(n-1 downto 0) );

end entity counter;

architecture binary of counter isbegin

process (clk, reset)ariable cnt nsigned(n 1 do nto 0)

architecture binary of counter isbegin

process (clk, reset)ariable cnt nsigned(n 1 do nto 0)

CMP3BITS

CLOCK Q0 variable cnt : unsigned(n-1 downto 0);begin

if reset = '1' then -- async resetcnt := (others => '0');

variable cnt : unsigned(n-1 downto 0);begin

if reset = '1' then -- async resetcnt := (others => '0');

Q0Q1

( );elsif rising_edge(clk) then

cnt := cnt + 1;end if;count <= std logic vector(cnt);

( );elsif rising_edge(clk) then

cnt := cnt + 1;end if;count <= std logic vector(cnt);

Qn-1Reset

7070

count <= std_logic_vector(cnt); end process;

end architecture binary;

count <= std_logic_vector(cnt); end process;

end architecture binary;

Les compteurs Library ieee;Use ieee.std_logic_1164.all;

Compteur / Décompteur à entrée de préchargement

Use ieee.numeric_std.all;Use ieee.std_logic_unsigned.all;entity CMP4BITSLUD isPORT (p g

UP = 1 compteurUP =0 décompteurRemarque :

PORT (RESET, CLOCK, LOAD, UP: in std_logic;DATA : in std_logic_vector (3 downto 0);Q : out std_logic_vector (3 downto 0));Remarque :

CMP <= "0000"; mise à zéro des sorties

end CMP4BITSLUD;architecture DESCRIPTION of CMP4BITSLUD issignal CMP: std_logic_vector (3 downto 0);beginAutre façon d’écrire cette instruction

est :CMP <= (others => ’0’) ;

beginprocess (RESET,CLOCK)begin

if RESET ='1' then

Cette dernière est très utilisée dans les descriptions car elle permet de s’affranchir de la taille du bus

CMP <= "0000"; -- Remise à zero asy du compteurelsif (CLOCK ='1' and CLOCK'event) thenif (LOAD =’1’) then

CMP <= DATA; -- Préchargement synchrones affranchir de la taille du bus. others =>’0’ correspond à mettre tous les bits du bus à zéro quelque

soit le nombre de bits d b s

CMP < DATA; Préchargement synchroneelse if (UP =’1’) then CMP <= CMP + 1; -- Incrém

else CMP <= CMP – 1; -- Décrémsynchroneend if; end if; end if;

d

7171

soit le nombre de bits du bus. end process;Q <= CMP;end DESCRIPTION;

Les compteursLibrary ieee;Use ieee.std_logic_1164.all;Use ieee.numeric std.all;

Les erreurs classiques avec l’utilisation de

Use ieee.numeric_std.all;Use ieee.std_logic_unsigned.all;

entity CMP4BITSRET isavec l utilisation de process

PORT (RESET, CLOCK : in std_logic; RET : out std_logic;Q : out std logic vector (3 downto 0));

Exemple : compteur avec retenue (fonctionnement incorrect)

Q : out std_logic_vector (3 downto 0));end CMP4BITSRET;architecture DESCRIPTION of CMP4BITSRET issignal CMP: std_logic_vector (3 downto 0);incorrect). beginprocess (RESET,CLOCK)begin

if RESET ='1' then CMP <= "0000";if RESET = 1 then CMP <= 0000 ;elsif (CLOCK ='1' and CLOCK'event) thenCMP <= CMP + 1;

if (CMP = "1111") then RET <= '1‘–- La retenue passera à un quand CMP = 14 décimalElse RET <= '0';end if; end if; end process;

7272

end if; end if; end process;Q <= CMP;

end DESCRIPTION;

Page 19: Chapitre 1 Introduction to VHDL

Les compteurs

Les résultats de simulation appellent quelques commentaires :On s’aperçoit que le signal de retenue RET passe au niveau logique haut quand

la valeur du compteur vaut 0, pourquoi ?car la règle 3 des process qui dit que les valeurs de signaux à l’intérieur d’un

process ne sont mis à jour qu’à la fin de celui-ci.Dans notre cas, prenons l’état où CMP=14, au coup d’horloge suivant on

incrémente le compteur CMP, mais la nouvelle valeur ne sera affectée à pCMP qu’à la fin du process, donc quand le test pour valider le signal de retenue est effectué, la valeur de CMP est égale à 14, et celui-ci n’est pas valide. Au coup d’horloge suivant CMP=15 et CMP est incrémenté donc

7373

prendra la valeur 0 à la fin du process., mais la condition CMP= "1111" sera valide et le signal de retenue RET passera au niveau logique un.

Les compteursLibrary ieee;Use ieee.std_logic_1164.all;Use ieee.numeric std.all;

Comment faire pour pallier à ce problème ?

Use ieee.numeric_std.all;Use ieee.std_logic_unsigned.all;

entity CMP4BITSRET ispdeux solutions1) Il faut anticiper d’un coup

d’horloge on valide la

PORT (RESET, CLOCK : in std_logic; RET : out std_logic;Q : out std logic vector (3 downto 0));d horloge, on valide la

retenue quand la valeur du compteur vaut 14, c’est à dire n-1.

Q : out std_logic_vector (3 downto 0));end CMP4BITSRET;architecture DESCRIPTION of CMP4BITSRET issignal CMP: std_logic_vector (3 downto 0);dire n 1.

Remarque : Dans ce cas la validation de la

retenue s’effectue de façon

beginprocess (RESET,CLOCK)begin

if RESET ='1' then CMP <= "0000";retenue s effectue de façon synchrone car elle est dans le process, mais la description est peu lisible

if RESET = 1 then CMP <= 0000 ;elsif (CLOCK ='1' and CLOCK'event) thenCMP <= CMP + 1;

if (CMP = "1110") then RET <= '1‘description est peu lisible.–- La retenue passera à un quand CMP = 14 décimalElse RET <= '0';end if; end if; end process;

7474

end if; end if; end process;Q <= CMP;

end DESCRIPTION;

Les compteurs architecture DESCRIPTION of CMP4BITSRET is

2) Le test de validation de la

signal CMP: std_logic_vector (3 downto 0);

begin

process (RESET CLOCK)2) Le test de validation de la retenue est effectuée en dehors du process

Remarque : Dans ce cas la

process (RESET,CLOCK)

begin

if RESET='1' thenRemarque : Dans ce cas la

validation de la retenue s’effectue de façon asynchrone car elle est en

CMP <= "0000";

elsif (CLOCK ='1' and CLOCK'event) then

CMP <= CMP + 1;asynchrone car elle est en dehors du process, mais la description est lisible.

CMP CMP 1;

end if;

end process;.

Q <= CMP;

-- Validation de la retenue

RET <= '1' when (CMP = "1111") else '0';RET 1 when (CMP 1111 ) else 0 ;

end DESCRIPTION;

7575

Les compteurs architecture DESCRIPTION of CMP_BCD8 issignal DIGIT_MSB, DIGIT_LSB: std_logic_vector

Compteur BCD deux digits Ce type des compteurs compte de "0"

g _ _ _ g _(3 downto 0);beginprocess (RESET,CLK)beginCe type des compteurs compte de 0

jusqu'à "99", il est à 8 bits, il est composé de deux sous-Compteurs : LSB t MSB h t à 4 bit l

beginif RESET ='1' thenDIGIT_LSB <= (others=>'0');DIGIT_MSB <= (others=>'0');

LSB et MSB, chacun est à 4 bits, le signal MSB s'incrémente que lorsque le signal LSB passe de "9" à "0".

_ ( );elsif (CLK ='1' and CLK'event) then

if DIGIT_LSB < 9 thenDIGIT_LSB <= DIGIT_LSB + 1;

lg p

elseDIGIT_LSB <= (others=>'0');

if DIGIT_MSB < 9 thenDIGIT MSB <= DIGIT MSB + 1 ;

Library ieee;Use ieee.std_logic_1164.all;Use ieee numeric std all; DIGIT_MSB < DIGIT_MSB + 1 ;

elseDIGIT_MSB <= (others=>'0');end if;

Use ieee.numeric_std.all;Use ieee.std_logic_unsigned.all;

entity CMP_BCD8 isend if;

end if;end process;Q <= DIGIT MSB & DIGIT LSB;

PORT (RESET, CLK : in std_logic;Q : out std_logic_vector (7 downto 0));

end CMP BCD8

7676

Q <= DIGIT_MSB & DIGIT_LSB;end DESCRIPTION;

end CMP_BCD8;

Page 20: Chapitre 1 Introduction to VHDL

Library ieee; Use ieee.std_logic_1164.all; U i i td ll

DIGIT_MSB <= (others =>'0');    elsif (CLK ='1' and CLK'event) thenif DIGIT LSB 9 thUse ieee.numeric_std.all; 

Use ieee.std_logic_unsigned.all;entity CMP_BCD8 is PORT ( RESET CLK : in std logic;

if DIGIT_LSB < 9 thenDIGIT_LSB <= DIGIT_LSB + 1;     

elseDIGIT LSB <= (others=>'0');PORT ( RESET, CLK : in std_logic; 

Q : out std_logic_vector (7 downto 0)); end CMP_BCD8;architecture DESCRIPTION of CMP BCD8 is

DIGIT_LSB <= (others=> 0 );      if DIGIT_MSB < 9 thenDIGIT_MSB <= DIGIT_MSB + 1 ;     

elsearchitecture DESCRIPTION of CMP_BCD8 is signal DIGIT_MSB, DIGIT_LSB: std_logic_vector (3 downto 0); begin

else DIGIT_MSB <= (others=>'0');        

end if;     end if;begin 

process (RESET,CLK)   beginif RESET ='1' then  

end if;     end if;   end process;   Q <= DIGIT MSB & DIGIT LSB;f

DIGIT_LSB <= (others =>'0');  Q _ _ ;end DESCRIPTION;

7777