Mudanças entre as edições de "PROJETO FINAL - Grupo 3 - SST"
Linha 7: | Linha 7: | ||
* Cada unidade e dezena de hora,minuto e segundo são atreladas a uma variável para uma eventual exibição no display de 7 segmentos; | * Cada unidade e dezena de hora,minuto e segundo são atreladas a uma variável para uma eventual exibição no display de 7 segmentos; | ||
* Há 2 processos no programa, 1 para identificar o estado da máquina e outro para a execução dos estados; | * Há 2 processos no programa, 1 para identificar o estado da máquina e outro para a execução dos estados; | ||
− | * A ativação do cronometro | + | * A ativação do cronometro para o relógio. |
=Diagrama de estados= | =Diagrama de estados= | ||
Linha 32: | Linha 32: | ||
port ( | port ( | ||
− | rst,clk1 | + | rst,clk1,estado,crono,as,am,ah : in std_logic; |
dig1,dig2,dig3,dig4,dig5,dig6 : out std_logic_vector(6 downto 0) | dig1,dig2,dig3,dig4,dig5,dig6 : out std_logic_vector(6 downto 0) | ||
); | ); | ||
Linha 81: | Linha 81: | ||
--Variaveis auxiliares responsaveis por atualizar o horario apos ajuste | --Variaveis auxiliares responsaveis por atualizar o horario apos ajuste | ||
variable aux0, aux1, aux2 : integer range 0 to 60; | variable aux0, aux1, aux2 : integer range 0 to 60; | ||
− | + | ||
+ | |||
+ | |||
begin | begin | ||
Linha 88: | Linha 90: | ||
− | if (state = st0) then | + | if (state = st0) then |
− | + | ||
+ | |||
+ | |||
if rising_edge (clk1) then -- Quando houver um evento na borda de subida do clk1; | if rising_edge (clk1) then -- Quando houver um evento na borda de subida do clk1; | ||
− | + | ||
+ | |||
+ | |||
count := count + 1; --Dispara o contador ou incrementa; | count := count + 1; --Dispara o contador ou incrementa; | ||
Linha 102: | Linha 108: | ||
elsif (count=clk) then --Se não, se o count for igual a freq de clock (50MHz) | elsif (count=clk) then --Se não, se o count for igual a freq de clock (50MHz) | ||
− | + | ||
+ | |||
+ | |||
ss0 := ss0 + 1; --Incrementa 1 no valor do segundo (ss0) | ss0 := ss0 + 1; --Incrementa 1 no valor do segundo (ss0) | ||
Linha 132: | Linha 140: | ||
end if; | end if; | ||
− | + | end if; | |
+ | |||
Linha 216: | Linha 225: | ||
elsif (state = st2) then -- Todo o processo do cronometro não afeta o processo do relogio normal | elsif (state = st2) then -- Todo o processo do cronometro não afeta o processo do relogio normal | ||
− | + | ||
+ | |||
+ | if (rst='0') then -- Reset para Zerar cronometro | ||
ssc := 0; | ssc := 0; | ||
mmc := 0; | mmc := 0; | ||
Linha 222: | Linha 233: | ||
countc :=0; | countc :=0; | ||
− | + | elsif rising_edge (clk1) then -- Se houver alteracao no ckl1 para 1... | |
countc := countc + 1; -- Incrementa o contador do cronometro | countc := countc + 1; -- Incrementa o contador do cronometro | ||
Linha 228: | Linha 239: | ||
if (countc=clk) then | if (countc=clk) then | ||
+ | |||
ssc := ssc + 1; --Incrementa 1 no valor do segundo (ssc) | ssc := ssc + 1; --Incrementa 1 no valor do segundo (ssc) | ||
− | + | ||
− | + | ||
--Se a variável segundo (ssc) for igual a 60, ele reseta a variável ssc ('0') e começa contagem | --Se a variável segundo (ssc) for igual a 60, ele reseta a variável ssc ('0') e começa contagem | ||
Linha 238: | Linha 250: | ||
mmc := (mmc + 1); | mmc := (mmc + 1); | ||
− | if ( | + | if (auxc0 = 60) then |
− | + | auxc0 := 0; -- '60' segundos não aparece, aparece '0' | |
− | + | auxc1 := (mm0 + 1); | |
--Se a variável minuto (mmc) for igual a 60, ele reseta a variável mmc ('0') e começa contagem | --Se a variável minuto (mmc) for igual a 60, ele reseta a variável mmc ('0') e começa contagem | ||
Linha 249: | Linha 261: | ||
hhc := hhc + 1; | hhc := hhc + 1; | ||
− | if ( | + | if (auxc1 = 60) then |
− | + | auxc1 := 0; -- '60' minutos não aparece, aparece '0' | |
− | + | auxc2 := hh0 + 1; | |
--Se a variável hora (hhc) for igual a 24, ele reseta a variável hhc ('0') | --Se a variável hora (hhc) for igual a 24, ele reseta a variável hhc ('0') | ||
if (hhc = 24) then | if (hhc = 24) then | ||
− | hhc := 0; -- '24' | + | hhc := 0; -- '24' horas não aparece, aparece '0' |
− | if ( | + | if (auxc2 = 24) then |
− | |||
− | |||
+ | auxc2 := 0; -- '24' horas não aparece, aparece '0' | ||
+ | |||
end if; | end if; | ||
end if; | end if; | ||
Linha 272: | Linha 284: | ||
countc := 0; -- zera o contador do cronometro; | countc := 0; -- zera o contador do cronometro; | ||
+ | |||
end if; | end if; | ||
end if; | end if; |
Edição atual tal como às 15h03min de 8 de julho de 2015
Código
- Método adotado
- A abordagem utilizada foi Behavioral. Modela como as saídas do sistema irão reagir às entradas do sistema.Dessa forma ficou mais simples e fácil de entender;
- O relógio possui 3 estados: Estado = '0', significa que ele esta no processo de contagem. Estado = '1', ele esta no processo de ajuste. Estado Crono ou st2 significa que está no cronometro;
- Cada unidade e dezena de hora,minuto e segundo são atreladas a uma variável para uma eventual exibição no display de 7 segmentos;
- Há 2 processos no programa, 1 para identificar o estado da máquina e outro para a execução dos estados;
- A ativação do cronometro para o relógio.
Diagrama de estados
Pinagem
Código VHDL - Clicar no "+" para expandir |
---|
library ieee; use ieee.std_logic_1164.all; entity relogio is generic( clk: integer := 50000000 ); -- Frequência para clock port ( rst,clk1,estado,crono,as,am,ah : in std_logic; dig1,dig2,dig3,dig4,dig5,dig6 : out std_logic_vector(6 downto 0) ); end entity; architecture funcio of relogio is type state_type is (st0, st1, st2); -- st0 = relogio rodando, st1 = edicao, st2 = cronometro signal state : state_type; begin -- Processo responsável por atualizar o Estado, st0:contando st1: parado para ajuste; process (estado,crono) begin -- Quando a key "Estado" estiver em '0' o estado atual é st0, e quando estiver em '1' o estado atual é st1, a key crono tem prioridade, -- ou seja, assim que ela é ativada o relogio entra no st2. if (estado='0' and crono='0') then state <= st0; elsif(estado='1' and crono='0') then state <= st1; else state <= st2; end if; end process;
--Processo resposável pela implementação dos Estados st0, st1 e st2. --Este processo é sensível ao clock, reset e os botões de entrada para ajuste(as,am,ah) process(clk1,rst,as,am,ah) -- Variaveis responsaveis por guarda valores dos contadores. Final 0 esta atrelado ao estado 0; final 1 esta atrelado ao estado st1; final c para o cronometro variable ss0, ss1, ssc: integer range 0 to 60; variable mm0, mm1, mmc: integer range 0 to 60; variable hh0, hh1, hhc: integer range 0 to 24; -- Variavel count e responsavel por realizar a contagem que vai de 0 ate clk, que no caso e 50MHz, -- ou seja, apos esse periodo a variavel e incrementada em 1. variable count : integer range 0 to clk; variable countc : integer range 0 to clk; --Variaveis responsaveis por guardar valor final do algarismo variable s1,s2,m1,m2,h1,h2 : integer range 0 to 9; --Variaveis auxiliares responsaveis por atualizar o horario apos ajuste variable aux0, aux1, aux2 : integer range 0 to 60;
--Implementação dos estados
if rising_edge (clk1) then -- Quando houver um evento na borda de subida do clk1;
count := count + 1; --Dispara o contador ou incrementa; if (rst='0') then --Se o botão reset estiver em '0', as variáveis do st0 são setadas e a contagem volta para 0; ss0 := 0; mm0 := 0; hh0 := 0; count :=0; elsif (count=clk) then --Se não, se o count for igual a freq de clock (50MHz)
ss0 := ss0 + 1; --Incrementa 1 no valor do segundo (ss0)
--Se a variável minuto (mm0) for igual a 60, ele reseta a variável mm0 ('0') e começa contagem --da variável hora (hh0); if (mm0 = 60) then mm0 := 0; -- '60' minutos não aparece, aparece '0' hh0 := hh0 + 1; --Se a variável hora (hh0) for igual a 24, ele reseta a variável hh0 ('0') if (hh0 = 24) then hh0 := 0; -- '24' minutos não aparece, aparece '0' end if; end if; end if; count := 0; -- zera o contador; end if; end if;
-- Atualizando saida -- s2 := ss0/10; -- dezena /pega a variavel ss0 e divide por dez, o resultado coloca na variavel s2 s1 := ss0 rem 10; -- unidade /pega a variavel ss0 e divide por dez, pega o resto e colocar na variavel s1 m2 := mm0/10; -- dezena /pega a variavel mm0 e divide por dez, o resultado coloca na variavel m2 m1 := mm0 rem 10; -- unidade /pega a variavel mm0 e divide por dez, pega o resto e colocar na variavel m1 h2 := hh0/10; -- dezena /pega a variavel hh0 e divide por dez, o resultado coloca na variavel h2 h1 := hh0 rem 10; -- unidade /pega a variavel hh0 e divide por dez, pega o resto e colocar na variavel h1
--Se houver uma mudança na borda de descida do botão de ajuste de segundos, ele incrementa a variável ss1 --a partir da variável que estava contando no estado anterior (ss0) --quando chegar em 60 ele reseta a variável segundos do st1(ss1); if (falling_edge (as)) then --aux0: e testada para atualizar o valor apos o ajuste aux0 := (ss0 + 1); ss1 := (ss0 + 1); if (ss1 = 60) then ss1 :=0; end if; end if;
--aux1: e testada para atualizar o valor apos o ajuste aux1 := (mm0 + 1); mm1 := (mm0 + 1); if (mm1 = 60) then mm1 :=0; end if; end if; --Se houver uma mudança na borda de descida do botão de ajuste de hora, ele incrementa a variável hh1 --a partir da variável que estava contando no estado anterior (hh0) --quando chegar em 24 ele reseta a variável hora do st1(hh1); if (falling_edge (ah)) then --aux2: e testada para atualizar o valor apos o ajuste aux2 := (hh0 + 1); hh1 := (hh0 + 1); if (hh1 = 24) then hh1 :=0; end if; end if; --Se o valor de aux0 for ajustado, a variável do st0 (ss0) também é atualizada, para que --quando o relógio voltar para o estado "contado" ele retorne a contagem de onde o relogio foi ajustado; if aux0 =(ss0+1) then ss0 := ss1; count :=0; elsif aux1=(mm0+1) then mm0 := mm1; count :=0; elsif aux2=(hh0+1) then hh0 := hh1; count :=0; end if; -- Atualizando saida -- s2 := ss0/10; -- dezena /pega a variavel ss0 e divide por dez, o resultado coloca na variavel s2 s1 := ss0 rem 10; -- unidade /pega a variavel ss0 e divide por dez, pega o resto e colocar na variavel s1 m2 := mm0/10; -- dezena /pega a variavel mm0 e divide por dez, o resultado coloca na variavel m2 m1 := mm0 rem 10; -- unidade /pega a variavel mm0 e divide por dez, pega o resto e colocar na variavel m1 h2 := hh0/10; -- dezena /pega a variavel hh0 e divide por dez, o resultado coloca na variavel h2 h1 := hh0 rem 10; -- unidade /pega a variavel hh0 e divide por dez, pega o resto e colocar na variavel h1 elsif (state = st2) then -- Todo o processo do cronometro não afeta o processo do relogio normal
elsif rising_edge (clk1) then -- Se houver alteracao no ckl1 para 1... countc := countc + 1; -- Incrementa o contador do cronometro if (countc=clk) then
--Se a variável segundo (ssc) for igual a 60, ele reseta a variável ssc ('0') e começa contagem --da variável minuto (mmc); if (ssc = 60) then ssc := 0; -- '60' segundos não aparece, aparece '0' mmc := (mmc + 1); if (auxc0 = 60) then auxc0 := 0; -- '60' segundos não aparece, aparece '0' auxc1 := (mm0 + 1); --Se a variável minuto (mmc) for igual a 60, ele reseta a variável mmc ('0') e começa contagem --da variável hora (hhc); if (mmc = 60) then mmc := 0; -- '60' minutos não aparece, aparece '0' hhc := hhc + 1; if (auxc1 = 60) then auxc1 := 0; -- '60' minutos não aparece, aparece '0' auxc2 := hh0 + 1; --Se a variável hora (hhc) for igual a 24, ele reseta a variável hhc ('0') if (hhc = 24) then hhc := 0; -- '24' horas não aparece, aparece '0' if (auxc2 = 24) then auxc2 := 0; -- '24' horas não aparece, aparece '0' end if; end if; end if; end if; end if; end if; countc := 0; -- zera o contador do cronometro;
m2 := mmc/10; -- dezena /pega a variavel mm0 e divide por dez, o resultado coloca na variavel m2 m1 := mmc rem 10; -- unidade /pega a variavel mm0 e divide por dez, pega o resto e colocar na variavel m1 h2 := hhc/10; -- dezena /pega a variavel hh0 e divide por dez, o resultado coloca na variavel h2 h1 := hhc rem 10; -- unidade /pega a variavel hh0 e divide por dez, pega o resto e colocar na variavel h1 end if;
case s2 is when 0 => dig2 <= "0000001"; --126 when 1 => dig2 <= "1001111"; --48 when 2 => dig2 <= "0010010"; --109 when 3 => dig2 <= "0000110"; when 4 => dig2 <= "1001100"; --51 when 5 => dig2 <= "0100100"; --91 when 6 => dig2 <= "0100000"; --95 when others => dig2 <= "1111111"; end case; case m1 is when 0 => dig3 <= "0000001"; --126 when 1 => dig3 <= "1001111"; --48 when 2 => dig3 <= "0010010"; --109 when 3 => dig3 <= "0000110"; --121 when 4 => dig3 <= "1001100"; --51 when 5 => dig3 <= "0100100"; --91 when 6 => dig3 <= "0100000"; --95 when 7 => dig3 <= "0001111";--112 when 8 => dig3 <= "0000000"; --127 when 9 => dig3 <= "0000100";--123 when others => dig3 <= "1111111"; end case; case m2 is when 0 => dig4 <= "0000001"; --126 when 1 => dig4 <= "1001111"; --48 when 2 => dig4 <= "0010010"; --109 when 3 => dig4 <= "0000110"; --121 when 4 => dig4 <= "1001100"; --51 when 5 => dig4 <= "0100100"; --91 when 6 => dig4 <= "0100000"; --95 when others => dig4 <= "1111111"; end case; case h1 is when 0 => dig5 <= "0000001"; --126 when 1 => dig5 <= "1001111"; --48 when 2 => dig5 <= "0010010"; --109 when 3 => dig5 <= "0000110"; --121 when 4 => dig5 <= "1001100"; --51 when 5 => dig5 <= "0100100"; --91 when 6 => dig5 <= "0100000"; --95 when 7 => dig5 <= "0001111";--112 when 8 => dig5 <= "0000000"; --127 when 9 => dig5 <= "0000100";--123 when others => dig5 <= "1111111"; end case; case h2 is when 0 => dig6 <= "0000001"; --126 when 1 => dig6 <= "1001111"; --48 when 2 => dig6 <= "0010010"; --109 when 3 => dig6 <= "0000110"; --121 when 4 => dig6 <= "1001100"; --51 when 5 => dig6 <= "0100100"; --91 when 6 => dig6 <= "0100000"; --95 when others => dig6 <= "1111111"; end case; end process; END ARCHITECTURE; |