Very High Speed Integrated Circuit Hardware Description Language/Exercices/TP 2
Une page de Wikiversité.
| Exercice 2 | |||
| Leçon : Very High Speed Integrated Circuit Hardware Description Language | |||
|---|---|---|---|
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.
Sommaire |
[modifier] 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 mais un seul côté ne pourra transmettre à la fois puisque la liaison se fait sur un seul fil.
C'est le système maître qui alimente le périphérique PS/2. Les signaux Data et 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.
Les octets de commandes et messages sont transmis de façon synchrone et série sur 11 bits ( les 8 bits à transmettre, poids faible en premier, précédés d'un bit start (0) et suivi d'un bit de parité et d'un bit stop (1). Le bit de parité impaire vaut 1 si le nombre total de 1 dans l'octet et le bit de parité lui même est impair. Durant la transmission, c'est le périphérique qui fournit l'horloge en la positionnant à un niveau bas (front descendant) tandis que l'émetteur (système ou périphérique) place data à un niveau bas pour un bit 0 ou le laisse inactif pour un bit 1. La fréquence d'horloge est au maximum de 33 kHz mais le plus couramment de 15 kHz. Entre les transmissions, le bus peut être :
- Idle : CLK et DATA sont tous les deux au niveau haut . Il n y a pas d'activité.
- Inhibit : Le système maintient CLK au niveau bas.
- Request to send : Le maître maintient DATA au niveau bas mais laisse CLK flotter. Il est prêt à émettre.
Une bonne implantation du protocole PS/2 nécessite une machine d'état calquée sur ces états du bus. Nous n'utiliserons qu'une implantation partielle du protocole PS/2 et par conséquent une machine d'état assez différente et beaucoup plus simple.
[modifier] 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 quivant. Le périphérique sera un clavier.
[modifier] Travail à réaliser
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 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.
L'entité correspondant au schéma est donc :
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity tp2 is port( PS2_Clk_M16, Clk_T9, reset_L14 : in std_logic; sorties_aff : out std_logic_vector(6 downto 0); aff : out std_logic_vector(3 downto 0)); end tp2;
PS2_Clk_M16 correspond à l'horloge PS/2 tandis que Clk_T9 est l'horloge globale (50 MHz) de la carte.
Les composants à implanter seront donc :
component Counter8 port(horloge,reset : in std_logic; q : buffer std_logic_vector(7 downto 0)); end component; component ShiftReg port(clk,entree : in std_logic; q : out std_logic_vector(7 downto 0)); end component; component comb port( entrees : in std_logic_vector(7 downto 0); eQ : in std_logic; F : out std_logic); end component; component dflipflop port( d,clk : in std_logic; q : out std_logic); end component; component tp1 is port ( clk : in std_logic; entrees : in std_logic_vector(7 downto 0); sorties : out std_logic_vector(6 downto 0); aff : out std_logic_vector(3 downto 0)); end component;
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°1.
[modifier] 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 dit que l'appui d'une touche envoie son scancode tandis que 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 ?

