show menu


Les utilisateurs connectés peuvent télécharger ce tutoriel en pdf

Créer un contrôleur VGA pour ZedBoard

Posté par Florent - 27 Juillet 2017

Introduction

Dans ce tutoriel nous allons créer un contrôleur VGA pour afficher une image sur un écran en utilisant un Zedboard et Vivado 2017.2. Le contrôleur sera codé en VHDL.

Télécharger les fichiers pour le projet (fichier zip): ici

Introduction à l’affichage vidéo

Qu’est-ce qu’une image?

Une image est une matrice de pixels (pour picture (x) elements (éléments de l’image en anglais)). Dans le cas d’une image en noir et blanc, un pixel est définit par une valeur qui représente la luminosité. Plus cette valeur est grande, plus le pixel sera clair (blanc) et plus elle est faible, plus le pixel sera sombre (noir). Dans le cas d’une image couleur, dans la plupart des cas, un pixel est composé de 3 valeurs : son niveau de rouge, son niveau de vert et son niveau de bleu (c’est pourquoi les images couleurs sont souvent appelés images RGB (Red Green Blue)). La combinaison de ces trois couleurs donne la couleur finale au pixel. Par exemple, dans de nombreux logiciels comme « paint » de Windows, il est possible de créer des couleurs personnalisées en choisissant le niveau de Rouge, de Vert et de Bleu. La Figure 1 montre que si l’on selecte la valeur maximale pour le Vert et le Bleu (255 dans ce cas) et la valeur minimale pour le Rouge (0), on obtient la couleur cyan.

Exemple d’un outil de définition de couleur

Figure 1 - Exemple d’un outil de définition de couleur personnalisée

Pour afficher une image sur un écran, l’image est envoyée ligne par ligne, en commençant par la ligne du haut, chaque ligne étant envoyée pixel par pixel en commençant par celui de gauche.

Par exemple, la Figure 2 montre comment une image de 3x3 pixels peut être envoyée à un écran en utilisant 3 canaux de données.

timing video

Figure 2 - Exemple de comment une image est envoyée à un écran

Introduction à VGA sur la ZedBoard

Un signal vidéo VGA est composé de 5 différents signaux: 2 signaux de synchronisation (HSYNC et VSYNC) et trois signaux analogiques pour les couleurs (Rouge, Vert, Bleu).

Une trame vidéo (une seule image d’une vidéo) comprend une période de vidéo active et une période de blanc (pas de données envoyées). Les signaux de synchronisation vertical (VSYNC) et horizontal (HSYNC) décrivent le timing de la vidéo.

Example de Video Frame

Figure 3 - Exemple de trame Vidéo et de signaux de synchronisation


La Figure 3 montre un exemple de trame vidéo avec signaux de synchronisation. Pendant la période de vidéo active, les données sont envoyées à l’écran. Pendant les périodes de blancs verticaux et horizontaux, aucune donnée vidéo n’est envoyée à l’écran. Les signaux de synchronisation sont envoyés pendant ces périodes après un temps définit selon le format vidéo. Ces signaux peuvent être négatifs ou positifs. Les périodes avant et après un signal de synchronisation sont appelés respectivement Front Porch et Back Porch.

VGA connector	schematic on the ZedBoard

Figure 4 - Schematique du connecteur VGA de la ZedBoard

En VGA, les données de couleurs sont des tensions variant entre +0V et +3.3V. Sur la Zedboard, ces valeurs sont envoyées en utilisant un convertisseur Numérique Analogique 4 entrées comme montré sur la Figure 4.

VGA Connector on the ZedBoard

Figure 5 - Connecteur VGA de la ZedBoard

La Figure 5 montre comment les signaux sont connectes sur le connecteur VGA de la ZedBoard. D’après le guide utilisateur de la ZedBoard (link ) on peut voir que le signal correspondant au rouge est connecté aux ports V20, U20, V19 et V18 du FPGA, que le signal correspondant au vert est connecté aux ports AB22, AA22, AB21 et AA21 et que le signal correspondant au bleu est connecté aux ports Y21, Y20, AB20 et AB19. Le signal HSYNC est connecté à AA19 et VSYNC à Y19.

Timing Vidéo (pour 1680 x 1050@60Hz)

Pour ce tutorial, nous allons envoyer à l’écran un signal vidéo au format 1680 x 1050 @60Hz. Dans ce format, les pixels sont envoyés à une fréquence de 147.14MHz.

Timing Horizontal

Dans le format 1680 x 1050@60Hz, la taille d’une ligne active est de 1680 pixels. Le signal de synchronisation horizontal, qui est négatif, est envoyé après 104 coups d’horloge pendant la période de blanc et dure 184 coups d’horloge. Il y a ensuite 288 coups d’horloge entre le signal de synchronisation horizontal et une nouvelle ligne active. La Table 1 resume le timing horizontal.

Line Part

Clock Signals

Time [µs]

Visible area

1680

11.417697431018

Front porch

104

0.70680984096779

Sync pulse

184

1.2505097186353

Back porch

288

1.9573195596031

Whole line

2256

15.332336550224

 Table 1 - 1680 x 1050 @ 60 Hz Horizontal timing

Timing Vertical

Dans le format 1680 x 1050@60Hz, une trame active est composée de 1050 lignes. Le signal de synchronisation vertical, qui est positif, est envoyé après une période correspondant à une ligne durant la période de blanc et dure pour une période correspondant à 3 lignes. Ce signal de synchronisation est suivit d’une période correspondant à 33 lignes avant la nouvelle trame active. La Table 2 resume le timing vertical.

Frame Part

Lines

Time [ms]

Visible area

1050

16.098953377735

Front porch

1

0.015332336550224

Sync pulse

3

0.045997009650673

Back porch

33

0.5059671061574

Whole frame

1087

16.666249830094

Table 2 - 1680 x 1050 @ 60 Hz Vertical timing

Gestion des horloges sur la ZedBoard

D’après le Guide Utilisateur Hardware de la ZedBoard, un oscillateur de 100MHz fourni une horloge a la PL via le pin Y9. Pour notre résolution vidéo, nous avons besoin d’une horloge avec une fréquence de 147.14 MHZ. Nous allons donc utiliser l’IP clocking wizard pour générer l’horloge à l’aide d’une MMCM.

Créer le contrôleur de timing

Ouvrir Vivado 2017.2 et créer un nouveau project RTL pour la ZedBoard.

Premièrement, nous avons en entrée une horloge de 100MHz que nous devons transformer en horloge de 147.14 MHz (fréquence pixel). Pour cela nous allons utiliser l’IP Xilinx Clocking Wizard.

Dans le “flow navigator”, cliquer sur “IP Catalog”. Dans le barre de recherche, chercher “clocking” et double-cliquer sur l’IP “Clocking Wizard” pour l’ajouter au projet.

Vivado 2017.2 - Ajouter une IP Clocking Wizard au projet

Figure 6 - Ajouter une IP Clocking Wizard au projet

Une fenêtre utilisateur devrait apparaitre pour configurer l’IP. Le nom du composant pour cette IP devrait être clk_wiz_0. Dans l’onglet “Clocking Option”, vérifier que la fréquence de l‘horloge Primaire d’entrée est configurée a 100MHz.

Vivado 2017.2 - Clocking Wizard Interface Utilisateur

Figure 7 - Clocking Wizard Interface Utilisateur - Onglet Clocking Options

Dans l’onglet “Output Clocks”, configurer la fréquence demander pour clk_out1 à 147.14MHz et désactiver “reset” et “locked” dans la partie “Enable Optional Inputs / Outputs for MMCP/PLL” et cliquer sur OK.


Vivado 2017.2 - Clocking Wizard GUI - Output Clocks

Figure 8 - Clocking Wizard GUI - Output Clocks

Une fenêtre “Generate Outputs Products” devrait apparaitre. Selectionner “Out of context per IP” et cliquer sur “Generate”.

Figure 9 - Fenêtre Generate Outputs Products

Ajouter les fichiers VHDL hdl/TOP_LEVEL, hdl/VGA_timing_controller.vhd et hdl/reset_synchronizer.vhd au projet. Dans la fenêtre des sources, vous deviez voir la hiérarchie telle que montrée dans la Figure 10.

Hiérarchie du projet

Figure 10 - Hiérarchie du projet

Le fichier reset_synchronizer.vhd contiens un simple synchronisateur de reset, le fichier VGA_timing_controller.vhd contiens le code utilise pour générer les signaux de synchronisation horizontal et vertical et un signal indiquant lorsque le timing est dans la partie active. Le fichier TOP_LEVEL genre les signaux R, G et B lorsque la vidéo est active.

Test du projet sur la ZedBoard

Ajouter le fichier de contrainte constr/phys_const.xdc au projet et générer le Bitstream.

Lorsque le Bitstream a été généré, ouvrir le “Hardware Manger” dans Vivado et programmer le FPGA. Connecter la Zedboard a un écran VGA. Assurez-vous que le SW0 (utilise comme reset) est sur la position ‘0’. Vous devriez voir un écran vert. Si le projet ne marche pas, essayer le Bitstream du dossier zip.

Image verte affichée sur l’écran

Figure 11 - Image verte affichée sur l’écran



Poster un commentaire

Seuls les utilisateurs connectés peuvent poster des commentaires