Projet VHDL Casse-briques
DOUMENC Rémi BERHAULT Guillaume
10 janvier 2011
SOMMAIRE
I.
Présentation du Projet ........................................................................................................ 3 A.
Cahiers des charges ..................................................................................................... 3
B.
Schéma général ........................................................................................................... 4
II.
Codage ................................................................................................................................. 4 A.
Ecran VGA .................................................................................................................... 4 1.
Historique .................................................................................................................... 4
2.
Fonctionnement .......................................................................................................... 4
3.
Gestion de l’affichage .................................................................................................. 6
4.
Gestion du déplacement de la balle............................................................................ 6
5. B.
a)
Principe de déplacement......................................................................................... 6
b)
Contact avec un bord .............................................................................................. 7
Gestion du déplacement du curseur ........................................................................... 9 Ecran LCD ................................................................................................................... 10
1.
Historique .................................................................................................................. 10
2.
Fonctionnement ........................................................................................................ 10
3.
Gestion de l’affichage ................................................................................................ 10
4.
Gestion du rafraîchissement ..................................................................................... 11
III.
Evaluation des performances ........................................................................................ 11
IV.
Conclusion ..................................................................................................................... 12
Doumenc Rémi & Berhault Guillaume
Page 2
Casse-briques / VHDL
I.
Présentation du Projet
A. Cahiers des charges Le but du projet est de réaliser un jeu de casse brique (sans brique) sur un écran VGA implémenté sur une FPGA
Ecran VGA : Affichage de la raquette et de la balle et éventuellement des briques.
Ecran LCD : Affichage d’informations : Temps de jeu
-
Nombre de rebonds
-
Nombre de briques cassées (s’il y en a)
-
Précision (s’il y a des briques)
L’appui sur le bouton poussoir du bouton rotatif lance la balle lorsqu’elle est figée au milieu de l’écran (début de jeu, ou balle perdue)
Le bouton rotatif gère le déplacement de la raquette.
Un interrupteur déclenche la pause.
Trois interrupteurs permettent de sélectionner la difficulté (3niveaux de difficulté)
Un bouton poussoir permet de changer l’affichage des informations sur l’écran LCD.
Un bouton poussoir déclenche un reset.
Raquette : Gérer le déplacement de la raquette et son immobilisation lors d’un contact avec les bords.
Balle : Gérer les déplacements et les rebonds de la balle. Lorsque la balle est perdue (contact avec le bas de l’écran) la balle est repositionnée au milieu de l’écran et est immobile.
Doumenc Rémi & Berhault Guillaume
Page 3
Casse-briques / VHDL
B. Schéma général
clock50_in reset
Filter_anti_bounce
Button_line
Cursor_state_machine
clock50_in reset button_line
clock50_in reset rotation sens strobe
rotation
VGA_module clock50_in reset push_button sens strobe switch_pause level_in
red_out green_out blue_out hs_out vs_out start_out rebond_out
Push_button switches
RAM clock50_in start_in rebond_in adresse switches
embedded_kcpsm3 level_out donnees
in_port interrupt interrupt_ack reset clock50_in
write_strobe read_strobe out_port port_id
Figure I-1 : Schéma bloc général de fonctionnement
II.
Codage
A. Ecran VGA 1. Historique Signification de VGA : « Video graphics arrays ». Ce type d’écran à été introduit par IBM en 1987. Il réfère aujourd’hui à un affichage en 640x480 pixels.
2. Fonctionnement En se référant à la documentation de la carte FPGA SPARTAN-3E nous découvrons que la sortie VGA se décompose en 5 signaux. Trois d’entre eux concernent les couleurs primaires et les 2 autres servent à effectuer le balayage horizontal et vertical comme pour un écran analogique (voir Figure II-1 : Connectique VGA d’une FPGA S partan-3E ci-après).
Doumenc Rémi & Berhault Guillaume
Page 4
Casse-briques / VHDL
Figure II-1 : Connectique VGA d’une FPGA S partan-3E
Les signaux VGA_HSYNC et VGA_VSYNC sont les deux signaux qui vont définir le balayage de l’écran à une fréquence de 60Hz. Le premier signal correspond à la synchronisation horizontal et le deuxième à la synchronistion verticale. Pour comprendre cela il suffit de regarder comment se déplace le « faisceau » (si l’on a un écran LCD il n’y a pas de faisceau, mais c’est mieux pour comprendre). Le faisceau balayage plus large que l’écran et va de gauche à droite sans arrêt. Il ne revient pas spontanément à gauche et sur la ligne du dessous. Pour cela nous utilisons le signal de synchronisation horizontal qui va faire revenir le faisceau au début de la ligne suIvante (cf Figure II-2: Exemple de timing d’un écran à tube cathodique).
Figure II-2: Exemple de timing d’un écran à tube cathodique
On remarque alors que le retour à la ligne suivante se fait lors du passage du signal de synchronisatoin horizontal du niveau haut au niveau bas pendant une certaine durée. Ainsi lorsque un certain nombre de ligne auront été passé le faisceau se situera en bas à droite de l’écran. Afin de la ramener en haut à gauche et de recommencer il faut cette fois untiliser le signal de synchronisation vertical, en le faisant passer d’un niveau haut à un niveau bas. Le tableau ci-dessous (Figure II-3 : Timing des signaux de synchronisation) nous donne les différentes temporisations qui nous permettent savoir quand il est possible d’émettre un signal. En effet il n’est pas possible d’afficher quelque chose sur l’écran lorsque le faisceau dépasse de l’écran ou lorsqu’il revient se repositionner en d ébut de ligne.
Doumenc Rémi & Berhault Guillaume
Page 5
Casse-briques / VHDL
Figure II-3 : Timing des signaux de synchronisation
Pour synchroniser les signaux nous devons utiliser une horloge dont la période est de
soit une horloge à 25MHz. Ainsi chaque front représente un pixel.
Il suffit ensuite de suivre les valeurs du tableau afin de définir la zone d’écran dans laquelle il est possible d’afficher.
3. Gestion de l’affichage Pour pouvoir afficher dans la zone d’éc ran possible, nous utilisons deux compteurs (horizontal_counter et vertical_counter). Ces derniers sont initialisés à 0. A chaque coup d’horloge à 25MHz le compteur horizontal est incrémenté de 1. Ce compteur représente les « clocks » du tableau en Figure II-3 : Timing des signaux de synchronisation, pour le « horizontal sync ». A l’aide du schéma en dessous du tableau précédent nous voyons qu’il faut attendre Tpw+Tbp avant d’être dans une zone d’affichage. En l’occurrence ceci correspon d à 96+48=144 coups d’horloge ou une valeur de 144 pour le compteur horizontal. Le signal n’affiche plus audelà de 784 coups d’horloge, ce qui correspond bien à 640 pixels affichés. Quant au compteur vertical, il est incrémenté lorsque le compteur horizontal atteint sa valeur maximale, soit 800. Cette fois, l’affichage n’est possible qu’entre des valeurs du compteur vertical comprises entre 31 et 511. Ce qui représentent bien une hauteur de 480 pixels. Le schéma ci-dessous, nous permet de visualiser ces c ompteurs. Figure II-4 : Définition de la zone d’affichage avec compteurs
4. Gestion du déplacement de la balle a)
Principe de déplacement La balle est placée au centre lorsque le joueur commence la partie, elle est ensuite lancée lorsque le joueur appuie sur le bouton poussoir du bouton rotatif. La balle est paramétrée par les coordonnées X_position et Y_position (centre de la balle), et son déplacement par les vecteurs X_slope et Y_slope (vecteurs pentes) voir Figure II-5 : Coordonnées de la balle dans le plan. Le déplacement est gérer par l’horloge clock10 cadencé à 100 Hz qui permet d’avoir un déplacement fluide et visible de la balle. La zone affichable de la balle correspond à une résolution de 480x640, ce qui revient, lorsque l’on utilise les signaux vertical_counter et horizontal_counter, à utiliser, comme expliqué précédemment, les intervalles :
Doumenc Rémi & Berhault Guillaume
Page 6
Casse-briques / VHDL
144 < horizontal_counter < 784 31 < vertical_counter < 511
Y_position
Y_slope X_slope
X_position Figure II-5 : Coordonnées de la balle dans le plan.
La balle se déplace dans la zone affichable, c'est-à-dire lorsque ses coordonnées sont comprises entre les bords verticaux et horizontaux. On utilise également les deux signaux vertical_counter et horizontal_counter pour repérer la position des bords de la balle et gérer son affichage. A chaque front d’horloge de clock10 si la balle est toujours contenue dans la zone affichable ainsi que son futur déplacement l’est encore, alors on incrémente sa position avec la valeur des coordonnées de la pente (voir ci-après), sinon elle rebondit (voir II-4-b Contact avec un bord). Si elle est juste déplacée nous avons : X_position<=X_position+X_slope ; Y_position<=Y_position+Y_slope ;
b) Contact avec un bord Le bord est maintenant composé d’une bordure supplémentaire de largeur 2 pixels. Elle sert à mieux visualiser les zones de contacts. Le contact de la balle avec un bord de la zone affichable est repéré lorsque l’inégalité suivante n’est plus vérifiée : Bord_Gauche_Affichage + taille_balle < position X < Bord_Droit_Affichage – taille_balle On détermine ensuite quel bord est responsable du contact et on effectue une inversion de coordonnée du vecteur directeur afin de renvoyer la balle, tout en conservant l’angle d’incidence.
Doumenc Rémi & Berhault Guillaume
Page 7
Casse-briques / VHDL
Figure II-6 : Re présentation d’un rebond sur le bord droit
Dans l’exemple ci-dessus : Lorsque l’inégalité n’est plus vérifiée alors cela signifie que l’on entre en contact avec le bord droit, on inverse alors la composante en X du vecteur directeur :
De manière général, lorsque l’on arrive sur les bords gauche et droit on inverse la composante en X de la pente et lorsque l’on arrive sur le bord haut ou bas (curseur) on inverse la composante en y.
Doumenc Rémi & Berhault Guillaume
Page 8
Casse-briques / VHDL
5. Gestion du déplacement du curseur Le curseur est géré par le bouton rotatif, son déplacement est fait suivant l’axe des X. La rotation du bouton entraine l’incrémentation ou la décrémentation du signal X_cursor_position en fonction du sens de rotation (droite ou gauche). La largeur du curseur est gérée par le signal cursor_size, sa hauteur est fixée à 10. Bordures Largeur 2
Cursor_size
X_cursor_position Figure II-7 : Coordonnées du curseur dans le plan.
De manière analogue au contact de la balle avec le bord, celui du curseur avec un bord de la zone affichable est repérée lorsque l’inégalité suivante n’est plus vérifiée :
Figure II-8 : Curseur en butée
Lorsque c’est le cas, on arrête l’incrémentation ou la décrémentation de X_cursor_position, selon le bord de contact, ainsi le curseur reste en contact avec le bord jusqu’à ce que l’utilisateur actionne le bouton rotatif dans le sens opposé.
Doumenc Rémi & Berhault Guillaume
Page 9
Casse-briques / VHDL
B. Ecran LCD 1. Historique LCD : Liquid Crystal Display L’écran LCD est principalement utilisé depuis la fin des années 90 en noir et blanc. Son principal avantage est sa faible consommation d’énergie . Ceci fait de lui un bon élément de système embarqué, comme dans un téléphone portable.
2. Fonctionnement L’utilisation de l’écran LCD va se faire à l’aide du PicoBlaze de la carte. Le programme de gestion d’initialisation et d’envoi des données à l’écran est déjà donné. Avant de commencer la partie, l’écran fait défiler un message de bienvenue et invite le joueur à débuter la partie. Ce dernier peut mettre en pause le jeu à tout instant en activant un interrupteur. Trois autres interrupteurs servent à choisir le niveau de difficulté du jeu.
3. Gestion de l’affichage Nous utilisons une ram dans laquelle nous commençons par stocker des messages prédéfinis qui changeront en fonction des choix de l ’utilisateur. Il y a le message de bienvenue, l’affichage de la pause lorsque le jeu est en pause et enfin il y a le t emps de jeu, le niveau et le nombre de rebonds qui s’affichent sur lécran en même temps. Le joueur débute la partie en appuyant sur le bouton poussoir du bouton rotatif. L’écran affiche alors le temps de jeu, le niveau courant ainsi que le nombre de rebonds de la balle. Le temps de jeu s’étend de 000s à 999s. Chacun des trois chiffres est codé par une variable en BCD. Ensuite cette derniè re valeur est concaténée avec la valeur ‘3’ afin d’obtenir le code hexadécimal de la table ASCII du chiffre en question. Voir l’exemple ci-après :
Figure II-9 : Table ASCII
Exemple pour 5s :
Doumenc Rémi & Berhault Guillaume
Page 10
Casse-briques / VHDL
4. Gestion du rafraîchissement Pour pouvoir afficher le changement d’heure nous devons commencer par créer une horloge cadencée à la seconde. Ainsi nous pouvons donner le temps de jeu en secondes. L’affichage de l’écran reste fixe et ne se rafraîchi que lors d’un changement d’état, c’est-à-dire lorsque un la configuration des switches changent par exemple. Pour pouvoir rafrâchir l’affichage nous gardons en mémoire le code qui a été demandé et nous le réactivons régulièrement, plus d’une fois par seconde, afin de voir le temps s’écouler.
III.
Evaluation des performances
Afin d’évaluer les performances de notre système nous pouvons étudier les différents rapports de synthèse que Xilinx nous donne. Device Utilization Summary Logic Utilization
Used
Available 295
Total Number Slice Registers
Utilization
9,312
3%
706
9,312
7%
499
4,656
10%
499
499
100%
0
499
0%
914
9,312
9%
232
11%
294
Number used as Flip Flops
1
Number used as Latches Number of 4 input LUTs Logic Distribution Number of occupied Slices Number of Slices containing only related logic Number of Slices containing unrelated logic Total Number 4 input LUTs Number used as logic
706
Number used as a route-thru
140
Number used for Dual Port RAMs
16
Number used for 32x1 RAMs
52
Number of bonded IOBs
27
IOB Flip Flops
5
IOB Latches
7
Number of Block RAMs
1
20
5%
Number of GCLKs
3
24
12%
82,004
Total equivalent gate count for design Additional JTAG gate count for IOBs
1,296
Nous voyons alors le nombre de Slice utilisé ainsi que la quantité de mémoire réservée à l’éxécution de notre programme. Nous pouvons maintenant nous intéresser aux données fournies sur les horloges afin de savoir à quelle vitesse notre programme peut s’éxécuter.
Doumenc Rémi & Berhault Guillaume
Page 11
Casse-briques / VHDL
Clock Report Clock Net
Resource
Locked Fanout Net Skew(ns) Max Delay(ns)
clock50_in_BUFGP BUFGMUX_X1Y11 No
147
0.067
0.185
U2/clock25
BUFGMUX_X1Y10 No
17
0.023
0.158
U2/clock10
BUFGMUX_X1Y0
36
0.042
0.163
write_strobe
Local
8
0.089
1.857
r1/clock1
Local
11
0.110
2.302
No
Sachant que la période minimale est de 20ns, c’est-à-dire l’horloge à 50MHz, nous pouvons voir que le circuit peut fonctionner à 50MHz sans problème apparent.
IV.
Conclusion
Ce projet nous a permis d’exploiter un écran VGA ainsi qu’un afficheur LCD au travers du VHDL, à l’aide d’un FPGA, SPARTAN-3E de chez Xilinx. Le résultat est conforme au cahier des charges établi.
Doumenc Rémi & Berhault Guillaume
Page 12
Casse-briques / VHDL