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.