0% ont trouvé ce document utile (0 vote)
29 vues3 pages

Interface PS/2 pour FPGA : Guide Pratique

Transféré par

Dominique MORETTI
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
29 vues3 pages

Interface PS/2 pour FPGA : Guide Pratique

Transféré par

Dominique MORETTI
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

pratique cours fpga

Cours FPGA
6 ième
partie : connexion d’un clavier
Paul Goossens & Andreas Voggeneder (FH Hagenberg)

Il est fort probable que vous ayez, au grenier, un clavier PS2 dont vous n’avez plus que faire.
Il tombe à pic pour servir d’organe de saisie pour notre carte FPGA. Comment s’y prendre,
tel est le sujet de la 6ème partie de notre cours FPGA.

La plupart des systèmes d’expérimentation utilisent une Le périphérique sait ainsi que l’hôte souhaite envoyer des
liaison RS-232 pour la transmission de données, dans un données. Comme réaction à ce désir, le périphérique gé-
sens ou dans l’autre. La liaison se fait le plus souvent avec nère un signal d’horloge. L’hôte envoie alors des données
un PC sur lequel tourne un programme de Terminal. L’uti- au rythme du signal d’horloge, en commençant pour un
lisateur se sert du moniteur du PC en tant que console de bit de début (« 0 ») qui est suivi par 8 bits de données.
sortie, le clavier faisant office d’organe d’entrée. Ici encore c’est le LSB qui passe en premier. Le bit suivant
Nous pouvons fort bien nous passer de PC en connectant est un bit de parité (impair). En clôture, l’hôte envoie un
tout simplement le moniteur et le clavier directement à no- bit d’arrêt (« 1 »). Ceci ne termine cependant pas la com-
tre carte d’expérimentation. munication. Le périphérique envoie, tout en final, un « 0 »
qui constitue un ACK (acquiescement) pour signaler que
les données sont bien arrivées (cf. figure 2).
PS/2
Jusqu’à tout récemment, la connexion des claviers et sou-
ris au PC se faisait par le fameux bus PS/2. Notre carte Logiciel vs matériel
d’expérimentation FPGA possède 2 ports de ce type. Il est bien entendu possible d’implémenter le protocole
Outre la tension d’alimentation, une connexion PS/2 vé- PS/2 sous forme logicielle. C’est ce que nous avons fait
hicule un signal de données et un signal d’horloge, tous dans les articles précédents pour le bus I2C. Inconvénient
deux bidirectionnels et, sur notre carte FPGA, reliés direc- de cette approche : on perd du temps processeur consom-
tement à certaines lignes de ce processeur. mé par le traitement des signaux. De plus, cela ne fait
Le transfert de données du périphérique (le clavier par que compliquer le programme.
exemple) vers l’hôte (le FPGA dans le cas présent) se fait Autre option : faire une interface matérielle se chargeant
de la manière suivante : de la génération et du traitement des signaux.
Le périphérique commence par envoyer un bit de début Ce mois-ci, nous allons faire une interface PS/2 maté-
(start) toujours à « 0 », suivi de 8 bits de données com- rielle. Le contrôleur (8051) n’a pas ainsi à s’occuper du
mençant par le bit de poids faible (LSB). On a ensuite un fonctionnement précis de l’interface PS/2.
bit de parité (impair : il est mis à « 1 » si le nombre de Avant d’entrer dans le détail du matériel de l’interface
« 1 » de l’octet émis est pair). Un bit d’arrêt (stop), tou- PS/2 prenons le temps d’examiner le contrôleur T8052
jours à « 1 », clôture le tout. d’un peu plus près.
Au cours de cette transmission, c’est le périphérique qui
génère le signal d’horloge. L’état de la ligne de données
ne change qu’à l’intérieur de l’intervalle où le signal T8052
d’horloge est haut (cf. figure 1). Nous avons utilisé le processeur softcore T51 à plusieurs
endroits de ce cours. Il est constitué d’une partie pro-
cesseur baptisée T51. En outre, ce contrôleur comporte
Hôte -> périphérique différentes interfaces telles que UART, temporisateurs, etc.
La communication de l’hôte vers le périphérique est un Comme tout processeur MCS51, le T51 utilise un bus
peu plus compliquée. Il faut que l’hôte commence par système spécial pour le pilotage des périphériques. Les re-
signaler son intention d’envoyer des données, ce qu’il gistres connectés à ce bus sont des SFR (Special Function
fait par la mise au niveau bas de la ligne d’horloge. Il Register, nous n’allons pas traduire...). Le contrôleur d’ori-
arrête du même coup une communication éventuellement gine (8051) n’utilisait, à dessein, pas toutes les adresses,
en cours. Un peu plus tard, il met la ligne de données au de manière à permettre l’ajout de périphériques addition-
niveau bas. Pour terminer, il rebascule la ligne d’horloge nels. Nous profitons de cette possibilité, dans l’exemple
à « 1 ». ex17, pour ajouter une interface PS/2 au contrôleur.

68 elektor - 11/2006
La routine de T51_Glue.VHDL a à charge de décoder Grâce au commentaire (anglais) dont est doté le code-
les adresses de ces SFR. Nous avons ajouté les lignes source, il ne devrait pas être difficile de saisir le fonction-
suivantes : nement. En cas de problèmes à ce niveau, il reste la pos-

ps2_data_sel <= ‘1’ when IO_Addr = “1011001” else ‘0’; -- 0xD9


ps2_data_wr <= ‘1’ when IO_Addr_r = “1011001” and IO_Wr = ‘1’ else ‘0’; -- 0xD9
ps2_ctrl_stat_sel <= ‘1’ when IO_Addr = “1011000” else ‘0’; -- 0xD8
ps2_ctrl_stat_wr <= ‘1’ when IO_Addr_r = “1011000” and IO_Wr = ‘1’ else ‘0’; -- 0xD8

Par le biais de ce morceau de code on fait en sorte que sibilité d’utiliser le simulateur pour examiner l’interaction
le registre PS2_DATA soit accessible à l’adresse SFR des signaux internes.
0xD9. Le registre PS2_CTRL_STAT est adressable lui à
l’adresse 0xD8.
Exemple
Le premier exemple utilisant l’interface PS/2 est ex17.
Interface PS/2 Commencez par connecter le clavier à l’embase marquée
L’interface PS/2 proprement dite est décrite dans
PS2Keyboard-a.VHDL.

À partir de la ligne 218 l’interface se trouve sous la hou-


lette du bus SFR. Cette ligne fait partie d’un processus
évalué lors d’un flanc montant du signal d’horloge.
Dès que le signal data_wr_i se trouve au niveau haut lors
d’un flanc montant de l’horloge, le registre CmdReg est
chargé du contenu mis à disposition par le processeur. De
plus, le bit 8 (le 9ème bit donc) est mis à « 1 ».
Si le signal ctrl_stat_wr_i devait se trouver au niveau haut,
un certain nombre de registres se voient chargés des bits
correspondants du bus de données. On voit clairement
que l’interface est mise au repos lorsque le bit 7 se trouve
être un « 1 » se mettant en attende de données fournies
par le périphérique.
Lors d’une opération de lecture, le processeur lit le conte-
nu de SFR_Data_o. La ligne 236 fait en sorte que ces
signaux transmettent le DataReg interne au cas où il serait
sélecté par le biais du signal data_sel_i. Sinon, c’est le
registre d’état que l’on transmet.

L’opération de transfert vers le processeur proprement dite


est réglée par le fichier T8051.VHDL.
Le reste du fichier PS2Keyboard-a.VHDL décrit la commu-
nication entre le FPGA et le bus PS/2. Figure 1. Les données envoyées par le périphérique à l’hôte. Le signal du haut est l’horloge.

11/2006 - elektor 69
pratique cours fpga

Suivez le Cours FPGA avec


l’offre combinée FPGA !
La base de ce cours est un module FPGA doté d’un FPGA Cyclone d’Altera, venant
s’enficher dans une carte d’expérimentation FPGA qui offre une palette impressionnante de
possibilités de connexion et comporte une paire d’affichages (cf. le numéro de mars 2006
d’Elektor).
Les 2 platines sont livrées montées et testées. L’ensemble constitue un excellent point de
départ pour s’essayer à tous les exemples proposés tout au long de ce Cours et ce faisant
faire la connaissance des FPGA.
Pour de plus amples informations, un tour à www.elektor.fr, à la rubrique e-CHOPPE >KITS
(page 2), s’impose.

Nous la trouvons dans fpga_lib.c. Nous découvrons ici


comment envoyer des données vers le clavier et comment
en lire. On commence, à titre d’initialisation, par envoyer
le code « 0xFF » vers le clavier. Si la réception s’est faite
correctement, le clavier répond par un ACK (« 0xFA ». Si
le clavier envoie un « 0xFE » cela signifie qu’il y a eu une
erreur de transmission.
Si tout s’est bien passé jusqu’à présent, le clavier effec-
tuera un auto-test, opération se traduisant par l’allumage
de toutes les LED du clavier. En cas de succès du test, le
clavier enverra un « 0xAA » de clôture. Le clavier doit
maintenant fonctionner comme il s’entend.
Le reste du code est resté simple. À chaque réception de
données, la routine d’interruption ext_int2_isr() fait en
sorte qu’elles soient stockées dans un tampon (buffer).

Codes de scan
Nous sommes en mesure de communiquer avec le cla-
vier. Nous recevons en outre les actions sur les touches
du clavier, mais nous préférerions recevoir les codes AS-
CII. Nous avons, pour cela, dans l’exemple 18 (ex18),
étendu la routine d’interruption de kb.c. Elle se charge
Figure 2. On voit ici un bloc de données envoyé par l’hôte vers le périphérique. maintenant de convertir les codes de scan entrants en ca-
ractères ASCII.
Le lecteur curieux que vous êtes aura sans doute essayé,
« KEYBOARD ». Configurez ensuite le FPGA à l’aide du dans l’exemple précédent, la touche Caps Lock. Si vous
fichier de configuration correspondant. l’avez fait, vous aurez constaté que la LED correspondan-
Si tout s’est bien passé, vous verrez apparaître un mes- te ne réagit pas. C’est normal, le pilotage des LED étant
sage sur l’affichage LCD. À partir de ce moment, toutes devenu l’affaire de l’hôte. Dans l’exemple 18 nous mon-
les données envoyées par le clavier sont affichées sous trons, à l’aide de la routine Set_LED(), comment piloter
forme hexadécimale. En l’absence d’action sur le clavier, les LED du clavier. Il est effectué le compte du nombre de
ce dernier n’envoie pas de donnée. caractères entrés au clavier, le résultat de cette opération
étant affiché par les LED du clavier. Comme nous ne dis-
Appuyez sur une touche quelconque du clavier. Dans la posons que de 2 LED, nous ne pouvons compter qu’entre
foulée, les données correspondantes sont envoyées vers le 0 et 7.
FPGA pour lui signaler cette action. Si l’action sur la tou- Cet article montre clairement que la puissance du FPGA
che se prolonge au-delà d’une certaine durée, le clavier n’est vraiment utilisée qu’en cas d’utilisation des avanta-
enverra à répétition le code correspondant à cette touche. ges offerts par la logique configurable par rapport aux
Supposons que vous ayez appuyé sur la touche « w ». systèmes à microcontrôleur conventionnels. Il est possible
S’il faut en croire l’affichage LCD, le clavier a envoyé le de réaliser la totalité du protocole PS/2 en logiciel, mais
code « 0x1D ». Lors du relâchement de l’action sur une cela coûte du temps processeur.
touche, le clavier envoie même 2 codes. Le premier est un Par le choix de cette approche matérielle, le processeur
« 0F» qui signale que l’utilisateur a relâché la touche, le n’a pas à s’occuper du traitement des signaux électriques
code suivant étant celui de la touche concernée. sur le bus PS/2, de sorte qu’il lui reste plus de temps pour
d’autres tâches.
Progiciel Il est possible, par la même technique que celle décrite
Comment le logiciel s’occupe-t-il de tout cela ? Il com- dans cet article, de réaliser une version matérielle du pro-
mence, comme d’habitude, par l’initialisation de l’affi- tocole I2C d’un article publié précédemment.
chage LCD. Il appelle ensuite la routine init_kb(). Nous la Dans le prochain article nous allons doter notre système
retrouvons dans kb.c où l’on attribue une valeur de début à microcontrôleur d’une sortie VGA de toute beauté, sous
aux variables. Pour finir, c’est au tour de InitKbd() d’être forme matérielle... bien évidemment.
appelée. (060025-6)

70 elektor - 11/2006

Vous aimerez peut-être aussi