Documente Academic
Documente Profesional
Documente Cultură
Mini-projet en VHDL
Sommaire
Partie 1 : Conception dun mini-calculateur ...... 3
I. Conception de lUAL
- 2 vers 1..17
- 4 vers 1.
.19
R0
UAL
CE
R1
B
CE
R2
Res
CE
R3
Contrleur
Instructon
CE
clk
I.
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 :
c. Fichier compar_4b_TB :
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
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 :
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 :
11
12
13
II.
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.
MUX
21
Sc1
E_UAL
Sc1
O
1
E_UAL
Res
A
17
a. Fichier MUX1.vhd :
18
b. Fichier MUX1_TB.vhd :
19
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
21
b. Fichier MUX2_TB :
22
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 :
24
b. Fichier DEMUX_TB :
25
IV.
Conception du contrleur :
Instr
Contrleur
Sc1
Sc2
Sc3
CE1
CE2
CE3
CE4
Code_OP
Fichier CONTROL1.vhd :
26
27
V.
28
- Fichier mini_calcul.vhd :
29
30
Exercices en VHDL
31
I.
DataDCB
Decodeur
segments :
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
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
36
II.
1. Fichier compteur.vhd :
37
2. Fichier compteur_TB.vhd :
38
39
III.
D
Clk
1. Fichier bascD.vhd :
2. Fichier bascD_TB.vhd :
40
Simulation :
IV.
JK
Q
Qbar
reset
1. Fichier JK.vhd :
41
2. Fichier JK_TB.vhd :
42
43
44
Simulation :
45