Mudanças entre as edições de "Avaliação 2 - SST"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 86: Linha 86:
 
=Medidor de Frequência=
 
=Medidor de Frequência=
  
[[Arquivo:frequencia.jpg]]
+
 
  
 
* x é o sinal cuja frequência queremos medir.
 
* x é o sinal cuja frequência queremos medir.

Edição das 20h17min de 15 de abril de 2015

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.