Avaliação 2 - SST
Revisão de 07h39min de 26 de novembro de 2015 por Diegomedeiros (discussão | contribs)
Temporizador
O sistema é composto por três seções: contador, drivers do display e display de sete segmentos.
- O contador é a parte sequencial do sistema. Ele deve contar segundos de 00 a 60, iniciando sempre que a entrada de habilitação (enable, ena) for alta e parando sempre que chegar a 60 ou quando enable for abaixada.
- O contador tem uma entrada reset (rst) assíncrona, que zera o sistema sempre que acionada.
- Ao alcançar 60, além do contador parar, a saída full_count deve ser acionada.
- O driver de SSD é a parte combinacional do sistema. Ele deve converter as saídas dos contadores (count1, count2) em sinais de 7 bits (dig1, dig2) para alimentar o mostrador de dois dígitos.
library ieee; use ieee.std_logic_1164.all; entity timer is generic (fclk : INTEGER :=2) ; --clock frequency port (clk, rst, ena: IN std_logic; full_count : OUT std_logic; dig1, dig2: OUT std_logic_vector (6 downto 0)); --7 bits, display de 7 segmentos end timer architecture timer of timer is begin process(clk, rst, ena) variable count0: INTEGER RANGE 0 to fclk; --para 1HZ variable count1: INTEGER RANGE 0 to 10; --para dig1 variable count2: INTEGER RANGE 0 to 7; -- para dig2 begin --counters if (rst='1') then count0 := 0; count1 := 0; count2 := 0; full_count <= '0'; elseif (count1=0 and count2=6) then full_count <='1'; elseif (clk'EVENT and clk='1') then if (ena='1') then count0 := count0 + 1; if (count0=fclk) then count0 := 0; count1 := count1 + 1; if (count1=10) then count1 := 0; count2 := count2 + 1; end if; end if; end if; end if; --ssd drivers case count1 is when 0 => dig1 <= “1111110”; --126 when 1 => dig1 <= “0110000”; --48 when 2 => dig1 <= “1101101”; --109 when 3 => dig1 <= “1111001”; --121 when 4 => dig1 <= “0110011”; --51 when 5 => dig1 <= “1011011”; --91 when 6 => dig1 <= “1011111”; --95 when 7 => dig1 <= “1110000”;--112 when 8 => dig1 <= “1111111”; --127 when 9 => dig1 <= “1111011”;--123 when others => dig1 <= “1001111”; --79 (“E”) end case; case count2 is when 0 => dig2 <= “1111110”; --126 when 1 => dig2 <= “0110000”; --48 when 2 => dig2 <= “1101101”; --109 when 3 => dig2 <= “1111001”; --121 when 4 => dig2 <= “0110011”; --51 when 5 => dig2 <= “1011011”; --91 when 6 => dig2 <= “1011111”; --95 when others => dig2 <= “1001111”; --79 (“E”) end case; end process; end timer;
Medidor de Frequência
- x é o sinal cuja frequência queremos medir.
- Uma janela de tempo é criada a partir do clock (com duração de 1s, por exemplo) e o número de pulsos com x dentro dela é contado.
- O período de x (ou vários períodos) é usado como janela de tempo e o número de pulsos do clock dentro dela é contado.
- O contador 1 divide a frequência do clock por n+1, criando uma forma de onda que permanece baixa durante nTo segundos e alta durando To segundos, onde To é o período do clock.
- Escolhendo n=fclk, obtém-se uma janela de tempo baixa (twindow) de 1s. Essa forma de onda provoca o armazenamento da saída do contador 2 no registrador em sua borda ascendente, e também reseta o contador 2, que é liberado para começar a contar novamente após um período de clock.
library ieee; use ieee.std_logic_1164.all; entity freq_meter is generic (fclk: INTEGER := 5; --frequencia clock fxmax: INTEGER :=15); --max fx port (clk, x : IN bit; test : OUT bit; --para visualizar janela de tempo baixa fx : OUT INTEGER RANGE 0 to fxmax); end freq_meter; architecture behavioral of freq_meter is signal twindow: bit; signal temp: INTEGER RANGE 0 to fxmax; begin --time window process (clk) variable count: INTEGER RANGE 0 to fclk; begin if (clk'EVENT and clk='1') then count := count + 1; if (count=fclk) then twindow <= '1'; elsif (count=fclk+1) then twindow <= '0'; count := 0; end if; end if; end process; --counter for x process (x, twindow) variable count : INTEGER RANGE 0 to 20; begin if (twindow='1') then count := 0; elseif (x'EVENT and x='1') then count := count + 1; end if; temp <= count; end process; --register process (twindow) begin if (twindow'EVENT and twindow='1') then fx <= temp; end if; end process; test <= twindow; end behavioral;