You are on page 1of 8

Instituto Politécnico Nacional

UPIIZ

Ing. Mecatrónica

Dispositivos Lógicos Programables

Reporte de Practica #6

Jaime de Jesús Vázquez Arvilla.

09/03/2015
1. Objetivo

de paridad y de fin. 3. c) Realizar un programa en el que al pulsar una tecla nos proporcione su Scancode (que aparecen en la siguiente figura) por el display de 7 segmentos. 8 bits de datos (primero el lsb). A continuación coloca los bits de datos. como se ha comentado anteriormente. 2. de esta manera se indica que se va a comenzar. En concreto estudiar su implementación para un teclado PS2. se mantiene a ‘1’ cuando está inactivo.El objetivo de la siguiente práctica es comprender el funcionamiento del puerto PS/2. Desarrollo a) Estudiar el protocolo de comunicación con el puerto PS2. Comprobar que la línea de datos y el reloj está a ‘1’ 2. Coloca en la línea de datos el bit start (‘0’). . El teclado comienza una transmisión realizando el siguiente protocolo: 1. y su formato es: 1bit de star(‘0’). b) Conectar un teclado PS2 a la basys 2. A los 5-25us el teclado pone la línea del reloj a ‘0’ 4. El bit de paridad impar estará a ‘1’ cuando haya un número par de unos en los 8 bits de datos. para teclado usando la tarjeta de desarrollo Basys2. La línea de datos. es decir. de esta manera se pueden detectar algunos errores. de manera que los ocho bits de datos más el de paridad deberá ser siempre un número impar de unos. Los datos pueden ser generados por el dispositivo o por el sistema. 2. no hay transmisión. CLK para transmitir el reloj de sincronización. Usa dos líneas a colector abierto con resistencias de “pullup” TTL +5V (por defecto a uno) 1. 1 bit deparidad impar.7KHz (aunque puede ser forzado a ‘0’ por el sistema. El reloj siempre debe ser generado por el dispositivo con una frecuencia entre 10 y 16. indicando con el flanco de bajada del reloj cuando se deben leer. Un teclado o ratón del tipo AT-PS/2 utiliza parta comunicarse un protocolo bidireccional serie síncrono de 11 bits. 1 bit de stop(’1’). DATA para transmitir los datos serie.

5. Para enviar una nueva trama. Imagen 1. Imagen 1.0: Transmisión de datos. #Main clock 50 MHz . después del bit de fin de la trama anterior. se inicia el protocolo de nuevo.  A continuación se muestra su archivo ucf: NET "clk" LOC = "T9" .1: Pines de conexion.

"J12".--guarda el dato temporalmente signal z: STD_LOGIC_VECTOR(3 downto 0). NET "clk_t" CLOCK_DEDICATED_ROUTE = FALSE.--relog del teclado reset : in STD_LOGIC.numeric_std.all. NET "dat_t" LOC = "M15" . NET NET NET NET "an<0>" "an<1>" "an<2>" "an<3>" LOC LOC LOC LOC = = = = "F12".--dato del teclado dato : out STD_LOGIC_VECTOR (7 downto 0)).all. NET NET NET NET NET NET NET "led<6>" "led<5>" "led<4>" "led<3>" "led<2>" "led<1>" "led<0>" LOC LOC LOC LOC LOC LOC LOC = = = = = = = "L14".--contador 2 begin --Contador process (kbclk) begin if reset='1' then cont0 <= (others => '0'). "K14". "L13".--contador 1 signal dato0: std_logic_vector(10 downto 0). architecture Behavioral of lectura is signal bit_inicio: std_logic. "M12". NET "clk_t" LOC = "M16" . "N14". use IEEE. entity lectura is Port ( kbclk : in STD_LOGIC. una lectura de datos de teclado.--condicion de captura signal cont0: std_logic_vector(3 downto 0). "M13". use IEEE.all. "P12".--reset kbdat : in STD_LOGIC.std_logic_unsigned. "H12".std_logic_1164.NET "reset" LOC ="L14". .--dato de salida end lectura.  Esta implementación se hizo instanciando componentes que fue un divisor de frecuencia. y un decodificador a continuación se muestran: Lectura de datos del teclado: library IEEE. use IEEE. "N11".

end if. --capturando datos--------------------------------------process (kbclk. . end process.kbdat) begin if z = 0 then dato0 <="00000000000". Decodificador: library IEEE.cont0) begin if reset='1' then dato0 <="00000000000". elsif z = 7 then dato0(4) <=kbdat.bit_inicio) begin if reset ='1' then dato0 <="00000000000". end if. elsif z = 4 then dato0(7) <=kbdat. elsif z = 3 then dato0(8) <=kbdat. end process. bit_inicio <= '0'. elsif z = 2 then dato0(9) <=kbdat. elsif z = 6 then dato0(5) <=kbdat.reset. elsif z = 8 then dato0(3) <=kbdat. if cont0 = 13 then cont0 <= (others => '0'). if z = 8 then z<=(others => '0'). elsif kbclk'event and kbclk='0' and cont0 > 0 then bit_inicio <= '1'. end Behavioral.cont0.elsif kbclk='0' and kbclk'event then cont0<=cont0+1. elsif kbclk'event and kbclk = '0' and cont0 > 1 and bit_inicio = '1' then z<=z+1. dato<=dato0(10 downto 3). z <= (others => '0'). --empezar deteccion------------------------------------process (kbclk. use IEEE. elsif z = 1 then dato0(10) <=kbdat. process (z. end if. end process.STD_LOGIC_1164. end if. elsif z = 5 then dato0(6) <=kbdat.ALL. end if. end process. end if.

end CLK_CONT.display RAYA CENTRAL end Behavioral. --4 "0010010" when "0101". --9 "0001000" when "1010".ALL. --E "0111111" when others. end if. use IEEE. with nibble0 select segmentos_s <= "1000000" when "0000". . --2 "0110000" when "0011". if contador=50000 then flag<=not flag.ALL. -.STD_LOGIC_UNSIGNED. architecture Behavioral of decod_7 is signal nibble0 : std_logic_vector (3 downto 0). --d "0000110" when "1110". -. begin nibble0 <= key_e(3 downto 0). --C "0100001" when "1101". --8 "0011000" when "1001".ALL. --5 "0000011" when "0110". use IEEE. end if. CLK_CONTROL <=flag.STD_LOGIC_1164. --3 "0011001" when "0100". --6 "1111000" when "0111".STD_LOGIC_1164.Reloj de entrada a la FPGA CLK_CONTROL : out STD_LOGIC). use IEEE. end process. --1 "0100100" when "0010". use IEEE.ALL. contador<=(others=>'0'). --A "0000011" when "1011". Divisor de frecuencia: library IEEE. --0 "1111001" when "0001".entity decod_7 is Port ( key_e : in STD_LOGIC_VECTOR (3 downto 0).ALL. --7 "0000000" when "1000". begin PROC_CONT : process (CLK) begin if CLK'event and CLK='1' then contador<=contador + '1'. use IEEE.STD_LOGIC_ARITH. entity CLK_CONT is port (CLK : in STD_LOGIC. end CLK_CONT. Programa principal: library IEEE. signal flag : STD_LOGIC. --b "0100111" when "1100". end decod_7. segmentos_s : out STD_LOGIC_VECTOR (6 downto 0)).STD_LOGIC_ARITH. architecture CLK_CONT of CLK_CONT is signal contador : STD_LOGIC_VECTOR (31 downto 0).

----------------------------------------------begin U01 : CLK_CONT port map ( CLK => CLK_T. end pro_a. end component. end component. led : out STD_LOGIC_VECTOR (6 downto 0). end component. U04 : decod_7 port map ( key_e => SAL0(7 downto 4). reset => reset. U05 : decod_7 port map ( --SALIDA1 . CLK_CONTROL : out STD_LOGIC). signal LED0: STD_LOGIC_VECTOR (6 downto 0). clk_t : in STD_LOGIC.ALL. --------------------------------------------------------------------------------------------component lectura is Port ( kbclk : in STD_LOGIC.use IEEE. U02 : lectura port map ( kbclk => clk_t. reset : in STD_LOGIC. ----------------------------------------------component decod_7 is Port ( key_e : in STD_LOGIC_VECTOR (3 downto 0).STD_LOGIC_UNSIGNED. signal LED1: STD_LOGIC_VECTOR (6 downto 0). architecture Behavioral of pro_a is ----------------------------------------------component CLK_CONT is port (CLK : in STD_LOGIC. segmentos_s=> LED1 ). an : out STD_LOGIC_VECTOR (3 downto 0)). CLK_CONTROL=> CLK_CONTROLO --RELOG PARA EL CONTROL ).--relog del teclado reset : in STD_LOGIC.--reset kbdat : in STD_LOGIC. dato => SAL0 ). kbdat => dat_t. ----------------------------------------------signal CLK_CONTROLO: STD_LOGIC. entity pro_a is Port ( clk : in STD_LOGIC. segmentos_s : out STD_LOGIC_VECTOR (6 downto 0)). signal SAL0: STD_LOGIC_VECTOR (7 downto 0). dat_t : in STD_LOGIC.--dato del teclado dato : out STD_LOGIC_VECTOR (7 downto 0)). signal C : STD_LOGIC_VECTOR(1 downto 0).

key_e => SAL0(3 downto 0). led <= "0000000". when "01" => an <= "1101". . when others => an <= "1111". end case. usando el teclado.LED0. end Behavioral.C. end if. El protocolo de comunicación mencionado anteriormente. when "10" => an <= "1011". led <= LED0. when "11" => an <= "0111". Conclusiones En esta práctica se comprendió el funcionamiento del puerto ps2. end process. segmentos_s=> LED0 ). led <= "0000001". case C is when "00" => an <= "1110". led <= LED1. 3. --SALIDA0 process(CLK_CONTROLO.LED1) begin if CLK_CONTROLO'event and CLK_CONTROLO='1' then C <= C + 1. de la tarjeta de desarrollo basys2. led <= "0000001".