Está en la página 1de 4

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

ENTITY semaforo IS
PORT (sensor,reset,clk: IN std_logic;
semcamin,semcarr: OUT std_logic_vector(0 TO 2));
END semaforo;

ARCHITECTURE descripcion OF semaforo IS


TYPE estado IS
(inicial,carramarillo,caminverde,caminamarillo,espera);
CONSTANT verde: std_logic_vector(0 TO 2):="001";
CONSTANT amarillo: std_logic_vector(0 TO 2):="010";
CONSTANT rojo: std_logic_vector(0 TO 2):="100";
SIGNAL presente: estado:=inicial;
SIGNAL rescont: boolean:=false; -- Pone a cero la cuenta
SIGNAL fin_largo,fin_corto: boolean; -- Indica fin de cuenta
SIGNAL cuenta: integer RANGE 0 TO 63;
BEGIN

-- Lo primero es definir la máquina de estados:


maquina:
PROCESS(clk,reset)
BEGIN
IF reset='1' THEN
presente<=inicial;
ELSIF clk='1' AND clk'event THEN
CASE presente IS
WHEN inicial=>
IF sensor='1' THEN
presente<=carramarillo;
END IF;
WHEN carramarillo=>
presente<=caminverde;
WHEN caminverde=>
IF fin_corto THEN
presente<=caminamarillo;
END IF;
WHEN caminamarillo=>
presente<=espera;
WHEN espera=>
IF fin_largo THEN
presente<=inicial;
END IF;
END CASE;
END IF;
END PROCESS maquina;

salida:
PROCESS(presente) -- No depende de las entradas
BEGIN
CASE presente IS
WHEN inicial=>
semcarr<=verde;
semcamin<=rojo;
rescont<=true;
WHEN carramarillo=>
semcarr<=amarillo;
semcamin<=rojo;
rescont<=true;
WHEN caminverde=>
semcarr<=rojo;
semcamin<=verde;
rescont<=false;
WHEN caminamarillo=>
semcarr<=rojo;
semcamin<=amarillo;
rescont<=true;
WHEN espera=>
semcarr<=verde;
semcamin<=rojo;
rescont<=false;
END CASE;
END PROCESS salida;

-- El siguiente proceso define el contador:


contador:
PROCESS(clk)
BEGIN
IF clk='1' THEN
IF rescont THEN cuenta<=0;
ELSE cuenta<=cuenta+1;
END IF;
END IF;
END PROCESS contador;

-- Queda la detección de los tiempos largos y cortos:


fin_largo<=true WHEN cuenta=29 ELSE false;
fin_corto<=true WHEN cuenta=9 ELSE false;

END descripcion;

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY ascensor IS
PORT(boton: IN std_logic_vector(3 DOWNTO 0);
piso: IN std_logic_vector(3 DOWNTO 0);
clk, reset: IN std_logic;
nivel, celula, abierto, cerrado: IN std_logic;
puerta, motor_subir, motor_bajar: OUT std_logic);
END ascensor;

ARCHITECTURE descripcion OF ascensor IS


TYPE estado IS (inicial,parado,cerrando,marcha,abriendo);
SIGNAL presente: estado:=inicial;
SIGNAL bot: std_logic_vector(3 DOWNTO 0); -- Almacena botón pulsado
SIGNAL piso_ini: std_logic_vector(3 DOWNTO 0); -- Piso de partida

BEGIN

estados:
PROCESS(reset,clk)
BEGIN
IF reset='1' THEN presente<=inicial;
ELSIF clk='1' AND clk'event THEN
CASE presente IS
WHEN inicial=> -- Estado inicial para que se nivele
IF nivel='1' then presente<=parado;
END IF;
WHEN parado=> -- Espera la pulsación de un botón
IF (bot/="0000") AND (bot/=piso) THEN presente<=cerrando;
END IF;
WHEN cerrando=> -- Cierra la puerta
IF cerrado='1' THEN presente<=marcha;
END IF;
WHEN marcha=> -- Lleva el ascensor a su piso
IF (bot=piso) AND (nivel='1') THEN presente<=abriendo;
END IF;
WHEN abriendo=> -- Abre las puertas
IF abierto='1' THEN presente<=parado;
END IF;
END CASE;
END IF;
END PROCESS estados;

salida:
PROCESS(presente,piso,celula,bot,piso_ini)
BEGIN
CASE presente IS
WHEN inicial=> -- Al encender puede que esté entre dos pisos
IF piso>"0001" THEN
motor_subir<='0'; -- Bajamos
motor_bajar<='1';
ELSE
motor_subir<='1'; -- Subimos
motor_bajar<='0';
END IF;
puerta<='1'; -- Abierta
WHEN parado=>
motor_subir<='0'; -- Parado
motor_bajar<='0';
puerta<='1'; -- Abierta
WHEN cerrando=>
motor_subir<='0'; -- Parado
motor_bajar<='0';
IF celula='1' THEN puerta<='1'; -- Abrir
ELSE puerta<='0'; -- Cerrar
END IF;
WHEN marcha=>
IF bot<piso_ini THEN
motor_subir<='0'; -- Bajamos
motor_bajar<='1';
ELSE
motor_subir<='1'; -- Subimos
motor_bajar<='0';
END IF;
puerta<='0'; -- Cerrada
WHEN abriendo=>
motor_subir<='0'; -- Parado
motor_bajar<='0';
puerta<='1'; -- Abrir
END CASE;
END PROCESS salida;
memoria:
PROCESS(reset,clk) -- Captura la pulsación del botón
BEGIN -- y el piso donde se encuentra
IF reset='1' THEN
bot<="0000";
piso_ini<=piso;
ELSIF clk='1' AND clk'event THEN
IF presente=parado THEN
IF (boton="0001") OR (boton="0010") OR
(boton="0100") OR (boton="1000") THEN bot<=boton;
ELSE bot<="0000"; -- Cualquier otra combinación no vale
END IF;
piso_ini<=piso;
END IF;
END IF;
END PROCESS memoria;

END descripcion;

También podría gustarte