0% ont trouvé ce document utile (0 vote)
26 vues27 pages

Simulation de portes logiques VHDL

Transféré par

Anicet LIASSIDJI
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
26 vues27 pages

Simulation de portes logiques VHDL

Transféré par

Anicet LIASSIDJI
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

‫المدرسة الوطنية للعلوم التطبيقية‬ ‫جامعة سيدي محمد بن عبدهللا‬

ⵜⵉⵏⵎⵍⵜⴰⵏⴰⵎⵓⵔⵜⵏⵜⵎⴰⵙⵙⴰⵏⵉⵏⵜⵓⵙⵏⵉⵙⵉⵏ ⵜⴰⵙⴷⴰⵡⵉⵜⵙⵉⴷⵉⵎⵓⵃⵎⵎⴰⴷⴱⵏⵄⴱⴷⵓⵍⵍⴰⵀ
Ecole Nationale des Sciences Appliquées de Fès Université Sidi Mohamed Ben Abdellah

SIMULATION DES
PORTES LOGIQUES PAR
MODELSIM

1
‫المدرسة الوطنية للعلوم التطبيقية‬ ‫جامعة سيدي محمد بن عبدهللا‬
ⵜⵉⵏⵎⵍⵜⴰⵏⴰⵎⵓⵔⵜⵏⵜⵎⴰⵙⵙⴰⵏⵉⵏⵜⵓⵙⵏⵉⵙⵉⵏ ⵜⴰⵙⴷⴰⵡⵉⵜⵙⵉⴷⵉⵎⵓⵃⵎⵎⴰⴷⴱⵏⵄⴱⴷⵓⵍⵍⴰⵀ
Ecole Nationale des Sciences Appliquées de Fès Université Sidi Mohamed Ben Abdellah

I. Introduction

L’implantation d’une ou de plusieurs descriptions VHDL dans un circuit FPGA


va dépendre de l’affectation que l’on fera des broches d’entrées/sorties et des
structures de base du circuit logique programmable.
Le schéma ci-dessous représente un exemple de descriptions VHDL ou de blocs
fonctionnels implantés dans un FPGA. Lors de la phase de synthèse chaque bloc
sera matérialisé par des portes et/ou des bascules. La phase suivante sera
d’implanter les portes et les bascules à l’intérieur du circuit logique. Cette tâche
est réalisée par le logiciel placement/routage, au cours de laquelle les entrées et
sorties seront affectées à des numéros de broches.
On peut remarquer sur le schéma la fonction particulière du bloc VHDL N°5. En
effet dans la description fonctionnelle d’un FPGA on a souvent besoin d’une
fonction qui sert à cadencer le fonctionnement de l’ensemble, celle-ci est très
souvent réalisée par une machine d’états synchronisée par une horloge.

Figure 1 : Relation entre VHDL et FPGA


II. Les différentes portes logiques

Réaliser les opérateurs de base de la logique combinatoire (les portes : Inverseur, ET, OU,
NON-ET, NON-OU).

 Porte Inverseur :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_inverseur is
2
‫المدرسة الوطنية للعلوم التطبيقية‬ ‫جامعة سيدي محمد بن عبدهللا‬
ⵜⵉⵏⵎⵍⵜⴰⵏⴰⵎⵓⵔⵜⵏⵜⵎⴰⵙⵙⴰⵏⵉⵏⵜⵓⵙⵏⵉⵙⵉⵏ ⵜⴰⵙⴷⴰⵡⵉⵜⵙⵉⴷⵉⵎⵓⵃⵎⵎⴰⴷⴱⵏⵄⴱⴷⵓⵍⵍⴰⵀ
Ecole Nationale des Sciences Appliquées de Fès Université Sidi Mohamed Ben Abdellah

Port ( a : in STD_LOGIC;
s : out STD_LOGIC);
end porte_inverseur;
-- Déclaration de l’architecture avec une affectation simple.
architecture Behavioral of porte_inverseur is
begin
s<= not a;
end Behavioral;
Création d’un fichier test bench VHDL

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity test_port_invers_vhd is
end test_port_invers_vhd;

architecture behavior of test_port_invers_vhd is

component porte_inverseur
port(
a : in std_logic;
s : out std_logic);
end component;

--inputs
signal a : std_logic := '0';

--outputs
signal s : std_logic;
begin
-- instantiate the unit under test (uut)

3
uut: porte_inverseur port map(
a => a,
s => s
);
tb : process
begin
a<='0';wait for 20 ns; a<='1';wait for 20 ns; wait;
end process;

end;

4
 Porte AND :

Alors le programme de la porte ET est comme suite :


-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_et is
Port ( a : in STD_LOGIC;
b: in STD_LOGIC;
s : out STD_LOGIC);
end porte_et;
-- Déclaration de l’architecture avec une affectation simple.
architecture Behavioral of porte_et is
begin
s<= a and b;
end Behavioral;

Le fichier Test du VHDL : test_porte_et nommé dans file name on change juste la partie du
tb :process

tb : process
begin
a<= '0'; b<= '0'; wait for 20 ns;
a<= '1'; b<= '0'; wait for 20 ns;
a<= '0'; b<= '1'; wait for 20 ns;
a<= '1'; b<= '1'; wait for 20 ns;
wait;
end process;
end;

5
 Porte OR :
Alors le programme de la porte_ou est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_ou is
Port ( a : in STD_LOGIC;
b: in STD_LOGIC;
s : out STD_LOGIC);
end porte_ou;
-- Déclaration de l’architecture avec une affectation simple.
architecture Behavioral of porte_ou is
begin
s<= a or b;
end Behavioral;

Le fichier Test du VHDL : test_porte_ou nommé dans file name on change juste la partie du
tb :process
tb : process
begin
a<= '0'; b<= '0'; wait for 20 ns;
a<= '1'; b<= '0'; wait for 20 ns;
a<= '0'; b<= '1'; wait for 20 ns;
a<= '1'; b<= '1'; wait for 20 ns;
wait;
end process;
end;

 Porte NAND :

Alors le programme de la porte_non_et est comme suite :


-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_non_et is
Port ( a : in STD_LOGIC;
b: in STD_LOGIC;
s : out STD_LOGIC);
end porte_non_et;
-- Déclaration de l’architecture avec une affectation simple.
architecture Behavioral of porte_non_et is
begin
s<= a nand b;
end Behavioral;

Le fichier Test du VHDL : test_porte_non_et nommé dans file name on change juste la partie
du tb :process

6
tb : process
begin

a<= '0'; b<= '0'; wait for 20 ns;


a<= '1'; b<= '0'; wait for 20 ns;
a<= '0'; b<= '1'; wait for 20 ns;
a<= '1'; b<= '1'; wait for 20 ns;
wait;
end process;
end;
 Porte NOR :

Alors le programme de la porte_non_ou est comme suite :


-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_non_ou is
Port ( a : in STD_LOGIC;
b: in STD_LOGIC;
s : out STD_LOGIC);
end porte_non_ou;
-- Déclaration de l’architecture avec une affectation simple.
architecture Behavioral of porte_non_ou is
begin
s<= a nor b;
end Behavioral;

Le fichier Test du VHDL : test_porte_non_ou nommé dans file name on change juste la partie
du tb :process
tb : process
begin
a<= '0'; b<= '0'; wait for 20 ns;
a<= '1'; b<= '0'; wait for 20 ns;
a<= '0'; b<= '1'; wait for 20 ns;
a<= '1'; b<= '1'; wait for 20 ns;
wait;
end process;
end;
Réaliser la porte XOR en utilisant les trois descriptions (flot de données, comportementale,
structurelle) en faisant appel aux composants déjà réalisé en utilisant
: COMPONENT.
 Porte XOR1 : flot de données
Alors le programme de la porte_xor1 est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_xor1 is
Port ( a : in STD_LOGIC;
b: in STD_LOGIC;
s : out STD_LOGIC);
7
end porte_xor1;
-- Déclaration de l’architecture avec une affectation conditionnelle.
architecture Behavioral of porte_xor1 is
begin
s<= '0' when a=b else '1';
end Behavioral;
 Porte XOR2 : comportemental
Alors le programme de la porte_xor2 est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_xor2 is
Port ( a : in STD_LOGIC;
b: in STD_LOGIC;
s : out STD_LOGIC);
end porte_xor2;
-- Déclaration de l’architecture avec une structure de test.
architecture Behavioral of porte_xor1 is
begin
process (a,b)
begin
if a=b then s<= '0';
else s<= '1';
end if;
end process;
end Behavioral;
 Porte XOR3 : structurelle
Alors le programme de la porte_xor3 est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_xor3 is
Port ( a : in STD_LOGIC;
b: in STD_LOGIC;
s : out STD_LOGIC);
end porte_xor3;
-- Déclaration de l’architecture en structurelle.
architecture Behavioral of porte_xor3 is
signal s1,s2,s3,s4:std_logic;
component porte_inverseur
port (a:in std_logic;
s:out std_logic);
end component;
component porte_et
port (a:in std_logic;
b:in std_logic;
s:out std_logic);
end component;
component porte_ou
port (a:in std_logic;
8
b:in std_logic;
s:out std_logic);
end component;
begin
u2:porte_inverseur port map (b,s2);
u1:porte_inverseur port map (a,s1);
u5:porte_ou port map (s3,s4,s);
u3:porte_et port map (s1,b,s3);
u4:porte_et port map (a,s2,s4);
end Behavioral;
Le fichier Test du VHDL : test_porte_xor 1,2 et 3 c’est le même on change juste la partie du
tb :process

9
tb : process
begin
a<= '0'; b<= '0'; wait for 20 ns;
a<= '1'; b<= '0'; wait for 20 ns;
a<= '0'; b<= '1'; wait for 20 ns;
a<= '1'; b<= '1'; wait for 20 ns;
wait;
end process;
end;

III. Multiplexeur
Réaliser un multiplexeur (2 vers 1) en utilisant les trois descriptions (flot de données,
comportementale, structurelle).
 Porte Multiplexeur 1 : flot de données
Alors le programme de la porte_mux1 est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_mux1 is
Port ( in1 : in STD_LOGIC;
In2: in STD_LOGIC;
sel : in STD_LOGIC;
s : out STD_LOGIC);
end porte_mux1;
-- Déclaration de l’architecture avec une affectation conditionnelle.
architecture Behavioral of porte_mux1 is
begin
s<= in1 when sel = '0';
else s<= in2;
end Behavioral;
 Porte Multiplexeur 2 : comportemental
Alors le programme de la porte_mux2 est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity porte_mux2 is
Port ( in1 : in STD_LOGIC;
In2: in STD_LOGIC;
sel : in STD_LOGIC;
s : out STD_LOGIC);
end porte_mux2;
-- Déclaration de l’architecture avec une structure de test.
architecture Behavioral of porte_mux2 is
begin
process (in1,in2, sel)
begin
if sel = '0' then s <=in1;
else s<= in2;
end if;
10
end process;
end Behavioral;
 Porte Multiplexeur 3 : structurelle
Alors le programme de la porte_mux3 est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration du paquetage spécifique pour appeler les components.
use work.mes_composants.all;
-- Déclaration de l’entité avec les entrées/sorties correspondants.

11
entity porte_mux3 is
Port ( in1 : in STD_LOGIC;
In2: in STD_LOGIC;
sel : in STD_LOGIC;
s : out STD_LOGIC);
end porte_mux3;
-- Déclaration de l’architecture en structurelle.
architecture Behavioral of porte_mux3 is
signal s1,s2,s3:std_logic;
begin
u1:porte_inverseur port map (sel,s1);
u4:porte_ou port map (s2,s3,s);
u2:porte_et port map (in1,s1,s2);
u3:porte_et port map (in2,sel,s3);
end Behavioral;
Le fichier Test du VHDL : test_porte_xor 1,2 et 3 c’est le même on change juste la partie du
tb :process
tb : process
begin
in1<='0'; in2<='0'; sel<='0'; wait for 20 ns;
in1<='0'; in2<='0'; sel<='1'; wait for 20 ns;
in1<='0'; in2<='1'; sel<='0'; wait for 20 ns;
in1<='0'; in2<='1'; sel<='1'; wait for 20 ns;
in1<='1'; in2<='0'; sel<='0'; wait for 20 ns;
in1<='1'; in2<='0'; sel<='1'; wait for 20 ns;
in1<='1'; in2<='1'; sel<='0'; wait for 20 ns;
in1<='1'; in2<='1'; sel<='1'; wait for 20 ns;
wait;
end process;
end;
IV. Demi-additionneur
Réaliser un demi-additionneur en utilisant les portes NAND (NON-ET) et l’inverseur dans une
description structurelle.
 Demi-additionneur : structurelle
Alors le programme du demi_add est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration du paquetage spécifique pour appeler les components.
use work.mes_composants.all;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity demi_add is
Port ( a : in STD_LOGIC;
b: in STD_LOGIC;
s : out STD_LOGIC;
cb : out STD_LOGIC);
end demi_add;
-- Déclaration de l’architecture en structurelle.
architecture Behavioral of demi_add is
signal s1,s2,s3:std_logic;
begin
u1:porte_non_et port map (a,b,s1);

FPGA et programmation VHDL Pr. Youssef EL AFOU


12
u2:porte_non_et port map (a,s1,s2);
u3:porte_non_et port map (s1,b,s3);
u4:porte_non_et port map (s2,s3,s);
u5:porte_inverseur port map (s1,cb);
end Behavioral;
Le fichier Test du VHDL : test_demi_add c’est le même on change juste la partie du
tb :process
tb : process
begin
a<= '0'; b<= '0'; wait for 20 ns;

FPGA et programmation VHDL Pr. Youssef EL AFOU


13
a<= '1'; b<= '0'; wait for 20 ns;
a<= '0'; b<= '1'; wait for 20 ns;
a<= '1'; b<= '1'; wait for 20 ns;
wait;
end process;
end;

V. Additionneur complet
Réaliser un additionneur complet de 1 bit en utilisant le demi_additionneur de 1bit ainsi qu’une
retenue à l’entrée et sortie du système.
 Additionneur complet 1bit: structurelle
Alors le programme du add_1bit est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration du paquetage spécifique pour appeler les components.
use work.mes_composants.all;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity add_1bit is
Port ( a : in STD_LOGIC;
b: in STD_LOGIC;
Cin : in STD_LOGIC;
Sortie : out STD_LOGIC;
Cout : out STD_LOGIC);
end add_1bit;
-- Déclaration de l’architecture en structurelle.
architecture Behavioral of add_1bit is
signal s1,s2,s3:std_logic;
begin
u1:demi_add port map (a,b,s1,S2);
u2:demi_add port map (Cin,s1,sortie,s3);
u3:porte_ou port map (s3,s2,Cout);
end Behavioral;
Le fichier Test du VHDL : test_ add_1bit c’est le même on change juste la partie du
tb :process
tb : process
begin
a<='0'; b<='0'; Cin<= '0'; wait for 20 ns;
a<='0'; b<='0'; Cin<= '1'; wait for 20 ns;
a<='0'; b<='1'; Cin<= '0'; wait for 20 ns;
a<='0'; b<='1'; Cin<= '1'; wait for 20 ns;
a<='1'; b<='0'; Cin<= '0'; wait for 20 ns;
a<='1'; b<='0'; Cin<= '1'; wait for 20 ns;
a<='1'; b<='1'; Cin<= '0'; wait for 20 ns;
a<='1'; b<='1'; Cin<= '1'; wait for 20 ns;
wait;
end process;

FPGA et programmation VHDL Pr. Youssef EL AFOU


14
end;
Alors le programme du add_4bits est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration du paquetage spécifique pour appeler les components.
use work.mes_composants.all;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity add_4bits is
Port ( a : in STD_LOGIC_VECTOR (3 downto 0);
b: in STD_LOGIC_VECTOR (3 downto 0);
Rin : in STD_LOGIC;
s : out STD_LOGIC_VECTOR (3 downto 0);
Rout : out STD_LOGIC);
end add_4bits;
-- Déclaration de l’architecture en structurelle.
architecture Behavioral of add_4bits is
signal T1,T2,T3:std_logic;
begin
u1:Add_1bit port map (a(0),b(0),Rin,S(0),T1);
u2:Add_1bit port map (a(1),b(1),T1,S(1),T2);
u3:Add_1bit port map (a(2),b(2),T2,S(2),T3);
u4:Add_1bit port map (a(3),b(3),T3,S(3),Rout);
end Behavioral;
Le fichier Test du VHDL : test_add_4bits c’est le même on change juste la partie du
tb :process
tb : process
begin
a<=''0000''; b<=''0000''; Rin<= '0'; wait for 20 ns;
a<=''0100''; b<=''0101''; Rin<= '1'; wait for 20 ns;
a<=''1010''; b<=''0110''; Rin<= '0'; wait for 20 ns;
a<=''1100''; b<=''0111''; Rin<= '1'; wait for 20 ns;
a<=''0101''; b<=''0111''; Rin<= '0'; wait for 20 ns;
a<=''1000''; b<=''0101''; Rin<= '1'; wait for 20 ns;
a<=''0010''; b<=''1011''; Rin<= '0'; wait for 20 ns;
a<=''1110''; b<=''0110''; Rin<= '1'; wait for 20 ns;
wait;
end process;
end;
Réaliser un additionneur complet de N bits en instanciant l’additionneur complet de 1bit. On doit
déclarer le paramètre générique N dans l’entité et utiliser l’instruction GENERATE dans le
programme principal de N bits.

FPGA et programmation VHDL Pr. Youssef EL AFOU


15
 Additionneur complet Nbits: structurelle
Alors le programme du add_Nbits est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration du paquetage spécifique pour appeler les components.
use work.mes_composants.all;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity add_Nbits is
generic (n:natural:=8); -- (8 ou 16 ou AUTRES)
Port ( a : in STD_LOGIC_VECTOR (N-1 downto 0);
b: in STD_LOGIC_VECTOR (N-1 downto 0);
Rin : in STD_LOGIC;
s : out STD_LOGIC_VECTOR (N-1 downto 0);
Rout : out STD_LOGIC);
end add_Nbits;
-- Déclaration de l’architecture en structurelle.
architecture Behavioral of add_Nbits is
signal t:std_logic_vector (n downto 0);
begin
u1:for i in 0 to n-1 generate
u2: add_1bit port map (a(i), b(i), t(i), s(i), t(i+1));
end generate;
t(0)<= Rin;
Rout <= t(n);
end Behavioral;
Le fichier Test du VHDL : test_add_Nbits, ICI N=8, la partie du tb :process
tb : process
begin
a<=x''FE''; b<=x''0D''; Rin<= '0'; wait for 20 ns;
a<=x''01''; b<=x''93''; Rin<= '1'; wait for 20 ns;
a<=x''A5''; b<=x''07''; Rin<= '0'; wait for 20 ns;
a<=x''C8''; b<=x''FF''; Rin<= '1'; wait for 20 ns;
wait;
end process;
end;
VI. Bascule D
Réaliser la bascule D en utilisant un signal de remise à zéro synchrone active à l’état haut (Reset=1)
et sensible au front montant de l’horloge Clk.
 Bascule D:
Alors le programme de la bascule_d est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity bascule_d is
Port ( reset : in STD_LOGIC;
D: in STD_LOGIC;
Clk : in STD_LOGIC;
Q : out STD_LOGIC;
FPGA et programmation VHDL Pr. Youssef EL AFOU
16
Qb : out STD_LOGIC);
end bascule_d;
-- Déclaration de l’architecture avec une structure de test en séquentielle.
architecture Behavioral of bascule_d is
begin
process (clk)
begin
if clk='1' and clk'event then
if reset= '1' then Q<='0'; Qb<='1';
else Q<= D; Qb<= not D;
end if;
end if;
end process;
end Behavioral;
Le fichier Test du VHDL : test_bascule_d, et le meme sauf pour la partie du tb et tm process :
tm: process
begin
clk<='0';wait for 10 ns;
clk<='1';wait for 10 ns;
end process;
tb : process
begin
reset<= '1'; D<= '0'; wait for 15 ns;
reset<= '1'; D<= '1'; wait for 15 ns;
reset<= '0'; D<= '0'; wait for 15 ns;
reset<= '0'; D<= '1'; wait for 15 ns;
wait;
end process;
end;
VII. REGISTRE
Réaliser un registre de 8 bits qui est constitué de bascules D avec un signal Reset asynchrone actif à
l’état haut, le circuit sera sensible au front montant de l’horloge Clk.
 Registre à 8 bits:
Alors le programme d’un registre_8bits est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity registre_8bits is
Port ( reset : in STD_LOGIC;
D: in STD_LOGIC _VECTOR (7 downto 0);
Clk : in STD_LOGIC;
Q : out STD_LOGIC _VECTOR (7 downto 0);
Qb : out STD_LOGIC _VECTOR (7 downto 0));
end registre_8bits;
-- Déclaration de l’architecture avec une structure de test en séquentielle.
architecture Behavioral of registre_8bits is
signal s,sb:std_logic_vector(7 downto 0);
begin
process (clk,reset,d)
begin

if reset= '1' then s<="00000000"; sb<="11111111";


else if clk='1' and clk'event then s<=d; sb<=not d;

FPGA et programmation VHDL Pr. Youssef EL AFOU


17
else s<= s; sb<= sb;
end if;
end if;
end process;
q<=s; qb<=sb;
end Behavioral;
Le fichier Test du VHDL : test_ registre_8bits, et le même sauf pour la partie du tb et tm
process :
tm: process
begin
clk<='0';wait for 10 ns;
clk<='1';wait for 10 ns;
end process;
tb : process
begin
reset<= '1'; D<= "01001001"; wait for 15 ns;
reset<= '1'; D<= "11111000"; wait for 15 ns;
reset<= '1'; D<= "00010101"; wait for 15 ns;
reset<= '0'; D<= "11001111"; wait for 15 ns;
reset<= '0'; D<= "00000111"; wait for 15 ns;
reset<= '0'; D<= "10101010"; wait for 15 ns;
wait;
end process;
end;

 Registre à N bits:
Réaliser un registre de N bits qui est constitué de bascules D avec un signal Reset asynchrone actif à
l’état haut, le circuit sera sensible au front montant de l’horloge Clk.

Alors le programme d’un registre_Nbits est comme suite :


-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity registre_Nbits is
generic (n: natural:=16);
Port ( reset : in STD_LOGIC;
D: in STD_LOGIC _VECTOR (N-1 downto 0);
Clk : in STD_LOGIC;
Q : out STD_LOGIC _VECTOR (N-1 downto 0);
Qb : out STD_LOGIC _VECTOR (N-1 downto 0));
end registre_Nbits;
-- Déclaration de l’architecture avec une structure de test en séquentielle.
architecture Behavioral of registre_Nbits is
signal s,sb:std_logic_vector(n-1 downto 0);
begin
process (clk,reset,d)
begin
if reset= '1' then s<=(others=>'0'); sb<=(others=>'1');
else if clk='1' and clk'event then s<=d; sb<=not d;
else s<= s; sb<= sb;
end if;
end if;
end process;

FPGA et programmation VHDL Pr. Youssef EL AFOU


18
q<=s; qb<=sb;
end Behavioral;
Le fichier Test du VHDL : test_ registre_Nbits, et le même sauf pour la partie du tb et tm
process :
tm: process
begin
clk<='0';wait for 10 ns;
clk<='1';wait for 10 ns;
end process;
tb : process
begin
reset<= '0'; D<= x"FF1E"; wait for 15 ns;
reset<= '0'; D<= x"2C35"; wait for 15 ns;
reset<= '1'; D<= x"1D6E"; wait for 15 ns;
reset<= '1'; D<= x"1123"; wait for 15 ns;
reset<= '0'; D<= x"097A"; wait for 15 ns;
reset<= '1'; D<= x"DE5A"; wait for 15 ns;
wait;
end process;
end;
VIII. Compteur/Décompteur
Réaliser un circuit compteur/décompteur de N bits (N est un paramètre générique) avec une
remise à zéro asynchrone active à l’état haut. Le circuit sera sensible au front montant de l’horloge
Clk, il fonctionnera comme compteur à l’état haut de Ud et comme décompteur à l’état bas de Ud.
 Compteur/ décompteur à N bits:
Alors le programme d’un compteur_decompteur_Nbits est comme suite :
-- Déclaration de la bibliothèque et des paquetages.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Déclaration de l’entité avec les entrées/sorties correspondants.
entity compteur_decompteur_Nbits is
generic (n: natural:=8);
Port ( reset : in STD_LOGIC;
Ud: in STD_LOGIC;
Clk : in STD_LOGIC;
Q : out STD_LOGIC _VECTOR (N-1 downto 0));
end compteur_decompteur_Nbits;
-- Déclaration de l’architecture avec une structure de test en séquentielle.
architecture Behavioral of compteur_decompteur_Nbits is
signal s:std_logic_vector(n-1 downto 0);
begin
process (clk,reset,Ud)
begin
if reset= '1' then s<=(others=>'0');
else if clk='1' and clk'event then
if ud = '1' then S <= S+1;
else S <= S-1;
end if; end if; end if;
end process;
q<=s;
end Behavioral;
Le fichier Test du VHDL : test_ compteur_decompteur_Nbits, et le même sauf pour la partie
du tb et tm process :
tm: process

FPGA et programmation VHDL Pr. Youssef EL AFOU


19
begin
clk<='0';wait for 10 ns;
clk<='1';wait for 10 ns;
end process;
tb : process
begin
reset<= '0'; ud<= '1'; wait for 15 ns;
reset<= '1'; ud<= '1'; wait for 15 ns;
reset<= '0'; ud<= '1'; wait for 15 ns;
reset<= '1'; ud<= '0'; wait for 15 ns;
reset<= '0'; ud<= '0'; wait for 15 ns;
reset<= '1'; ud<= '1'; wait for 15 ns;
wait;
end process;
end;

FPGA et programmation VHDL Pr. Youssef EL AFOU


20
Travaux dirigés
Série TD n°1 (Circuits combinatoires)
Exercice 1
On donne la description VHDL suivante :
Library ieee ;
Use ieee.std_logic_1164.all;
Use work.std_arith.all;

Entity Portes is
Port (A, B: in std_logic;
Y1, Y2, Y3, Y4, Y5, Y6, Y7: out std_logic);
end Portes ;

Architecture Arch_Portes of Portes is


begin
Y1<= A and B;
Y2<= A or B;
Y3<= A xor B;
Y4<= A not B;
Y5<= A nand B;
Y6<= A nor B;
Y7<= not (A xor B);
end Arch_Portes;

1) A partir du fichier donner les noms des bibliothèques utilisées.


2) Quel est le nom de l’entité ? Quel est le nom de l’architecture ?
3) Représenter le schéma fonctionnel de la fonction. On placera naturellement les
entrées à gauche et les sorties à droites.

Exercice 2

B A S
0 0 1
0 1 1
1 0 1
1 1 0
1) Faire la description VHDL de ce circuit ?
2) De quel circuit s’agit-il ?
3) Dessiner le schéma bloc de ce circuit ?

FPGA et programmation VHDL Pr. Youssef EL AFOU


21
Exercice 3
Entrées Sorties
A3 A2 A1 A0 S1 S0
0 1 0 1 1 1
0 1 1 0 0 1
1 1 0 1 1 0
1) Faire la description VHDL de ce circuit ?
On peut passer de std_logic vers std_logic_vector en présentant les entrées et les sorties
comme des vecteurs respectivement.
2) Ecrire une description VHDL qui utilise les entrées et les sorties en vecteurs dans
une entité et plusieurs architectures qui contiennent différentes descriptions :
 Affectation sélective (with… select… when) ?
 Affectation conditionnelle (when… else) ?
 Structure de test (if… then… else)?
 Structure de choix (case… is… when) ?

Exercice 4
Soit la description VHDL suivante :
Library ieee ;
Use ieee.std_logic_1164.all;

Entity Fonction_mystere is
Port (e0, e1: in std_logic;
sel: in std_logic;
Sort: out std_logic);
end Fonction_mystere ;

Architecture V0 of Fonction_mystere is
begin
Sort <= e0 when sel= '0' else e1;
end V0;

1) Quelle est la fonction réalisée par cette architecture ?


2) Réécrire la même fonction avec la structure de test ?
3) Pour cette architecture, recopier le chronogramme suivant et complétez le avec la
trace du signal « sort » :
sel
e0
e1
sort

FPGA et programmation VHDL Pr. Youssef EL AFOU


22
Série TD n°2 (Circuits combinatoires)
Exercice 1
Soit la description VHDL suivante :
Library ieee ;
Use ieee.std_logic_1164.all;

Entity fct is
Port (a, b: in std_logic;
s: out std_logic);
end fct ;

Architecture archi_fct of fct is


begin
s<= '1' when a=b else '0';
end archi_fct;

1) Que réalise cette fonction ?


2) Donner le schéma de cette fonction ?
3) Donner une affectation sélective à cette architecture ?
Dans le même projet, on écrit la description VHDL suivante :
Library ieee ;
Use ieee.std_logic_1164.all;
R
O

Entity circuit is
Port (e1, e2, e3, e4: in std_logic;
s: out std_logic);
end circuit ;
R
XO

Architecture archi_circuit of circuit is


Signal s1, s2, s3, s4: std_logic;
Componenet fct
Port (a, b: in std_logic;
s: out std_logic);
end componenet ;
begin
cmp1: fct port map (e1, e2, s1);
cmp2: fct port map (e3, e4, s2);
cmp3: fct port map (e1, e3, s3);
end archi_circuit;

4) Faite une analyse structurelle du circuit réalisé ?


5) Donner le schéma de ce circuit en utilisant les portes décrites dans le
programme ?

FPGA et programmation VHDL Pr. Youssef EL AFOU


26
Soit la description VHDL suivante :
Library ieee ;
Use ieee.std_logic_1164.all;
Use iee.std_logic_arith.all;

Entity fct1 is
Port (A, B: in std_logic;
S1, S2, S3, S4: out std_logic);
end fct1 ;

Architecture Archi_fct1 of fct1 is


begin
S1<= '1' when (a= '0' and b= '0') else '0';
S2<= '1' when (a= '1' and b= '0') else '0';
S3<= '1' when (a= '0' and b= '1') else '0';
S4<= '1' when (a= '1' and b= '1') else '0';
end Archi_fct1;

1) Déduire de ce programme le schéma bloc du circuit ?


2) De quel circuit s’agit-il ?
3) La structure électronique dans cette description est-elle combinatoire ou
séquentielle ?
4) Ecrire cette même fonction avec une affectation sélective ?

Exercice 3

Voici le schéma bloc d’un démultiplexeur 1à 4, une entrée de validation Enable (le
circuit est actif à l’état haut de ce signal), une entrée de sélection E et 4 sorties.

Y0
E Y1
DMUX1_4
Y2
Enable Y3

Ecrire une description VHDL de ce circuit en utilisant :


1) Instruction de choix ? de quelle description s’agit-il ?
2) Affectation sélective ? de quelle description s’agit-il ?

FPGA et programmation VHDL Pr. Youssef EL AFOU


27
Ecrire une description VHDL du schéma fonctionnel suivant, de quelle description avez-
vous besoin ?

C
F

X
MU
A
X
MU

Y
R
NO

FPGA et programmation VHDL Pr. Youssef EL AFOU


28
Série TD n°3 (Circuits séquentiels)
Exercices 1
1) Ecrire une description VHDL selon le principe d’une bascule D latch

D Q
D_Latch
CLK Qb

2) Compléter le chronogramme suivant en se basant sur les données de D et CLK

clk

Q
Qb
Exercice 2
Réaliser un registre composé de 4 bascules D latch.
D1 D2 D3 D4

D1_Latc D2_Latch D3_Latc D4_Latch


CLK h h

Reset

Q1 Q2 Q3 Q4
Exercice 3
Réaliser un registre à décalage à droite de 4bits avec un reset asynchrone :
1) Description simple.
2) Description en utilisant une boucle.

FPGA et programmation VHDL Pr. Youssef EL AFOU


29
Série TD n°4 (Circuits séquentiels)

Exercice 1
Réaliser un compteur de 3 bits dans les cas suivants :
1) Compteur simple sans remise à zéro.
2) Compteur avec une Reset asynchrone.

Exercice 2
Réaliser un compteur décimal en langage VHDL avec une remise à zéro asynchrone
active à l’état bas.

Exercice 3
Réaliser un compteur/décompteur en langage VHDL avec une remise à zéro asynchrone
active à l’état haut. Le circuit fonctionnera comme compteur à l’état haut du signal E et
comme un décompteur à l’état bas du signal E.

Exercice 4
Réaliser un compteur modulo 6 en langage VHDL (le compteur compte de 0 à 5).

Exercice 5
Réaliser un décompteur modulo 12 en langage VHDL (le décompteur décompte de 11 à
0).

FPGA et programmation VHDL Pr. Youssef EL AFOU


30

Vous aimerez peut-être aussi