Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Vhdlejer
Vhdlejer
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;
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;
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;
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;