Upload
dhekra-jbeli
View
51
Download
4
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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;
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
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
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
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
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
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
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
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;
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;
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;
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;
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