Está en la página 1de 7

INSTITUTO TECNOLGICO DE CELAYA

Ingeniera Mecatrnica

Proyecto final
"Reloj digital"
Baeza Martnez, Jess Daniel
Nava Fausto, Luis Felipe
Resumen En las siguientes lneas se presentar al lector los patrones de solucin empleados en el diseo y
construccin de un reloj digital en el cual es posible leer no solo la hora configurada, sino tambin la fecha en
formato
Palabras Clave Mquina de estados, programacin de eventos, temporizacin.

I. MTODOS
El proyecto presentado en las siguientes lneas
consiste en el diseo y operacin de un reloj digital
en la arquitectura de la tarjeta FPGA Basys 3 que
cumpla con caractersticas especficas, tal como se
muestra en las figuras uno y dos

Fig. 1. Funciones del reloj en la tarjeta Basys 3,


flanco derecho

Fig. 1. Funciones del reloj en la tarjeta Basys 3,


flanco izquierdo

Al englobar las necesidades primarias para la


operacin del reloj, se identificaron los siguientes
aspectos:
Funciones para la administracin del
tiempo (Segundos, minutos, horas, meses
y aos).
Funciones para ejecutar los cambios de
unidades una vez que la condicin de
cambio de una unidad de tiempo a otra se
cumpla.
Establecimiento de una condicin de
interrupcin para que el botn de
habilitacin de la fecha se ejecute sin
afectar la secuencia y tiempos manejados
por el reloj en el momento que dicha
condicin sea activada.
Establecimiento de condicin de paro
cuando se habilite la opcin de cambio de
fecha, u hora.
Sincronizacin de los vectores empleados
para representar las unidades de segundos
y las decenas de segundos dentro de la
tarjeta sin que exista desfasamiento en los
valora mostrados respecto en los displays.
Con fines prcticos y visualizacin formal, el
programa del reloj obedece un patrn de
lgica semejante al del diagrama mostrado en
la pgina siguiente.

Ingeniera Mecatrnica; Electrnica Digital A; Diciembre 12, 2016

Reloj
Digital

Comportamiento y
definicin de los patrones
de tiempo

Vector de unidades de
segundo
Divisor de frecuencia
configurado a 1 segundo

Vector para decenas de


segundo

Unidades de minuto
Decenas de minuto
Unidades de hora
Decenas de hora

M
P
L
E
X
O
R

Unidades de das
Decenas de das
Unidades de meses
Decenas de meses
Configuracin-aos

M
P
L
E
X
O
R

S
E
L
E
C
T
O
R

MPLEXOR

Ingeniera Mecatrnica; Electrnica Digital A; Diciembre 12, 2016

D
E
M
P
L
E
X

A continuacin, se procede a desglosar el cdigo


desarrollado para la operacin del reloj:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

entity Reloj is
Port ( clk,fecha,mf,cent,inc,dec,cam :
STD_LOGIC;
sel : out STD_LOGIC_VECTOR
downto 0);
dis : out STD_LOGIC_VECTOR
downto 0);
segledu : out STD_LOGIC_VECTOR
downto 0);
segledd : out STD_LOGIC_VECTOR
downto 0));
end Reloj;

in

pulso<=not pulso;
pulso1<= not pulso1;
pulso2<= not pulso2;
end if;
if contmul<19999 then
contmul<= contmul+1;
else
contmul<=0;
end if;

if pulso='1' then
ant<=inc;
(3
if inc='1' and ant='0' then
cuenta<='1';
(6
else
cuenta<='0';
(8
end if;
end if;
(4
if pulso1='1' then
ant1<=dec;
if dec='1' and ant1='0' then
cuenta1<='1';
architecture Behavioral of Reloj is
else
signal cont : integer range 0 to 99999999:=0;
cuenta1<='0';
signal cnt : integer range 1 to 20000000:=1;
end if;
signal contmul : integer range 0 to 19999:=0;
end if;
signal segu : integer :=0;
if pulso2='1' then
signal segd : integer :=0;
ant2<=cam;
signal min1 : integer :=0;
if cam='1' and ant2='0' then
signal min2 : integer :=0;
cuenta2<='1';
signal hor1 : integer :=0;
else
signal hor2 : integer :=0;
cuenta2<='0';
signal dia1 : integer :=1;
end if;
signal dia2 : integer :=0;
end if;
signal mes1 : integer :=1;
if cont<99999999 then
signal mes2 : integer :=0;
cont<=cont+1;
signal ano : integer :=0;
else
signal cambios : integer :=0;
if segu<9 then
signal ano2 : integer :=1;
segu<=segu+1;
signal ant, pulso, cuenta, ant1, pulso1, cuenta1,
else
ant2, pulso2, cuenta2 : STD_LOGIC;
segu<=0;
if segd<5 then
begin
segd<=segd+1;
else
process(clk)
segd<=0;
begin
end if;
if clk'event and clk='1' then
end if;
if cnt<20000000 then
if segu>8 and segd=5 then
cnt<=cnt+1;
segu<=0;
else
segd<=0;
cnt<=1;
if min1<9 then
Ingeniera Mecatrnica; Electrnica Digital A; Diciembre 12, 2016

min1<=min1+1;
if ano<9 then
else
ano<=ano+1;
min1<=0;
else
if min2<5 then
ano<=0;
min2<=min2+1;
if ano2<5 then
else
ano2<=ano2+1;
min2<=0;
else
end if;
ano2<=0;
end if;
end if;
if min1>8 and min2=5 then
end if;
min1<=0;
end if;
min2<=0;
end if;
if hor1<9 then
end if;
hor1<=hor1+1;
end if;
else
end if;
hor1<=0;
cont<=0;
if hor2<1 then
end if;
hor2<=hor2+1;
if cuenta2='1' then
else
if cambios<4 then
hor2<=0;
cambios<=cambios+1;
end if;
else
end if;
cambios<=0;
if hor1>3 and hor2=2 then
end if;
hor1<=0;
end if;
hor2<=0;
if cambios=0 and cent='1' and cuenta='1' then
if dia1<9 then
min1<=min1+1;
dia1<=dia1+1;
end if;
else
if cambios=0 and cent='1' and cuenta1='1' then
dia1<=0;
min1<=min1-1;
if dia2<3 then
end if;
dia2<=dia2+1;
if cambios=1 and cent='1' and cuenta='1' then
else
hor1<=hor1+1;
dia2<=0;
end if;
end if;
if cambios=1 and cent='1' and cuenta1='1' then
end if;
hor1<=hor1-1;
if dia1=0 and dia2=3 then
end if;
dia1<=1;
if cambios=2 and cent='1' and cuenta='1' then
dia2<=0;
dia1<=dia1+1;
if mes1<9 then
end if;
mes1<=mes1+1;
if cambios=2 and cent='1' and cuenta1='1' then
else
dia1<=dia1-1;
mes1<=0;
end if;
if mes2<1 then
if cambios=3 and cent='1' and cuenta='1' then
mes2<=mes2+1;
mes1<=mes1+1;
else
end if;
mes2<=0;
if cambios=3 and cent='1' and cuenta1='1' then
end if;
mes1<=mes1-1;
end if;
end if;
if mes1>1 and mes2=1 then
if cambios=4 and cent='1' and cuenta='1' then
mes1<=1;
ano<=ano+1;
mes2<=0;
end if;
Ingeniera Mecatrnica; Electrnica Digital A; Diciembre 12, 2016

if cambios=4 and cent='1' and cuenta1='1' then


when 2 => dis <= "0010010";
ano<=ano-1;
when 3 => dis <= "0000110";
end if;
when 4 => dis <= "1001100";
if contmul<4999 then
when 5 => dis <= "0100100";
sel<="1110";
when 6 => dis <= "0100000";
case min1 is
when 7 => dis <= "0001111";
when 0 => dis <= "0000001";
when 8 => dis <= "0000000";
when 1 => dis <= "1001111";
when others => dis <= "0000100";
when 2 => dis <= "0010010";
end case;
when 3 => dis <= "0000110";
else
when 4 => dis <= "1001100";
case ano is
when 5 => dis <= "0100100";
when 0 => dis <= "0000001";
when 6 => dis <= "0100000";
when 1 => dis <= "1001111";
when 7 => dis <= "0001111";
when 2 => dis <= "0010010";
when 8 => dis <= "0000000";
when 3 => dis <= "0000110";
when others => dis <= "0000100";
when 4 => dis <= "1001100";
end case;
when 5 => dis <= "0100100";
if fecha='1' and segu=0 then
when 6 => dis <= "0100000";
case mes1 is
when 7 => dis <= "0001111";
when 0 => dis <= "0000001";
when 8 => dis <= "0000000";
when 1 => dis <= "1001111";
when others => dis <= "0000100";
when 2 => dis <= "0010010";
end case;
when 3 => dis <= "0000110";
end if;
when 4 => dis <= "1001100";
end if;
when 5 => dis <= "0100100";
else
when 6 => dis <= "0100000";
if contmul<9999 then
when 7 => dis <= "0001111";
sel<="1101";
when 8 => dis <= "0000000";
case min2 is
when others => dis <= "0000100";
when 0 => dis <= "0000001";
end case;
when 1 => dis <= "1001111";
end if;
when 2 => dis <= "0010010";
if fecha='1' and segu=1 then
when 3 => dis <= "0000110";
case ano is
when 4 => dis <= "1001100";
when 0 => dis <= "0000001";
when others => dis <= "0100100";
when 1 => dis <= "1001111";
end case;
when 2 => dis <= "0010010";
if fecha='1' and segu=0 then
when 3 => dis <= "0000110";
case mes2 is
when 4 => dis <= "1001100";
when 0 => dis <= "0000001";
when 5 => dis <= "0100100";
when others => dis <= "1001111";
when 6 => dis <= "0100000";
end case;
when 7 => dis <= "0001111";
end if;
when 8 => dis <= "0000000";
if fecha='1' and segu=1 then
when others => dis <= "0000100";
case ano2 is
end case;
when 1 => dis <= "1001111";
end if;
when 2 => dis <= "0010010";
if mf='1' then
when 3 => dis <= "0000110";
if segu=0 or segu=2 or segu=4 or segu=6 or
when 4 => dis <= "1001100";
segu=8 then
when others => dis <= "0100100";
case mes1 is
end case;
when 0 => dis <= "0000001";
end if;
when 1 => dis <= "1001111";
if mf='1' then
Ingeniera Mecatrnica; Electrnica Digital A; Diciembre 12, 2016

if segu=0 or segu=2 or segu=4 or segu=6 or


when 1 => dis <= "1001111";
segu=8 then
when 2 => dis <= "0010010";
case mes2 is
when 3 => dis <= "0000110";
when 0 => dis <= "0000001";
when 4 => dis <= "1001100";
when others => dis <= "1001111";
when 5 => dis <= "0100100";
end case;
when 6 => dis <= "0100000";
else
when 7 => dis <= "0001111";
case ano2 is
when 8 => dis <= "0000000";
when 1 => dis <= "1001111";
when others => dis <= "0000100";
when 2 => dis <= "0010010";
end case;
when 3 => dis <= "0000110";
else
when 4 => dis <= "1001100";
dis <= "0000001";
when others => dis <= "0100100";
end if;
end case;
end if;
end if;
else
end if;
if contmul<19999 then
else
sel<="0111";
if contmul<14999 then
case hor2 is
sel<="1011";
when 0 => dis <= "0000001";
case hor1 is
when 1 => dis <= "1001111";
when 0 => dis <= "0000001";
when others => dis <= "0010010";
when 1 => dis <= "1001111";
end case;
when 2 => dis <= "0010010";
if fecha='1' and segu=0 then
when 3 => dis <= "0000110";
case dia2 is
when 4 => dis <= "1001100";
when 0 => dis <= "0000001";
when 5 => dis <= "0100100";
when 1 => dis <= "1001111";
when 6 => dis <= "0100000";
when 2 => dis <= "0010010";
when 7 => dis <= "0001111";
when others => dis <= "0000110";
when 8 => dis <= "0000000";
end case;
when others => dis <= "0000100";
end if;
end case;
if fecha='1' and segu=1 then
if fecha='1' and segu=0 then
dis <= "0010010";
case dia1 is
end if;
when 1 => dis <= "1001111";
if mf='1' then
when 2 => dis <= "0010010";
if segu=0 or segu=2 or segu=4 or segu=6 or
when 3 => dis <= "0000110";
segu=8 then
when 4 => dis <= "1001100";
case dia2 is
when 5 => dis <= "0100100";
when 0 => dis <= "0000001";
when 6 => dis <= "0100000";
when 1 => dis <= "1001111";
when 7 => dis <= "0001111";
when 2 => dis <= "0010010";
when 8 => dis <= "0000000";
when others => dis <= "0000110";
when others => dis <= "0000100";
end case;
end case;
else
end if;
dis <= "0010010";
if fecha='1' and segu=1 then
end if;
dis <= "0000001";
end if;
end if;
end if;
if mf='1' then
end if;
if segu=0 or segu=2 or segu=4 or segu=6 or
end if;
segu=8 then
end if;
case dia1 is
Ingeniera Mecatrnica; Electrnica Digital A; Diciembre 12, 2016

case segu is
when 1 => segledu<="000000001";
when 2 => segledu<="000000011";
when 3 => segledu<="000000111";
when 4 => segledu<="000001111";
when 5 => segledu<="000011111";
when 6 => segledu<="000111111";
when 7 => segledu<="001111111";
when 8 => segledu<="011111111";
when 9 => segledu<="111111111";
when others => segledu<="000000000";
II. RESULTADOS
.
Reporte
Reloj funcional

III. CONCLUSIONES
El trabajo realizado a lo largo del semestre queda
resumido en el presente documento junto con la
entrega del modelo funcional en la tarjeta Basys 3.
Los integrantes de este equipo lograron utilizar de
manera efectiva la mayora de los conceptos vistos
en clase y comprenden que cada elemento, cada
estructura y cada entidad declarada a lo largo de la
programacin en lenguaje de VHDL del reloj no es
ms que el fundamento, la base para el desarrollo de
proyectos con mayor grado de complejidad y ms
especficos, los cuales favorecern positivamente a la
formacin profesional del ingeniero futuro.
REFERENCIAS
[1] Maxinez, David; Alcal, Jessica. VHDL, El arte de
programar sistemas digitales. Grupo editorial
Patria, 6ta edicin. Ciudad de Mxico. 2008.

Ingeniera Mecatrnica; Electrnica Digital A; Diciembre 12, 2016

También podría gustarte