A DESCRIÇÃO VHDL RELÓGIO
Por: Marlon Cardan • 9/7/2020 • Ensaio • 9.755 Palavras (40 Páginas) • 414 Visualizações
[pic 1]
DESCRIÇÃO VHDL RELÓGIO
-- relogio digital para placa nexys 2 - digilent
-- by Leandro J. Cassol - Unilasalle
library ieee;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity relogio is
port (clock : in std_logic; -- porta de entrada para o clock do sistema
reset : in std_logic; -- porta de entrada para o reset do sistema
ajusta_minuto : in std_logic; -- porta de entrada para o ajuste dos minutos do sistema
ajusta_hora : in std_logic; -- porta de entrada para o ajuste das horas do sistema
anodes : out std_logic_vector(3 downto 0); -- sinal para multiplexar displayers
display_sete_segmentos : out std_logic_vector(6 downto 0) -- porta de saida. Sai sinal BCD para as displayers
);
end relogio;
architecture Behavioral of relogio is
type tipo_estado is (D0,D1,D2,D3);
signal fsm: tipo_estado;
signal muda_display : std_logic;
signal controle_mux : std_logic_vector (0 to 2);
signal contador_muda_display : integer :=0;
signal segundo, minuto, hora : integer :=0 ;
signal contador_clock : integer :=0;
signal ck_1hz : std_logic ;
signal saida_mux, display1_hora, display2_hora, display1_minuto, display2_minuto, display1_segundo, display2_segundo :integer :=0 ;
signal codigo_bcd_display : std_logic_vector(6 downto 0);
begin -- divisor de frequencias - transforma um clock de 50MHz para 1Hz
divisor_de_clock : process(clock) --processo de divisão de frequencia para tranformar o clock de 24MHz para 1Hz. (depende do sinal clock)
begin
if(clock'event and clock='1') then
contador_clock <= contador_clock + 1;
contador_muda_display <= contador_muda_display + 1;
if(contador_clock = 49999999) then --o sinal de entrada tem uma frequencia de 50MHz - converte 50Mhz em 1Hz
ck_1hz <= '1';
contador_clock <= 0;
else
ck_1hz <='0';
end if;
if(contador_muda_display = 49999) then --o sinal de entrada tem uma frequencia de 50MHz - converte 50 Mhz em 100KHz
muda_display <= '1';
contador_muda_display <= 0;
else
muda_display <='0';
end if;
end if;
end process divisor_de_clock; --fim do processo de divisão de frequencias
-- contador das horas, minutos e segundos. E botão de ajuste das horas e dos minutos.
relogio : process(ck_1hz, reset) --processo relógio (depende dos sinais de ck_1hz e reset)
begin
if (reset = '1') then
segundo <= 0; --zera o contador dos segundos quando reset for igual a zero
minuto <= 0; --zera o contador dos minutos quando reset for igual a zero
hora <= 0; --zera o contador das horas quando reset for igual a zero
elsif(ck_1hz'event and ck_1hz='1') then --a partir desta linha e dentro deste processo todos o sinais são atualizados em função do sinal ck_1hz
segundo <= segundo + 1; --incrementa o contador dos segundos no evento de clock (sinal ck_1hz)
if (ajusta_minuto='1') then --incrementa o contador dos minuntos quando o sinal ajusta_minuto for igual a 1
minuto <= minuto + 1; --incrementa o contador dos minutos quando o sinal ajusta_minuto for igual a 1
if (minuto = 59) then --
minuto <= 0; --zera contador dos minutos quando apos a contagem ser 59
...