Vous êtes sur la page 1sur 45

Universit Mohammed 1 er

Ecole National des Sciences Appliques


Oujda

Mini-projet en VHDL

Travail ralis par :


BOUSELHAM Loubna
MERZOUKI Alae
MOURHLI Med
RABYI Kaoutar
YAHYAOUI Fatima

Dpartement : Gnie Electrique


Anne universitaire : 2008/2009

Sommaire
Partie 1 : Conception dun mini-calculateur ...... 3
I. Conception de lUAL

Conception du comparateur 4 bits ...4


- Conception de lUAL ..8

II. Conception des registres....14


III. Conception des multiplexeurs et dmultiplexeurs
1. Conception des multiplexeurs

- 2 vers 1..17
- 4 vers 1.
.19

2. Conception de dmultiplexeur ..23


IV. Conception du contrleur..25
V. Conception final du mini-calculateur .27

Partie 2 : Exercices en VHDL ...29


I.
II.
III.
IV.

Modlisation dun dcodeur 7 segments ...30


Modlisation dun compteur synchrone 35
Modlisation dune bascule D Flip Flop .38
Modlisation dune bascule JK .41

Conception dun mini-calculateur

R0

UAL

CE

R1
B

CE

R2

Res

CE

R3

Contrleur
Instructon

CE

clk

I.

Conception de lUnit arithmtique et logique :


1. Conception du comparateur 4 bits :
a. Table de vrit

A3, B3
A3>B3
A3<B3
A3=B3
A3=B3
A3=B3
A3=B3
A3=B3
A3=B3
A3=B3

Entres
A2, B2 A1, B1
x
x
x
x
A2>B2
x
A2<B2
x
A2=B2 A1>B1
A2=B2 A1<B1
A2=B2 A1=B1
A2=B2 A1=B1
A2=B2 A1=B1

A0, B0
x
x
x
x
x
x
A0>B0
A0<B0
A0=B0

Sorties
A_SUP_B A_INF_B A_EGAL_B
1
0
0
0
1
0
1
0
0
0
1
0
1
0
0
0
1
0
1
0
0
0
1
0
0
0
1

b. Fichier compar_4b :

On tape les lignes de commande suivantes dans la fentre transcript :


force A 0000 0,1000 40,0000 80,1100 120,0000 160,1110 200,1001 240,1111
280,0100 320,1111 360
(On force le signal A 0000 au temps 0, 1000 au temps 40, 0000 au temps 80,
1100 au temps 120, 0000 au temps 160, 1110 au temps 200, 1001 au temps 240,
1111 au temps 280, 0100 au temps 320 et 1111 au temps 360)

force B 0000 0,0000 40,1000 80,1000 120,0100 160,1100 200,1011 240,1110


280,0101 320,1111 360
Run 400
La simulation donne les rsultats suivants:

c. Fichier compar_4b_TB :

La simulation donne les rsultats suivants:

2. Conception de lUAL :
Enntree_A

4
4

Enntree_B

4
3

resultat
S_A_SUP_B
S_A_INF_B
S_A_EGAL_B
S_OVFL
S_ZERO
S_NEG

CodeOP

a. Fichier Oprations.vhd :
7

Le champ CodeOp sert indiquer la nature de lopration


raliser :
CodeOP
000
001
010
011
100
101
110
111

Opration raliser
Resultat <= A ET B
Resultat <= A NON ET B
Resultat <= A OU B
Resultat <= A NON OU B
Resultat <= A XOR B
Resultat <= NOT A
Resultat <= A + B
Resultat <= A - B
b. Fichier Indications.vhd :

S_OVFL : sortie permettant dindiquer si lopration


effectue un dbordement.
S_ZERO : sortie permettant dindiquer si le rsultat est nul.

S_NEG : sortie permettant dindiquer sur le rsultat est


ngatif.

c. Fichier Unite.vhd : description complte de lUAL :

On tape les lignes de commande suivantes dans la fentre transcript :


force entree_A 0000 0,1000 40,0000 80,1100 120,0000 160,1110 200,1001 240,1111
280,0100 320,1111 360
force entree_B 0000 0,0000 40,1000 80,1000 120,0100 160,1100 200,1011 240,1110
280,0101 320,1111 360
10

force CodeOp 000 0,001 40,010 80,011 120,100 160,101 200,110 240,111 360
run 400
La simulation donne les resultats suivants :

d. Fichier Unite_TB.vhd : TestBench de lUAL :

11

12

La simulation donne les rsultats suivants :

13

II.

Conception des registres :

(Registre de mmorisation : Il s'agit en fait d'un ensemble de bascules


D flip-flop formant un mot binaire de 4 bits)
D
Clock_enable

CE

CLR

1. Fichier Registre.vhd :
Commentaire : Si CE=1,lentre de registre sera recopi dans la sortie ,si non la sortie est un
tat inconnu fort
- On tape les lignes de commande suivantes dans la fentre transcript :
force CE 1 0,0 350
force D 0000 0,0001 60,0010 120,0011 180,0100 240
force clr 0
run 500
pour clock_enable a une priode de 100ns
- La simulation donne les rsultats suivants :

14

2. Fichier REGISTRE_TB :

15

16

III.

La simulation donne les rsultats suivants :

Conception des multiplexeurs et dmultiplexeurs :


1. Conception des multiplexeurs :
1.1
Multiplexeur 2 vers 1 :
Res
A

MUX
21

Sc1

E_UAL

Sc1
O
1

E_UAL
Res
A

17

a. Fichier MUX1.vhd :

On tape les lignes de commande suivantes dans la fentre transcript :


force A 0000 0,0001 30,0010 60
force res 0110 0,1111 40,1010 80
force Sc1 0 0,1 35
run 80
La simulation donne les rsultats suivants :

18

b. Fichier MUX1_TB.vhd :

19

La simulation donne les rsultats suivants :

1.2

Multiplexeur 4 vers 1

S_R0
S_R1
S_R2

MUX
41

S_R3

Res

Sc2
00
01
10
11

Res
S_R0
S_R1
S_R2
S_R3

2
a. Fichier MUX2.vhd
:
Sc2e
s

20

- On tape les lignes de commande suivantes dans la fentre transcript :


force S_R0 0000 0,0001 20
force S_R1 0010 0,0011 10
force S_R2 0100 0,0101 15
force S_R3 0111 0,1000 10
force Sc2 00 0,01 5,10 10,11 15
run 20
-

La simulation donne les rsultats suivants :

21

b. Fichier MUX2_TB :

22

La simulation donne les rsultats suivants :

23

2. Conception de dmultiplexeur :
E_R0
E_R1
S_UAL

DEMUX
14

E_R2
E_R3

Sc3
00
01
10
11

E_R0
1
0
0
0

E_R1
0
1
0
0

E_R2
0
0
1
0

E_R3
0
0
0
1

2
Sc3e
s

a. Fichier DEMUX.vhd :

- On tape les lignes de commande suivantes dans le transcript :


force S_UAL 0000 0,0001 10,0011 20,0100 40
force Sc3 00 0,01 10,10 20,11 40
run 50
- La simulation donne les rsultats suivants :

24

b. Fichier DEMUX_TB :

25

La simulation donne les rsultats suivants :

IV.

Conception du contrleur :

Instr

Contrleur

Sc1
Sc2
Sc3
CE1
CE2
CE3
CE4
Code_OP

- Le bit 3 de linstruction permet de prciser si lon souhaite effectuer


une opration sur les entres A et B ou sur B et une donne provenant
de lun des registres => Cest le signal de slection de multiplexeur 2
vers 1.
- Les bits 5 et 4 permettent de slectionner le registre dans lequel une
donne servira effectuer un calcul avec loprande B => Cest le signal
de slection de multiplexeur 4 vers 1.
- Les bits 7 et 6 permettent de slectionner le registre dans le quel le
rsultat de lUAL sera stock => Cest le signal de slection du
dmultiplexeur 1 vers 4.

Fichier CONTROL1.vhd :
26

27

- On tape les lignes de commande dans le transcript :


force Instr 01011111 0,01010000 10,11111010 20,10101010 30,01100110
40,11111111 50,00000000 60
run 70
- La simulation donne les rsultats suivants :

V.

Conception final du mini-calculateur :

28

- Fichier mini_calcul.vhd :

29

30

Exercices en VHDL

31

I.

Modlisation dun dcodeur 7

DataDCB

Decodeur

segments :

SEG sur 7 bits

1. Table de vrit :
E1 E2 E3 E4
0
0
0
0
0
0
0
0
1
1

0
0
0
0
1
1
1
1
0
0

0
0
1
1
0
0
1
1
0
0

0
1
0
1
0
1
0
1
0
1

SEG_
A
1
0
1
1
0
1
1
1
1
1

SEG_B SEG_C
1
1
1
1
1
0
0
1
1
1

1
1
0
1
1
1
1
1
1
1

SEG_D SEG_E
1
0
1
1
0
1
1
0
1
1

SEG_F

SEG_G

1
0
0
0
1
1
1
0
1
1

0
0
1
1
1
1
1
0
1
1

1
0
1
0
0
0
1
0
1
0

2. Fichier dec7seg.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.all;
entity dec7seg is
port( BCD: in std_logic_vector (3 downto 0);
SEGS: out std_logic_vector(6 downto 0));
end dec7seg;
architecture bhv of dec7seg is
begin
with BCD select
SEGS <= "1111110" when "0000",
"0110000" when "0001",
"1101101" when "0010",
"1111001" when "0011",
"0110011" when "0100",
"1011011" when "0101",
"1011111" when "0110",
"1110000" when "0111",
"1111111" when "1000",
"1111011" when "1001",
"-------" when others;
end bhv;
32

On tape les lignes de commande suivantes dans la fentre transcript :


- force bcd 0000 0,0001 20,0010 40,0011 60,0100 80,0101 100,0110 120,0111
140,1000 160,1001 180,1010 200,1011 220
- run 240
La simulation donne les rsultats suivants :

3. Fichier dec7seg _TB.vhd


library ieee;
use ieee.std_logic_1164.all;
entity dec7seg_TB is
end dec7seg_TB;
architecture TB2 of dec7seg_TB is
component dec7seg
port( BCD: in std_logic_vector (3 downto 0);
SEGS: out std_logic_vector(6 downto 0));
end component;
signal BCD:std_logic_vector (3 downto 0);
signal SEGS:std_logic_vector(6 downto 0);
begin
dec:dec7seg port map (BCD,SEGS);
process
variable C:integer:=0;
begin
--case 1
BCD <= "0000";
wait for 2 ns;
assert(SEGS = "1111110")
report "SEGS error!" severity error;
if ( SEGS /= "1111110") then
C:= C +1;
end if;
--case 2
BCD <= "0001";
wait for 2 ns;
assert(SEGS = "0110000")
report "SEGS error!" severity error;
if ( SEGS /= "0110000") then
C:= C +1;
end if;

33

--case 3
BCD <= "0010";
wait for 2 ns;
assert(SEGS = "1101101")
report "SEGS error!" severity error;
if ( SEGS /= "1101101") then
C:= C +1;
end if;
--case 4
BCD <= "0011";
wait for 2 ns;
assert(SEGS = "1111001")
report "SEGS error!" severity error;
if ( SEGS /= "1111001") then
C:= C +1;
end if;
--case 5
BCD <= "0100";
wait for 2 ns;
assert(SEGS = "0110011")
report "SEGS error!" severity error;
if ( SEGS /= "0110011") then
C:= C +1;
end if;
--case 6
BCD <= "0101";
wait for 2 ns;
assert(SEGS = "1011011")
report "SEGS error!" severity error;
if ( SEGS /= "1011011") then
C:= C +1;
end if;
--case 7
BCD <= "0110";
wait for 2 ns;
assert(SEGS = "1011111")
report "SEGS error!" severity error;
if ( SEGS /= "1011111") then
C:= C +1;
end if;
--case 8
BCD <= "0111";
wait for 2 ns;
assert(SEGS = "1110000")
report "SEGS error!" severity error;
if ( SEGS /= "1110000") then
C:= C +1;
end if;
--case 9
BCD <= "1000";
wait for 2 ns;
assert(SEGS = "1111111")
report "SEGS error!" severity error;
if ( SEGS /= "1111111") then

34

C:= C +1;
end if;
--case 10
BCD <= "1001";
wait for 2 ns;
assert(SEGS = "1111011")
report "SEGS error!" severity error;
if ( SEGS /= "1111011") then
C:= C +1;
End if;
-- lorsque l'entree BCD dpasse 9
--case 11
BCD <= "1010";
wait for 2 ns;
assert(SEGS = "-------")
report "SEGS error!" severity error;
if ( SEGS /= "-------") then
C:= C +1;
end if;
--case 12
BCD <= "1011";
wait for 2 ns;
assert(SEGS = "-------")
report "SEGS error!" severity error;
if ( SEGS /= "-------") then
C:= C +1;
end if;
--case 13
BCD <= "1100";
wait for 2 ns;
assert(SEGS = "-------")
report "SEGS error!" severity error;
if ( SEGS /= "-------") then
C:= C +1;
end if;
--case 14
BCD <= "1101";
wait for 2 ns;
assert(SEGS = "-------")
report "SEGS error!" severity error;
if ( SEGS /= "-------") then
C:= C +1;
end if;
--case 15
BCD <= "1110";
wait for 2 ns;
assert(SEGS = "-------")
report "SEGS error!" severity error;
if ( SEGS /= "-------") then
C:= C +1;
end if;
--case 16
BCD <= "1111";
wait for 2 ns;
assert(SEGS = "-------")
report "SEGS error!" severity error;
35

if ( SEGS /= "-------") then


C:= C +1;
end if;
-- summury of test bench
if (C=0) then
assert false
report"Testbench of compara_4b completed successfully!"
severity note;
else
assert true
report " Something wrong,try again"
severity error;
end if;
wait;
end process;
end TB2;

La simulation du test bench du dcodeur 7 segments donne les rsultats suivants :

36

II.

Modlisation dun compteur synchrone :

1. Fichier compteur.vhd :

- On tape les lignes de commande dans le transcript :


Force clk 1 0, 0 {50 ns} -r 100
Force rst 0 0
- La simulation donne les rsultats suivants :

37

On change la valeur du N, et on lui donne cette fois la valeur 12 ,( generic(n:


natural := 12);)
Le rsultat de la simulation est le suivant :

2. Fichier compteur_TB.vhd :

38

Remarque : le testbench est fait pour N = 3

39

III.

Modlisation dune bascule D flip flop:

D
Clk

1. Fichier bascD.vhd :

- On tape les lignes de commande suivante dans le transcript :


Force clk 1 0, 0 {50 ns} -r 100
force D 1 0, 0 80,1 120,0 150
run 200
- La simulation donne les rsultats suivants:

2. Fichier bascD_TB.vhd :

40

Simulation :

IV.

Modlisation dune bascule JK:


J
CLK

JK

Q
Qbar

reset

1. Fichier JK.vhd :

41

- On tape les lignes de commande suivante dans le transcript :


Force clk 1 0, 0 {50 ns} -r 100
force reset 1 0,0 20
force j 0 0,1 110
force k 0 0,1 40,0 110,1 210
run 300
- La simulation donne les rsultats suivants :

2. Fichier JK_TB.vhd :

42

43

44

Simulation :

45