Proyecto Final
Diseño e implementación de un sistema con FPGA para controlar el nivel de un tanque
En este documento se presentan el diseño y la implementación de un sistema de control en el cual se seleccionan dos niveles de llenado para un tanque, se utiliza un actuador para el drenado y llenado del recipiente, con sensores micro-switches acoplados a la FPGA.
En el siguiente enlace se muestra el documento con mas detalle sobre este proyecto
Diseño e implementación de un sistema con FPGA para controlar el nivel de un tanque
Código en Xilinx
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.pq_tanque.all;
entity visu2 is
Port (
reset: in std_logic;
ck: in std_logic;
S2: in std_logic;--n_2
S1: in std_logic;--n_1
B2: in std_logic;--vaciar
B1: in std_logic;--llenar
V2: out std_logic;--llena
V1: out std_logic;--vacía
L2: out std_logic;--led llena
L1: out std_logic;--led vacía
catodos : out STD_LOGIC_VECTOR (6 downto 0);
anodos : out STD_LOGIC_VECTOR (3 downto 0)
);
end visu2;
architecture behavioral of visu2 is
type nombres_estados is (stop, vacio, llena);
type nombres_display is (nivel_0, nivel_1, nivel_2);
--signal presente : estados := vacio;
--signal futuro : estados;
--signal cont, cont1, cont2: natural range 0 to 2**26-1;
signal BCD_1, BCD_2, BCD_3, BCD_4 : std_logic_vector (3 downto 0);
signal sald : STD_LOGIC_VECTOR(3 downto 0):= (others => '0');--
signal e :STD_LOGIC_vector(1 downto 0):= "00";--
signal sald_1 : STD_LOGIC;--
signal tes : STD_LOGIC;--
signal tiemp : STD_LOGIC;--
signal display: nombres_display;
signal estado: nombres_estados;
signal boton: std_logic_vector (1 downto 0);
signal sensor: std_logic_vector (1 downto 0);
begin
sensor<=S2&S1;
boton<=B2&B1;
process(reset, ck)
begin
if reset='1' then
estado<=stop;
elsif ck='1' and ck'event then
case estado is
when stop =>
if sensor="11" then display<=nivel_0;
if boton="00" then estado<=stop; end if;
if boton="01" then estado<=llena; end if;
end if;
if sensor="10" then display<=nivel_1;
if boton="00" then estado<=stop; end if;
if boton="01" then estado<=llena; end if;
if boton="10" then estado<=vacio; end if;
end if;
if sensor="00" then display<=nivel_2;
if boton="00" then estado<=stop; end if;
if boton="01" then estado<=stop; end if;
if boton="10" then estado<=vacio; end if;
end if;
when vacio =>
if sensor="11" then display<=nivel_0;
if boton="00" then estado<=stop; end if;
end if;
if sensor="10" then display<=nivel_1;
if boton="00" then estado<=stop; end if;
end if;
when llena =>
if sensor="10" then display<=nivel_1;
if boton="00" then estado<=stop; end if;
end if;
if sensor="00" then display<=nivel_2;
if boton="00" then estado<=stop; end if;
end if;
--
when others => estado<=stop;
end case;
end if;
end process;
process(estado,display)
begin
case estado is
when stop =>
V2<='1';
V1<='1';
L2<='0';
L1<='0';
when vacio =>
V2<='1';
V1<='0';
L2<='0';
L1<='1';
when llena =>
V2<='0';
V1<='1';
L2<='1';
L1<='0';
end case;
case display is
when nivel_0 =>
BCD_1 <="0000"; --0
BCD_2 <="0000"; --0
BCD_3 <="1000"; ---
BCD_4 <="0101"; --n
when nivel_1 =>
BCD_1 <="0001"; --1
BCD_2 <="0000"; --0
BCD_3 <="1000";
BCD_4 <="0101"; --n
when nivel_2 =>
BCD_1 <="0010"; --2
BCD_2 <="0000"; --0
BCD_3 <="1000";
BCD_4 <="0101"; --n
end case;
end process;
selector: visual PORT MAP(ck, e);
salida: mostrar PORT MAP(BCD_1, BCD_2, BCD_3, BCD_4, e, sald);
--animacion_0 : parpadeo PORT MAP(clk, tes, sald_1, tiemp);
bcd0: bcd_7_seg PORT MAP (e, sald, sald_1, catodos, anodos);
end behavioral;
________________________________________________________________
No hay comentarios:
Publicar un comentario