Very High Speed Integrated Circuit Hardware Description Language/Exercices/TP 1
Une page de Wikiversité.
Les Travaux Pratiques que nous présentons sont liés au matériel utilisé. En ce qui nous concerne nous utilisons du matériel XILINX (Spartan 3). Comme vous pourrez cependant le constater, la rédaction de ce TP est relativement indépendante du matériel. Beaucoup d'autres cartes proposent une connexion PS/2 : seuls le nom des broches et la façon de les nommer changent avec le matériel.
L'objectif de ce TP divisé en trois parties est de lire le scancode envoyé par un clavier et de l'afficher sur deux afficheurs sept segments. Le protocole PS/2 implanté ici est très loin d'être complet.
Cette série a été réalisée avec des étudiants de deuxième année (L2) sur une période de sept semaines à raison d'une heure et demi par semaine. Seuls 10% des étudiants sont allés jusqu'au bout.
Sommaire |
[modifier] TP1 : afficheurs 7 segments
Pour visualiser nos futures informations fournies par un clavier, nous avons besoin dans un premier temps de travailler sur l'affichage d'informations.
[modifier] Décodeur 7 segments simple
Pour permettre de prendre contact avec la maquette d'essai on va commencer par résoudre un problème simple : utiliser 4 interrupteurs en entrée et afficher en hexadécimal la valeur correspondante sur un des quatres afficheurs sept segments. Les quatres interrupteurs sont repérés par les broches H13 H14 G12 F12 à mettre dans un fichier ucf. On rappelle ici la syntaxe de ces fichiers ucf :
net "entrees<3>" loc="h13"; net "entrees<2>" loc="h14"; net "entrees<1>" loc="g12"; net "entrees<0>" loc="f12";
Ce fichier correspond à une entité (entity) VHDL :
entity tp1 is port ( entrees : in std_logic_vector(3 downto 0); .....); end tp1;
Pour d'autres FPGA et environnements de programmation les fichiers ucf seront certainement remplacés par d'autres fichiers utilisant une autre syntaxe.
Il nous faut parler des afficheurs maintenant. Ils sont multiplexés à l'aide d'un signal par afficheur. L'affichage se fait ainsi avec 7 signaux (les segments à allumer) qui sont actifs à l'état bas. Ces signaux seront repérés par les broches E14 G13 N15 P15 R16 F13 N16 du FPGA. Pour allumer le segment a, on positionne le signal en E14 à 0 et on met l'entrée de sélection correspondante de l'afficheur à 0 (les autres seront mises à 1 pour éteindre les autres afficheurs). En VHDL on pourra utiliser un std_logic_vector(3 downto 0) pour les quatre selections. La variable correspondante sera dénommée "aff" dans la suite de ce document. La partie du fichier ucf correspondante sera :
net "aff<0>" loc="d14"; net "aff<1>" loc="g14"; net "aff<2>" loc="f14"; net "aff<3>" loc="e13";
comme cela peut se voir sur la figure ci-dessous :
L'entité VHDL correspondante sera :
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity tp1 is port ( entrees : in std_logic_vector(3 downto 0); -- 4 inters en entree sorties : out std_logic_vector(6 downto 0); -- 7 segments en sorties aff : out std_logic_vector(3 downto 0)); -- 4 selecteurs d'afficheur end tp1;
qu'il vous faudra compléter avec son architecture correspondante. Il s'git naturellement d'un problème purement combinatoire qui peut être résolu avec un style "with select when" écrit directement à partir d'une table de vérité.
[modifier] Décodeur 8 bits vers deux afficheurs
On utilisera que les deux afficheurs poids faibles. Réaliser un ensemble permettant d'afficher le contenu de 8 bits sur deux afficheurs en hexadécimal. Ici il vous faudra forcément une horloge pour afficher tantôt le poids faible tantôt le poids fort (l'afficheur est validé par un 0).
Indications : On pourra réaliser l'ensemble de la façon suivante :
Un compteur 20 bits est destiné à réaliser un signal "lent" (Q19) à partir de l'horloge 50MHz de la carte. Un mutliplexeur permet d'envoyer alternativement les quatre bits de poids fort et les quatre bits de poids faible sur le décodeur sept segments. Ceci doit être synchronisé avec le signal qui sélectionne l'afficheur sur lequel on affiche. Comme il n'y a que deux afficheurs, le bit Q19 inversé/non inversé suffit pour alterner cette sélection d'afficheur : quand on envoie le poids faible on sélectionne l'afficheur droit etc... Le décodeur sept segments de l'exercice 1 peut être utilisé encore ici. Le travail à réaliser peut être caractérisé par l'entité (entity) suivante :
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity 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 tp1;
qu'il vous suffit de compléter par son architecture correspondante. Solution du tp1 ici.


