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 1: Linha 1:
 +
;ALUNOS: Nicole, Leonardo, Renan;
 +
 
=Temporizador=
 
=Temporizador=
  

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

ALUNOS
Nicole, Leonardo, Renan;

Temporizador

Temporizador2.jpg

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

Medidor.jpg

  • 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 <= '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;