Está en la página 1de 6

INSTITUTO POLITCNICO DE LEIRIA

ESCOLA SUPERIOR DE TECNOLOGIA E GESTO


PROJETO DE SISTEMAS ELECTRNICOS, MAESTRADO, ENGENHARIA ELECTROTCNICA

TPC #6 Exerccio # D
1. Diagrama de bloques
La Figura 1 representa el diagrama de flujo del sistema, las entradas y las salidas son las mismas
descritas en el TPC5B.

Figura 1: Diagrama de flujo del sistema global

2. Mdulos VHDL
En la implementacin del circuito representado en la Figura 1 fue usado un mdulo VHDL: flujo, que
implementa un sistema global. Cuando la entrada Boton es activada (=1), el sistema empieza a ejecutar las
acciones dependiendo de las entradas de los sensores S1 y S2, para la cual se posee tres atividades:
a) Enciende el led durante 4 ciclos de reloj (S1=S2) .
b) Enciende la alarma (S1>S2)
c) Regresa inmendiatamente al inicio si no fuera mayor e igual (S1<S2)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity flujo is
Port ( boton : in STD_LOGIC;
clk : in STD_LOGIC;
sensor1 : in STD_LOGIC_VECTOR (3 downto 0);
sensor2 : in STD_LOGIC_VECTOR (3 downto 0);
led : out STD_LOGIC;
alarma : out STD_LOGIC;
reset : in STD_LOGIC
);
end flujo;
architecture arch of flujo is
signal carrega,conta:std_logic;
signal limpa,comparar:std_logic;
signal fim2,fim1:std_logic;
signal mayor,igual:std_logic;
signal aux:std_logic_vector (3 downto 0):=(others=>'0');
signal dato1,dato2:std_logic_vector(3 downto 0);
type eg_state_type is (zero,accion1,accion2,accion3);
signal state_reg, state_next: eg_state_type;

begin
------contador que nos permitira cumplir con los ciclos de conteo------process(conta,mayor,igual,clk,limpa)
begin
if limpa='1' then
fim1<='0';
fim2<='0';
elsif (conta='1') then
if((clk'EVENT and clk='0' )) then--clk='0'
if mayor='1' then
if (aux="0000") then
fim2<='1';
aux<="0000";
else
fim2<='0';
aux<=aux+'1';
end if;
elsif
igual='1' then

--nos permite que el reloj cuente exactamente los periodos de cada


--accin pues en clk='1', al pasar a la accion3, se incrementaba un periodo
--pues justo caia en el flanco de subida y tenia que esperar hasta el otro
--ciclo del reloj para pasar a la siguiente accin, y por ello el problema que se
--incrementaba un periodo mas en cada accion de encendido

if (aux="0011") then
fim2<='1';
aux<="0000";
else
fim2<='0';
aux<=aux+'1';
end if;
else
if (aux="1001") then
fim1<='1';
aux<="0000";
else
fim1<='0';
aux<=aux+'1';
end if;
end if;
end if;
end if;
end process;
------------------------------------------------------------------------------------permite guardar los datos---------------------------------process(carrega,clk)
begin
if (carrega='1')then
if (clk'event or clk='1' or clk='0') then
--esto nos permite que empieze almacenar los datos
dato1<=sensor1;
--en flancos de subida y de bajada del reloj.
dato2<=sensor2;
end if;
end if;
end process;
----------------------------------------------------------------------------------permite determinar si las entradas son iguales, mayores o ningun caso--process(dato1,dato2,comparar,limpa)
begin
if limpa='1' then
igual<='0';
mayor<='0';
elsif (comparar='1') then
if (dato1=dato2) then
igual<='1';
mayor<='0';
elsif (dato1>dato2) then
mayor<='1';
igual<='0';
else
mayor<='0';
igual<='0';
end if;
end if;
end process;
-----------------------------------------------------------------------------process(clk,reset)
begin
if (reset='1') then
state_reg <= zero;
elsif (clk'event and clk='1') then
state_reg <= state_next;

end if;
end process;

process(state_reg,boton,igual,mayor,fim2,fim1)
begin
state_next <= state_reg;
case state_reg is
when zero =>
carrega<='0';
conta<='0';
led<='0';
alarma<='0';
limpa<='1';
comparar<='0';
if boton='1' then
state_next <= accion1;
end if;
when accion1 =>
limpa<='0';
carrega<='1';
state_next <= accion2;
when accion2 =>
carrega<='0';
conta<='1';
if fim1='1' then
conta<='0';
state_next <= accion3;
comparar<='1';
end if;
when accion3 =>
if fim1='1' and igual='1' and mayor='0' then
led<='1';
conta<='1';
if fim2='1' then
state_next <= zero;
end if;
elsif fim1='1' and igual='0' and mayor='1' then
conta<='1';
alarma<='1';
if fim2='1' then
state_next <=zero;
end if;
elsif fim1='1' and igual='0' and mayor='0' then
led<='0';
alarma<='0';
state_next <=zero;
end if;
end case;
end process;
end arch;

3. Resultados de Simulacin
En las siguientes grficas se puede ver los resultados de la simulacin. En la figura 2 se indican el cambio de
ls estados ,es decir, zeroaccion1accion2---accion3---zero...accion3, en la accion3 se debe ejecutar
operaciones, como por ejemplo: encendido de la alarma (S1>S2) (figura 3), encendido del led (S1=S2)
(figura 4) y no ejecutar ninguna de las acciones mencionas anteriormente en el caso de que S1<S2 (figura5).

Cabe recalcal que para que pase de la accion2 a la accion3 se debe esperar 10 ciclos de reloj, lo mismo
sucede para el led que debe estar encedido durante 4 ciclos y la alarma encendido durante un ciclo de reloj.

Figura 2: Comienzo del circuito

Figura 3: Seal S1>S2, activacin de la alarma.

Figura 4: S1=S2, activacin del led.

Figura 5: S1<S2, no se activa la seal del led ni la alarma.

4. Referencias/Agradecimentos
Para realizar este trabajo fueron consultados los ejemplos disponbles en la siguiente referencia:
FPGA PROTOTYPING BY VHDL EXAMPLES XILINX SPARTAN 3 VERSION; PONG P. CHU

No pedimos ayuda a ningn compaero para realizar este trabajo

También podría gustarte