Você está na página 1de 4

Prática nº

Universidade Federal do Ceará


Departamento de Engenharia Elétrica
Técnicas Avançadas em Eletrônica Digital
Professores: Paulo Praça
Semestre 2016.2
04
Teclado PS/2
Objetivos:

• Implementar a leitura de um teclado PS/2 em FPGA;


• Criação de blocos de programas em VHDL para leitura de teclado e
display de 7segmentos.

Informações Teóricas:

Os teclados mais novos são compostos por 102 teclas, com um conjunto de
comandos próprios e teclas de funções alinhadas. O teclado IBM, padrão
mais utilizado atualmente, gera um código especial chamado scancode,
formado por um byte representado, geralmente, em hexadecimal, ao
hospedeiro a cada vez que uma tecla é pressionada. Quando uma tecla é
solta, é gerado um break-code, geralmente diferente do scancode inicial da
ação de pressionar (make). Na figura 1 é apresentada uma relação das
principais teclas com seus respectivos códigos.

Figura 1 – Scancodes em um teclado padrão internacional de 102 teclas.


O teclado PS/2 comunica-se através de um conector tipo mini-DIN de 6
pinos (macho na extremidade do fio do teclado). A figura 2 mostra esse
conector com seus pinos referenciados.
ENTRADAS

5 – CLOCK DO 6 – RESERVADO
TECLADO
5. 4 – 5Vcc
3 – TERRA

1 – DADOS DO 2 – RESERVADO
TECLADO

Figura 02 - Conector PS/2 tipo mini-DIN de 6 pinos.

No FPGA configuramos os sinais do conector PS2_DAT e PS2_CLK nos


pinos PIN_J14 e PIN_H15, respectivamente. O esquemático do circuito
pode ser visto na Figura 3.

Figura 3 – Esquemático do circuito do conector PS/2 no FPGA.

Para a transferência completa de um dado (byte), temos um total de 11 bits,


sendo passados um a um, representados por 1 Start bit, 8 bits de dados, 1
bit de paridade (impar) e 1 Stop bit, respectivamente, conforme indicado na
figura 3.4. Enquanto não há atividade na comunicação serial do teclado, o
sinal de clock (PS/2_CLK) e de dados (PS/2_DAT) permanecem em nível
alto. Os dados são lidos na borda de descida do clock, a partir do Start Bit
que deve ser obrigatoriamente zero (nível lógico baixo).
Figura 4 – Diagrama de tempo da transmissão de um dado.

Procedimentos:

O módulo dispõe de uma entrada para teclado PS/2. Digite o código


abaixo para a recepção dos dados provenientes do teclado PS/2 e
copile. Plugue o teclado no modulo do kit e continue a pratica.
OBS: Não é necessário digitar os comentários das linhas.

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY teclado IS
PORT ( rst : IN STD_LOGIC; -- Sinal de Reset
clock_tec : IN STD_LOGIC; -- Sinal de Clock do Teclado
dados_tec : IN STD_LOGIC; -- Sinal de Dados do Teclado
scan_code: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); -- Valor Lido (Tabela ScanCode)
END teclado;

ARCHITECTURE leitura OF teclado IS

SIGNAL contador : NATURAL RANGE 0 TO 32 := 0; -- Nº de bits lidos na AÇÃO COMPLETA


SIGNAL byte : STD_LOGIC_VECTOR (7 DOWNTO 0); -- ScanCode enviado pelo teclado

BEGIN
ler_scancodes: PROCESS (clock_tec, rst) -- Processo que lê scancode do teclado quando pressionado
BEGIN

IF (rst = '0') THEN -- Se o reset for pressionado, zerá tudo.


contador <= 0;
scan_code <= "00000000";
ELSIF ((clock_tec'EVENT) AND (clock_tec = '0')) THEN -- Os dados são lidos na borda de descida.
contador <= contador + 1; -- Incremento inicial do contador (START Bit)

-- Inicio da transferência, bit a bit, de dados do teclado:

CASE contador IS
WHEN 0 => null; -- START Bit ('0').

WHEN 1 TO 8 => -- Primeiros 8 bits da palavra de dados


contador <= contador + 1; -- Contador é incrementado em 1, e
byte(contador - 1) <= dados_tec; -- byte vai recebendo os dados do teclado

WHEN 9 => -- Bit de Paridade ('1').


contador <= contador + 1; -- Contador é incrementado em 1, e
scan_code <= byte; -- scan_code recebe o byte completo (Dados).

WHEN 10 =>
IF (dados_tec = '1') THEN -- Se STOP Bit é igual a '1'
contador <= contador + 1; -- Contador é incrementado em 1.
ELSE null; -- Caso contrário não é o bit de parada
END IF;

WHEN 11 => -- Fim da transmissão da ação de PRESSIONAR TECLA


IF (dados_tec = '0') THEN -- Teclado deve gerar um pulso igual a '0'(ACK)
contador <= contador + 1; -- Contador incrementa 1.
ELSE null;
END IF;

WHEN 12 TO 20 => -- Intervalo de pulsos para uma nova palavra.


contador <= contador + 1; -- Apenas é incrementado o contador.

WHEN 21 =>
IF (dados_tec = '1') THEN -- Fim do intervalo de 10 bits.
contador <= contador +1;
ELSE null;
END IF;

WHEN 22 =>
IF (dados_tec = '0') THEN -- START Bit, da ação de SOLTAR TECLA
contador <= contador + 1;
ELSE null;
END IF;

WHEN 23 TO 31 => -- bits gerados na ação de SOLTAR TECLA (não interessa)


contador <= contador + 1;

WHEN 32 =>
IF (dados_tec = '1') THEN -- STOP Bit, da ação de SOLTAR TECLA
contador <= 0; -- Reinicia o contador.
ELSE null;
END IF;’
END CASE;

END IF;

END PROCESS ler_scancodes;


END leitura;

2) Com base na figura abaixo, desenvolva um código VHDL para o bloco


“converter_codigo” que receba o scan_code proveniente do programa
implementado anteriormente no bloco “teclado” e mostre nos displays de 7
segmentos do kit o valor em HEXA da tecla pressionada no teclado PS/2.

Figura 5 – Diagrama de Blocos da Leitura do Teclado.

Você também pode gostar