12
10 janvier 2011 Projet VHDL Casse-briques DOUMENC Rémi BERHAULT Guillaume

2A-VHDL Projet Casse Briques

Embed Size (px)

Citation preview

10 janvier 2011

Projet VHDL

Casse-briques

DOUMENC Rémi BERHAULT Guillaume

Doumenc Rémi & Berhault Guillaume Page 2

Casse-briques / VHDL

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

a) Principe de déplacement ......................................................................................... 6

b) Contact avec un bord .............................................................................................. 7

5. Gestion du déplacement du curseur ........................................................................... 9

B. 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 3

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 4

Casse-briques / VHDL

B. Schéma général

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 Spartan-3E ci-après).

Filter_anti_bounce clock50_in reset button_line

rotation

Cursor_state_machine clock50_in reset rotation

sens strobe

VGA_module clock50_in red_out reset green_out push_button blue_out sens hs_out strobe vs_out switch_pause start_out level_in rebond_out

RAM clock50_in level_out start_in donnees rebond_in adresse switches

embedded_kcpsm3 in_port write_strobe interrupt read_strobe interrupt_ack out_port reset port_id clock50_in

clock50_in

reset

Button_line

Push_button switches

Doumenc Rémi & Berhault Guillaume Page 5

Casse-briques / VHDL

Figure II-1 : Connectique VGA d’une FPGA Spartan-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 6

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’écran 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 correspond à 96+48=144 coups d’horloge ou une valeur de 144 pour le compteur horizontal. Le signal n’affiche plus au-delà 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 compteurs.

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 7

Casse-briques / VHDL

144 < horizontal_counter < 784 31 < vertical_counter < 511

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.

Y_position

X_position

Y_slope

X_slope

44 84 11

1

Doumenc Rémi & Berhault Guillaume Page 8

Casse-briques / VHDL

Figure II-6 : Repré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 9

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.

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é.

X_cursor_position 44 84 11

1

Bordures Largeur 2

Cursor_size

01

Doumenc Rémi & Berhault Guillaume Page 10

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 temps 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 11

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 Utilization

Total Number Slice Registers 295 9,312 3%

Number used as Flip Flops 294

Number used as Latches 1

Number of 4 input LUTs 706 9,312 7%

Logic Distribution

Number of occupied Slices 499 4,656 10%

Number of Slices containing only related logic 499 499 100%

Number of Slices containing unrelated logic 0 499 0%

Total Number 4 input LUTs 914 9,312 9%

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 232 11%

IOB Flip Flops 5

IOB Latches 7

Number of Block RAMs 1 20 5%

Number of GCLKs 3 24 12%

Total equivalent gate count for design 82,004

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 12

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 No 36 0.042 0.163

write_strobe Local

8 0.089 1.857

r1/clock1 Local

11 0.110 2.302

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.