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

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.
Cette série (TP 1 à TP 4) 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. Les exercices demandés jusqu'en 2008, sont ceux qui ont un corrigé maintenant, et seuls 10% des étudiants sont allés jusqu'au bout (sans le corrigé bien entendu). Ayant maintenant publié les corrigés, il m'a fallu ajouter des exercices non corrigés et même un quatrième TP. Ainsi, en 2010, un binome sur douze a terminé le TP3. Il faut dire que des restrictions budgétaires ont fait passer nos enseignements de 7 à 6 semaines.
L'objectif de ce TP divisé en quatre parties est de lire le scancode envoyé par un clavier, de l'afficher sur plusieurs afficheurs sept segments et pour finir, d'embarquer un processeur qui utilisera ces scancodes. Le protocole PS/2 implanté ici est très loin d’être complet.

## 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. Nous allons utiliser pour cela des afficheurs 7 segments présents sur la carte.

### 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 quatre afficheurs sept segments.
Tout ce qui est spécifique au fabricant Xilinx, au composant Spartan3 et à la carte d'évaluation Digilent sera mis dans une boîte déroulante comme ci-dessous partir de maintenant dans ce document. Cela concerne essentiellement les fichiers ucf. Ces fichiers sont destinés à faire une correspondance entre les signaux logiques gérés par le langage VHDL, et les broches physiques du FPGA utilisé. Pour d'autres FPGA et environnements de programmation les fichiers ucf seront certainement remplacés par d'autres types de fichiers utilisant une autre syntaxe. Il vous faut lire la documentation appropriée.
Ce problème à résoudre correspond à une entité (entity) VHDL :
On peut remarquer que :
* les quatre interrupteurs d'entrées sont regroupés dans une variable que l’on appelle entrees
* les sept segments à afficher sont regroupés dans une variable nommée s7segs
* la sélection des afficheurs est regroupée dans une variable nommée aff
La compréhension de ces choix nécessite une compréhension des afficheurs. 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. Cela veut simplement dire que les afficheurs 7 segments sont à anode commune.
La figure ci-dessous présente le travail à réaliser.
Tous les schémas présenteront le travail à faire sous forme fonctionnelle : quelles sont les entrées, quelles sont les sorties ? Le bloc à réaliser en VHDL sera toujours coloré en bleu clair dans cette série de Travaux Pratiques.
L'entité VHDL complète correspondante à la figure ci-dessus sera donc :
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é.

### Décodeur 8 bits vers deux afficheurs avec sa correction

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 comme indiqué dans la figure ci-dessous. Il est important de comprendre que cette figure vous donne l'architecture de votre programme VHDL : on utilisera la programmation structurelle. Ce style consiste à assembler des composants : cela est expliqué dans la section Assembler des composants du WIKIBOOK Conception et VHDL.
Un compteur 20 bits est destiné à réaliser un signal "lent" (Q19) à partir de l'horloge 50 Mhz 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 7 segments 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 :
qu’il vous suffit de compléter par son architecture correspondante. Avant de dérouler la solution, essayez de réfléchir par vous-même.
Voici sans autres explications une solution du TP1 :
Et voici le fichier ucf :

### Décodeur 16 bits vers quatre afficheurs sans sa correction

On vous demande d'étendre l’affichage à 16 bits. Vous allez réaliser un registre à décalage sur 4 bits avec un '0' qui se décale en décalage circulaire. Ce registre sera commandé par l'horloge lente naturellement. Ces quatre signaux seront utilisés pour la sortie "aff", c'est-à-dire la sélection des afficheurs.
Il vous faut prévoir une initialisation (synchrone ou asynchrone) de votre registre pour avoir au début "1110" par exemple, avec une entrée spécifique d'initialisation.
La sortie de ce registre à décalage commandera un multiplexeur pour choisir les quatre bits à afficher.
Voici un schéma de principe :
* Notre horloge générale est de 50 Mhz. Ainsi, contrairement au schéma, il est bon de prendre q17 en lieu et place de q19 comme horloge lente... autrement votre œil percevra les clignotements des afficheurs. Nous mettrons la figure à jour un de ces jours !
L'entité VHDL correspondant au schéma est :
Le registre à décalage se fait facilement avec l'opérateur de concaténation. Quelque chose comme
devrait convenir. On vous laisse trouver le process autour, l'entité les signaux ...
Pour information les quatre autres interrupteurs de notre carte d'évaluation sont en J14, J13, K14 et K13.
Puisque j'utilise cette page avec mes étudiants, je ne donne pas les solutions complètes.
En résumé, votre travail consiste à implanter les composants suivants :
Certains sont utilisés dans TP1.
Je vous donne le fichier ucf utilisé pour les tests :