library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity timer is
generic (FCLK: integer := 50000000); --Frequencia de operaçao do CLOCK da placa DE2-115
PORT (CLK, ESTADO,RESET, Ajuste_hora, Ajuste_minuto,cronometro,iniciar_cronometro : in std_logic;
seg1, seg2, min1, min2, hora1, hora2 : out std_logic_vector (6 downto 0));
--seg1 e a unidade do segundo e seg2 e a dezena
--hora e min seguem a mesma logica
end timer;
--utilizamos a abordagem behavioral (comportamental)
architecture contador of timer is
--Criaçao dos dois estados(ajusta e conta)
type state_type is (ST0, ST1);
signal state: state_type;
begin
-- Formulando os estados do sistema
process (ESTADO)
begin
if (ESTADO ='0') then --Caso estado seja igual a zero o processo de contagem eh realizado
state <= ST0; --Estado de contagem
else
state <= ST1; --Estado de ajuste
end if;
end process;
--Foi criado o processo com sensibilidade do CLOCK, RESET, Ajuste_hora e Ajuste_minuto, pois caso haja alteraçao em dessas variaveis
--o processo eh realizado
process(CLK, RESET, Ajuste_hora, Ajuste_minuto,cronometro,iniciar_cronometro)
--Foram criadas variaveis auxiliares para armazenar os valores de hora, minuto e segundo para que eles sejam inseridos no display
VARIABLE clock,clock_cronometro: INTEGER RANGE 0 TO FCLK; --A variaçao do CLK eh iniciado no zero e ateh a sua freq maxima
VARIABLE segundo1,segundo1_cronometro : INTEGER RANGE 0 TO 10; --Representa a unidade do segundo
VARIABLE segundo2,segundo2_cronometro : INTEGER RANGE 0 TO 6; --Representa a dezena do segundo
VARIABLE minuto1, minuto11,minuto1_cronometro: INTEGER RANGE 0 TO 10;
VARIABLE minuto2, minuto22,minuto2_cronometro: INTEGER RANGE 0 TO 6;
VARIABLE horas1, horas11,horas1_cronometro: INTEGER RANGE 0 TO 10;
VARIABLE horas2, horas22,horas2_cronometro: INTEGER RANGE 0 TO 10;
--Minuto11, Minuto22, Horas11 e Horas22 sao variaveis de ajuste. As demais variaveis sao auxiliares para contagem.
begin
case state is
when ST0 =>
IF (RESET = '0' and cronometro = '0') THEN --Se o reset estiver ativo baixo todas as variaveis serao zeradas reiniciado
clock := 0;
segundo1 := 0;
segundo2 := 0;
minuto1 := 0;
minuto2 := 0;
horas1 := 0;
horas2 := 0;
minuto11 := 0;
minuto22 := 0;
horas11 := 0;
horas22 := 0;
--A contagem do CLOCK ateh o seu valor maximo (o que corresponde a um segundo) eh verificada na borda de subida do CLOCK
ELSIF (CLK'event AND CLK='1') then
clock := clock + 1;
--Quando a frequencia do CLCOK chegar em seu valor maximo o mesmo sera zerado e inicia a contagem
IF (clock = FCLK) then
clock := 0;
segundo1 := segundo1 + 1;
--Realizaçao da contagem
IF (segundo1 = 10) then
segundo1 := 0;
segundo2 := segundo2 + 1;
IF (segundo2 = 6) then
segundo2 := 0;
minuto1 := minuto1 + 1;
IF (minuto1 = 10 ) then
minuto1 := 0;
minuto2 := minuto2 + 1;
IF (minuto2 = 6) then
minuto2 := 0;
horas1 := horas1 + 1;
IF (horas1 = 10) then
horas1 := 0;
horas2 := horas2 + 1;
IF (horas2 = 2) then
horas2 := 0;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
--- ajustando cronometro
--IF (cronometro = '1') then
--
--
-- IF (iniciar_cronometro = '1') then
--
-- IF (CLK'event AND CLK='1') then
-- clock_cronometro := clock_cronometro + 1;
--
-- IF (clock_cronometro = FCLK) then
-- clock_cronometro := 0;
-- segundo1_cronometro := segundo1_cronometro + 1;
-- IF (segundo1_cronometro = 10) then
-- segundo1_cronometro := 0;
-- segundo2_cronometro := segundo2_cronometro + 1;
-- IF (segundo2_cronometro = 6) then
-- segundo2_cronometro := 0;
-- minuto1_cronometro := minuto1_cronometro + 1;
-- IF (minuto1_cronometro = 10 ) then
-- minuto1_cronometro := 0;
-- minuto2_cronometro := minuto2_cronometro + 1;
-- IF (minuto2_cronometro = 6) then
-- minuto2_cronometro := 0;
-- horas1_cronometro := horas1_cronometro + 1;
-- IF (horas1_cronometro = 10) then
-- horas1_cronometro := 0;
-- horas2_cronometro := horas2_cronometro + 1;
-- IF (horas2_cronometro = 2) then
-- horas2_cronometro := 0;
-- END IF;
-- END IF;
-- END IF;
-- END IF;
-- END IF;
-- END IF;
-- END IF;
-- END IF;
-- END IF;
--
--
--
-- IF (RESET = '0' and cronometro = '1') THEN
-- clock_cronometro := 0;
-- segundo1_cronometro := 0;
-- segundo2_cronometro :=0;
-- minuto1_cronometro := 0;
-- minuto2_cronometro :=0;
-- horas1_cronometro :=0;
-- horas2_cronometro :=0;
-- END IF;
--END IF;
--Ajuste de horario--
when ST1 => --Significa que estah no estado de ajuste
if (falling_edge (Ajuste_minuto)) then --A identificaçao que o ajuste minuto foi alterado eh realizado na borda descida (pressionar botao)
minuto11 := minuto1 + 1;
if (minuto11 = 10) then
minuto11 :=0;
minuto22 := minuto2 + 1;
if (minuto22 = 6) then
minuto22 := 0;
end if;
end if;
end if;
if (falling_edge (Ajuste_hora)) then --Mesma logica do ajuste minuto
horas11 := horas1 +1;
if (horas11 = 10) then
horas11 :=0;
horas22 := horas2 + 1;
end if;
if (horas22 = 2) then
if (horas11 = 4) then
horas11 := 0;
horas22 := 0;
end if;
end if;
end if;
--Atribuiçao da variavel de ajuste para a variavel de contagem que sera encaminhada para o display
clock :=0;
minuto1 := minuto11;
minuto2 := minuto22;
horas1 := horas11;
horas2 := horas22;
end case;
---------CONVERÇAO PARA DISPLAY 7 SEGMETOS---------
-- caso relogio normal
-- if (cronometro = '0') then
case segundo1 is
when 0 => seg1 <= not("1111110"); --126
when 1 => seg1 <= not("0110000"); --48
when 2 => seg1 <= not("1101101"); --109
when 3 => seg1 <= not("1111001"); --121
when 4 => seg1 <= not("0110011"); --51
when 5 => seg1 <= not("1011011"); --91
when 6 => seg1 <= not("1011111"); --95
when 7 => seg1 <= not("1110000"); --112
when 8 => seg1 <= not("1111111"); --127
when 9 => seg1 <= not("1111011"); --123
when others => seg1 <= not("1001111"); --79 (“E”)
end case;
case segundo2 is
when 0 => seg2 <= not("1111110"); --126
when 1 => seg2 <= not("0110000"); --48
when 2 => seg2 <= not("1101101"); --109
when 3 => seg2 <= not("1111001"); --121
when 4 => seg2 <= not("0110011"); --51
when 5 => seg2 <= not("1011011"); --91
when 6 => seg2 <= not("1011111"); --95
when others => seg2 <= not("1001111"); --79 (“E”)
end case;
case minuto1 is
when 0 => min1 <= not("1111110"); --126
when 1 => min1 <= not("0110000"); --48
when 2 => min1 <= not("1101101"); --109
when 3 => min1 <= not("1111001"); --121
when 4 => min1 <= not("0110011"); --51
when 5 => min1 <= not("1011011"); --91
when 6 => min1 <= not("1011111"); --95
when 7 => min1 <= not("1110000");--112
when 8 => min1 <= not("1111111"); --127
when 9 => min1 <= not("1111011");--123
when others => min1 <= not("1001111"); --79 (“E”)
end case;
case minuto2 is
when 0 => min2 <= not("1111110"); --126
when 1 => min2 <= not("0110000"); --48
when 2 => min2 <= not("1101101"); --109
when 3 => min2 <= not("1111001"); --121
when 4 => min2 <= not("0110011"); --51
when 5 => min2 <= not("1011011"); --91
when 6 => min2 <= not("1011111"); --95
when others => min2 <= not("1001111"); --79 (“E”)
end case;
case horas1 is
when 0 => hora1 <= not("1111110"); --126
when 1 => hora1 <= not("0110000"); --48
when 2 => hora1 <= not("1101101"); --109
when 3 => hora1 <= not("1111001"); --121
when 4 => hora1 <= not("0110011"); --51
when 5 => hora1 <= not("1011011"); --91
when 6 => hora1 <= not("1011111"); --95
when 7 => hora1 <= not("1110000");--112
when 8 => hora1 <= not("1111111"); --127
when 9 => hora1 <= not("1111011");--123
when others => hora1 <= not("1001111"); --79 (“E”)
end case;
case horas2 is
when 0 => hora2 <= not("1111110"); --126
when 1 => hora2 <= not("0110000"); --48
when 2 => hora2 <= not("1101101"); --109
when others => hora2 <= not("1001111"); --79 (“E”)
end case;
-- caso relogio cronometando
--else
--case segundo1_cronometro is
-- when 0 => seg1 <= not("1111110"); --126
-- when 1 => seg1 <= not("0110000"); --48
-- when 2 => seg1 <= not("1101101"); --109
-- when 3 => seg1 <= not("1111001"); --121
-- when 4 => seg1 <= not("0110011"); --51
-- when 5 => seg1 <= not("1011011"); --91
-- when 6 => seg1 <= not("1011111"); --95
-- when 7 => seg1 <= not("1110000"); --112
-- when 8 => seg1 <= not("1111111"); --127
-- when 9 => seg1 <= not("1111011"); --123
-- when others => seg1 <= not("1001111"); --79 (“E”)
--end case;
--case segundo2_cronometro is
-- when 0 => seg2 <= not("1111110"); --126
-- when 1 => seg2 <= not("0110000"); --48
-- when 2 => seg2 <= not("1101101"); --109
-- when 3 => seg2 <= not("1111001"); --121
-- when 4 => seg2 <= not("0110011"); --51
-- when 5 => seg2 <= not("1011011"); --91
-- when 6 => seg2 <= not("1011111"); --95
-- when others => seg2 <= not("1001111"); --79 (“E”)
--end case;
--case minuto1_cronometro is
-- when 0 => min1 <= not("1111110"); --126
-- when 1 => min1 <= not("0110000"); --48
-- when 2 => min1 <= not("1101101"); --109
-- when 3 => min1 <= not("1111001"); --121
-- when 4 => min1 <= not("0110011"); --51
-- when 5 => min1 <= not("1011011"); --91
-- when 6 => min1 <= not("1011111"); --95
-- when 7 => min1 <= not("1110000");--112
-- when 8 => min1 <= not("1111111"); --127
-- when 9 => min1 <= not("1111011");--123
-- when others => min1 <= not("1001111"); --79 (“E”)
--end case;
--case minuto2_cronometro is
-- when 0 => min2 <= not("1111110"); --126
-- when 1 => min2 <= not("0110000"); --48
-- when 2 => min2 <= not("1101101"); --109
-- when 3 => min2 <= not("1111001"); --121
-- when 4 => min2 <= not("0110011"); --51
-- when 5 => min2 <= not("1011011"); --91
-- when 6 => min2 <= not("1011111"); --95
-- when others => min2 <= not("1001111"); --79 (“E”)
--end case;
--case horas1_cronometro is
-- when 0 => hora1 <= not("1111110"); --126
-- when 1 => hora1 <= not("0110000"); --48
-- when 2 => hora1 <= not("1101101"); --109
-- when 3 => hora1 <= not("1111001"); --121
-- when 4 => hora1 <= not("0110011"); --51
-- when 5 => hora1 <= not("1011011"); --91
-- when 6 => hora1 <= not("1011111"); --95
-- when 7 => hora1 <= not("1110000");--112
-- when 8 => hora1 <= not("1111111"); --127
-- when 9 => hora1 <= not("1111011");--123
-- when others => hora1 <= not("1001111"); --79 (“E”)
--end case;
--case horas2_cronometro is
-- when 0 => hora2 <= not("1111110"); --126
-- when 1 => hora2 <= not("0110000"); --48
-- when 2 => hora2 <= not("1101101"); --109
-- when others => hora2 <= not("1001111"); --79 (“E”)
--end case;
--
--end if;
end process;
END ARCHITECTURE;