-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathVideo3_Ejemplo4.txt
122 lines (103 loc) · 2.93 KB
/
Video3_Ejemplo4.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
--Descripcion:
--Implementación de hardware para mostrar el uso de los displays de 7 segmentos
-- en un contador de 0 a 9999 corriendo en una tarjeta Cyclone IV.
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY CONT09999 IS
PORT( CLK : IN STD_LOGIC;
INI : IN STD_LOGIC;
RESET : IN STD_LOGIC;
DISPLAY : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
TRANS : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END CONT09999;
ARCHITECTURE BEHAVIORAL OF CONT09999 IS
TYPE MAQUINA IS (UNIDADES,DECENAS,CENTENAS,MILLAR);
SIGNAL EDO_P, EDO_F : MAQUINA := UNIDADES;
--CONSTANT DELAY_FIN : INTEGER := 499_999;
CONSTANT DELAY_FIN : INTEGER := 49_999_999;
CONSTANT DELAY_SW : INTEGER := 4_999;
SIGNAL CONTADOR_PRINCIPAL : INTEGER RANGE 0 TO 9 :=0;
SIGNAL CONTA_UNIDADES, CONTA_DECENAS, CONTA_CENTENAS, CONTA_MILLAR : INTEGER RANGE 0 TO 9 :=0;
SIGNAL CONTA_DELAY : INTEGER RANGE 0 TO DELAY_FIN :=0;
SIGNAL CONTA_SW : INTEGER RANGE 0 TO DELAY_SW :=0;
BEGIN
PROCESS(CLK)
BEGIN
IF RISING_EDGE(CLK) THEN
IF RESET = '1' THEN
CONTA_UNIDADES <= 0;
CONTA_DECENAS <= 0;
CONTA_CENTENAS <= 0;
CONTA_MILLAR <= 0;
ELSE
IF INI = '1' THEN
IF CONTA_DELAY = DELAY_FIN THEN
CONTA_DELAY <= 0;
CONTA_UNIDADES <= CONTA_UNIDADES+1;
IF CONTA_UNIDADES = 9 THEN
CONTA_UNIDADES <= 0;
CONTA_DECENAS <= CONTA_DECENAS +1;
IF CONTA_DECENAS = 9 THEN
CONTA_DECENAS <= 0;
CONTA_CENTENAS <= CONTA_CENTENAS+1;
IF CONTA_CENTENAS = 9 THEN
CONTA_CENTENAS <= 0;
CONTA_MILLAR <= CONTA_MILLAR+1;
IF CONTA_MILLAR = 9 THEN
CONTA_MILLAR <= 0;
END IF;
END IF;
END IF;
END IF;
ELSE
CONTA_DELAY <= CONTA_DELAY +1;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(EDO_P)
BEGIN
CASE EDO_P IS
WHEN UNIDADES =>
TRANS <= "1110";
EDO_F <= DECENAS;
WHEN DECENAS =>
TRANS <= "1101";
EDO_F <= CENTENAS;
WHEN CENTENAS =>
TRANS <= "1011";
EDO_F <= MILLAR;
WHEN MILLAR =>
TRANS <= "0111";
EDO_F <= UNIDADES;
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
PROCESS(CLK,EDO_P,EDO_F)
BEGIN
IF RISING_EDGE (CLK) THEN
CONTA_SW <= CONTA_SW +1;
IF CONTA_SW = DELAY_SW THEN
CONTA_SW <= 0;
EDO_P <= EDO_F;
END IF;
END IF;
END PROCESS;
CONTADOR_PRINCIPAL <= CONTA_UNIDADES WHEN EDO_P = UNIDADES ELSE
CONTA_DECENAS WHEN EDO_P = DECENAS ELSE
CONTA_CENTENAS WHEN EDO_P = CENTENAS ELSE
CONTA_MILLAR;
--ABCDEFG
DISPLAY <= "0000001" WHEN CONTADOR_PRINCIPAL = 0 ELSE --0
"1001111" WHEN CONTADOR_PRINCIPAL = 1 ELSE --1
"0010010" WHEN CONTADOR_PRINCIPAL = 2 ELSE --2
"0000110" WHEN CONTADOR_PRINCIPAL = 3 ELSE --3
"1001100" WHEN CONTADOR_PRINCIPAL = 4 ELSE --4
"0100100" WHEN CONTADOR_PRINCIPAL = 5 ELSE --5
"0100000" WHEN CONTADOR_PRINCIPAL = 6 ELSE --6
"0001111" WHEN CONTADOR_PRINCIPAL = 7 ELSE --7
"0000000" WHEN CONTADOR_PRINCIPAL = 8 ELSE --8
"0000100";
END BEHAVIORAL;