Vous êtes sur la page 1sur 19

09/11/2021

Cours n°2 – Le langage VHDL Cédric Meyer S

Plan
S Introduction

S Trame d’une description VHDL


S Entité S Approfondissements types et objets
S Type et mode des signaux S Types synthétisables ou non
S Architecture S Signaux/variables/constantes
S Tableaux/record
S VHDL de type « flot de données »
S Création de nouveaux types
S Assignations inconditionnelles
S Les attributs
S Opérateurs logiques et arithmétiques
S Assignations conditionnelles S Composants génériques
S Assignations sélectives
S Concaténation S VHDL structurel
S Déclarations
S VHDL comportemental
S Instanciations
S Process
S Assignations conditionnelles S VHDL pour la simulation
S Assignations sélectives
S Testbench
S Création de stimuli
S Wait

1
09/11/2021

Introduction

Objectif premier :
• Permettre/simplifier la saisie de logigrammes
en vue de l’implémentation sur CPLD/FPGA

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity demux74154 is port


(
Adr :in std_logic_vector(3 downto 0);
G1N,G2N:in std_logic;
Y :out std_logic_vector(15 downto 0)
);
end demux74154;

architecture a_demux74154 of demux74154 is


begin
etiquette: for i in 0 to 15 generate
Y(i)<=(G1N or G2N) when Adr=i else '1';
end generate;
end a_demux74154 ;
3

Le langage VHDL
Very High Speed Integrated Circuit
Hardware
Description
Language

C’est un langage complet de description matérielle


trés utilisé pour la synthèse logique des
composants programmables type CPLD et FPGA.

2
09/11/2021

VHDL : un langage normalisé


(mais qui évolue !)
•Historiquement, c’est le DAD (Département Américain
de la Défense) qui lança le projet VHDL dans les années
1970 de façon à ce que l’ensemble de leurs
fournisseurs travaillent avec un langage commun

•1987 IEEE (Institute of Electrical & Electronic Engineers)


IEEE1076
(reconnaît uniquement le bit avec 2 valeurs)
•1993 IEEE 1164
(signaux logiques multivaleurs)
•1997 IEEE 1076.3
(gestion des types complémentaires: représentation signée)
•Remises à jour: 1999 IEEE 1076.6; VHDL.2002; etc.

Avantages du langage VHDL


Simplification et concision de la description d’un composant

Facilité de lecture

Universalité

Indépendance vis-à-vis du circuit cible

Langage assurant une portabilité, indépendant des outils

Rigueur qui permet d’éviter des erreurs

Raccourcit le temps de conception

Langage unique pour description, simulation et spécification

3
09/11/2021

Schéma ➔description
VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity demux74154 is port


(
Adr :in std_logic_vector(3 downto 0);
G1N,G2N:in std_logic;
Y :out std_logic_vector(15 downto 0)
);
end demux74154;

architecture a_demux74154 of demux74154 is


begin
etiquette: for i in 0 to 15 generate
Y(i)<=(G1N or G2N) when Adr=i else '1';
end generate;
end a_demux74154 ; 7

1.Trame d’une description VHDL


La description d’un composant logique se fait en 3 parties:
1. Déclaration des librairies utilisées
2. Description des broches d’E/S du composant. (Entité)
3. Description de la structure du composant. (Architecture)

La trame (ou le format imposé) d’une description VHDL est la suivante :


Librairies

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity Nom_de_l’entité is port (= nom du fichier) A


S
Description des E/S de la structure en explicitant pour chacune B
Entité

d’elles le nom, la direction et le type.


End Nom_de_l’entité ;

Architecture Nom_de_l’architecture of Nom_de_l’entité is


A
Architecture

Zone de déclaration des signaux internes


Begin Qu’est-ce S
Description de la B qui se passe
là dedans?
structure logique
End Nom_de_l’architecture ;

4
09/11/2021

2. L’entité
entity CTR8_Raz is port
entity CTR8 is port
(

L’entité
(
H : in std _logic; H : in std_ logic; -- commentaire
Ns : out integer range 0 to 255 R : in std _ logic;
); TC : out std _ logic;
end CTR8; Ns : buffer std _logic_vector(7 downto 0)
);
end CTR8_Raz;
• L’entité porte un nom qui doit être unique dans un projet
• On y trouve la déclaration des signaux d’entrée et de sortie du composant
• Pas de ; à la fin de la déclaration du dernier signal de l’entité
• Chaque signal est associé à un type et à un mode (direction)
Les différents modes possibles
Mode description Commentaires
(Direction)
in Entrée On ne peut qu’en lire la valeur
out Sortie On ne peut pas lire: on ne peut qu’écrire
Sortie avec possibilité On peut lire et écrire (utile pour les rebouclages internes)
buffer de lecture Seul le composant peut écrire une valeur
Entrée/Sortie 3 états On peut lire et écrire et l’écriture peut être faite par plus d’un
inout
composant (ou 0)
Entrée/Sortie 3 états Idem inout mais ne peut être lié qu’à d’autres signaux de mode
linkage 9
linkage (à oublier)

2. L’entité

• Un signal peut aussi être déclaré en interne au composant (ni entrée, ni sortie)
Dans ce cas il doit être déclaré entre les mot-clé architecture et begin
On ne précise alors pas de mode(direction)
Exemple : Architecture A of Composant is
-- declaration de trois signaux internes de type std_logic
signal A,B,C : std_logic;
Begin

Quelques types d’objets (d’autres disponibles en fonction des bibliothèques utilisées)


Type « d’objets » Exemple Commentaires
d’écriture
bit ‘0’ ‘1’ Le bit n’a que ces 2 valeurs
std_logic ‘0’ ‘1’ A en tout 9 valeurs possibles: Voir ci-dessous
U: non initialisé; X: inconnu forçage fort; 0: NLB forçage fort; 1: NLH forçage fort; Z: Haute impédance; W:
inconnu forçage faible; L: NLB forçage faible; H: NLH forçage faible; -: quelconque
std_logic_vector(n downto 0) "00010111" Vecteur de std_logic écriture binaire
O"127" Vecteur de std_logic écriture octale
X"A6E4" Vecteur de std_logic écriture hexadécimale.
integer range p1 to p2 187 16 -5 Entier (positif ou négatif)
10

5
09/11/2021

3. L’architecture combinatoire
VHDL type « flot de données »
3.1 Assignation inconditionnelle: exemple n°1
A B Som Ret
architecture A_addi of Additionneur is
begin 0 0 0 0
Som <= A xor B ; 0 1 1 0
Ret <= A and B ; 1 0 1 0
end A_addi;
1 1 0 1

XOR
Opérateurs logiques A
Som
opérateur action Type opérande B
et résultat 1
NOT NON Booléen,
AND2
AND ET bits, A
NAND ET NON bit_vecteur, Ret
OR OU Std_logic,
B
2
NOR OU NON Std_logic_vector
XOR OU exclusif Ainsi on impose au synthétiseur
XNOR OU exclusif des portes logiques
NON
11

3. L’architecture combinatoire
VHDL type « flot de données »
3.1 Assignation inconditionnelle: exemple n°2

library ieee;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_1164.all; architecture A_op_Num of op_Num is
begin
entity op_Num is port Somme <= A +B ;
(
Produit<= A * B ;
A,B: in integer range 0 to 255;
Somme: out integer range 0 to 511; end A_op_Num;
Produit: out integer range 0 to 65535
);
end op_Num ;
Opérateurs arithmétiques
Opérateur action Type opérande et résultat
+ Somme Bit_vector
- Soustraction
Std_logic_vector
* Multiplication
/ Division euclidienne Integer
12

6
09/11/2021

3. L’architecture combinatoire
VHDL type « flot de données » A B Som Ret

3.2- Assignation conditionnelle (utilisation de 0 0 0 0


when) 0 1 1 0
1 0 1 0
architecture A_addi of Additionneur is 1 1 0 1
begin
Som <= '0' when ((A='0') and (B='0')) or ((A='1') and (B='1')) else '1‘ ;
Ret <= '1' when (A='1') and (B='1') else '0‘ ;
end A_addi ;

L’instruction dans le cas général :


(signal) <= (valeur1) when (Condition1)
else (valeur2) ) when (Condition2)

else (valeurDefaut) ;

Opérateurs de test (renvoie une variable type booléenne)


opérateur action opérateur action
= Égal <= Inférieur ou égal
/= Pas égal > Supérieur strictement
< Inférieur strictement >= Supérieur ou égal
13

3. L’architecture combinatoire
VHDL type « flot de données »
3.2- Assignation conditionnelle
Exemple de fichier complet avec utilisation de l’instruction « generate »

--Demultiplexeur 4 vers 16

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.all;

Entity demux74154 is Port(


Adr : in std_logic_vector(3 downto 0);
G1N, G2N : in std_logic;
Y : out std_logic_vector(15 downto 0)
);
End demux74154;

Architecture a_demux74154 of demux74154 is


Begin
etiquette: for i in 0 to 15 generate
Y(i)<=(G1N or G2N) when Adr=i else '1';
end generate;
End a_demux74154 ;

14

7
09/11/2021

3. L’architecture combinatoire
VHDL type « flot de données »

3.3- Assignation sélective


architecture A_addi3 of Additionneur is
signal AB : std_logic_vector(1 downto 0); A B Som Ret
begin 0 0 0 0
AB <= A&B;
0 1 1 0
with AB select
Som <= '1’ when “01”|“10”, 1 0 1 0
'0’ when others; 1 1 0 1
with AB select
Ret <= '1’ when “11”,
‘0’ when others; Attention : les signes « , » ou
end A_addi3 ; « ; » doivent être respectés.

L’instruction dans le cas général :


with (Signal1) select
(Signal2) <= (Valeur21) when (Valeur1 du signal1),
(Valeur22) when (Valeur2 du signal1),
etc… ,
(Valeur2n) when others ;
15

3. L’architecture combinatoire
VHDL type « flot de données »
3.3- Assignation sélective
Assignation sélective. Exemple de fichier complet

--Octuple multiplexeur 4 vers 1

library ieee; architecture Arch_Mux8 of Mux8 is


use ieee.std_logic_1164.ALL; begin
use ieee.std_logic_unsigned.all; with Adr select
S<= A when "00",
entity Mux8 is port( B when "01",
Adr : in std_logic_vector(1 downto 0); C when "10",
A,B,C,D : in std_logic_vector(7 downto 0); D when others;
S : out std_logic_vector(7 downto 0) end Arch_Mux8 ;
);
end Mux8;

16

8
09/11/2021

4. Opérations sur les bits et vecteurs


Concaténation
entity CONCAT is port(
A : in std_logic;
P : in std_logic_vector(5 downto 0);
Q : buffer std_logic_vector(7 downto 0)
);
end CONCAT;
architecture a_CONCAT of CONCAT is
begin
Q <= A & P & '0’;
end a_CONCAT;

entity CONCAT2 is port(


Ne : in std_logic_vector(3 downto 0); VCC INPUT
Ne[3..0]
Ns : buffer std_logic_vector(6 downto 0)
VCC

1
);
end CONCAT2; 1 , Ne[3..0] , 0 , 0 WIRE
Ns[6..0]
architecture a_CONCAT2 of CONCAT2 is inst4
0
begin
Ns <= '1' & Ne & "00"; GND OUTPUT
Ns[6..0]
end a_CONCAT2;
17

5. L’architecture séquentielle
VHDL type « comportemental »
5.1- Processus (Process)
Un process est un groupe délimité d’instructions, doté de trois caractéristiques
essentielles:

1. Le processus s’exécute à chaque changement d’état d’un des signaux auxquels il


est déclaré sensible.
• Un signal d’entrée est dit sensible si, changeant seul d’état, il peut amener
une ou plusieurs sorties à changer.
(Nota: des entrées synchrones ne sont pas sensibles)
2. Les instructions du processus s’exécutent séquentiellement.

3. les modifications apportées aux valeurs de signaux par les instructions prennent
effet à la fin du processus.

5.2- Représentation d’une transition (= front) d’un signal


Front montant: (H'EVENT AND H = '1') Front descendant: (H'EVENT AND H = ‘0')

Ou bien: rising_edge(H) Ou bien: falling_edge(H)


Attention: Le processus n’est déclenché que lorsque un des signaux sensibles change
d’état. S’il n’y a pas de signal sensible le process se redéclenche dès qu’il arrive à
l’instruction END PROCESS.
Nota: Le signal d’horloge d’un compteur ainsi que les entrées asynchrones sont sensibles
ainsi que les entrées de données parallèles si le LOAD est asynchrone. 18

9
09/11/2021

5. L’architecture séquentielle
VHDL type « comportemental »

5.3- Assignation conditionnelle: if … then


Qi est déclaré en vecteur il faut y
Liste des signaux sensibles. Le charger un vecteur et non un entier
process ne sera déclenché que si un Bien que Qi soit un vecteur cette
de ces signaux change d’état. instruction ne retourne pas d’erreur.
process (H,R) Traduction :
Après que H ou R ait changé d’état:
begin Si R=1 Alors Qi est mis à 0
if R = '1' then qi <= "0000"; Si R=0 et si front montant de H
elsif (H’event and H = '1’) then alors
Qi <= Qi + 1; Qi est incrémenté.
Si R=0 et pas de front montant alors
else Qi garde sa valeur.
Qi <= Qi;
end if;
end process; Instruction inutile: il ne faut préciser
que ce qui doit changer
NB: L’instruction if … then ne peut s ’utiliser que dans un process!
19

5. L’architecture séquentielle
VHDL type « comportemental »
5.4- L’assignation sélective: Case … is … when … =>
Exemple: multiplexeur synchrone 4 vers 1
architecture a_MUX of MUX_Syn is
begin Traduction
process (H)
begin Au front montant de H
if (H'event and H='1') then
case A is ➢si l’adresse A est 0 alors S = Y0
when "00" => S<=Y(0); ➢si l’adresse A est 1 alors S = Y1
when "01" => S<=Y(1); ➢si l’adresse A est 2 alors S = Y2
when "10" => S<=Y(2); ➢si l’adresse A est 3 alors S = Y3
when others => S<=Y(3);
end case;
end if;
end process;
end a_MUX;

NB: L’instruction Case … is … when … => ne peut s’utiliser que dans un process!

20

10
09/11/2021

--Compteur décompteur synchrone modulo 52


--validation de comptage et chargement parallèle 6. Exemple de fichiers
asynchrone
library ieee;
use ieee.std_logic_unsigned.all;
complets (séquentiel)
use ieee.std_logic_1164.all; Liste des signaux sensibles. Le process ne sera
entity ctr_mod52 is port ( déclenché que si un de ces signaux change d’état.
H,CE,Ld,U_DN: in std_logic;
P : in integer range 0 to 63;
Chargement (Préposition) asynchrone: Cette entrée est
Nb: buffer integer range 0 to 63 prioritaire sur l’horloge car elle est placée avant dans le
); process.
end ctr_mod52;
CE=1: Validation de comptage
architecture a_ctr_mod52 of ctr_mod52 is CE=0: Le compteur est bloqué à sa dernière valeur.
begin
process (H,LD,P) UDN=1: comptage incrémental
begin ➔ On incrémente jusqu’à 51 et on repasse à 0
if LD='1' then Nb<=P; UDN=0: décomptage ou comptage décrémental.
elsif (H'event and H='1') then
if CE='1'then ➔ On décrémente jusqu’à 0 et on repasse à 51.
if U_DN='1'then
if Nb=51 then Nb<=0;
else Nb<=Nb+1;
end if;
else
if Nb=0 then Nb<=51;
else Nb<=Nb-1;
end if;
end if;
end if;
end if;
end process;
end a_ctr_mod52;
21

6. Exemple de fichiers complets (séquentiel)


--avec une Raz asynchrone active au NLH et Chargement (Préposition) synchrone
--commande de prépositionnement synchrone
active au NLB
library ieee;
Liste des signaux sensibles. Le process ne sera
use ieee.std_logic_1164.all; déclenché que si un de ces signaux change d’état.
use ieee.std_logic_unsigned.all;
Mise à 0 asynchrone: Cette entrée est prioritaire sur
entity ctr8_Ras_LDs is port l’horloge car elle est placée avant dans le process.
( No est un « vecteur » ne peut recevoir un entier.
H,R,LDN,UDN:in std_logic;
P:in std_logic_vector(7 downto 0); Chargement (Préposition) synchrone: Cette entrée
No:buffer std_logic_vector(7 downto 0) dé-pend de l’horloge car elle est placée après dans le
);
end ctr8_Ras_LDs; process.
UDN=1: comptage incrémental. Même pour un
architecture a_ctr8_Ras_LDs of ctr8_Ras_LDs is
begin vecteur l’instruction No<=No+1 est comprise.
process (H,R) UDN=0: décomptage (ou comptage décrémental.)
begin
If R='1' then No <="00000000";
elsif H'event and H='1’ then
if LDN='0' then No<=P;
else
if UDN='1' then No<=No+1;
else No<=No-1;
end if;
end if;
end if;
end process;
end a_ctr8_Ras_LDs;
22

11
09/11/2021

7. Process en combinatoire
Il faudra alors veiller à ce que tous les signaux
d’entrée soient déclarés comme signaux sensibles.

On peut utiliser un process pour décrire une fonction combinatoire.


Exemple: on veut réaliser la commande d’une chaudière. --Utilisation d'un process pour réaliser une fonction combinatoire
library ieee;
Système de chauffage : use ieee.std_logic_1164.all;
Deux sondes captent la température : use ieee.std_logic_unsigned.all;
Ti : température réelle intérieure entity Chauffage is port (
Te : température réelle extérieure Te,Ti:integer range -128 to 127; --températures réelles
Une console de saisie permet de régler différents paramètres : Th,Ts,Tc:integer range -128 to 127;--températures de consignes
Ts : température souhaitée dans le local (consigne)
p:in std_logic; --paramêtre de programmation
Th : température hors-gel du local
Tc : température critique extérieure M0,M1:out std_logic --sorties commandant la chaudière
Une information logique p provenant d’un programmateur horaire );
permet d’indiquer à l’automate les plages de chauffage end Chauffage;
programmées.
Ce système, qui est purement combinatoire, doit obéir au cahier des architecture a_Chauffage of Chauffage is
charges suivant : begin
Cahier des charges : process (p,Te,Ti,Th,Ts,Tc)
Pendant les heures de chauffage programmées (➔ p=1), le fonction- begin
nement de la chaudière est le suivant : if p='1' then
Si Ti est supérieure ou égale à Ts elle est mise à l’arrêt (➔ M1
if Ti>=Ts then M0<='0';M1<='0';
= 0 et M0 = 0)
Si Ti est inférieure à Ts else
si Te Tc : Mise en mode normal (➔ M1 = 1 et M0 = 0) if Te>=Tc then M1<='1';M0<='0';
si Te  Tc : Mise en mode rapide (➔ M1 = 1 et M0 = 1) else M1<='1';M0<='1';
En dehors des heures de chauffage programmées (➔ p=0), le end if;
fonctionnement de la chaudière est le suivant : end if;
si Ti  Th et si Te Tc ==> mode normal. (➔ M1 = 1 et M0 = 0) else
si Ti  Th et si Te< Tc ==> mode rapide. (➔ M1 = 1 et M0 =1 ) if Ti<=Th and Te>=Tc then M1<='1';M0<='0';
si Ti > Th et si Te  Tc ==> en mode ralenti (➔ M1 = 0 et M0 = elsif Ti<=Th and Te<Tc then M1<='1';M0<='1';
1) elsif Ti>Th and Te<Tc then M1<='0';M0<='1';
arrêt (➔ M1 = 0 et M0 = 0) dans les autres cas.
else M0<='0';M1<='0';
end if;
Cette possibilité est très intéressante pour réaliser une fonction logique end if;
décrite textuellement. On fait alors l’économie de la table de vérité. end process; 23
end a_Chauffage;

8. Opérations sur les bits et vecteurs


Décalage
--Registre à décalage Registre à décalage à gauche,16 bits, entrée
library ieee; série, sortie parallèle avec remise à zéro
use ieee.std_logic_unsigned.all;
use ieee.std_logic_1164.all;
asynchrone.

entity SRG16 is port(


R,H,Ser:in std_logic;
Q:buffer std_logic_vector(15
downto 0)
);
end SRG16;
architecture a_SRG16 of SRG16 is
begin
process (H,R)
begin
if R='1' then Q<=(others=>'0');
d14 d13 d12 … … d1 d0 ser
elsif (H'event and H='1') then
Q<=Q(14 downto 0) & Ser;  Q(14 downto 0) → les 15 bits de poids faible de Q
end if;  Q<=(others=>'0’) → mise à 0 de tous les bits de Q
end process; quelle que soit sa taille
end a_SRG16; Autre exemple : S<=(1=>‘1‘,5=>‘1‘,others=>'0') 24

12
09/11/2021

9. Utilisation de « alias »
--Compteur binaire en 9 bits sortie 8bits
--avec RAZ et CE:validation de comptage
library ieee;
use ieee.std_logic_1164.all;
Permet de donner un autre nom
use ieee.std_logic_unsigned.all; au même objet
entity ctr9_8_raz_ce2 is port
(
H : in std_logic;
R,CE : in std_logic;
Ns : buffer std_logic_vector(7 downto 0)
);
end ctr9_8_raz_ce2;

architecture a_ctr9_8_raz_ce2 of ctr9_8_raz_ce2 is


signal Ni: STD_LOGIC_vector(8 downto 0);
alias Ni8_1:STD_LOGIC_vector(7 downto 0) is Ni(8 downto 1);
begin
--on compte sur 9 bits
process (H,R) Description en schématique
begin
if R='1' then Ni<="000000000";
elsIf H'event and H='1’ then
if Ni< 511 then
if CE='1' then Ni <= Ni+1;end if;
end if;
end if;
end process; Autre description en schématique
--et on garde les 8 bits de poids forts
Ns<= Ni8_1; Même instruction que Ns <= Ni(8 downto 1)
end a_ctr9_8_raz_ce2; 25

10. Sortie 3 états

library ieee;
use ieee.std_logic_1164.all;
Exemple : Buffer 8bits bidirectionnel use ieee.std_logic_unsigned.all;

entity bidir is port (


Le port doit être défini en Dir : IN std_ logic;
entrée/sortie Dg,Dd : INOUT std_logic_vector(7 downto 0)
);
end bidir;
Noter la syntaxe de la mise
en haute impédance architecture arch_bidir of bidir is
begin
Dg<=Dd when Dir='0' else (others => 'Z');
Dd<=Dg when Dir='1' else (others => 'Z’);
end arch_bidir;
Simulation de ce composant

26

13
09/11/2021

11. Approfondissements : les types


➢ Bit ; Bit_vector
Bit ‘0’ ‘1’
Bit_vector(3 downto 0); “1001” (binaire); X”14A” (hexadécimal); O”147” (octal) Synthétisable
➢ Std_logic ; Std_logic_vector ; Unsigned ; Signed
Std_logic ‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘ H’ , ‘-’
Std_logic _vector(11 downto 0); “110100001001” = X”D09” = O”6411”
Std_logic _vector(0 downto 0); “1”
signed(8 downto 0); “110100101” Synthétisable
➢ Integer [-2^31 +2^31-1]
Integer range -128 to 127 -14, 25, … Synthétisable: un bus de n fils 2n ≥ nombre. Ex: 25 ➔ 5 fils
➢ Real [-1E38 +1E38]
Real range -273.15 to 1E6; -10.4, 123456.789, 1E-6, 8.0
Un nombre réel n’est pas synthétisable mais peut être un paramètre.
➢Boolean Boolean; true, false Pas synthétisable: c’est le résultat d’un test
➢ Character (95 des 128 du code ASCII)
Character ‘x’, ‘X’, ‘9’, ‘*’, etc… mais pas ‘é’, ‘/’, … Pas synthétisable
➢ Time (ps, ns, us, ms, sec, min, hr)
Time 10 ns, 15 ms, etc… mais pas 10ns Pas synthétisable utilisé en simulation. 27

11. Approfondissements : les objets


Les objets --Signaux entrées/sorties déclarés dans l’entité
H,R : in std_logic;
➢ Les signaux N : buffer integer range 0 to 7;
--Signaux internes déclarés dans l’architecture, avant “begin”
Les signaux sont des liaisons
équipotentielles. signal A,B,C: std_logic;

L’affectation: A<=B relie A avec B ➔ les valeurs de A et B seront toujours identiques.

➢ Les variables --Variable déclarée dans un process, avant “begin”


Les variables sont des variable COUNT : std_logic_vector(2 downto 0);
emplacements-mémoire recevant
des valeurs
L’affectation: A:=B met la valeur de B dans A➔ les valeurs de A et B seront identiques seulement à ce moment. Si B
reçoit ensuite une autre valeur A et B seront différentes. Une variable s’utilise uniquement dans un process. Avant
que celui-ci se termine il faudra affecter la valeur de la variable à un signal.

-- Valeur déclarée dans l’architecture, avant “begin” ou dans un


-- process, (ou une fonction, ou une procédure) avant “begin”.
constant Tclk : time := 10 ns;
➢ Les constantes constant Data std_logic_vector:=“011010”;
constant Nint_c: integer:=100;
Une constante contient une valeur
qui ne peut être que lue. constant Din_c: STD_LOGIC:='1';

28

14
09/11/2021

11. Approfondissements : les types


composites (tableaux)
Déclaration
type Type_mem is array(0 TO 1023) of integer range 0 TO 2**8-1;
signal Mem : Type_mem;

type Type_Rom is array(0 TO 31) of integer range 0 TO 255;

Énumération des éléments du tableau


constant echantillons_sinus:Type_Rom :=
(0,13,25,37,50,62,74,86,98,109,120,131,142,152,162,171,180,189,197,205,212,219
,225,231,236,240,244,247,250,252,254,255);
echantillons_sinus(2) = 25
echantillons_sinus(30) = 254

La déclaration du type et la déclaration du tableau doivent être fait avant le « begin » de l’achitecture
Architecture a of composant is
Type …. …
Constant … …
begin
….
29

11. Approfondissements : les types


composites (record)
Déclaration
type test_vecteur is record (H=>'0',R=>'0', N=>4),--10
H:std_logic; (H=>'1',R=>'0', N=>5), --11
R:std_logic; (H=>'0',R=>'0', N=>5), --12
(H=>'1',R=>'0', N=>6), --13
N:integer range 0 to 2;
(H=>'0',R=>'0', N=>6), --14
end record;
(H=>'1',R=>'0', N=>7), --15
--La variable ci-dessous est déclarée à l’intérieur d’un process (H=>'0',R=>'0', N=>7), --16
variable vecteur: test_vecteur; (H=>'1',R=>'0', N=>0), --17
(H=>'0',R=>'0', N=>0), --18
(H=>'1',R=>'0', N=>1), --19
Utilisation (H=>'0',R=>'0', N=>1), --20
(H=>'1',R=>'0', N=>2), --21
type tableau_de_test_vecteur is array (natural
range <>) of test_vecteur ; Après l’instruction: ➔
constant test_data: tableau_de_test_vecteur := (
--remise à 0 du ctr Vecteur := Test_data(11);
(H=>'0',R=>'1', N=>0), --0 On a: Vecteur.H = ‘1’  Champ H
(H=>'1',R=>'1', N=>0), --1 Vecteur.R = ‘0’  Champ R
(H=>'0',R=>'0', N=>0), --2
--avancement du CTR au différents temps Vecteur.N = 5  Champ N
(H=>'1',R=>'0', N=>1), --3
(H=>'0',R=>'0', N=>1), --4 ➢ Permet de grouper des types
(H=>'1',R=>'0', N=>2), --5
(H=>'0',R=>'0', N=>2), --6 hétérogènes
(H=>'1',R=>'0', N=>3), --7 ➢ Utile pour une description susceptible
(H=>'0',R=>'0', N=>3), --8 d’évoluer (mise à jour du type au lieu de
(H=>'1',R=>'0', N=>4), --9 l’entité) 30

15
09/11/2021

11. Approfondissements : les types

Comment créer de nouveau types?


Une machine à états a 5 états qui sont : repos, décision, lecture1, lecture2, ecriture
Au lieu de coder les états en binaire on peut définir un nouveau type : Type_etat

architecture a_xxxxx of xxxxxx is


Type Type_etat is (repos, decision, lecture1, lecture2, ecriture)
Signal etat : Type_etat ;
begin

Utilisation
process(H)
begin
case etat is
when repos => etc.. ;
when decision => etc.. ;
……..
when others => etc.. ;
end case;
end process; 31

12. Les attributs


type Type_etat is (repos, décision, lecture1, lecture2, ecriture)
signal N :integer range 0 to 255 ;
Quelques attributs signal Q :std_logic_vector(9 downto 0)
alias Ni8_1:STD_LOGIC_vector(0 to 7) is Ni(8 downto 1);

H’event chgt état de H N’left 0 Nota: le mot réservé


« Alias » permet de
Type_etat’left Repos N’right 255
donner un autre nom à
Type_etat’right ecriture N’high 255 un objet déjà existant.
Type_etat’high ecriture N’low 0
Type_etat’length 5 N’length 256
Q’left 9 Ni8_1’left 0
Q’right 0 Ni8_1’right 7
Q’high 9 Ni8_1’high 7
Q’low 0 Ni8_1’low 0
Q’Range 9 downto 0 Ni8_1’Range 0 to 7
Q’length 10 Ni8_1’length 8

Pour avoir plus amples informations, voir le livre:VHDL Langage, Modélisation, Synthèse de R.
AIRIAU –J.-M. BERGÉ - V. OLIVE – J. ROUILLARD: Presses Polytechniques et Universitaires. 32

16
09/11/2021

13. Les composants génériques

Compteur à Nb_bits Comment réduire le nombre de descriptions


--Compteur générique nb bits synchrone de base dont j’ai besoin ?
library ieee; CTR 4bits, Ctr 6 bits …..
Une description paramétrée : ➔ composant
use ieee.std_logic_unsigned.all; générique
use ieee.std_logic_1164.all;
entity Ctr_nb_bits is Le paramètre est 4 par défaut
generic( nb_bits:integer:=4);
port Ci-dessous ce compteur est instancié et on a
( choisi le nombre de bits = 8 pour
H:in std_logic; l’instanciation n°2 (inst2)
Q:buffer std_logic_vector(nb_bits-1 downto 0)
); Parameter Value
end Ctr_nb_bits; nb_bits 8
architecture a_Ctr_nb_bits of Ctr_nb_bits is Ctr_nb_bits
begin H Nramp[7..0]
process(H) H Q[nb_bits-1..0]
begin
if (H'event and H='1') then
Q<=Q+1;
end if;
inst2
end process;
end a_Ctr_nb_bits; → On peut définir plusieurs paramètres
33
génériques

14. VHDL structurel --Fonction finale: MLI_VHD.vhd


library ieee;
➢ Fonction réalisée d’une manière hiérarchique. use ieee.std_logic_1164.all;
➢ Exemple ci-dessous : fichier schématique (.bdf). C’est le fichier ENTITY MLI_VHD IS
TOP LEVEL (= fichier « instanciant » niveau 0). port(H : in std_logic;
NF : in std_logic_vector(3 downto 0);
➢ Les fichiers appelés ou « instanciés » (1ère instance :
PWM : out std_logic
Comp_nb_bits; 2ème instance : Ctr_nb_bits ) sont décrits en );
VHDL. Déclaration END MLI_VHD;
du bus interne ARCHITECTURE a_mli_vhd OF mli_vhd IS
--déclaration du signal interne ==>
SIGNAL Rampe : std_logic_vector(3 downto 0);
--déclaration du premier composant ==>
COMPONENT comp_nb_bits
generic (nb_bits : integer);
Déclaration

port(A : IN std_logic_vector(3 downto 0);


composant
Déclaration

B : IN std_logic_vector(3 downto 0);


du 1er

AsB : out std_logic;


AmB : out std_logic;
AeB : out std_logic
);
--Compteur générique nb bits synchrone END COMPONENT;
library ieee; --comparateur générique avec nb bits --déclaration du deuxième composant ==>
use ieee.std_logic_unsigned.all; LIBRARY ieee; COMPONENT ctr_nb_bits
Déclaration

USE ieee.std_logic_1164.all;
composant

use ieee.std_logic_1164.all; generic (nb_bits : integer);


du 2ème

entity Ctr_nb_bits is use ieee.std_logic_unsigned.all; port(H : in std_logic;


generic( nb_bits:integer:=8); ENTITY comp_nb_bits IS
Q: out std_logic_vector(3 downto 0)
PORT( generic( nb_bits:integer:=8);
PORT( );
H:in std_logic;
A,B:in std_logic_vector(nb_bits-1 END COMPONENT;
Q:buffer std_logic_vector(nb_bits-1 downto 0)
BEGIN
Branchement Branchement

); downto 0);
composant

--Branchement du premier composant ==>


Instanciation

end Ctr_nb_bits; AsB,AmB,AeB:out std_logic


du 1er

architecture a_Ctr_nb_bits of Ctr_nb_bits is ); inst1 : comp_nb_bits


begin END comp_nb_bits; generic map(nb_bits => 4)
process(H) ARCHITECTURE a_comp_nb_bits OF port map(A => NF, B => rampe, AsB => PWM);
begin comp_nb_bits IS -- port map(NF, Rampe, PWM);
if (H'event and H='1') then BEGIN
--Branchement du deuxième composant ==>
composant

Q<=Q+1; AsB<='1' when A>B else '0';


du 2ème

AmB<='1' when A<B else '0'; inst2 : ctr_nb_bits


end if;
AeB<='1' when A=B else '0'; generic map(nb_bits => 4)
end process;
end a_Ctr_nb_bits; END a_comp_nb_bits; port map(H => H, Q => Rampe);
END a_MLI_VHD; 34

17
09/11/2021

15. VHDL pour la simulation


➢ Des structures VHDL synthétisables (utilisables conjointement)
• « flot de données »
• Comportemental
• Structurel
➢ Des objets non synthétisables pour faciliter la simulation des composants

On pourra ainsi décrire facilement les stimuli à appliquer au composant et analyser les résultats. On parle
alors de bancs tests ou « test bench ».
Principe de la simulation
Test_Bench

Générer les Chronogrammes


Test_bench : signaux d’entrée et rapports
• Fichier VHDL B_S
du composant à
• Pas de signaux d’entrée ni de tester
sortie. Tous les signaux sont B_E1
internes. et E1
Composant S
• Instancie le composant à tester B_E2
B_Q Comparer les E2
• Applique les signaux d’entrées et signaux de sortie B_E3 à tester Q
lit les signaux de sortie. avec ceux E3
• Vérifie si les signaux de sortie attendus
sont ceux attendus.

35

15. VHDL pour la simulation


Test bench d’un séquenceur --maintenant le signal A
--Test bench du séquenceur process
library ieee; begin
use ieee.std_logic_unsigned.all; A_bench<= '0';
use ieee.std_logic_1164.all; for i in 0 to 1 loop
Entité vide wait for 100 us;
entity Bench_sequenceur is Construction
A_bench<='1';
end Bench_seq_vitesse; wait for 100 us; de stimuli
A_bench<= '0';
architecture a_Bench_sequenceur of Bench_sequenceur is
end loop;
component sequenceur port (
for i in 2 to 3 loop
H:IN std_logic; Déclaration du wait for 0.5 ms;
A:in std_logic;
(des) composant A_bench<='1';
FM,Valid:out std_logic
); à tester wait for 0.5 ms;
Instanciation du
A_bench<= '0';
end component; composant à tester
end loop;
signal H_bench:std_logic:='1';
end process ;
signal A_bench:std_logic:='1'; Déclaration des --instantiation du composant à tester
signal FM_bench:std_logic;
signal Valid_bench:std_logic; signaux internes inst1:Seq_vitesse port
map(H_bench,A_bench,FM_bench,Valid_bench);
constant TH:time:=20 us;
end;
begin
--Construction de l'horloge.
process
begin
H_bench<= '0';
wait for TH/2; Construction de
H_bench<= '1'; stimuli
wait for TH/2;
end process;
36

18
09/11/2021

15. VHDL pour la simulation


process --process générant le Top Trame
Génération de signaux périodiques begin
TT<= '0'; Un process pour
library ieee; wait for 100 us; chaque signal
use ieee.std_logic_unsigned.all; TT<= '1'; (concurrents)
use ieee.std_logic_1164.all; wait for 19.9 ms;
entity trame is end process;
end trame; process --process générant le Top Bande
Un process sans liste architecture a_trame of trame is begin
signal TL:std_logic:='1'; TB<= '0'; Synchronisation
de sensibilité est par rapport à un
signal TT:std_logic:='1'; wait until TT='0';
redéclenché dès qu’il wait for 22*64 us; autre signal
signal TB:std_logic:='0';
arrive à la fin constant ecart_TB:time:=10 us; for i in 23 to 312 loop
begin wait for ecart_TB + 30 us;
process --process générant le Top Ligne TB<= '1'; Utilisation de
begin wait for 5 us; boucles
Attente d’un temps TL<= '0'; TB<= '0';
défini wait for 5 us; wait for 29 us-ecart_TB;
TL<= '1'; end loop;
wait for 59 us; end process ;
end process; end a_trame;

37

15. VHDL pour la simulation


Utilisation de wait
➢ utilisé dans une déclaration séquentielle de type PROCESS.
➢ remplace une liste de sensibilité pour contrôler l'exécution et la suspension d'un PROCESS.
➢ peut être placé n'importe où dans le PROCESS.
➢ Sans WAIT ou sans liste de sensibilité, un PROCESS se boucle indéfiniment.

◆ Il existe trois syntaxes différentes autour de wait.

WAIT ON signals
(équivalent à une liste de sensibilité).
WAIT FOR period
process process (a,b) Spécifie la durée maximale d’attente
begin begin
-- sequential statements -- sequential statements process
wait on a,b; end process; begin
end process; EN_1 <= '0';
EN_2 <= '1';
wait for 10 ns; -- attente de 10ns
WAIT UNTIL expression
wait; -- attente infinie
l'expression booléenne doit parvenir end process;
à TRUE avant de continuer
l'exécution.

process Attention, wait n’est pas


begin
wait until CLK'event and CLK='1'; synthétisable (utilisable en
Q1 <= D1; simulation seulement)
end process;
38

19

Vous aimerez peut-être aussi