Letrero movible "Hola"
Enviado por Daarick GR • 9 de Enero de 2025 • Práctica o problema • 4.617 Palabras (19 Páginas) • 50 Visitas
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Hola is
port (
clk : in std_logic; -- Reloj principal
reset : in std_logic; -- Reinicio del sistema
led : out std_logic_vector(6 downto 0); -- Salida al display de 7 segmentos
clk_out2 : out std_logic;
clk_out1 : out std_logic;
display : out std_logic_vector(3 downto 0)
);
end Hola;
architecture arqHola of Hola is
type estados is (q1, q2, q3, q4, q5, q6, q7, q8,
a1, a2, a3, a4,
b1, b2, b3, b4,
c1, c2, c3, c4,
d1, d2, d3, d4,
e1, e2, e3, e4,
f1, f2, f3, f4,
g1, g2, g3, g4,
h1, h2, h3, h4);
signal actual, siguiente,
actual1, siguiente1,
actual2, siguiente2,
actual3, siguiente3,
actual4, siguiente4,
actual5, siguiente5,
actual6, siguiente6,
actual7, siguiente7,
actual8, siguiente8: estados;
signal detener : std_logic := '0'; -- Señal para detener el conteo
signal salida, salida1, salida2, salida3, salida4, salida5, salida6, salida7, salida8 : std_logic_vector(6 downto 0);
signal dp_aux, dp_aux1, dp_aux2, dp_aux3, dp_aux4, dp_aux5, dp_aux6, dp_aux7, dp_aux8 : std_logic_vector(3 downto 0);
signal clk_aux2: STD_LOGIC;
signal clk_aux1: STD_LOGIC;
signal contador1: integer range 0 to 10000000 := 0;
signal contador2: integer range 0 to 100000 := 0;
begin
--divisor 1
divisor_frecuencia1: process(reset, clk) BEGIN
if(reset='1') then
clk_aux1 <= '0';
contador1 <= 0 ;
elsif rising_edge(clk) then
if(contador1 = 10000000) then
clk_aux1 <= NOT(clk_aux1);
contador1 <= 0;
else
contador1 <= contador1 + 1;
end if;
end if;
end process;
clk_out1 <= clk_aux1;
--divisor 2
divisor_frecuencia2: process(reset, clk) BEGIN
if(reset='1') then
clk_aux2 <= '0';
contador2 <= 0 ;
elsif rising_edge(clk) then
if(contador2 = 100000) then
clk_aux2 <= NOT(clk_aux2);
contador2 <= 0;
else
contador2 <= contador2 + 1;
end if;
end if;
end process;
clk_out2 <= clk_aux2;
--Maquina de estados para 1
process(clk_aux2, reset)
begin
if reset = '1' then
actual1 <= a1; -- Reinicia al estado inicial
elsif rising_edge(clk_aux2) then
actual1 <= siguiente1;
end if;
end process;
process(actual1)
begin
case actual1 is
when a1 =>
siguiente1 <= a2;
salida1 <= "1111111"; -- Muestra
dp_aux1 <= "0111";
when a2 =>
siguiente1 <= a3;
salida1 <= "1111111"; -- Muestra
dp_aux1 <= "1011";
when a3 =>
siguiente1 <= a4;
salida1 <= "1111111"; -- Muestra
dp_aux1 <= "1101";
when a4 =>
siguiente1 <= a1;
salida1 <= "1111111"; -- Muestra
dp_aux1 <= "1110";
when others =>
siguiente1 <= a1; -- Valor por defecto
dp_aux1 <= "0111";
end case;
end process;
--Maquina de estados para 2
process(clk_aux2, reset)
begin
if reset = '1' then
actual2 <= b1; -- Reinicia al estado inicial
elsif rising_edge(clk_aux2) then
actual2 <= siguiente2;
end if;
end process;
process(actual2)
begin
case actual2 is
when b1 =>
siguiente2 <= b2;
salida2 <= "1111111"; -- Muestra
dp_aux2 <= "0111";
when b2 =>
siguiente2 <= b3;
salida2 <= "1111111"; -- Muestra
dp_aux2 <= "1011";
when b3 =>
siguiente2 <= b4;
salida2 <= "1111111"; -- Muestra
dp_aux2 <= "1101";
when b4 =>
siguiente2 <= b1;
salida2 <= "1001000"; -- Muestra H
dp_aux2 <= "1110";
when others =>
siguiente2 <= b1; -- Valor por defecto
dp_aux2 <= "0111";
end case;
end process;
--Maquina de estados para 3
process(clk_aux2, reset)
begin
if reset = '1' then
actual3 <= c1; -- Reinicia al estado inicial
elsif rising_edge(clk_aux2) then
actual3 <= siguiente3;
end if;
end process;
process(actual3)
begin
case actual3 is
when c1 =>
siguiente3 <= c2;
salida3 <= "1111111"; -- Muestra
dp_aux3 <= "0111";
when c2 =>
siguiente3 <= c3;
salida3 <= "1111111"; -- Muestra
dp_aux3 <= "1011";
...