Está en la página 1de 2

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY semaforo IS
PORT (
CLK : IN std_logic;
RST: IN std_logic; --Reset para volver a estado inicial--
sem : OUT std_logic_vector(7 DOWNTO 0));
--Leds de salida--
END semaforo;
ARCHITECTURE CRUCERO OF semaforo IS
type state_type is (s0,s1,s2,s3); -- Estados del semadoro--
signal estado : state_type;
signal cont : std_logic_vector(3 DOWNTO 0);
constant t5: std_logic_vector(3 DOWNTO 0):= "0101";
constant t3: std_logic_vector(3 DOWNTO 0):= "0011";
BEGIN
----
SECUENCIAL: PROCESS(CLK, RST)
BEGIN
IF RST = '1' THEN
estado <= s0;
cont <= "0000";
ELSIF CLK'EVENT AND CLK ='1' THEN
CASE estado IS --Comienzo de secuencia de estados--
WHEN s0 =>
if cont < t5 then
estado <= s0;
cont <= cont+1;
else
estado <= s1;
cont <= "0000";
end if;
WHEN s1 =>
if cont < t3 then
estado <= s1;
cont <= cont+1;
else
estado <= s2;
cont <= "0000";
end if;
WHEN s2 =>
if cont < t3 then
estado<= s2;
cont <= cont+1;
else
estado <= s3;
cont <= "0000";
end if;
WHEN s3 =>
if cont < t5 then
estado <= s3;
cont <= cont+1;
else
estado <= s0;
cont <= "0000";
end if;
WHEN OTHERS =>
estado <= s0;
END CASE;
END IF;
END PROCESS SECUENCIAL;
COMBINACIONAL: PROCESS(estado) -- Comienzonzo de los procesos combinacionales.
BEGIN
CASE estado IS
WHEN s0 => sem <= "11000001"; -- Estado inicial -- Verde y Flecha
activos y Rojo del 2do semaforo
WHEN s1 =>
sem <= "00100001"; -- Rojo del 2do semafoactivo y amarillo
sem(5) <= CLK; -- Parpadeo 1er semaforo
WHEN s2 => sem <= "00011100"; -- Rojo activo del 1er semaforo -- Verde
y Flecha activos del 2do semaforo
WHEN s3 => sem <= "00010010"; -- Rojo activo del 1er semaforo y
amarillo del segundo
sem(1) <= CLK; -- Parpadeo 2do semaforo
WHEN OTHERS => sem <= "11000001"; -- Se reinicia el ciclo
END CASE;
END PROCESS COMBINACIONAL;
END CRUCERO;

También podría gustarte