Cours2 VHDL
Cours2 VHDL
Cours2 VHDL
Plan
2
Déclaration des bibliothèques
3
Déclaration des bibliothèques
Le TYPE:
Le 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.
exemple : DATA : out std_logic_vector (7 downto 0) ;
Ces types ne sont pas prédéfinis: pour les utiliser, il faut déclarer le
package std_logic_1164, qui fait partie de la library IEEE:
library ieee;
use ieee.std_logic_1164.all; définit les types, les fonctions de conversion,
les opérateurs logiques et les fonctions de
détection de fronts.
4
Déclaration des bibliothèques
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Use ieee.std_logic_signed.all;
Use ieee.numeric_std.all;
5
Déclaration des entrées/sorties (I/O)
6
Déclaration des entrées/sorties (I/O).
7
Classe d’objets et règles de déclaration
Toute donnée traitée par VHDL doit être déclarée comme constante,
variable ou signal .
Constantes: permettent de définir des valeurs permanentes
constant pi : real := 3.1416;
Variables: valeur modifiable immédiatement par une affectation (:=)
variable stop : boolean;
Signaux:
modélisation de l'entrée/sortie d'un dispositif. C'est une forme d'onde
qui change avec le temps: la modification a lieu à la prochaine itération
de la simulation (retard delta).
signal sel : bit;
8
Règles d’écriture en VHDL
Le nom d’un objet manipulé par VHDL doit être différent d’un mot
réservé du VHDL:
Abs Access After Alias
All And Architecture Array
Assert Attribute Begin Block
Body Buffer Bus Case
Component Configuration Constant Disconnect
Downto Else Elsif End
Entity Exit File For
Function Generate Generic Group
Guarded If Impure In
Inertial Inout Is Label
Library Linkage Literal Loop
Map Mod Nand New
Next Nor Not Null
Of On Open Or
Others Out Package Port
Postponed Procedure Process Pure
Range Record Register Reject
Rem Report Return Rol
Ror Select Severity Signal
Shared Sla Sll Sra
Srl Subtype Then To
Transport Type Unaffected Units
Until Use Variable Wait
When While With Xnor
Xor
9
Types d’objets
10
Types d’objets
11
Les opérateurs utilisés en synthèse
12
Les opérateurs utilisés en synthèse
Exemple:
Library ieee;
Use ieee.std_logic_1164.all;
entity AFFEC is port ( E1,E2 : in std_logic;
BUS1,BUS2 : out std_logic_vector(3 downto 0);
S1,S2,S3,S4 : out std_logic);
end AFFEC;
architecture DESCRIPTION of AFFEC is
begin
S1 <= '1';
S2 <= '0';
S3 <= E1;
S4 <= '1' when (E2 ='1') else 'Z'; -- S4 = 1 si E2=1 sinon S4= Z
BUS1 <= "1000";
BUS2 <= X"A"; -- valeur en HEXA -> BUS2 = 10(déc)
end DESCRIPTION;
13
Les opérateurs utilisés en synthèse
Exemple :
Soit A et B de type 3 bits et S1 de type 8 bits:
A = "001" et B ="110"
S1 <= A & B & "01" ;
Après l’affectation :
S1 = "001110 01"
14
Les opérateurs utilisés en synthèse
Opérateurs logiques:
Opérateur VHDL
ET and
NON ET nand
OU or
NON OU nor
OU EXCLUSIF xor
NON OU EXCLUSIF xnor
NON not
DECALAGE A GAUCHE sll
DECALAGE A DROITE srl
ROTATION A GAUCHE rol
ROTATION A DROITE ror
15
Les opérateurs utilisés en synthèse
Exemples :
S1 <= A sll 2 ; -- S1 = A décalé de 2 bits à gauche.
S2 <= A rol 3 ; -- S2 = A avec une rotation de 3 bits à gauche
NB: Pour réaliser des décalages logiques en synthèse logique, il est
préférable d’utiliser les instructions suivantes :
Décalage à droite :
-- 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 à droite
Décalage à gauche :
-- 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 à gauche
16
Les opérateurs utilisés en synthèse
Opérateurs arithmétiques:
Opérateur VHDL
Addition +
Soustraction -
Multiplication *
Division /
Opérateurs relationnels:
Opérateur VHDL
Egal =
Non égal /=
Inférieur <
Inférieur ou égal <=
Supérieur >
Supérieur ou égal >=
17
Processus en VHDL
18
Processus en VHDL
Exemple:
19
Les instructions en mode concurrent
Les instructions suivantes sont des processus implicites (ou instructions
concurrentes):
l'affectation inconditionnelle d'un signal.
exemple:
20
Les instructions en mode concurrent
Exercice d’application:
21
Les instructions en mode concurrent
Architecture du décodeur 1 parmi 4:
L’ordre dans lequel seront écrites les instructions n’a aucune importance.
23
Les instructions du mode « concurrent »
Affectation conditionnelle:
Exemple:
S <= E2 when ( E1= ‘1’ ) else ‘0’;
24
Les instructions du mode « concurrent »
Exercice d’application:
25
Les instructions du mode « concurrent »
Décodeurs 7 segments:
entity DEC7SEG4 is
port (DEC : in std_logic_vector(3 downto 0);
SEG : out std_logic_vector(6 downto 0));
end ;
architecture DESCRIPTION of DEC7SEG4 is
begin
SEG <= "1111110" when DEC = "0000"
else "0110000" when DEC = "0001"
else "1101101“ when DEC = "0010"
else "1111001“ when DEC = "0011"
else "0110011“ when DEC = "0100"
else "1011011“ when DEC = "0101"
else "1011111" when DEC = "0110"
else "1110000" when DEC = "0111"
else "1111111" when DEC = "1000"
else "1111011" when DEC = "1001"
else "-------";
end DESCRIPTION;
26
Les instructions du mode « concurrent »
Affectation sélective :
Cette instruction permet d’affecter différentes valeurs à un signal, selon les
valeurs prises par un signal dit de sélection.
27
Les instructions du mode « concurrent »
Exercice d’application:
28
Les instructions du mode « concurrent »
Multiplexeur 4 vers 1:
29
Les instructions du mode séquentiel
30
Les instructions du mode séquentiel
[Nom_du_process :] process(Liste_de_sensibilité_nom_des_signaux)
Begin
-- instructions du process
end process [Nom_du_process] ;
31
Les instructions du mode séquentiel
Les deux principales structures utilisées dans un process:
Exemple: Exemple:
if (Reset = ‘1’) then Sortie <= ‘0’; case SEL is
else Sortie <= D; when “000“=> S1 <= E1;
end if; when “001“=> S1 <= ‘0’;
when “010“ | “011“ => S1 <= ‘1’;
when others => S1<= ‘0’;
end case;
32
Les instructions du mode séquentiel
Exemples de process : bascule D.
Library ieee;
Use ieee.std_logic_1164.all;
entity BASCULE_D is
port (D,CLK, Reset : in std_logic;
Q : out std_logic);
end BASCULE_D;
Exercice:
Ajouter l’ entrée de forçage à 1 (Set) asynchrone dans la
description de la bascule D.
34
Simulation par Test bench
Un testbench (banc de test) est une description VHDL incorporant une
instance du circuit à tester (Device Under Test) et lui fournissant les
séquences de signaux d'entrées (stimuli) afin de visualiser les sorties
avec un simulateur.
Générateur
Vérificateur
des
DUT des
vecteurs
sorties
de test
Test bench
LIBRARY ieee ;
LIBRARY work ;
USE ieee.std_logic_1164.all ;
USE work.all ;
ENTITY bascule_d_tb IS
END ;
ARCHITECTURE bascule_d_tb_arch OF bascule_d_tb IS
signal clk, Reset, d, q : std_logic ;
COMPONENT bascule_d PORT ( Reset, clk, d : in std_logic ;
q : out std_logic );
END COMPONENT ;
36
Simulation par Test bench
BEGIN
DUT : bascule_d PORT MAP ( clk => clk , Reset => Reset ,
d => d , q => q ) ;
clk_in : process
Begin
clk <='0'; wait for 20 ns;
clk <='1'; wait for 20 ns ;
end process clk_in ;
Reset_in : process
Begin
Reset <='1'; wait for 20 ns ;
Reset <='0'; wait for 180 ns ;
end process Reset_in ;
d_in : process
begin
d <='1'; wait for 30 ns;
d <='0'; wait for 60 ns;
d <='1'; wait for 90 ns;
end process d_in;
END ; 37