Академический Документы
Профессиональный Документы
Культура Документы
Esta descripcion es mas interesante ya que en este caso esta mas claro lo que quere-
mos decir y tanto la simulacion como la sntesis coinciden. Quiza alguien podra pensar
que una posible solucion sera poner presente en la lista sensible, pero esto, aunque la
simulacion estara bien, sintetizara otro circuito diferente. O sea, que es aconsejable
seguir un unico modelo para la maquina de estados, que funcione bien para sntesis, y
no salirse de ah.
ENTITY semaforo IS
PORT (sensor,reset,clk: IN std_logic;
semcamin,semcarr: OUT std_logic_vector(0 TO 2));
END semaforo;
salida:
PROCESS(presente)
BEGIN
CASE presente IS
WHEN inicial=>
semcarr<=verde;
semcamin<=rojo;
rescont<=true;
WHEN carramarillo=>
semcarr<=amarillo;
semcamin<=rojo;
END descripcion;
11.2.3 El ascensor
Ejemplo 11.3 Describir el controlador de un ascensor unico en una vivienda de 4
pisos. Las entradas al circuito seran, 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, habra una celula que detecte la presencia de algun obstaculo en la
puerta, si hay un obstaculo la puerta no debe cerrarse. La salida sera por un lado el
motor (mediante dos bits), y la puerta (un bit). El funcionamiento es bien simple: el
ascensor debe ir al piso indicado por los botones, cuando llegue abrira las puertas que
permaneceran 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 hara caso.
ENTITY ascensor IS
PORT(boton: IN bit_vector(0 TO 3);
piso: IN bit_vector(1 DOWNTO 0);
clk,reset,celula: IN bit;
motor: OUT bit_vector(0 TO 1);
puerta: OUT bit);
END ascensor;
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 obtaculos
END IF;
WHEN voy=>
IF bot(1 DOWNTO 0)=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);
WHEN cerrar=>
motor<="00";
puerta<='1';
WHEN voy=>
puerta<='0'; -- Cerrada
IF bot(2 DOWNTO 0)>piso THEN
motor<="10"; -- Subir
ELSE motor<="01"; -- Bajar
END IF;
END CASE;
END PROCESS salida;
END mover;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY rom IS
PORT( cen: IN std_logic;
direcc: IN std_logic_vector(1 DOWNTO 0);
dato: OUT std_logic_vector(7 DOWNTO 0));
END rom;
PROCESS(direcc)
BEGIN
salida<="XXXXXXXX" AFTER 10 ns;
CASE direcc IS
WHEN "00"=>salida<=TRANSPORT "00000000" AFTER 100 ns;
WHEN "01"=>salida<=TRANSPORT "00000001" AFTER 100 ns;
WHEN "10"=>salida<=TRANSPORT "01010101" AFTER 100 ns;
WHEN "11"=>salida<=TRANSPORT "10101010" AFTER 100 ns;
WHEN OTHERS=> NULL;
END CASE;
END PROCESS;
END modelo;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
ENTITY codifica_boton IS
END codifica_boton;
codifica_boton;
ARCHITECTURE
ARCHITECTURE arquitectura_co
arquitectura_cod_boton
d_boton OF codifica_boton
codifica_boton IS
BEGIN
PROCESS (piso_donde_va)
BEGIN
CASE (piso_donde_va) IS
END CASE;
END PROCESS;
END arquitectura_cod_boton;
arquitectura_cod_boton;
LIBRARY ieee;
USE ieee.STD_LOGIC_1164.all;
ENTITY codifica_boton_test IS
END codifica_boton_test;
codifica_boton_test;
ARCHITECTURE
ARCHITECTURE arquitectura_boton
arquitectura_boton_test
_test OF codifica_boton_test
codifica_boton_test IS
-- Declaración del componente
COMPONENT codifica_boton IS
PORT
piso_donde_va
piso_donde _va : IN STD_LOGIC_VECTOR (2 DOWNTO 0); -- selección de piso
codigo_piso
codigo_pi so : OUT STD_LOGIC_VECTOR (1 DOWNTO 0) -- codigo generado
);
END COMPONENT;
-- Declaración de señales
SIGNAL piso_donde_va
piso_donde _va : STD_LOGIC_VECTOR (2 DOWNTO 0); -- boton que se activa
SIGNAL codigo_piso
codigo_p iso : STD_LOGIC_VECTOR(1 DOWNTO 0); -- codigo generado
-- Configuración de la arquitectura
BEGIN
);
END arquitectura_boton_test;
2.-Capturas de pantallas:
La librería WORK:
3.-Análisis de resultados:
Tras haber creado la entidad y la arquitectura, procedemos a realizar la simulación.
Dicha simulación debe cumplir lo que dice en el archivo de test. Por eso lo
analizaremos por intervalos(cada intervalo son 20 nanosegundos):
1. (piso_donde_va <= "100" )Es decir, el ascensor esta en el piso 2 con el código
de entrada (piso_donde_va) “100”; por lo cual, la salida (codigo_piso) devuelve
“10”.
2. ("001" AFTER periodo) Cuando pasan 20 ns, el código recibe “001” por lo que
devuelve “00” como dice la arquitectura.
3. ("010" AFTER 2 * periodo) Cuando vuelve a pasar un periodo, cambia y recibe
“010” por lo que sale (codigo_piso) es “01”.
4. ("100" AFTER 3 * periodo) cuando pasa el periodo, cambia de piso al segundo
y devuelve en el código_piso “10” como al principio.
5. ("000" AFTER 4 * periodo) como no maraca nada, se recibe “000”; y como es
distinto de: “001”, “010”, “100”; devuelve “11”.
6. ("111" AFTER 5 * periodo) se marcan 3 pisos a la vez y se recibe “111” ”; y
como es distinto de: “001”, “010”, “100”; devuelve “11”.
7. (“001" AFTER 6 * periodo) se aprieta el botón 0 (“001”) y devuelve “00”.
8. (100" AFTER 7 * periodo) ahorase aprieta el botón del segundo piso, por lo que
la salida (código_piso) será “10”
9. ("010" AFTER 8 * periodo) ahora pasa otro periodo y recibe “010” por lo que se
devuelve el equivalente al haber pulsado el botón 1: “01”.
10. (100" AFTER 9 * periodo) Ahora se pulsa el botón del segundo piso y
devolvemos “10”.
11. ("001" AFTER 10 * periodo) por último se requiere bajar al piso 0 y el
código_piso es: “00”.
1.- Primera parte:
a) Código utilizado:
Código de la entidad y arquitectura de un biestable tipo D activado por flanco de
subida y señal clear asíncrona activa a nivel alto: (los comentarios han sido eliminados)
LIBRARY IEEE;
USE ieee.STD_LOGIC_1164.all;
ENTITY biestable_D_con_clr IS
END biestable_D_con_clr;
BEGIN
END flujo_asin;
b) Capturas:
1
Sergio Carrégalo Díaz Sistemas Electrónicos y Automáticos
Cristina Amián Sánchez Practica 4
PB/S PA/S
Q3 Q0
PB S
PA
S
Q2 Q1
S
PB/S PA/S
2
Sergio Carrégalo Díaz Sistemas Electrónicos y Automáticos
Cristina Amián Sánchez Practica 4
Sabiendo que:
3
Sergio Carrégalo Díaz Sistemas Electrónicos y Automáticos
Cristina Amián Sánchez Practica 4
--Flip-flop D
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity FF_D is
CLEAR : in STD_LOGIC;
CLK : in STD_LOGIC;
D : in STD_LOGIC;
Q : out STD_LOGIC);
end FF_D;
begin
begin
end if;
end process;
4
Sergio Carrégalo Díaz Sistemas Electrónicos y Automáticos
Cristina Amián Sánchez Practica 4
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity P4 is
CLK : in STD_LOGIC;
S : in STD_LOGIC;
PA : in STD_LOGIC;
PB : in STD_LOGIC;
Q0 : out STD_LOGIC;
Q1 : out STD_LOGIC;
Q2 : out STD_LOGIC;
Q3 : out STD_LOGIC;
A : out STD_LOGIC;
D : out STD_LOGIC);
end P4;
architecture A_P4 of P4 is
signal D0,D1,D2,D3:STD_LOGIC;
signal Q1_I,Q2_I,Q3_I:STD_LOGIC;
signal A_I,D_I:STD_LOGIC;
component FF_D is
CLEAR : in STD_LOGIC;
CLK : in STD_LOGIC;
D : in STD_LOGIC;
Q : out STD_LOGIC);
end component;
5
Sergio Carrégalo Díaz Sistemas Electrónicos y Automáticos
Cristina Amián Sánchez Practica 4
begin
D2<=(Q0_I AND NOT S) OR (NOT PB AND NOT S) OR (Q1_I AND NOT S);
Q0<=Q0_I;
Q1<=Q1_I;
Q2<=Q2_I;
Q3<=Q3_I;
D<=Q2_I;
A<=Q0_I;
A_I<=Q0_I;
D_I<=Q2_I;
end A_P4;
Se genera ahora el fichero TEST con los estímulos, para obtener la simulación en
el tiempo del circuito. El código fuente es el siguiente:
LIBRARY ieee;
SE ieee.std_logic_1164.ALL;
ENTITY T_FF_D IS
END T_FF_D;
6
Sergio Carrégalo Díaz Sistemas Electrónicos y Automáticos
Cristina Amián Sánchez Practica 4
COMPONENT P4
PORT(
RESET : IN std_logic;
CLK : IN std_logic;
S : IN std_logic;
PA : IN std_logic;
PB : IN std_logic;
Q0 : OUT std_logic;
Q1 : OUT std_logic;
Q2 : OUT std_logic;
Q3 : OUT std_logic;
A : OUT std_logic;
D : OUT std_logic
);
END COMPONENT;
--Inputs
--Outputs
signal Q0 : std_logic;
signal Q1 : std_logic;
signal Q2 : std_logic;
signal Q3 : std_logic;
signal A : std_logic;
signal D : std_logic;
7
Sergio Carrégalo Díaz Sistemas Electrónicos y Automáticos
Cristina Amián Sánchez Practica 4
BEGIN
S => S,
PA => PA,
PB => PB,
Q0 => Q0,
Q1 => Q1,
Q2 => Q2,
Q3 => Q3,
A => A,
D => D
);
CLK_process :process
begin
end process;
S <= '0', '1' after 200 ns, '0' after 600 ns, '1' after 800 ns, '0' after 900 ns;
PA <= '0', '1' after 400 ns, '0' after 700 ns;
PB <= '1', '0' after 300 ns, '1' after 1000 ns;
END;
8
Sergio Carrégalo Díaz Sistemas Electrónicos y Automáticos
Cristina Amián Sánchez Practica 4
Al inicio del cronograma tenemos que la única señal activa al inicio es PB, lo que
no indica que el ascensor se encuentra en la planta baja. A los 200ns se activa el
pulsador de llamada, lo que no indica que desde la planta alta se ha requerido la
subida del ascensor. Por tanto, se pasa al estado Q0, para indicar que el ascensor
esta subiendo. Cuando se el sensor de planta alta (PA) se activa, se pasa al
estado Q1, indicándonos que el ascensor ya esta arriba, y el estado Q0 pasa a
nivel lógico bajo.
A Los 600ns se desactiva el pulsador de llamada, lo que quiere decir que se
requiere al ascensor en la planta baja. En el siguiente flanco de bajada del reloj, se
desactiva PA, para indicarnos que el ascensor ya no esta en la planta baja, y se
pasa al estado Q2, es decir, ascensor bajando.
En 833 nos, se vuelve a llamar al ascensor a la subida, por lo que se pasa al
estado Q0, y se vuelve a repetir el proceso primero.
9
Sergio Carrégalo Díaz Sistemas Electrónicos y Automáticos
Cristina Amián Sánchez Practica 4
Las salidas del circuito del ascensor quedan por tanto relacionadas con la entrada
de la placa de la siguiente manera:
10