Repository navigation
Home

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

- Material necesario
- Conexión del teclado a la FPGA
- Probando el teclado
- Detalles del controlador de bajo nivel
- Controlador Superior
- Mapa de los códigos
- Más información
- Autor
- Licencia
- 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
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
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!

Para probar el teclado PS/2 sigue los estos pasos:
-
Conecta la Icezum Alhambra al teclado, como se ha indicado en el apartado anterior
-
Baja este circuito de ejemplo: 01-keyboard-leds.ice
-
Ábrelo en Icestudio

-
Cárgalo en la Icezum Alhambra
-
Pulsa cualquier tecla. Su código aparecerá en los leds

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
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

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)

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
Los códigos corresponientes a las teclas se muestran en este dibujo. Son los códigos en amarillo. Están en hexadecimal

Para la generación de esta documentación, me he basado en la información encontrada en estos enlaces:
-
https://github.com/OLIMEX/iCE40HX1K-EVB/blob/master/demo/ice40-io-video/example_0.v
-
http://www.eecg.toronto.edu/~jayar/ece241_08F/AudioVideoCores/ps2/ps2.html
- Juan González Gómez (Obijuan)

Creative Commons Attribution-ShareAlike 4.0 International License