Filière ELT 2 ème année, 2015-2016 TP3- Port série, Liaison RS232 Dans ce TP nous utiliserons le port sériel pour envoyer et recevoir les données vers un PC. Le port série des PC utilise la norme RS232 pour envoyer et recevoir les octets sérialisés. Ci-dessous, est présenté le schéma du timing de la liaison RS232, pour le cas de 8 bits de donnée, pas de parité et 1 bit de stop: Figure 1 : Le timing de la liaison RS232 Le baud rate, d après la norme peut être 300, 600, 1200, 2400, 4800, 9600 ou 19200 bits/sec. Dans ce TP on utilisera la vitesse 19200. Nous essayons de générer des caractères et de les envoyer vers le PC. Le PC les affichera sur l'écran. Le but final est d'envoyer une phrase à chaque fois que l'on appuie sur un des boutons de la carte. Dans le travail 1, on essaye d'envoyer juste un seul caractère, on le finalisera en travail 2. Travail 3 réalisera la réception sur la carte quand c'est le PC qui envoie des caractères. Travail 1 : Emission d'un caractère A chaque appuie du bouton BTN0 de la carte, un caractère est envoyé vers le PC. Le travail est scindé en deux: réalisation d'un component qui sérialise l'envoie d'une donnée de 8 bits sur le port série, et le programme principal qui, à chaque appuie du bouton, fournit un caractère à ce component. Le component dont vous devez écrire le programme et qui s occupe de l émission d un octet est présenté sur la Figure 2. 1
Figure 2 - Component qui respecte la norme RS232 et qui envoie une donnée 8 bits au PC Le circuit principal qui utilisera ce component (et qui fournit donc la donnée pour être sérialisée et puis envoyée) doit respecter le timing de la Figure 3: 1/19200 Figure 3- Timing de l'interface du port série On commence par la conception du component qu'on appellera l'interface du port série. Le rôle de l interface est en fait de recevoir un octet (sur le bus DATA de taille 8), d y ajouter les bits de start et de stop, et de les sérialiser suivant la norme RS232. L utilisateur de votre component (le programme principal) doit lui fournir le signal EN_19200 en permanence. Il (le programme principal) vérifie le signal BUSY et si ce signal est à zéro, il met sa donnée sur les lignes DATA et puis envoie une impulsion sur le signal STRB. Votre component doit sauvegarder cette donnée quand il détecte (sur le front de l'horloge) un niveau 1 sur STRB. Comment s'y prendre: On se concentre sur le timing du signal que nous devons générer et on essaye d'identifier l'enchainement des évènements (voir Figure 4). Figure 4- Identification du pointeur 2
On identifie deux états: "idle" et "envoie". Dans l'état "idle", on envoie sur TX la valeur logique '1'. Dès la réception d'un STRB, on sauvegarde la donnée et on passe à l'état "envoi". Dans cet état, on autorise le pointeur de s'incrémenter au rythme de "EN_19200". Pour simplifier les choses, on imagine un registre qui contient non seulement la donnée mais aussi les bits de start et de stop. On n'a qu'à faire sortir sur TX le bit pointé par "pointeur". Figure 5- la machine d'états comportant deux état "idle" et "envoi" Figure 6- le registre dont les bits seront envoyés sur TX Le "pointeur" est à incrémenter à chaque "EN_19200". Il est remis à zéro de manière "asynchrone" tant que nous sommes dans l'état "idle". BUSY reste à '0' dans l'état "idle" mais passe à '1' tant que nous sommes dans l'état "envoi". Figure 7- Schéma global du component 3
Une fois le programme décrivant ce component est fait, vérifiez son fonctionnement en simulation. Le programme de test ci-dessous peut être utilisé : process -- clk 100 MHz begin MCLK<= '0'; wait for 5 ns; MCLK <= '1'; wait for 5 ns; end process; process -- création du signal enable à 19200 Hz (la fréquence n est pas -- 19200 pour diminuer le temps de simulation) Begin EN_19200 <= 0 after 2 ns; Wait for 100 ns; EN_19200 <= '1' after 2 ns; wait for 10 ns; end process; DATA <= "11001010"; process begin STRB <= '0'; wait for 120 ns; STRB <= '1' after 2 ns; wait for 10 ns; STRB <= '0'; wait; end process; Si la simulation est satisfaisante, vous pouvez tester votre circuit. Il faudra utiliser ce component dans un circuit principal où un signal «enable» de 19200 HZ est généré. Ensuite, connecter le signal STRB à une des boutons de la carte. Lancer le programme «hyper terminal» du PC et connecter le port série du PC à la carte. Si tout va bien, vous devrez voir un caractère affiché sur l écran à chaque appuie du bouton. Est-ce que plusieurs caractères s affichent à chaque appuie? si oui pourquoi? Travail 2 : Affichage d une phrase Créer une mémoire ROM qui contient les codes ascii de la phrase «Je suis le meilleur!». A la fin de la phrase, ajouter les valeurs 10, 13 et 0, qui placeront le curseur au début de la ligne suivante et que le zéro marquera la fin de la phrase. Cette mémoire peut être crée comme suit : type T_memo is array (0 to 23) of std_logic_vector(7 downto 0); constant rom_memo : T_memo := (x"4a",x"65",x"20",x"73",x"75",x"69", x"73",x"20",...,x"0a",x"0d",x"00"); 4
Le but est de fabriquer une machine d'états pour afficher, à chaque appuie sur le BTN0 de la carte, cette phrase sur l écran PC. Le circuit de la Figure 8 présente le circuit total. Figure 8- Le circuit affichant une phrase à l écran PC L algorithme à utiliser dans la machine d'états de la figure 8 consiste à - Initialement dans l'état fin, attendre que le signal RESET arrive. A ce moment-là et si l'interface est libre on procède à envoyer les caractères un par un. On commence par créer une impulsion sur strb. - Le component qui reçoit ce strb, commence à envoyer le premier caractère. Il mettra busy à 1 - Analyser minutieusement le digramme d'état de la Figure 9. Figure 9- le diagramme de flux pour la machine à états de la Figure 8. Ecrire le programme entier en ajoutant le component et tester son fonctionnement sur la carte. 5
Travail 3 : Réception Nous allons faire afficher les codes ASCII envoyés par le PC suivant la norme RS232 sur les 7 segments. Construire un nouveau projet. Aller chercher dans le site web de TP et récupérer les deux programmes VHDL dont un affiche une donnée 16 bits (4 digits hexadécimaux) sur les afficheurs et l autre qui reçoit du port série d un PC le code ascii de la touche enfoncée. Relier ces components pour réaliser le circuit suivant : Figure 10- Circuit du récepteur du port série En ouvrant l application «hyper terminal» on doit visualiser le code ascii de la touche du clavier sur les 7-segment de la carte FPGA. 6