Sunteți pe pagina 1din 12

INFORME 7 DE LABORATORIO ELECTRONICA DIGITAL II

APLICACIN DE LOS CIRCUITOS SECUENCIALES II


DETECCIN DE UNA CLAVE DE 4 DIGITOS

NOMBRES: ALEJANDRO RUBIO, COD: 2420121010


JULIAN ALBERTO AVILA, COD: 2420121020

PRESENTADO A: M.sc ING LUISA FERNANDA GALLO SANCHEZ

UNIVERSIDAD DE IBAGUE
FACULTAD DE INGENIERIA
INGENIERIA ELECTRONICA V SEMESTRE
IBAGUE TOLIMA
2014
OBJETIVO

Familiarizar al estudiante con el diseo de circuitos secunciales


empleando lgica Programada
Desarrollo de la prctica
Se emple un diagrama de estado de tal forma en la que se pudiese
detectar e identificar a que equivale cada pulsacin en el teclado para
poder ser visualizada en el display 7:
library IEEE;
use IEEE.std_logic_1164.all;
entity teclado is
port (clr, clk: in std_logic;
x:
in bit_vector(2
downto 0);
palabra: out
bit_vector(3 downto 0);
--Palabra: para detectar la
tecla que se esta presionada
display: out bit_vector(3
downto 0);--Salida del display
(BCD)
entrada: in
STD_LOGIC;
salida : out
STD_LOGIC);
end teclado;
architecture tec of teclado is
type estado is (A,B,C,D,E);-Estados
signal h: estado;
signal temporal: STD_LOGIC;
signal contador: integer
range 0 to 124999 := 0;
begin
process(clr,clk,entrada)
begin
if (clr = '1') then
temporal <= '0';
contador <= 0;

elsif
rising_edge(entrada) then
if (contador =
124999) then
temporal <=
NOT(temporal);
contador <= 0;
else
contador <=
contador+1;
end if;
end if;
salida <=
temporal;
if clr='1' then -- Clear
Asincrono
h<=A;
display<="1111";
elsif clk'event and
clk='1'then --Deteccion del
flanco
case h is
when A =>
h<=B;
palabra<="1000";
display<="1111";--Cambio
de palabra y no hay salida en
el display
when B =>
if x="000" then
h<=C;
palabra<="0100"; --Cambio
de palabra
elsif x="001" then

h<=B;
display<="0011";
elsif x="010" then
h<=B;
display<="0010";
elsif x="100" then
h<=B;
display<="0001";
end if;
when C =>
if x="000" then
h<=D;
palabra<="0010"; --Cambio
de palabra
elsif x="001" then
h<=C;
display<="0110";
elsif x="010" then
h<=C;
display<="0101";
elsif x="100" then
h<=C;
display<="0100";
end if;
when D=>
if x="000" then
h<=E;
palabra<="0001"; --Cambio
de palabra
elsif x="001" then
h<=D;
display<="1001";

elsif x="010" then


h<=D;
display<="1000";
elsif x="100" then
h<=D;
display<="0111";
end if;
when E =>
if x="000" then
h<=B;
palabra<="1000"; --Cambio
de palabra
elsif x="001" then
--Tecla #,
h<=E;
display<="1011";
elsif x="010" then
h<=E;
display<="0000";
elsif x="100" then
h<=E;
display<="1010"; -- Tecla *
end if;

when others => null;


end case;
end if;
end process;
end tec;

Y luego se aplic para comparar la tecla seleccionada con la clave


asignada: (1010)
library IEEE;
Use IEEE.std_logic_arith.all;
use
IEEE.STD_LOGIC_1164.ALL;
use
IEEE.STD_logic_unsigned.All;

use
IEEE.STD_logic_unsigned.All;
entity clave is port

(fila: inout bit_vector(0 to


3);
rst: in std_logic;
clk: in std_logic;
aux: inout std_logic;
colum: in bit_vector(0 to
3);
bcd: out
std_logic_vector(0 to 3);
conta: inout
std_logic_vector(0 to 3);
leds: inout
std_logic_vector(0 to 7));
end clave;
architecture nose of calve is
SIGNAL dat1 : integer;
SIGNAL dat2 : integer;
SIGNAL dat3 : integer;
SIGNAL dat4 : integer;
signal count: integer range 0
to 9999;
signal contaerror: integer;
begin
process (rst,clk)
begin
IF (rst = '0') THEN
bcd<="0000";
conta<="0000";
leds <= "11111111";
dat1<=0;
dat2<=0;
dat3<=0;
dat4<=0;
aux<='0';
co<=0;
error<=0;
elsif (clk'event AND clk='1')
THEN
if co = 9999 then
count <= 0;

else co <= count+1;


end if;
IF (count = 9999) THEN
if (fila="0000") then
fila<= "1000";
elsif (fila="1000") then
if (colum="1000") then
bcd<= "0001";
if(conta="0011" and
oprimio='0') then
leds <= "11110000";
oprimio <= '1';
conta<="1000";
mem4<= 1;
elsif(conta="0010" and
oprimio='0') then
leds <= "11111000";
conta<= "0011";
oprimio <= '1';
mem3<= 1;
elsif(conta="0001" and
oprimio='0') then
leds <= "11111100";
conta<= "0010";
oprimio <= '1';
mem2<= 1;
elsif(conta="0000" and
oprimio='0') then
leds <= "11111110";
mem1<= 1;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0100") then
bcd<= "0010";
if(conta="0011" and
oprimio='0') then -pregunta por contador

leds <= "11110000";


oprimio <= '1';
conta<="1000";
mem4<= 2;
-ALMACENA MEMORIA 4 UN 2
elsif(conta="0010" and
oprimio='0') then -pregunta por contador
leds <= "11111000";
conta<= "0011";
oprimio <= '1';
mem3<= 2;
elsif(conta="0001" and
oprimio='0') then -pregunta por contador
leds <= "11111100";
conta<= "0010";
oprimio <= '1';
mem2<= 2;
elsif(conta="0000" and
oprimio='0') then -pregunta por contador
leds <= "11111110";
mem1<= 2;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0010") then -se oprimio 3
bcd<= "0011";
if(conta="0011" and
oprimio='0') then -pregunta por contador
leds <= "11110000";
oprimio <= '1';
conta<="1000";
mem4<= 3;
elsif(conta="0010" and
oprimio='0') then -pregunta por contador
leds <= "11111000";
conta<= "0011";

oprimio <= '1';


mem3<= 3;
elsif(conta="0001" and
oprimio='0') then -pregunta por contador
leds <= "11111100";
conta<= "0010";
oprimio <= '1';
mem2<= 3;
elsif(conta="0000" and
oprimio='0') then -pregunta por contador
leds <= "11111110";
mem1<= 3;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0001") then -if(dat1=1) then
-- 1010
if(dat2=0) then
if(dat3=1) then
if(dat4=0) then
leds(0)<='0';
-else
if(contaerror<2) then
-bcd<="0000";
conta<="0000";
leds <= "11111111";
dat1<=0;
dat2<=0;
dat3<=0;
dat4<=0;
oprimio<='0';
count<=0;
contaerror<=contaerror+1;
end if;
end if;
else
if(contaerror<2) then
--

bcd<="0000";
conta<="0000";
leds <= "11111111";
mem1<=0;
mem2<=0;
mem3<=0;
mem4<=0;
oprimio<='0';
count<=0;
contaerror<=contaerror+1;
end if;
end if;
else
if(contaerror<2) then
bcd<="0000";
conta<="0000";
leds <= "11111111";
mem1<=0;
mem2<=0;
mem3<=0;
mem4<=0;
oprimio<='0';
count<=0;
contaerror<=contaerror+1;
end if;
end if;
else
if(contaerror<2) then
bcd<="0000";
conta<="0000";
leds <= "11111111";
mem1<=0;
mem2<=0;
mem3<=0;
mem4<=0;
oprimio<='0';
count<=0;
contaerror<=contaerror+1;
end if;
end if;
elsif (colum="0000") then -no se oprimio nada en
col=1000
bcd<= "0000";

fila<= "0100";
end if;
elsif(fila= "0100") then
if (colum="1000") then -PREGUNTA COLUMNAS
bcd<= "0100";
if(conta="0011" and
oprimio='0') then -pregunta por contador
leds <= "11110000";
oprimio <= '1';
conta<="1000";
mem4<= 4;
elsif(conta="0010" and
oprimio='0') then -pregunta por contador
leds <= "11111000";
conta<= "0011";
oprimio <= '1';
mem3<= 4;
elsif(conta="0001" and
oprimio='0') then -pregunta por contador
leds <= "11111100";
conta<= "0010";
oprimio <= '1';
mem2<= 4;
elsif(conta="0000" and
oprimio='0') then -pregunta por contador
leds <= "11111110";
mem1<= 4;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0100") then -se oprimio 5
bcd<= "0101";

if(conta="0011" and
oprimio='0') then -pregunta por contador
leds <= "11110000";
oprimio <= '1';
conta<="1000";
mem4<= 5;
elsif(conta="0010" and
oprimio='0') then -pregunta por contador
leds <= "11111000";
conta<= "0011";
oprimio <= '1';
mem3<= 5;
elsif(conta="0001" and
oprimio='0') then -pregunta por contador
leds <= "11111100";
conta<= "0010";
oprimio <= '1';
mem2<= 5;
elsif(conta="0000" and
oprimio='0') then -pregunta por contador
leds <= "11111110";
mem1<= 5;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0010") then -se oprimio 6
bcd<= "0110";
if(conta="0011" and
oprimio='0') then -pregunta por contador
leds <= "11110000";
oprimio <= '1';
conta<="1000";
mem4<= 6;
elsif(conta="0010" and
oprimio='0') then -pregunta por contador

leds <= "11111000";


conta<= "0011";
oprimio <= '1';
mem3<= 6;
elsif(conta="0001" and
oprimio='0') then -pregunta por contador
leds <= "11111100";
conta<= "0010";
oprimio <= '1';
mem2<= 6;
elsif(conta="0000" and
oprimio='0') then -pregunta por contador
leds <= "11111110";
mem1<= 6;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0000") then -no se oprimio nada
bcd<= "0000";
fila<= "0010";
end if;
elsif(fila= "0010") then
if (colum="1000") then -- se
oprimio 7
bcd<= "0111";
if(conta="0011" and
oprimio='0') then -pregunta por contador
leds <= "11110000";
oprimio <= '1';
conta<="1000";
mem4<= 7;
elsif(conta="0010" and
oprimio='0') then -pregunta por contador
leds <= "11111000";
conta<= "0011";
oprimio <= '1';
mem3<= 7;

elsif(conta="0001" and
oprimio='0') then -pregunta por contador
leds <= "11111100";
conta<= "0010";
oprimio <= '1';
mem2<= 7;
elsif(conta="0000" and
oprimio='0') then -pregunta por contador
leds <= "11111110";
mem1<= 7;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0100") then -se oprimio 8
bcd<= "1000";
if(conta="0011" and
oprimio='0') then -pregunta por contador
leds <= "11110000";
oprimio <= '1';
conta<="1000";
mem4<= 8;
elsif(conta="0010" and
oprimio='0') then -pregunta por contador
leds <= "11111000";
conta<= "0011";
oprimio <= '1';
mem3<= 8;
elsif(conta="0001" and
oprimio='0') then -pregunta por contador
leds <= "11111100";
conta<= "0010";
oprimio <= '1';
mem2<= 8;
elsif(conta="0000" and
oprimio='0') then -pregunta por contador

leds <= "11111110";


mem1<= 8;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0010") then -se oprimio 9
bcd<= "1001";
if(conta="0011" and
oprimio='0') then -pregunta por contador
leds <= "11110000";
oprimio <= '1';
conta<="1000";
mem4<= 9;
elsif(conta="0010" and
oprimio='0') then -pregunta por contador
leds <= "11111000";
conta<= "0011";
oprimio <= '1';
mem3<= 9;
elsif(conta="0001" and
oprimio='0') then -pregunta por contador
leds <= "11111100";
conta<= "0010";
oprimio <= '1';
mem2<= 9;
elsif(conta="0000" and
oprimio='0') then -pregunta por contador
leds <= "11111110";
mem1<= 9;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0000") then -no se oprimio nada
bcd<= "0000";
fila<= "0001";
end if;

elsif(fila= "0001") then


if (colum="0100") then -- se
oprimio 0
bcd<= "0000";
if(conta="0011" and
oprimio='0') then -pregunta por contador
leds <= "11110000";
oprimio <= '1';
conta<="1000";
mem4<= 0;
elsif(conta="0010" and
oprimio='0') then -pregunta por contador
leds <= "11111000";
conta<= "0011";
oprimio <= '1';
mem3<= 0;
elsif(conta="0001" and
oprimio='0') then -pregunta por contador
leds <= "11111100";
conta<= "0010";

oprimio <= '1';


mem2<= 0;
elsif(conta="0000" and
oprimio='0') then -pregunta por contador
leds <= "11111110";
mem1<= 0;
oprimio <= '1';
conta<= "0001";
end if;
elsif (colum="0000") then -no se oprimio nada
bcd<= "0000";
oprimio <= '0';
fila<= "1000";
end if;
else
fila<= "1000";
end if;
end
end
end
end

if;
if;
process;
nose;

Se debe conocer y tener claro el orden de los pines que corresponden


a las filas y las columnas para el correcto funcionamiento del teclado

CONCLUSIONES

Para reconocer el botn pulsado se envi un vector explorador por las


columnas del teclado; para mantener los nivele lgicos, se usaron
resistencias en las columnas y con respecto a esto, se lean la respuesta en
las filas en un vector de entrada de datos.

Usando el reloj interno de la CYCLONE, se logr crear un divisor de frecuencia


mediante la programacin de tal forma que al pulsar una tecla, sea muy
rpido o lento la deteccin del reconocimiento de una tecla, dependiendo de
la frecuencia programada, en nuestro caso, se detectaban muy rpido
cuando se opriman las teclas, entonces no podamos escribir correctamente
la clave, por ende bajamos la frecuencia de los pulsos del reloj para que
detectara con mayor precisin cuando se oprimiera una tecla y mejorar la
respuesta en la captura de la clave.

Se usaron variables de entrada y salida, como contadores en el cdigo para


controlar cuantas veces se reciba la deteccin de una tecla, pero estas no
fueron usadas en la asignacin de pines, puesto que se usaba como proceso
interno del cdigo.

S-ar putea să vă placă și