Skip to content
Juan Gonzalez-Gomez edited this page Sep 25, 2017 · 13 revisions

Controlador de teclado PS/2 para FPGAs

Controlador de teclado PS/2 para FPGAs libres. Usa tu teclado viejo para controlar tus circuitos

En esta animación se puede ver el controlador en una Icezum Alhambra, al que se le ha conectado un teclado PS/2. Con las teclas 1,2,3 y 4 se cambia de estado los leds

Contenido

Material necesario

  • 2 resistencias de 330ohm
  • 1 Conector hembra PS/2 para circuito impreso
  • 1 Teclado PS/2
  • 1 Tarjeta Icezum Alhambra o placa con FPGA libre compatible

Conexión del teclado a la FPGA

Los teclados PS/2 tienen un conector Mini-DIN macho de 6 pines

De todos ellos, sólo se usan 4:

  • VCC: Alimentación del teclado (5v)
  • GND
  • Data: Salida serie de datos
  • CLK: Señal de reloj para los datos

La disposición de los pines en el conector macho es:

El esquema de conexionado para una tarjeta icezum alhambra es el siguiente. Se han utilizado los pines D0 y D1 para las señales de CLK y DATA respectivamente, pero se podrían emplear cualquier otros (desde D0 hasta D13)

Para el conexionado hay dos opciones:

  • Utilizar cables hembra-hembra, macho-hembra y una placa entrenadora.
  • Hacer una placa propia, soldando los conectores y las resistencias

Conexionado con placa propia

Para conectar fácilmente el teclado a la Icezum Alhambra, podemos utilizar una placa nuestra con los componentes soldados

La lista de materiales son:

  • 2 resistencias de 330 ohm
  • 1 conector macho de 4 pines
  • 1 conector hembra de PS/2 para circuito impreso

La placa tiene las 4 señales accesibles desde los pines 4 macho

Inicialmente tenía colocadas resistencias de 1K, sin embargo, dieron problemas con los conversores de nivel de la Icezum Alhambra, por lo que corté las patas por arriba y soldé las nuevas de 330 ohm. La placa es un poco chapucera, pero hace su función :-)

Esta es la vista inferior

Y la conectamos a la Icezum Alhambra por medio de cables hembra-hembra. Luego enchufamos el teclado y ... ¡Ya estamos listos!

Probando el teclado

Para probar el teclado PS/2 sigue los estos pasos:

  1. Conecta la Icezum Alhambra al teclado, como se ha indicado en el apartado anterior

  2. Baja este circuito de ejemplo: 01-keyboard-leds.ice

  3. Ábrelo en Icestudio

  1. Cárgalo en la Icezum Alhambra

  2. Pulsa cualquier tecla. Su código aparecerá en los leds

Detalles del controlador PS/2 de bajo nivel

La comunicación con el Teclado es de tipo serie síncrona. El teclado envía los datos se envían por la señal de DATA, y el reloj por CLK. Los datos están disponibles para su lectura en el flanco de bajada de CLK

Los datos se envían en tramas de 11 bits, con esta estructura: (Start)(datos)(Paridad)(Stop) donde:

  • START: 1 Bit de start (Es siempre 0)
  • DATOS: 8 bits. Llega primero el bit menos significativo
  • PARIDAD: 1 bit de paridad
  • STOP: 1 bit de stop (siempre 1)

El el esquema del controlador se muestra a continuación:

Está formado por un registro de desplazamiento de 10 bits, que está dividido en 2: uno de 2 bits y otro de 8 bits. Los datos llegan en serie y van entrando en el registro. Al cabo de 11 pulsos de reloj de PS2_CLK, en el registro de 8 bits tendremos el dato, y en el de 2 bits los bits de paridad y stop (el último en llegar). El bit de start no se almacena

Tanto la señal de reloj como la de datos se pasan por 2 biestables D para que se sincronicen con el reloj interno (es un requerimiento de las reglas de diseño síncrono)

La señal de reloj del PS/2 se invierte (porque es activa en flanco de bajada) y los flancos se convierten en pulsos, que se usan como señal de temporización del desplazamiento y de incremento del contador de 11 bits. Este contador, que es módulo 11, emite un pulso cuando han llegado 11 flanco de subida del reloj, y por tanto, cada vez que se ha recibido un dato de 8 bits

Este controlador de bajo nivel nos devuelve un dato de 8 bits y un pulso indicando que está el dato listo

Enviado códigos por el puerto serie

Al apretar una tecla normal, el teclado envía su **código de 8 ***. Al soltarla envía primero el dato F0 y luego el código de la tecla. Mediante este ejemplo hacemos que todos los códigos recibidos se envíen por el puerto serie y se vean en el terminal serie

Ahora, si apretamos y soltamos la tecla a, veremos que se reciben los bytes 1C F0 1C en el terminal de comunicaciones

Controlador superior

El teclado nos envía varios bytes, según la tecla pulsada y si la hemos apretado o soltado. Además, para ampliar el número de teclas, algunas teclas envían primero el código E0 para indicar que es un código extendido, y a continuación el código de la tecla

Por ello, necesitamos un controlador superior que gestione todos los posibles casos. La interfaz de este controlador es:

  • Entradas: Las señales del PS/2: DATA y CLK

  • Salidas

    • make: Pulso que indica si se ha apretado una tecla
    • break: Pulso que indica que una tecla se ha soltado
    • code: Código de 8 bits de la tecla pulsada o soltada

    En el ejemplo 05-keyboard-break-LEDs se captura en un registro el código de las teclas pulsadas, y se muestra por los leds

Si en vez de la señal make, usamos break, se captura el código en el momento de liberar la tecla

Finalmente, el circuito 09-key-leds-2.ice se muestra un ejemplo de un circuito que cambia el estado de los leds del 0 a 3 al pulsar las teclas 1,2,3 ó 4 (y sólo esas)

https://github.com/Obijuan/PS2-KeyBoard-FPGA/raw/master/ps2-keyb-collection/examples/09-key-leds-2.ice

Su funcioamiento se puede ver en la animación de portada de esta documentación

El código leido por el controlador de alto nivel, se envía al bus donde están conectados los ****4 bloques de detección de la tecla. Cada uno de ellos tiene un comparador con el código correspondiete de la tecla. Si lo que se recibe es igual a la tecla esperada, se envía un pulso por su salida

Este pulso se lleva a un biestable T para que cambie su estado, y se muestre por el correspondiente led

Mapa de códigos

Los códigos corresponientes a las teclas se muestran en este dibujo. Son los códigos en amarillo. Están en hexadecimal

Más información

Para la generación de esta documentación, me he basado en la información encontrada en estos enlaces:

Autor

Licencia


Creative Commons Attribution-ShareAlike 4.0 International License