# Very High Speed Integrated Circuit Hardware Description Language/Travail pratique/TP 3

Objectif : réaliser un échantillonnage de l'horloge PS/2 et le tester en incrémentant un compteur qui affichera le nombre de fronts d'horloge pour chaque appui de touche sur le clavier.

## Protocole PS/2

Le protocole PS/2 permet une communication synchrone, bidirectionnelle et bits en série entre un système et un périphérique (couramment clavier, souris ou touchpad de portable). Chaque côté est susceptible d'envoyer des commandes ou des données sur un fil que l’on nommera "data" dans la suite. Tout ceci est synchronisé par une horloge appelée "PS2_clk". Mais un seul côté ne pourra transmettre à la fois puisque la liaison se fait sur le seul fil "data".
C'est le système maître qui alimente le périphérique PS/2. Les signaux Data et PS2_Clk sont bidirectionnels et à sortie collecteur ouvert. Une résistance de 10K ohm environ doit être placée entre ces deux signaux et l'alimentation ce qui garantit un niveau haut hors de toute transaction.
Une bonne implantation du protocole PS/2 nécessite une machine d'état calquée sur les états du bus. Nous n'utiliserons qu'une implantation partielle du protocole PS/2 et par conséquent une machine d'états assez différente mais beaucoup plus simple.
En résumé, voici les chronogrammes temporels du protocole PS/2 lors d'une transmission d'un périphérique (ici un clavier) vers le maître (ici un PC ou un FPGA).
* Puisque c’est le clavier qui envoie de l'information, c’est lui qui réalise l'horloge appelée "PS2_clk" dans le dessin ci-dessus.
* Les données sont envoyées en commençant par le poids faible : D0 puis D1 ... puis D7.
* La transmission commence par un bit de start.
* Une fois les données sur 8 bits envoyées on a une parité et un bit de stop.

## Périphérique vers système maître

Le périphérique peut transmettre un octet vers le système à condition que le bus soit préalablement « idle ». L'octet est transmis sous forme série avec l'horloge (impulsions négatives). Le périphérique change les données sur front montant alors que le système est censé les lire pendant que CLK est à 0 (ou sur le front descendant). Nous allons réaliser une telle communication : dans ce TP ainsi que dans le suivant. Le périphérique sera un clavier.

## Travail à réaliser
### Travail corrigé

Il est risqué d’utiliser directement l'horloge fournie par le clavier pour commander notre système. En effet le signal peut comporter des aléas qui seront interprétés par le système comme des fronts et provoquer ainsi des décalages dans la réception. Pour éviter cela on échantillonne l'horloge PS/2 au rythme d'une horloge système plus rapide. Chaque échantillon est envoyé dans un registre à décalage auquel on ajoute une bascule D qui mémorise l'état dans lequel on se trouve. Le principe est simple. Si on est dans l'état 0 et que tout le registre est à un on passe à l'état un, si on est dans l'état un et que tout le registre est à 0, alors on passe dans l'état 0. Ceci peut être réalisé par le schéma ci-dessous. Pour comprendre le fonctionnement de cet anti-rebond peu conventionnel, vous pouvez résoudre cet exercice.
Programmez l’ensemble des composants ci-dessus. La sortie intéressante pour nous est la sortie Q de la bascule D(notée « Sortie » sur le schéma). Pour tester l’ensemble et son fonctionnement vous prendrez cette sortie Q comme horloge d'un compteur (avec Remise à Zéro). La sortie de ce compteur sera reliée à un afficheur sept segments du TP précédent. Si votre ensemble fonctionne correctement, chaque appui sur une touche clavier devra afficher une valeur 11 (0x0B ). Mais ce n’est pas exactement ce que vous obtiendrez (voir questions).
Voici le schéma global de ce que vous avez à réaliser.
Tous les schémas présenteront le travail à réaliser sous forme fonctionnelle (quelles sont les entrées, quelles sont les sorties ?). Le bloc à réaliser en VHDL sera toujours coloré en bleu clair.
L'entité correspondant au schéma ci-dessus est donc :
PS2_Clk_M16 correspond à l'horloge PS/2 tandis que Clk_T9 est l'horloge globale (50 Mhz) de la carte.
Les deux signaux sont ajoutés dans le fichiers ucf :
Les composants à implanter seront donc :
Pour chacun des composants on aura à réaliser une entité et une architecture. Remarquons que l'architecture de tp1 a été réalisée dans le TP n$^o$ 1.

#### Questions

Quelle valeur effective du compteur lisez-vous pour l'appui d'une touche sur le clavier ? Cela correspond-il avec la documentation du clavier qui explique que l'appui d'une touche envoie son scancode tandis que le relâchement d'une touche donne 0xF0 suivi du scancode. Que se passe-t-il si vous appuyez sur une touche flèche ?
L'appui d'une touche normale du clavier doit afficher "21" en hexadécimal, soit 33 en décimal. Comme indiqué en TP 3, cet appui correspond à un octet envoyé soit 11 fronts d'horloge, puis deux octets pour le relâchement soit en tout 33 fronts d'horloge. Les touches de flèches nous donnent un nombre hexadécimal de 37 soit un nombre décimal de 55 (envoi de 5 octets : deux pour l'appui et 3 pour le relâchement).
Voici sans autres explications la solution du TP2 :
auquel on ajoutera l'entité et l'architecture du TP1.
Et puis voici le fichier ucf maintenant :

### Travail non corrigé

Modifier l'exemple corrigé ci-dessus pour prendre en compte l’affichage sur 4 digits réalisé en fin de TP 1. Tapez un texte sur le clavier pour voir le compteur s'incrémenter petit à petit pour passer progressivement sur 2 digits puis sur trois et enfin sur quatre. Pour cela, il faudra naturellement passer le compteur sur 16 bits.
| TP 2 | TP 4 |