Reloj
Reloj
Reloj
Reloj Digital
0
Proyecto de D.A.S. Reloj Digital
Índice
1
Proyecto de D.A.S. Reloj Digital
A continuación haremos una breve descripción del funcionamiento general del sistema:
Al cargar el código en la placa lo primero que hacemos es resetear el programa para que
todos los valores comiencen de cero, y el reloj empiece a contar desde el valor inicial de la hora
(00:00:00).
A partir de este momento podemos empezar a utilizar toda la funcionalidad que ofrecen los
botones.
Estando en este estado, en el que el reloj muestra la hora, pulsando el botón set, podemos
establecer la hora actual, ajustando primero los minutos y posteriormente las horas, mediante el
botón adjust. Una vez establecidos los minutos, pasamos a establecer las horas mediante el
botón set. Cuando hemos fijado el valor deseado volvemos a mostrar la hora actual con el botón
modo.
A partir de este mismo estado podemos visualizar la hora que tiene fijada el reloj para que
suene la alarma en caso de estar activada. Al igual que en el caso anterior podemos cambiar la
hora de la alarma a través del botón set. Este proceso es idéntico al descrito en el apartado
anterior, utilizando los botones adjust (cambiar el valor de los dígitos), set (pasar de minutos a
horas o viceversa) y modo (volver a mostrar la hora fijada para la alarma).
Cuando nos encontramos en este estado, en el que visualizamos la alarma, podemos pasar a
mostrar el valor del cronómetro a través del botón modo. La primera vez que visualizamos el
cronómetro, éste estará parado y con valor cero. El resto de las veces su estado dependerá de el
último uso que se hizo del cronómetro, es decir, si lo dejamos contando o parado en un
determinado instante (puede ser el valor que hubiera contado o puesto a cero).
Cuando el cronómetro está parado, para que empiece a contar utilizamos el botón adjust, de
igual forma si estamos contando podemos parar el cronómetro con este mismo botón. Para
iniciar una nueva cuenta, reseteamos el cronómetro con el botón set.
Podemos abandonar la visualización del cronómetro en cualquiera de sus estados mediante
el botón modo, y volver a mostrar la hora actual.
Cuando se está mostrando la hora actual, podemos activar la alarma, para que suene cuando
la hora actual coincida con la establecida para la alarma, mediante el botón adjust. Como
comprobamos que coincidan las horas y los minutos, la alarma estará sonando durante un
minuto, a no ser que se desactive antes pulsando este mismo botón.
Para representar que la alarma está activa, iluminamos el punto decimal en todas las
posiciones del banco de displays.
2
Proyecto de D.A.S. Reloj Digital
Una visión general de los módulos que componen nuestro sistema es la siguiente:
Controlador
3
Proyecto de D.A.S. Reloj Digital
2. Máquina de estados.
- set, mod y adj: estas señales se activan cuando se pulsa el botón correspondiente, son
las que producen las transiciones de un estado a otro, de la forma que se ha descrito en
el funcionamiento del sistema.
- modo: esta señal es una salida de Moore del diagrama de estados, y nos indica el
módulo que estamos utlizando. Tanto cuando nos encontramos mostrando la hora, como
estableciendo su valor, la señal modo tendrá el valor “00”. Igualmente para la alarma
tendrá en todo momento el valor “01” y para el cronómetro “10”.
- ponerMin: esta señal es una salida de Moore que se activa cuando estamos fijando el
valor de los minutos de la hora del reloj.
- ponerHora: esta señal es una salida de Moore que se activa cuando estamos fijando el
valor de las horas de la hora del reloj.
- ponerAlarmM: esta señal es una salida de Moore que se activa cuando estamos fijando
el valor de los minutos de la alarma del reloj.
- ponerAlarmH: esta señal es una salida de Moore que se activa cuando estamos fijando
el valor de las horas de la alarma del reloj.
- cuentaCronometro: esta señal es una salida de Moore que se activa cuando el
cronómetro está contando.
- cargaFlagAlarm: esta señal es una salida de Mealy que nos indica si hay que activar o
desactivar la alarma, es decir, si estamos mostrando la hora actual y pulsamos el botón
adjust, tenemos que modificar el estado de la alarma (activa o no), por lo tanto debemos
activar el flag de carga.
- valorFlagAlarm: esta señal es una salida de Mealy que nos indica si la alarma está
activada (en este caso el valor es uno) o no (valor cero). Como hemos mencionado
anteriormente podemos comprobar si la alarma está activada o no mediante el punto
decimal del banco de displays.
- cargaFlagCronometro: esta señal es una salida de Mealy que nos indica si hay que
modificar el valor del estado del cronómetro, es decir, contando o parado.
- valorFlagCronometro: esta señal es una salida de Mealy que nos indica el valor del
estado del cronómetro, si su valor es uno el cronómetro está contando y si es cero el
cronómetro está parado.
- reset: esta señal es una salida de Mealy que se activa cuando ponemos el cronómetro a
cero. Hay que aclarar que esta señal sólo resetea el valor del cronómetro, y es
independiente de la señal rst que resetea todo el sistema.
4
Proyecto de D.A.S. Reloj Digital
adj / cargaFlagAlarm = 1
valorFlagAlarm = ¬valorFlagAlarm
adj adj
mod
mod
adj
adj
mod
mod ∧ ¬valorFlagCronometro
mod ∧ valorFlagCronometro
mod
adj / valorFlagCronometro = 1
Cronómetro cargaFlagCronometro = 1
Parado Cronómetro
Contando
adj/ valorFlagCronometro = 1
set / reset = 1 cargaFlagCronometro = 1
set / reset = 1
Cronómetro a
Cero
mod
5
Proyecto de D.A.S. Reloj Digital
3. Diseño RT.
Este módulo se utiliza para generar la hora del reloj. Consiste en varios contadores
encadenados por la señal de fin de cuenta del contador anterior, que se corresponden con los
cuatrocientoavos de segundo (utilizamos un temporizador de 0.0025 segundos para aprovechar
el mismo temporizador en otros módulos), segundos, minutos y horas. La cadena que une estos
contadores se rompe cuando estamos actualizando manualmente la hora del reloj, para esto se
colocará una puerta OR a la entrada de los contadores de las horas y los minutos.
*ponerHora
Contador de Contador de
0a2 0a9
ContOut53 ContOut43
ContOut50 ContOut40
ContOut52 ContOut42
ContOut51 ContOut41
*ponerMin
Contador de Contador de
0a5 0a9
ContOut33 ContOut23
ContOut30 ContOut20
ContOut32 ContOut22
ContOut31 ContOut21
6
Proyecto de D.A.S. Reloj Digital
Este módulo se utiliza para introducir la hora de la alarma del reloj. Consiste en cuatro
contadores encadenados de dos en dos que se corresponden con los minutos y las horas. La
entrada de los contares del dígito menos significativo de las horas y los minutos, valdrá uno en
el caso de que estemos introduciendo las horas o minutos, según el caso, de la alarma y
pulsemos el botón adjust.
clk
7
Proyecto de D.A.S. Reloj Digital
En este módulo se genera el sonido cuando la alarma del reloj tiene que sonar (la hora
de la alarma debe coincidir con la hora actual y la alarma debe estar activada). Para ello se
recibirá como entrada las salidas de los contadores de las horas y minutos respectivos y se
comprobará si son iguales.
El oscilador cuenta el semiperiodo de la nota que vamos a generar. Por otro lado
tenemos dos contadores, uno de segundos y otro de cuartos de segundo. El solapamiento de las
salidas de fin de cuenta nos produce una señal que sonará dos veces durante un segundo y luego
deja pasar otro segundo. La OR de todas estas señales nos da el sonido de la alarma en el
momento adecuado.
Oscilador T Q
sound
valorFlagAlarm
clk
Contador cuartos de
segundo T Q
Contador de
segundos T Q
8
Proyecto de D.A.S. Reloj Digital
Este módulo sirve para llevar la cuenta del cronómetro en el cual se mostrará las
centésimas de segundo, los segundos y los minutos. Para ello, enlazaremos varios contadores
que irán contando hasta un número determinado (dependiendo del valor que represente). La
salida de cada contador se enviará al controlador para que la muestre en el banco de displays.
Para que el cronómetro empiece a contar, la señal de CuentaCronómetro debe estar a uno,
así como la salida del temporizador que nos indica que ha transcurrido una centésima de
segundo.
Es importante aclarar que la entrada reset de los contadores viene del controlador y es
distinta del reset general del sistema. Esta entrada es asíncrona y resetea el cronómetro cuando
el usuario pulsa el botón de set (y el reloj se encuentra en cualquiera de los otros dos estados del
cronómetro).
clk
reset
CuentaCronómetro
Temporizador
9
Proyecto de D.A.S. Reloj Digital
modo
BANCO DE
REGISTROS
sel
CONVERSOR DE
SIETE SEGMENTOS
SieteSegs
Hemos realizado una simplificación para que el diseño se vea más claro. En realidad, las
señales contOut y contCOut están compuestas cada una de seis vectores de cuatro bits cada uno
que se corresponden con cada una de las salidas de los contadores BCD. La salida contAlOut
está compuesta por cuatro vectores también de cuatro bits. Además añadimos a cada señal los
bits que representarán las dos rayas que separan las horas de los minutos o bien aquellos bits
que representan las letras A y L. Es decir, cuando estamos en modo “00” y tenemos que mostrar
la hora, pasamos al multiplexor los ocho bits que componen la hora seguido de “1010” (que se
corresponde según nuestra elección con dos rayas horizontales) y a continuación pasamos los
ocho bits que componen los minutos que también van seguidos de “1010”. Por último los ocho
bits que componen los segundos. En el caso del cronómetro ocurre algo similar solo que
representamos centésimas de segundos, segundos y minutos. Cuando lo que tenemos que
mostrar es la alarma aparecerán las horas y los minutos seguidos de un espacio en blanco y de
las letras A y L (hemos elegido los vectores “1011” y “1100”).
10
Proyecto de D.A.S. Reloj Digital
La salida del banco de registros son ocho vectores de cuatro bits que van al multiplexor
donde se selecciona una de estas salidas dependiendo del display que se esté refrescando en ese
momento. Por último esta salida pasa al conversor de siete segmentos.
Para producir el efecto del parpadeo de los dígitos cuando estamos poniendo en reloj en hora
o cuando ponemos la alarma pensamos un módulo que, bajo ciertas condiciones, pusiera una
salida cero en el banco de displays en lugar de la salida sieteSegs correspondiente. De este
modo conseguimos que no se muestre nada en ciertas posiciones durante cierto tiempo (hemos
elegido medio segundo) y de esta forma los números parpadeen. El diseño RT es el siguiente:
SalidaInversor
PonerHora
DisplaySelAux(2)
Aux1
DisplaySelAux(1)
PonerHora
DisplaySelAux(2)
DisplaySelAux(1) Aux2
DisplaySelAux(2)
PonerHora
PonerMin
SalidaInversor
Aux3
DisplaySelAux(2)
DisplaySelAux(1)
DisplaySelAux(0)
PonerMin
DisplaySelAux(2)
DisplaySelAux(1)
DisplaySelAux(0)
DisplaySelAux(2)
DisplaySelAux(0)
DisplaySelAux(1) Aux4
DisplaySelAux(0)
DisplaySelAux(2)
DisplaySelAux(1) PonerMin
11
Proyecto de D.A.S. Reloj Digital
La idea que se encuentra detrás de todas estas señales es que tenemos que mostrar la salida
del conversor de siete segmentos en las siguientes ocasiones:
- Cuando no estemos poniendo el reloj en hora.
- Cuando estemos poniendo el reloj en hora pero no toca refrescar los displays
correspondientes a los dígitos de la hora.
- Cuando estemos poniendo el reloj en hora y tengamos que refrescar los displays
correspondientes a los dígitos de la hora y además haya pasado medio segundo.
El último punto surge de la necesidad de que aparezcan los dígitos de la hora cada cierto
tiempo (porque sino no veríamos nada). Lo conseguimos con un contador que cuenta medio
segundo y que va a la entrada de un biestable T (que hemos llamado inversor). De esta forma,
salidaInversor vale uno cada medio segundo y los dígitos correspondientes a la hora aparecen.
Todo esto es aplicable al caso en el que estamos poniendo los minutos. Además es necesario
hacer lo mismo en el caso de que estemos poniendo la alarma, por lo que son necesarias cuatro
señales más:
SalidaInversor
PonerAlarmH
DisplaySelAux(2)
Aux1
DisplaySelAux(1)
PonerAlarmH
DisplaySelAux(2)
DisplaySelAux(1) Aux2
DisplaySelAux(2)
PonerAlarmH
SalidaInversor
PonerMin
Aux3
DisplaySelAux(2)
DisplaySelAux(1)
DisplaySelAux(0)
PonerAlarmM
DisplaySelAux(2)
DisplaySelAux(1)
DisplaySelAux(0)
DisplaySelAux(2)
DisplaySelAux(0)
DisplaySelAux(1) Aux4
DisplaySelAux(0)
DisplaySelAux(2)
DisplaySelAux(1) PonerAlarmM
12
Proyecto de D.A.S. Reloj Digital
Al final juntamos todo y nos queda el siguiente diseño para la señal sieteSegs:
Aux1
Aux2
Aux3
Aux4
Modo(1)
Modo(0)
Aux5
Aux6
Aux7
Aux8
Modo(1)
Modo(0)
Modo(1)
Modo(0)
CargaFlagAlarm
ValorFlagAlarm
BANCO DE DISPLAYS
clk
El valor que sale del flag que usamos para saber si la alarma está o no activada va
directamente al decimal point del banco de displays de forma que si la alarma está activada se
iluminará.
13
Proyecto de D.A.S. Reloj Digital
De esta parte del diseño sólo nos queda el contador de medio segundo y el inversor:
TEMPORIZADOR
CONTADOR DE
0 - 199
INVERSOR
SalidaInversor
El refresco de displays se hace de forma periódica como es habitual con un contador que nos
indica la persistencia.
14
Proyecto de D.A.S. Reloj Digital
4. Incidencias.
En un principio nuestro diagrama de estados era muy complejo debido a que duplicamos el
número de estados para diferenciar si la alarma estaba activada o no y si el cronómetro estaba
contando o parado. Para simplificar el diagrama de estados introdujimos dos flags, uno para
indicar si la alarma está activa y otro para indicar si el cronómetro está contando o parado. De
esta forma, cargamos los valores de los flags cuando es necesario mediante señales que
obtenemos del controlador y mediante una comprobación del valor del flag podemos averiguar
si la alarma está conectada o si el cronómetro está contando.
Una segunda modificación sobre el diseño inicial fue la de sustituir el banco de pulsadores
que íbamos a utilizar en un principio para implementar el comportamiento de los botones del
reloj, por el teclado PS2. Esto es debido a que tuvimos un pequeño problema que no fuimos
capaces de depurar, el cual consistía en que al activar la alarma los pulsadores dejaban de
comportarse de la forma adecuada.
15
Proyecto de D.A.S. Reloj Digital
- Fichero Hora.vhd:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity hora is
port (
clk: in STD_LOGIC;
rst: in STD_LOGIC;
tc: in STD_LOGIC;
PonerHora: in STD_LOGIC;
PonerMin: in STD_LOGIC;
adj: in STD_LOGIC;
ContOut5: out STD_LOGIC_VECTOR (3 downto 0);
ContOut4: out STD_LOGIC_VECTOR (3 downto 0);
ContOut3: out STD_LOGIC_VECTOR (3 downto 0);
ContOut2: out STD_LOGIC_VECTOR (3 downto 0);
ContOut1: out STD_LOGIC_VECTOR (3 downto 0);
ContOut0: out STD_LOGIC_VECTOR (3 downto 0)
);
end hora;
begin
16
Proyecto de D.A.S. Reloj Digital
if (finCuenta='1') THEN
count <= (OTHERS=>'0');
else
if (tc = '1') then
count <= count + 1;
end if;
end if;
end if;
tcCuarentavos <= finCuenta;
end process;
17
Proyecto de D.A.S. Reloj Digital
end if;
tcCont1 <= finCuenta;
end process;
18
Proyecto de D.A.S. Reloj Digital
cont4: process (clk, rst, tcCont3, count4, count5, ponerHora, adj, ponerMin)
constant timeOut: std_logic_vector (3 DOWNTO 0) := "1010";
variable finCuenta: std_logic;
begin
if (count4=timeOut) then
finCuenta := '1';
else
finCuenta := '0';
end if;
if (rst='0') then
count4 <= (OTHERS=>'0');
elsif (clk'EVENT AND clk='1') THEN
if (finCuenta='1') THEN
count4 <= (OTHERS=>'0');
elsif (count5="0010") and (count4="0100") then
count4 <= (OTHERS=>'0');
elsif ((tcCont3 = '1' and ponerHora = '0' and ponerMin='0') or
(ponerHora ='1' and adj = '1')) then
count4 <= count4 + 1;
end if;
end if;
tcCont4 <= finCuenta;
end process;
end horaArch;
19
Proyecto de D.A.S. Reloj Digital
- Fichero Alarma.vhd:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity alarma is
port (
clk: in STD_LOGIC;
rst: in STD_LOGIC;
ponerAlarmH: in STD_LOGIC;
ponerAlarmM: in STD_LOGIC;
adj: in STD_LOGIC;
ContOutAl3: out STD_LOGIC_VECTOR (3 downto 0);
ContOutAl2: out STD_LOGIC_VECTOR (3 downto 0);
ContOutAl1: out STD_LOGIC_VECTOR (3 downto 0);
ContOutAl0: out STD_LOGIC_VECTOR (3 downto 0)
);
end alarma;
begin
20
Proyecto de D.A.S. Reloj Digital
21
Proyecto de D.A.S. Reloj Digital
end alarmaArch;
- Fichero Sonido.vhd:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity sonido is
port (
clk: in STD_LOGIC;
rst: in STD_LOGIC;
hora5: in STD_LOGIC_VECTOR (3 downto 0);
hora4: in STD_LOGIC_VECTOR (3 downto 0);
hora3: in STD_LOGIC_VECTOR (3 downto 0);
hora2: in STD_LOGIC_VECTOR (3 downto 0);
alarma3: in STD_LOGIC_VECTOR (3 downto 0);
alarma2: in STD_LOGIC_VECTOR (3 downto 0);
alarma1: in STD_LOGIC_VECTOR (3 downto 0);
alarma0: in STD_LOGIC_VECTOR (3 downto 0);
alarmaOn: in STD_LOGIC;
tcTemp: in STD_LOGIC;
sound: out STD_LOGIC
);
end sonido;
begin
22
Proyecto de D.A.S. Reloj Digital
begin
if (cuenta = numCiclos) then
tc <= '1';
else
tc <= '0';
end if;
if (rst='0') then
cuenta := (others => '0');
elsif (clk'EVENT and clk='1') then
if (tc='0') then
cuenta := cuenta + 1;
else
cuenta := (others => '0');
end if;
end if;
end process oscilador;
salidaComparador <= '0' when (hora5=alarma3 and hora4=alarma2 and hora3=alarma1 and
hora2=alarma0) else '1';
23
Proyecto de D.A.S. Reloj Digital
end sonidoArch;
24
Proyecto de D.A.S. Reloj Digital
- Fichero Cronometro.vhd:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity cronometro is
port (
clk: in STD_LOGIC;
rst: in STD_LOGIC;
reset: in STD_LOGIC;
tc: in STD_LOGIC;
cuentaCronometro: in STD_LOGIC;
ContOutC5: out STD_LOGIC_VECTOR (3 downto 0);
ContOutC4: out STD_LOGIC_VECTOR (3 downto 0);
ContOutC3: out STD_LOGIC_VECTOR (3 downto 0);
ContOutC2: out STD_LOGIC_VECTOR (3 downto 0);
ContOutC1: out STD_LOGIC_VECTOR (3 downto 0);
ContOutC0: out STD_LOGIC_VECTOR (3 downto 0)
);
end cronometro;
begin
25
Proyecto de D.A.S. Reloj Digital
26
Proyecto de D.A.S. Reloj Digital
end if;
end if;
tcCont1 <= finCuenta;
end process;
27
Proyecto de D.A.S. Reloj Digital
end if;
tcCont3 <= finCuenta;
end process;
end cronometroArch;
28
Proyecto de D.A.S. Reloj Digital
- Fichero ps2keyboardinterface.vhd:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY ps2KeyboardInterface IS
PORT (
clk: IN std_logic;
rst: IN std_logic;
ps2Clk: IN std_logic;
ps2Data: IN std_logic;
data: OUT std_logic_vector (7 DOWNTO 0);
newData: OUT std_logic;
newDataAck: IN std_logic
);
END ps2KeyboardInterface;
BEGIN
29
Proyecto de D.A.S. Reloj Digital
IF (lastBitRcv='1') THEN
ps2DataRegOut <= (OTHERS=>'1');
ELSIF (ps2ClkFallingEdge='1') THEN
ps2DataRegOut <= ps2Data & ps2DataRegOut(10 downto 1);
END IF;
END IF;
END PROCESS ps2DataReg;
oddParityCheker:
30
Proyecto de D.A.S. Reloj Digital
state := waitingData;
END IF;
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS controller;
END ps2KeyboardInterfaceArch;
- Fichero Keyboard.vhd:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY keyboard IS
PORT (
rst: IN std_logic;
clk: IN std_logic;
ps2Clk: IN std_logic;
ps2Data: IN std_logic;
nuevaTecla: OUT std_logic;
dataAux: OUT std_logic_vector(7 DOWNTO 0)
);
END keyboard;
COMPONENT ps2KeyboardInterface
PORT (
clk: IN std_logic;
rst: IN std_logic;
ps2Clk: IN std_logic;
ps2Data: IN std_logic;
data: OUT std_logic_vector (7 DOWNTO 0);
newData: OUT std_logic;
newDataAck: IN std_logic
);
END COMPONENT;
BEGIN
ps2Interface: ps2KeyboardInterface
PORT MAP (clk, rst, ps2Clk, ps2Data, data, newData, newDataAck);
31
Proyecto de D.A.S. Reloj Digital
END keyboardArch;
- Fichero Temporizador.vhd:
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;
entity Temporizador is
port (
clk: in STD_LOGIC;
rst: in STD_LOGIC;
tc: out STD_LOGIC
);
end Temporizador;
32
Proyecto de D.A.S. Reloj Digital
BEGIN
temporizador:PROCESS (clk,rst)
CONSTANT timeOut: std_logic_vector (19 DOWNTO 0) := "00000111101000010010";
VARIABLE count: std_logic_vector (19 DOWNTO 0);
VARIABLE finCuenta: std_logic;
BEGIN
IF (count=timeOut) THEN
finCuenta := '1';
ELSE
finCuenta := '0';
END IF;
IF (rst='0') THEN
count := timeOut;
ELSIF (clk'EVENT AND clk='1') THEN
IF (finCuenta='1') THEN
count := (OTHERS=>'0');
ELSE
count := count + 1;
END IF;
END IF;
tc <= finCuenta;
END PROCESS;
END TemporizadorArch;
- Fichero Relojprincipal.vhd:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity relojPrincipal is
port (
rst: in STD_LOGIC;
clk: in STD_LOGIC;
ps2Clk: IN std_logic;
ps2Data: IN std_logic;
sel: out STD_LOGIC_VECTOR (2 downto 0);
sieteSegs: out STD_LOGIC_VECTOR (6 downto 0);
alarmaOn: out STD_LOGIC;
sound: out STD_LOGIC
);
end relojPrincipal;
33
Proyecto de D.A.S. Reloj Digital
component hora
port (
clk: in STD_LOGIC;
rst: in STD_LOGIC;
tc: in STD_LOGIC;
PonerHora: in STD_LOGIC;
PonerMin: in STD_LOGIC;
adj: in STD_LOGIC;
ContOut5: out STD_LOGIC_VECTOR (3 downto 0);
ContOut4: out STD_LOGIC_VECTOR (3 downto 0);
ContOut3: out STD_LOGIC_VECTOR (3 downto 0);
ContOut2: out STD_LOGIC_VECTOR (3 downto 0);
ContOut1: out STD_LOGIC_VECTOR (3 downto 0);
ContOut0: out STD_LOGIC_VECTOR (3 downto 0)
);
end component;
component keyboard
port (
rst: IN std_logic;
clk: IN std_logic;
ps2Clk: IN std_logic;
ps2Data: IN std_logic;
nuevaTecla: OUT std_logic;
dataAux: OUT std_logic_vector(7 DOWNTO 0)
);
end component;
component alarma
port (
clk: in STD_LOGIC;
rst: in STD_LOGIC;
ponerAlarmH: in STD_LOGIC;
ponerAlarmM: in STD_LOGIC;
adj: in STD_LOGIC;
ContOutAl3: out STD_LOGIC_VECTOR (3 downto 0);
ContOutAl2: out STD_LOGIC_VECTOR (3 downto 0);
ContOutAl1: out STD_LOGIC_VECTOR (3 downto 0);
ContOutAl0: out STD_LOGIC_VECTOR (3 downto 0)
);
end component;
component cronometro
port (
clk: in STD_LOGIC;
rst: in STD_LOGIC;
reset: in STD_LOGIC;
tc: in STD_LOGIC;
cuentaCronometro: in STD_LOGIC;
ContOutC5: out STD_LOGIC_VECTOR (3 downto 0);
ContOutC4: out STD_LOGIC_VECTOR (3 downto 0);
ContOutC3: out STD_LOGIC_VECTOR (3 downto 0);
ContOutC2: out STD_LOGIC_VECTOR (3 downto 0);
ContOutC1: out STD_LOGIC_VECTOR (3 downto 0);
34
Proyecto de D.A.S. Reloj Digital
component sonido
port (
clk: in STD_LOGIC;
rst: in STD_LOGIC;
hora5: in STD_LOGIC_VECTOR (3 downto 0);
hora4: in STD_LOGIC_VECTOR (3 downto 0);
hora3: in STD_LOGIC_VECTOR (3 downto 0);
hora2: in STD_LOGIC_VECTOR (3 downto 0);
alarma3: in STD_LOGIC_VECTOR (3 downto 0);
alarma2: in STD_LOGIC_VECTOR (3 downto 0);
alarma1: in STD_LOGIC_VECTOR (3 downto 0);
alarma0: in STD_LOGIC_VECTOR (3 downto 0);
alarmaOn: in STD_LOGIC;
tcTemp: in STD_LOGIC;
sound: out STD_LOGIC
);
end component;
35
Proyecto de D.A.S. Reloj Digital
BEGIN
36
Proyecto de D.A.S. Reloj Digital
END IF;
END PROCESS;
37
Proyecto de D.A.S. Reloj Digital
mux:PROCESS (regOut0,regOut1,regOut2,regOut3,regOut4,regOut5,regOut6,regOut7,
displaySelAux)
BEGIN
CASE displaySelAux IS
WHEN "000" => salMux <= regOut0;
WHEN "001" => salMux <= regOut1;
WHEN "010" => salMux <= regOut2;
WHEN "011" => salMux <= regOut3;
WHEN "100" => salMux <= regOut4;
WHEN "101" => salMux <= regOut5;
WHEN "110" => salMux <= regOut6;
WHEN "111" => salMux <= regOut7;
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
38
Proyecto de D.A.S. Reloj Digital
END IF;
end if;
tcDoscientosavos <= finCuenta;
END PROCESS;
aux1 <= '1' WHEN ponerHora='0' or (displaySelAux(2 downto 1)="11" and (ponerHora='1'
and salidaInversor='1'))
ELSE '0';
aux2 <= '1' WHEN ponerHora='1' and (displaySelAux(2)='0' or
displaySelAux(2 downto 1)="10")
ELSE '0';
aux3 <= '1' WHEN ponerMin='0' or ((displaySelAux="100" or displaySelAux="011") and
(ponerMin='1' and salidaInversor='1'))
ELSE '0';
aux4 <= '1' WHEN ponerMin='1' and (displaySelAux(2 downto 1)="00" or
displaySelAux(1 downto 0)="10" or
(displaySelAux(2)='1' and displaySelAux(0)='1'))
ELSE '0';
aux5 <= '1' WHEN ponerAlarmH='0' or (displaySelAux(2 downto 1)="11" and
(ponerAlarmH='1' and salidaInversor='1'))
ELSE '0';
aux6 <= '1' WHEN ponerAlarmH='1' and (displaySelAux(2)='0' or
displaySelAux(2 downto 1)="10")
ELSE '0';
aux7 <= '1' WHEN ponerAlarmM='0' or ((displaySelAux="100" or displaySelAux="011")
and (ponerAlarmM='1' and salidaInversor='1'))
ELSE '0';
aux8 <= '1' WHEN ponerAlarmM='1' and (displaySelAux(2 downto 1)="00" or
displaySelAux(1 downto 0)="10" or (displaySelAux(2)='1' and
displaySelAux(0)='1'))
ELSE '0';
sieteSegs <= sieteSegsAux WHEN ((aux1='1' or aux2='1') and (aux3='1' or aux4='1') and
modo="00") or ((aux5='1' or aux6='1') and
(aux7='1' or aux8='1') and modo="01") or modo= "10"
ELSE "0000000";
39
Proyecto de D.A.S. Reloj Digital
IF (nuevaTeclaAux='1') THEN
CASE dataAux IS
WHEN "00010110" =>
modAux <='1';
setAux <='0';
adjAux <='0';
WHEN "00011110" =>
setAux <='1';
modAux <= '0';
adjAux <= '0';
WHEN "00100110" =>
adjAux <='1';
modAux <='0';
setAux <='0';
WHEN OTHERS => NULL;
END CASE;
ELSE
setAux <= '0';
modAux <= '0';
adjAux <= '0';
END IF;
END IF;
END PROCESS;
40
Proyecto de D.A.S. Reloj Digital
41
Proyecto de D.A.S. Reloj Digital
42
Proyecto de D.A.S. Reloj Digital
END relojPrincipal_arch;
43