Mudanças entre as edições de "PROJETO FINAL - Grupo 3 - SST"
(Criou página com '=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áci...') |
(→Código) |
||
Linha 8: | Linha 8: | ||
* 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 não para o relógio, por isso foram usadas variaveis diferentes para tratar do cronometro. | * A ativação do cronometro não para o relógio, por isso foram usadas variaveis diferentes para tratar do cronometro. | ||
+ | |||
+ | =a= | ||
+ | |||
+ | =Pinagem= | ||
+ | |||
+ | [[Arquivo: pin.png|900px]] | ||
{{collapse top | '''Código VHDL''' - Clicar no "+" para expandir }} | {{collapse top | '''Código VHDL''' - Clicar no "+" para expandir }} |
Edição das 01h30min de 7 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 não para o relógio, por isso foram usadas variaveis diferentes para tratar do cronometro.
a
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,clkc,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; variable auxc, auxc2 : integer range 0 to 86400; -- auxiliar para ajustar relogio ao sair do cronometro begin --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;
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 -- Zerando cronometro ssc := 0; mmc := 0; hhc := 0; countc :=0; if (clk1'event and clk1='1') then -- Se houver alteracao no ckl1 para 1... countc := countc + 1; -- Incrementa o contador do cronometro if (countc=clk) then ssc := ssc + 1; --Incrementa 1 no valor do segundo (ssc) ss0 := ss0 + 1;
if (ss0 = 60) then ss0 := 0; -- '60' segundos não aparece, aparece '0' mm0 := (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 (mm0 = 60) then mm0 := 0; -- '60' minutos não aparece, aparece '0' hh0 := 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' minutos não aparece, aparece '0' if (hh0 = 24) then hh0 := 0; -- '24' minutos não aparece, aparece '0' end if; end if; end if; end if; end if; end if; countc := 0; -- zera o contador do cronometro; end if; end if;
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; |