Descarga - GEOCITIES.ws

Anuncio
PROBLEMA 1. PARCIAL 2001/2002
Entity CIRCUITO is
Generic (N: positive:=8);
Port ( E : in std_logic_vector (N-1 downto 0);
T : out std_logic_vector (1 downto 0);
S : out std_logic_vector(N-1 downto 0));
End circuito;
Architecture ARCH_CIRCUITO of CIRCUITO is
Signal T0, T1: std_logic_vector (N downto 0);
Component CELDA
Port( E
T0IN
T1IN
T0OUT
T1OUT
S
End CELDA;
:
:
:
:
:
:
in std_logic;
in std_logic;
in std_logic;
out std_logic;
out std_logic;
out std_logic);
Begin
CELDAS: for I in 0 to N-1 generate
CELDA_I : CELDA port map (E(I), T0(I), T1(I), T0(I+1), T1(I+1), S(I));
End generate CELDAS;
T0(0) <=’0’; T1(0)<=’0’;
T(0)<=T0(N); T(1)<=T1(N);
End ARCH_CIRCUITO;
PROBLEMA 2. PARCIAL 2001/2002
architecture ARCH of CONTROL is
begin
process (ON_OFF, CLK)
variable T_IDEAL, T_REAL: integer;
begin
if ON_OFF =’1’ then
if CLK’event and CLK=’1’ then
T_IDEAL := std_logic_vector_to_integer (TEMP_IDEAL);
T_REAL := std_logic_vector_to_integer (SENSOR_TEMP);
if T_IDEAL > T_REAL + 2 then
CALIENTA <= ’1’; REFRIGERA <= ‘0’;
elsif T_IDEAL < T_REAL – 2 then
CALIENTA <= ’0’; REFRIGERA <= ‘1’;
else
CALIENTA <= ’0’; REFRIGERA <= ‘0’;
end if;
end if;
else
CALIENTA <= ’0’; REFRIGERA <= ‘0’;
end if;
end process;
end ARCH;
El ascensor.
Describir el controlador de un ascensor único en una vivienda de 4 plantas. Las entradas al
circuito serán, por un lado, el piso al que el usuario desea ir mediante 4 botones, y el piso en el
que se encuentra el ascensor en un momento dado. Por otro, habrá una célula que detecte la
presencia de algún obstáculo en la puerta, si hay un obstáculo la puerta no debe cerrarse. La
salida será por un lado el motor (mediante dos bits), y la puerta (un bit). El funcionamiento es:
el ascensor debe ir al piso indicado por los botones, cuando llegue abrirá las puertas que
permanecerán así hasta que se reciba otra llamada. El ascensor no tiene memoria por lo que si
se pulsan los botones mientras el ascensor se mueve, no hará caso.
bot =”100”
INICIO
bot(1..0) = piso
motor =”10” o “01”
puerta = ‘0’
motor =”00”
puerta = ‘1’
bot /= “100”
VOY
CERRAR
motor =”00”
puerta = ‘1’
celula=’1’
bot(1..0) /= piso
celula = ‘0’
El piso al que se va, se pierde en la señal BOT.
El estado se guarda en la señal presente.
La señal boton es perecedera, por lo que al ser pulsada debe grabarse en BOT, siempre que
estemos en INICIO.
Máquina de Moore: las salidas dependen sólo del estado
El estado en realidad está compuesto por (presente, BOT)
SOLUCIÓN:
library ieee;
use ieee.std_logic_1164.all;
ENTITY ascensor IS
PORT(
boton: IN bit_vector (3 downto 0);
piso: IN bit_vector (1 downto 0);
clk, reset, celula: IN bit;
motor: OUT bit_vector (1 downto 0);
puerta: OUT bit
);
END ascensor;
ARCHITECTURE mover OF ascensor IS
TYPE estado IS (inicial, cerrar, voy);
SUBTYPE vector IS bit_vector (2 DOWNTO 0);
SIGNAL presente: estado:=inicial;
SIGNAL bot: bit_vector (2 DOWNTO 0);
FUNCTION codifica (pulso: bit_vector(0 TO 3)) RETURN vector IS
BEGIN
CASE pulso IS
WHEN "0001" => RETURN "000";
WHEN "0010" => RETURN "001";
WHEN "0100" => RETURN "010";
WHEN "1000" => RETURN "011";
WHEN OTHERS => RETURN "100";
END CASE;
END codifica;
BEGIN
fsm: PROCESS (reset, clk)
BEGIN
IF reset = '1' THEN presente<=inicial;
ELSIF clk ='1' AnD clk'EVENT THEN
CASE presente IS
WHEN inicial =>
IF bot/="100" THEN presente <=cerrar;
END IF;
WHEN cerrar =>
IF celula ='0' THEN presente <=voy; -- sin obstáculos
END IF;
WHEN voy =>
IF bit_vector_to_integer(bot(1 DOWNTO 0))=bit_vector_to_integer(piso) THEN
presente<=inicial;
END IF;
END CASE;
END IF;
END PROCESS fsm;
salida: PROCESS (presente, boton)
BEGIN
CASE presente IS
WHEN inicial =>
motor <="00"; --parado
puerta <='1'; --abierta
bot <= codifica(boton); --sólo se lee el boton cuando estamos en el estado inicial
WHEN cerrar =>
motor<="00";
puerta<='1';
WHEN voy =>
puerta <='0';
IF bit_vector_to_integer(bot(1 DOWNTO 0))> bit_vector_to_integer(piso) THEN
motor<="10"; --subir
ELSE motor<="01"; --bajar
END IF;
END CASE;
END PROCESS salida;
END mover;
EL BOTON
Un motor eléctrico viene controlado por un único botón. Cuando se pulsa el botón, cambia de
encendido a apagado y viceversa. Sintetizar el circuito que controla el motor mediante una
máquina de estados en VHDL
boton=’0’
motor =’0’
OFF
boton=’1’
boton=’1’
ON
motor =’1’
boton=’0’
En el momento que se pulsa el botón podemos dar varias vueltas y cuando se suelta podemos
parar en cualquiera de los dos estados, se comportaría como una ruleta.
La solución sería añadir en las condiciones que haya un evento en la señal boton.
boton=’0’ or not boton’event
motor =’0’
OFF
boton=’1’ and boton’event
boton=’1’ and boton’event
ON
motor =’1’
boton=’0’ or not boton’event
Entity CIRCUITO is
Port(
Boton: in std_logic;
Motor: out std_logic);
End CIRCUITO;
architecture ARCH of CIRCUITO is
type estados is (ON, OFF);
signal presente: estados;
begin
salida: process(presente)
begin
case presente is
when OFF => motor <=’0’;
when ON => motor <=’1’;
end case;
end process salida;
maquina: process(boton)
begin
if boton=’1’ and boton’event then
case presente is
when OFF => presente <= ON;
when ON => presente <=OFF;
end case;
end if;
end process maquina;
Problema VHDL
Realizar en VHDL el circuito de control de unos semáforos que controlan un cruce entre un
camino rural y una carretera. En principio, el semáforo del camino rural siempre está en rojo y
el de la carretera en verde. Una célula en el camino rural detecta la presencia de un coche,
momento en el cuál el semáforo de la carretera pasa de verde a rojo pasando por ámbar, al
tiempo que el semáforo del camino se pone en verde. El semáforo del camino permanece en
verde unos 10 segundos, momento en el cual empieza la secuencia de puesta a rojo, al tiempo
que el semáforo de la carretera empieza la secuencia de cambio hacia el verde. El semáforo del
camino no debe ponerse en verde otra vez hasta transcurridos 30 segundos por lo menos. El
circuito tiene una entrada de reloj de 1 segundo de periodo y las señales de entrada y salida
suficientes para el control del semáforo.
Descargar