Está en la página 1de 39

Universidad de San Carlos de Guatemala

Facultad de Ingeniería
Escuela de Mecánica Eléctrica
Laboratorio de Electrónica
Proyecto de Electrónica 3
Segundo Semestre de 2019
Tutor: Inga. Magdalena Puente

Detector de Disparo

Guilson Alecsander Arevalo Cabrera 201503775

Lester Augusto Junior Ambrosio Chavez 201602891


Juan Carlos Solloy Xicón 201602816
Resumen
El proyecto consiste en diseñar un detector de disparo aplicando los conceptos obtenidos
en el curso de electrónica 3 y laboratorio de electrónica 3

El proyecto final de laboratorio consiste en crear un dispositivo que sea capaz de detectar
la ubicación (ángulo y distancia) de un evento por medio de la detección del sonido que
genera dicho evento. El ángulo y dirección del evento tienen que ser mostrados mediante
indicadores físicos. Para poder detectar la dirección del evento se requiere colocar 1
micrófono por cada esquina de un cuadrado, siendo 4 micrófonos en total. Así será
posible detectar el origen del evento en los 360 grados del plano XY. Para detectar la
dirección de la que provino el sonido se necesitaran usar comparadores de voltaje (con
amplificadores operacionales suficientemente rápidos) sin necesidad de usar un ADC. El
Voltaje DC de referencia de los comparadores de voltaje tiene que ser generado por
medio de una señal de PWM generado por la FPGA.
INTRODUCCION
Este proyecto se tratará de un detector de disparo el cual constará de 5 micrófonos, una
matriz de leds para indicar un mensaje y un servomotor para indicar la dirección del disparo

OBJETIVOS

Comprender el principio de funcionamiento de FPGA.

Aplicar los conocimientos adquiridos en el laboratorio para diseñar e implementar un


proyecto funcional siguiendo todas las especificaciones dadas.
El proyecto final de laboratorio consiste en crear un dispositivo que sea capaz de detectar
la ubicación (ángulo y distancia) de un evento por medio de la detección del sonido que
genera dicho evento. El ángulo y dirección del evento tienen que ser mostrados mediante
indicadores físicos.
Para poder detectar la dirección del evento se requiere colocar 1 micrófono por cada
esquina de un cuadrado, siendo 4 micrófonos en total. Así será posible detectar el origen
del evento en los 360 grados del plano XY. Para detectar la dirección de la que provino el
sonido se necesitaran usar comparadores de voltaje (con amplificadores operacionales
suficientemente rápidos) sin necesidad de usar un ADC. El Voltaje DC de referencia de
los comparadores de voltaje tiene que ser generado por medio de una señal de PWM
generado por la FPGA.

Para estimar la distancia a la cual se produjo el evento se utilizará un quinto micrófono el


cual estará conectado a un ADC externo a la FPGA, en base a la amplitud máxima
detectada por el micrófono se estimará la distancia a la cual se produjo el sonido
detectado.
Como indicadores de la dirección del evento se deben utilizar servomotores, que
apuntaran en la dirección de la cual provino el sonido. En una matriz de leds de 8X15 leds
como mínimo, en la cual se mostrará un mensaje y el ángulo del evento que se detectó.
El proyecto también deberá contar con un control de sensibilidad que de manera indirecta
controlará, mediante una señal PWM, el voltaje de referencia de los comparadores de
voltaje. La sensibilidad será calibrada mediante un potenciómetro conectado al ADC
externo.
Solución del proyecto
Para la detección del ángulo de donde proviene el sonido se utilizaron maquinas de
estado finito cuando el micrófono uno detectaba la señal, esta se enviaba a un estado
donde el tiempo entre detección de los micrófonos se media y dependiendo del tiempo
transcurrido variaba el ángulo de donde provenía el sonido, se utilizaron 4 estados para
los micrófonos los cuales variaban el ángulo según el tiempo medido por el modulo del
medidor de tiempo, estados M1 M2 M3 M4 y se utilizaron sentencias directas para los
ángulos de 0 grados, 90 grados, 180 grados 270 grados ya que estos al medir el tiempo la
diferencia es cero, se utilizo una matriz de 8x16 para mostrar la dirección de los ángulos
de donde proviene el sonido y por medio de multiplexación se utilizaron las dos matrices
de 8x8, también se utilizo un convertidor analógico a digital de 4 bits para mostrar la
distancia aproximada de donde proviene el sonido dependiendo de la intensidad del
mismo.
Para la entrada de las señales de los micrófonos se utilizaron detectores de flanco, para
asegurarnos de que el mismo micrófono no pare el tiempo de conteo del medidor.
Se utilizaron dos motores servo, los cuales tienen un rango de 180 grados, uno muestra
los ángulos menores a 180 y el otro de 180 a 360 grados, para controlarlos se utilizo pwm
por medio de la FPGA, se hizo un divisor de frecuencia a 50hz ya que a esta frecuencia
trabajan lo servomotores,
Diagrama esquematico
Modulo principal

Modulo pwm
Modulo micrófonos

Modulo multiplexor para la matriz de leds


BIBLIOGRAFIA

[1] https://eprints.ucm.es/26200/1/intro_VHDL.pdf

[2] MORRIS, MANO, M.


Diseño digital. Tercera edición
PEARSON EDUCACIÓN, México, 2003
ISBN: 970-26-0438-9
CODIGO UTILIZADO EN VHDL
PORT MAP
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Proyecto_final is
Port ( Clk : in STD_LOGIC;
M1 : in STD_LOGIC;
M2 : in STD_LOGIC;
M3 : in STD_LOGIC;
M4 : in STD_LOGIC;
reset : in STD_LOGIC;
boton : IN std_logic_vector(3 downto 0); ---
entradas adc
Display_uni : OUT std_logic_vector(3 downto 0);
Display_dece : OUT std_logic_vector(3 downto 0);
Display_cent : OUT std_logic_vector(3 downto 0);
enable : OUT std_logic_vector(7 downto 0);
PWM_S1 : out STD_LOGIC;
PWM_S2 : out STD_LOGIC
);
end Proyecto_final;

architecture Behavioral of Proyecto_Final is


------------------------------------------------------
component pwm
Port ( Clk: in Std_Logic;
PWM_S1: out Std_Logic;
PWM_S2: out Std_Logic;
angulo_in: in integer
);

end component;

component microfonos
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
M1 : in STD_LOGIC;
M2 : in STD_LOGIC;
M3 : in STD_LOGIC;
M4 : in STD_LOGIC;
adc : in STD_LOGIC_VECTOR(3 DOWNTO 0);
verde : out STD_LOGIC;
uni: out integer;
dece: out integer;
cente: out integer;
uni_cont: in integer;
dece_cont: in integer;
cente_cont: in integer;
angulo_out : out integer);

end component;

COMPONENT matriz
PORT(
Clk : IN std_logic;
reset : IN std_logic;
uni: in integer;
dece: in integer;
cente: in integer;
Display_uni : OUT std_logic_vector(3 downto 0);
Display_dece : OUT std_logic_vector(3 downto 0);
Display_cent : OUT std_logic_vector(3 downto 0);
enable : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;

COMPONENT adc1
PORT(
clk : IN std_logic;
reset : IN std_logic;
boton : IN std_logic_vector(3 downto 0);
O : OUT std_logic_vector(3 downto 0)
);
END COMPONENT;

COMPONENT contador
PORT(
clk : IN std_logic;
reset : IN std_logic;
s : IN std_logic;
uni_cont : OUT integer;
dece_cont : OUT integer;
cente_cont : OUT integer
);
END COMPONENT;

---$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
signal angulo_union : integer;
signal uni_u : integer:=0;
signal dece_u : integer:=0;
signal cente_u : integer:=0;
signal uni_c : integer:=0;
signal dece_c : integer:=0;
signal cente_c : integer:=0;
signal adc_union: std_logic_vector(3 downto 0);
signal verde_s: std_logic;
-----------------------------------------------------------
begin

C1:pwm PORT MAP(


Clk => Clk,
PWM_S1 => PWM_S1,
PWM_S2 => PWM_S2,
angulo_in => angulo_union
);

C2: microfonos PORT MAP(


Clk => Clk,
reset => reset,
M1 => M1,
M2 => M2,
M3 => M3,
M4 => M4,
uni_cont => uni_c,
dece_cont => dece_c,
cente_cont => cente_c ,
adc => adc_union,
verde => verde_s,
uni => uni_u,
dece => dece_u,
cente => cente_u,
angulo_out =>angulo_union
);

C3: matriz PORT MAP(


Clk => Clk ,
reset => reset,
uni => uni_u,
dece => dece_u,
cente => cente_u,
Display_uni => Display_uni,
Display_dece => Display_dece,
Display_cent => Display_cent,
enable => enable
);

C4: adc1 PORT MAP(


clk =>clk,
reset =>reset,
boton => boton ,
O => adc_union
);

C5: contador PORT MAP(


clk => clk,
reset => reset,
s => verde_s,
uni_cont => uni_c,
dece_cont => dece_c,
cente_cont => cente_c
);

end Behavioral;

MODULO PWM
library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity pwm is

Port ( Clk: in Std_Logic;

PWM_S1: out Std_Logic;

PWM_S2: out Std_Logic;

angulo_in: in integer);

end pwm;

architecture Behavioral of pwm is

------------------------------------------------------

constant valor_maximo: integer := 240000;

constant Tiempo: integer := 160;


signal contador_p: integer range 0 to valor_maximo-1;

signal angulo: integer range 0 to 360; ----valor recibido del angulo donde se encuentra el sonido

signal cambio: integer range 0 to 180;----valor recibido del angulo donde se encuentra el sonido

---------------------------------------------------

begin

------------------------------------------------------------------

angulo <= angulo_in;

process(Clk)

begin

---#########################################################

if (rising_edge(Clk)) then

if (contador_p=valor_maximo-1) then

contador_p<=0;

else

contador_p<= contador_p+1;

end if;

--ANGULO MENOR A 180

if angulo < 181 then

if angulo = 0 then

cambio<=5;

elsif angulo = 22 then

cambio<=60;

elsif angulo = 45 then

cambio<=80;

elsif angulo = 67 then

cambio<=95;

elsif angulo = 90 then

cambio<=115;

elsif angulo = 112 then

cambio<=125;

elsif angulo = 135 then

cambio<=145;

elsif angulo = 157 then


cambio<=165;

elsif angulo = 180 then

cambio<=180;

end if;

--SERVO 1---

If (contador_p<Tiempo*cambio) then

PWM_S1<='1';

else

PWM_S1<='0';

end if;

--SERVO 2---

If (contador_p<Tiempo*5) then--servo 2 tiene un


valor constante de angulo 0 el codigo solo recibe valores superiores a 0

PWM_S2<='1';

else

PWM_S2<='0';

end if;

-- ANGULO MAYOR A 180

elsif angulo > 180 then

if angulo = 202 then

cambio<=60;

elsif angulo = 225 then

cambio<=80;

elsif angulo = 247 then

cambio<=95;

elsif angulo = 270 then

cambio<=115;

elsif angulo = 292 then

cambio<=125;

elsif angulo = 315 then

cambio<=145;

elsif angulo = 337 then

cambio<=165;
end if;

--SERVO 1---

If (contador_p<Tiempo*180) then--servo 1 tiene un


valor constante de angulo 0 el codigo solo recibe valores superiores a 0

PWM_S1<='1';

else

PWM_S1<='0';

end if;

--SERVO 2--

If (contador_p<Tiempo*cambio) then

PWM_S2<='1';

else

PWM_S2<='0';

end if;

end if;

end if;

end process;

end Behavioral;

MODULO MICROFONOS

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity microfonos is

Port ( clk : in STD_LOGIC;

reset : in STD_LOGIC;

M1 : in STD_LOGIC;

M2 : in STD_LOGIC;

M3 : in STD_LOGIC;
M4 : in STD_LOGIC;

uni_cont: in integer;

dece_cont: in integer;

cente_cont: in integer;

adc : in STD_LOGIC_VECTOR(3 downto 0);

verde : out STD_LOGIC;

uni: out integer;

dece: out integer;

cente: out integer;

angulo_out : out integer);

end microfonos;

architecture Behavioral of microfonos is

----------------------------------------------------------------------------------------------

signal reg_1_0, reg_2_0, reg_1_1, reg_2_1, reg_1_2, reg_2_2, reg_1_3, reg_2_3: std_logic ;

signal pulso_boton0, pulso_boton1, pulso_boton2, pulso_boton3: std_logic ;

signal Mic : std_logic_vector(3 downto 0);

signal valor_grados : integer;

--

Type FSM is (Estado_espera, Estado_inicio, Estado_M1, Estado_M2,


Estado_M3, Estado_M4, Estado_medida);

signal Estado_sistema: FSM;

signal conteo: integer range 0 to 12000000;

signal tiempo: integer range 0 to 10:= 10;

------------------------------------------------------------------------------------------------

begin

Mic(0)<= pulso_boton0;

Mic(1)<= pulso_boton1;

Mic(2)<= pulso_boton2;

Mic(3)<= pulso_boton3;

--microfono 1

process (reset, clk)

begin

if reset = '0' then


reg_1_0 <= '0';

elsif rising_edge(clk) then

reg_1_0 <= M1;

end if;

end process;

process (reset, clk)

begin

if reset = '0' then

reg_2_0 <= '0';

elsif rising_edge(clk) then

reg_2_0 <= reg_1_0;

end if;

end process;

pulso_boton0 <= '1' when (reg_1_0 = '0' and reg_2_0 = '1') else '0';

-- microfono 2

process (reset, clk)

begin

if reset = '0' then

reg_1_1 <= '0';

elsif rising_edge(clk) then

reg_1_1 <= M2;

end if;

end process;

process (reset, clk)

begin

if reset = '0' then

reg_2_1 <= '0';

elsif rising_edge(clk) then

reg_2_1 <= reg_1_1;

end if;

end process;
pulso_boton1 <= '1' when (reg_1_1 = '0' and reg_2_1 = '1') else '0';

--microfono 3

process (reset, clk)

begin

if reset = '0' then

reg_1_2 <= '0';

elsif rising_edge(clk) then

reg_1_2 <= M3;

end if;

end process;

process (reset, clk)

begin

if reset = '0' then

reg_2_2 <= '0';

elsif rising_edge(clk) then

reg_2_2 <= reg_1_2;

end if;

end process;

pulso_boton2 <= '1' when (reg_1_2 = '0' and reg_2_2 = '1') else '0';

--microfono 4

process (reset, clk)

begin

if reset = '0' then

reg_1_3 <= '0';

elsif rising_edge(clk) then

reg_1_3 <= M4;

end if;

end process;

process (reset, clk)

begin

if reset = '0' then


reg_2_3 <= '0';

elsif rising_edge(clk) then

reg_2_3 <= reg_1_3;

end if;

end process;

pulso_boton3 <= '1' when (reg_1_3 = '0' and reg_2_3 = '1') else '0';

------------------------------------------------------------------------------------------------

process(clk)

begin

if (rising_edge(Clk)) then

if (reset = '0') then

valor_grados<=0;

Estado_sistema <= Estado_espera;

tiempo <= 2;

else

Case Estado_sistema is

when Estado_espera =>

if (tiempo > 0) then

if (conteo < 12000000) then

conteo <= conteo + 1;

verde <= '0';

else

conteo <= 0;

tiempo <= tiempo - 1;

end if;

else

Estado_sistema <= Estado_inicio;

end if;
when Estado_medida =>

if (tiempo > 0) then

if (conteo < 12000000) then

conteo <= conteo + 1;

else

conteo <= 0;

tiempo <= tiempo - 1;

end if;

else

Estado_sistema <= Estado_espera;

Case adc is

when "1111" =>

uni<=10;

dece<=5;

cente<=0;

when "0111" =>

uni<=10;

dece<=0;

cente<=1;

when "0011" =>

uni<=10;

dece<=5;
cente<=1;

when "0001" =>

uni<=10;

dece<=0;

cente<=2;

when others => null;

end case;

tiempo <= 3;

end if;

when Estado_inicio =>

valor_grados<=0;

uni<=0;

dece<=0;

cente<=0;

case Mic is

when "1001" =>

valor_grados<=0; --0 o 360

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=0;

dece<=0;

cente<=0;
when "0011" =>

valor_grados<=90; --- angulo 90

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=0;

dece<=9;

cente<=0;

when "0110" => -- angulo 180

valor_grados<=180;

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=0;

dece<=8;

cente<=1;

when "1100" =>

valor_grados<=270; --- angulo 270

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=0;

dece<=7;

cente<=2;

------------------------------------------------

when "0001" => -- angulo entre 0 y 90

Estado_sistema <= Estado_M1;

verde <= '1';

-------------------------------------------------

when "0010" => --angulo entre 90 y 180

Estado_sistema <= Estado_M2;

verde <= '1';

------------------------------------------------

when "0100" => -- angulo entre 180 y 270

Estado_sistema <= Estado_M3;

verde <= '1';

-------------------------------------------------

when "1000" =>-- angulo entre 270 a 360

Estado_sistema <= Estado_M4;


verde <= '1';

when others => null;

end case;

---**********************************---------------

when Estado_M1 =>

if (Mic="1010") then--angulo 45

valor_grados<=45;

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=5;

dece<=4;

cente<=0;

elsif(Mic="1000") then--M2

valor_grados<=45;-- angulo menor a 45 valor


tiempo medido

verde <= '0';

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=5;

dece<=4;

cente<=0;

elsif(Mic="0010") then--M2

valor_grados<=90;-- angulo mayor a 45 valor


tiempo medido

verde <= '0';

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=0;

dece<=9;

cente<=0;

end if;

---*******************************************--------

when Estado_M2 =>


if(Mic="0101") then -- angulo 135

valor_grados<=135;

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=5;

dece<=3;

cente<=1;

elsif (Mic="0001") then -- angulo menor a 135 valor


tiempo medido

valor_grados<=135;

verde <= '0';

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=5;

dece<=3;

cente<=1;

elsif (Mic="0100") then -- angulo mayor a 135 valor


tiempo medido

valor_grados<=180;

verde <= '0';

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=0;

dece<=8;

cente<=1;

end if;

----**********************************************

when Estado_M3 =>

if(Mic="1010") then--angulo 225

valor_grados<=225;

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=5;

dece<=2;

cente<=2;

elsif(Mic="1000") then----angulo mayor a 225


valor_grados<=225;

verde <= '0';

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=5;

dece<=2;

cente<=2;

elsif(Mic="0010") then-- angulo menor a 225

valor_grados<=270;

verde <= '0';

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=0;

dece<=7;

cente<=2;

end if;

----**********************************************

when Estado_M4 =>

if(Mic="0101") then--angulo 315

valor_grados<=315;

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=5;

dece<=1;

cente<=3;

elsif(Mic="0100") then--angulo menor a 315

valor_grados<=315;

verde <= '0';

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=5;

dece<=1;

cente<=3;

elsif(Mic="0001") then--angulo mayor a 315

valor_grados<=360;
verde <= '0';

Estado_sistema <= Estado_medida;

tiempo <= 3;

uni<=0;

dece<=6;

cente<=3;

end if;

---**************************

when others =>

Estado_sistema <= Estado_espera;

end case;

end if;

end if;

end process;

angulo_out <= valor_grados;

------------------------------------------------------------------------------------------------

end Behavioral;

MODULO MATRIZ DE LEDS

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity matriz is
Port (
Clk : in STD_LOGIC;
reset : in STD_LOGIC;
uni: in integer;
dece: in integer;
cente: in integer;
Display_uni : out
std_logic_vector (3 downto 0);
Display_dece : out
std_logic_vector (3 downto 0);
Display_cent : out
std_logic_vector (3 downto 0);
enable : out std_logic_vector (7
downto 0));
end matriz;

architecture Behavioral of matriz is

signal mux: integer range 0 to 12000000;


signal estado_enable: std_logic_vector(7 downto 0);
Type memoria_uni is array (0 to 10) of std_logic_vector (3 downto 0);
Type memoria_dece is array (0 to 9) of std_logic_vector (3 downto 0);
Type memoria_cent is array (0 to 9) of std_logic_vector (3 downto 0);
---*************************************************--------------------------
constant col1: memoria_uni:= ("1111", --0

"1111", --1

"1111", --2

"1111", --3

"1111", --4

"1111", --5

"1111", --6

"1111", --7

"1111", --8

"1111", --9

"1111");--10
constant col2: memoria_uni:= ("1001", --0

"1001", --1

"1001", --2

"0000", --3

"0110", --4

"0000", --5

"1000", --6

"0000", --7

"1001", --8

"0000", --9

"0110");--10
constant col3: memoria_uni:= ("0110", --0

"0001", --1

"0110", --2

"1110", --3

"0110", --4

"0111", --5
"0111", --6

"0100", --7

"0110", --8

"0110", --9

"0000");--10
constant col4: memoria_uni:= ("0110", --0

"1001", --1

"1110", --2

"1000", --3

"0110", --4

"0001", --5

"0001", --6

"1100", --7

"1001", --8

"0000", --9

"0000");--10

constant col5: memoria_uni:= ("0110", --0

"1001", --1

"1101", --2

"1110", --3

"0000", --4

"1100", --5

"0110", --6

"1100", --7

"0110", --8

"1110", --9

"0110");--10
constant col6: memoria_uni:= ("0110", --0

"1001", --1

"1011", --2

"0110", --3

"1110", --4
"1100", --5

"0110",--6

"1100", --7

"0110", --8

"1110", --9

"0110");--10
constant col7: memoria_uni:= ("1001", --0

"0000", --1

"0000", --2

"1001", --3

"1110", --4

"0001", --5

"1001",--6

"1100", --7

"1001", --8

"1110", --9

"0110");--10
constant col8: memoria_uni:= ("1111", --0

"1111", --1

"1111", --2

"1111", --3

"1111", --4

"1111", --5

"1111", --6

"1111", --7

"1111", --8

"1111", --9

"1111");--10
-------*****************************************************-------------------
constant col1_dece: memoria_dece:= ("1111", --0

"1111", --1

"1111", --2

"1111", --3
"1111", --4

"1111", --5

"1111", --6

"1111", --7

"1111", --8

"1111");--9
constant col2_dece: memoria_dece:= ("1001", --0

"1001", --1

"1001", --2

"0000", --3

"0110", --4

"0000", --5

"1000", --6

"0000", --7

"1001", --8

"0000");--9
constant col3_dece: memoria_dece:= ("0110", --0

"0001", --1

"0110", --2

"1110", --3

"0110", --4

"0111", --5

"0111", --6

"0100", --7

"0110", --8

"0110");--9
constant col4_dece: memoria_dece:= ("0110", --0

"1001", --1

"1110", --2

"1000", --3

"0110", --4

"0001", --5

"0001", --6
"1100", --7

"1001", --8

"0000");--9

constant col5_dece: memoria_dece:= ("0110", --0

"1001", --1

"1101", --2

"1110", --3

"0000", --4

"1100", --5

"0110", --6

"1100", --7

"0110", --8

"1110");--9
constant col6_dece: memoria_dece:= ("0110", --0

"1001", --1

"1011", --2

"0110", --3

"1110", --4

"1100", --5

"0110",--6

"1100", --7

"0110", --8

"1110");--9
constant col7_dece: memoria_dece:= ("1001", --0

"0000", --1

"0000", --2

"1001", --3

"1110", --4

"0001", --5

"1001",--6

"1100", --7
"1001", --8

"1110");--9
constant col8_dece: memoria_dece:= ("1111", --0

"1111", --1

"1111", --2

"1111", --3

"1111", --4

"1111", --5

"1111", --6

"1111", --7

"1111", --8

"1111");--9

----********************************************************----
constant col1_cent: memoria_cent:= ("1111", --0

"1111", --1

"1111", --2

"1111", --3

"1111", --4

"1111", --5

"1111", --6

"1111", --7

"1111", --8

"1111");--9
constant col2_cent: memoria_cent:= ("1001", --0

"1001", --1

"1001", --2

"0000", --3

"0110", --4

"0000", --5

"1000", --6

"0000", --7

"1001", --8
"0000");--9
constant col3_cent: memoria_cent:= ("0110", --0

"0001", --1

"0110", --2

"1110", --3

"0110", --4

"0111", --5

"0111", --6

"0100", --7

"0110", --8

"0110");--9
constant col4_cent: memoria_cent:= ("0110", --0

"1001", --1

"1110", --2

"1000", --3

"0110", --4

"0001", --5

"0001", --6

"1100", --7

"1001", --8

"0000");--9

constant col5_cent: memoria_cent:= ("0110", --0

"1001", --1

"1101", --2

"1110", --3

"0000", --4

"1100", --5

"0110", --6

"1100", --7

"0110", --8

"1110");--9
constant col6_cent: memoria_cent:= ("0110", --0
"1001", --1

"1011", --2

"0110", --3

"1110", --4

"1100", --5

"0110",--6

"1100", --7

"0110", --8

"1110");--9
constant col7_cent: memoria_cent:= ("1001", --0

"0000", --1

"0000", --2

"1001", --3

"1110", --4

"0001", --5

"1001",--6

"1100", --7

"1001", --8

"1110");--9
constant col8_cent: memoria_cent:= ("1111", --0

"1111", --1

"1111", --2

"1111", --3

"1111", --4

"1111", --5

"1111", --6

"1111", --7

"1111", --8

"1111");--9

begin
enable <= estado_enable;
process (Clk)
begin
if (rising_edge (Clk)) then

-- multiplexado
if(mux = 12000) then
mux <= 0;
if(estado_enable =
"00000001") then
estado_enable <=
"00000010";
Display_uni <= col2
(uni);
Display_dece <=
col2_dece (dece);
Display_cent <=
col2_cent (cente);
elsif(estado_enable =
"00000010") then
estado_enable <=
"00000100";
Display_uni <= col3
(uni);
Display_dece <=
col3_dece (dece);
Display_cent <=
col3_cent (cente);
elsif(estado_enable =
"00000100") then
estado_enable <=
"00001000";
Display_uni <= col4
(uni);
Display_dece <=
col4_dece (dece);
Display_cent <=
col4_cent (cente);
elsif(estado_enable =
"00001000") then
estado_enable <=
"00010000";
Display_uni <= col5
(uni);
Display_dece <=
col5_dece (dece);
Display_cent <=
col5_cent (cente);
elsif(estado_enable =
"00010000") then
estado_enable <=
"00100000";
Display_uni <= col6
(uni);
Display_dece <=
col6_dece (dece);
Display_cent <=
col6_cent (cente);
elsif(estado_enable =
"00100000") then
estado_enable <=
"01000000";
Display_uni <= col7
(uni);
Display_dece <=
col7_dece (dece);
Display_cent <=
col7_cent (cente);
elsif(estado_enable =
"01000000") then
estado_enable <=
"10000000";
Display_uni <= col8
(uni);
Display_dece <=
col8_dece (dece);
Display_cent <=
col8_cent (cente);
elsif(estado_enable =
"10000000") then
estado_enable <=
"00000001";
Display_uni <= col1
(uni);
Display_dece <=
col1_dece (dece);
Display_cent <=
col1_cent (cente);
else
estado_enable <=
"00000001";
end if;
else
mux <= mux + 1;
end if;

end if;
end process;
end Behavioral;

MODULO CONTADOR
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity contador is
Port(
--Señales de control; reset y señal de reloj.
clk: in std_logic;
reset: in std_logic;
--Push boton para el conteo.
s: in std_logic;
uni_cont: out integer;
dece_cont: out integer;
cente_cont: out integer
--Salidas para el control de los Display's.
);
end contador;

architecture Behavioral of contador is

signal temporal, cont_up: std_logic;


signal contador: integer range 0 to 6000000 := 0;
signal conteo: integer range 0 to 12000000;
signal flag: std_logic;

signal unidades: integer range 0 to 9;


signal decenas: integer range 0 to 9;
signal centenas: integer range 0 to 9;

begin
uni_cont <= unidades;
dece_cont <= decenas;
cente_cont <= centenas;
Cont_up <= temporal;
process (clk, reset) begin
if(reset = '0')then
temporal <= '0';
contador <= 0;
elsif falling_edge(clk) then
if (s <= '0') then
if (contador = 5999)then
temporal <= not(temporal);
contador <= 0;
else
contador <= contador + 1;
end if;
end if;
end if;
end process;

process(clk, reset)
begin

if(reset = '0') then

conteo <= 0;
unidades <= 0;
decenas <= 0;
centenas <= 0;

elsif(rising_edge(clk)) then

if(conteo = (5999)) then


conteo <= 0;
if(Cont_up = '0') then
flag <= '1';
end if;

if(Cont_up = '1' and flag = '1') then


flag <= '0';
if(unidades <= 8) then
unidades <= unidades + 1;
else
unidades <= 0;

if(decenas <= 8) then


decenas <= decenas +
1;
else
decenas <= 0;

if(centenas <= 8) then


centenas <=
centenas + 1;
else
unidades <=
0;
decenas <=
0;
centenas <=
0;
end if;
end if;
end if;
end if;

else
conteo <= conteo + 1;
end if;

end if;
end process;

end Behavioral;

También podría gustarte