3MMCEP VGA

De Ensiwiki
Révision de 7 février 2012 à 16:48 par Rippertc (discussion | contributions) (Question 1)

Aller à : navigation, rechercher

Laptop.png  Première Année  Puce.png  Matériel 

Le but de ce TP d'introduction est d'apprendre le petit sous-ensemble du langage VHDL qu'on va utiliser pendant le projet d'architecture, et de se familiariser avec la programmation de la carte FPGA.

Préparation

Pour bien aborder le TP et comprendre ce que vous allez faire, il faut que vous arriviez en séance en ayant lu la documentation décrivant le fonctionnement d'une carte VGA.

Une fois que vous avez lu la documentation, lisez l'exercice "Affichage basique" ci-dessous et essayer de prévoir ce qui sera affiché une fois le circuit implanté.

On fournit des sources dont vous aurez besoin dans ce Projet, téléchargez les et décompressez le fichier .zip dans le répertoire de votre projet.

Affichage basique

Soit le schéma ci-dessous, décrivant la structure du circuit que l'on va implanter.

Le composant GeneSync est un bloc qui génère les signaux HSYNC et VSYNC conformément à la norme VGA (pour une résolution de 640x480 pixels). Le signal IMG est à 1 uniquement lorsque le canon à électrons est dans une zone visible de l'image. Si IMG est à 0, alors les signaux R, G et B doivent obligatoirement être à 0 aussi. Les signaux X et Y désignent les coordonnées du pixel de couleurs R, G et B à l'instant considéré.

Question 1

Décompresser l'archive CEP_start.zip, et lisez la partie concernant ce TP dans le fichier LISEZMOI contenu dans cette archive.

Créer le composant GeneRGB (dans le fichier GeneRGB.vhd) correspondant au schéma ci-dessus (avec un simple éditeur de fichier). Vous devez donc construire le circuit qui calcule les valeurs des signaux R, G et B en fonction de la position (X, Y) du pixel ainsi que du signal de contrôle IMG.

Question 2

Modifier le composant VGA (dans le fichier VGA.vhd) qui interconnecte les composants GeneSync et GeneRGB comme dans le schéma précédent.

Question 3

Lancer la commande make clean dans le répertoire contenant vos sources, afin d'initialiser les répertoires de travail.

Simuler le comportement du circuit. (le fichier de test testBench_VGA.vhd vous est déjà fourni). Pour ce faire taper en ligne de commande make testBench_VGA.view_vcd DUREESIMU=20ms

Question 4

Vérifier que le fichier de contraintes utilisé pour associer les entrées et sorties du circuit aux pattes du FPGA (les numéros de pattes sont indiqués entre parenthèses sur le schéma) correspond bien à ce qui est souhaité.

Question 5

Programmer la carte (avec la commande make VGA.program) , connecter le câble VGA à l'écran et vérifier que l'affichage correspond bien à ce que vous aviez prévu.

Générateur de mire VGA

On souhaite maintenant construire un circuit capable d'afficher la mire ci-dessous (noter bien les différences avec la version précédente).

VGAex2.jpg

Cette mire affiche une bande rouge de 32 pixels de large, puis une bande bleue de 32px, puis une bande verte de 32px, puis une bande noire de 32px, etc.

Question 1

Modifier (après l'avoir sauvegardé) le schéma GeneRGB pour obtenir cette mire.

Question 2

Vérifier en simulation que le circuit se comporte comme prévu.

Question 3

Implanter le circuit sur la carte FPGA.

Affichage d'une image bitmap

Dans cet exercice, on va afficher à l'écran une image bitmap, c'est à dire une image décrite sous la forme d'un tableau dont chaque case correspond à la couleur du point de coordonnées correspondantes.

Le circuit que l'on veut réaliser est décrit dans le schéma ci-dessous.

VGA1 CEP.png

L'image que l'on va utiliser est une image en noir et blanc de résolution 320x240px (pour limiter l'espace mémoire nécessaire au stockage de l'image). Comme GeneSync calcule X et Y pour un affichage de résolution 640x480px, il suffit d'utiliser X(9..1) et Y(8..1) pour afficher l'image à la bonne résolution.

La mémoire utilisée travaille avec des mots de 32 bits : cela signifie qu'on trouve les 32 premiers pixels de l'image à l'adresse 0, les 32 suivants à l'adresse 1, etc. On calcule donc l'adresse de la case mémoire contenant le pixel voulu en utilisant la formule ad = Y(8..1) & X(9..6) (où & est l'opérateur de concaténation). Par exemple, le pixel de coordonnées (X, Y) = (129, 2) se trouve à l'adresse 0x0024 (c'est à dire 000000100100 en binaire).

Comme chaque mot contient 32 pixels, on va utiliser un simple multiplexeur 32 entrées vers 1 sortie pour extraire le bit voulu. L'entrée de données du multiplexeur sera donc le mot lu en mémoire et l'entrée de sélection X(5..1). Les signaux R, G et B seront alors égaux à la sortie du multiplexeur si IMG vaut 1, et 0 sinon.

Vous pouvez implanter le multiplexeur comme vu en cours ou utiliser la fonction conv_integer prédéfinie dans la bibliothèque standard : cette fonction prend en paramètre un std_logic_vector et renvoie l'entier correspondant.

Question 1

Modifier (après les avoir sauvegardés) les fichiers GeneRGB.vhd et VGA.vhd.

La partie "A" de la mémoire vidéo n'est pas utilisée dans ce TP, dans le fichier VGA.vhd vous pouvez donc :

  • brancher l'horloge clka sur l'horloge globale ;
  • forcer à 0 (sur le bon nombre de bits) toutes les entrées inutiles ;
  • ne rien associer aux sorties inutiles.

Tester en simulation pour vérifier que vos composants sont corrects (même si l'analyse visuelle de la simulation ne vous apportera pas grand-chose !).

Question 2

Tester le circuit sur la carte FPGA. En regardant l'affichage, à votre avis, comment sont stockés les pixels dans la mémoire ?

Corriger ce défaut et reprogrammer la carte. Que remarquez-vous maintenant ? Corriger ce nouveau défaut d'affichage (induit par l'utilisation d'une mémoire synchrone), par exemple en ajoutant un registre 5 bits pour introduire un retard d'un cycle dans la sélection du pixel. Vous aurez alors besoin d'ajouter une entrée CLK au composant GeneRGB par rapport à la figure ci-dessus.