Title: Pr
1Synthèse dun jeu vidéo en VHDL
2Structure de principe dun jeu vidéo
De façon simplifiée, un jeu vidéo est constitué
de
Un noyau (CORE) chargé de gérer les
caractéristiques primaires des objets animés à
incruster dans limage positions, amplitudes,
etc., ceci en fonction des règles
comportementales du jeu. Cest ce noyau qui
reçoit les commandes externes du jeu.
Une unité daffichage (DISPLAY) cest elle qui
va produire les signaux de contrôle (synchros
horizontale et verticale) et les signaux
vidéo correspondant aux objets gérés par le
noyau. Laspect de ces objets (forme, couleur,
etc.) est fonction des spécifications du jeu.
3Schéma structurel dun jeu vidéo
4Un standard vidéo simple le système VGA
(nom donné à linterface Video Graphics Adapter)
Une image VGA est formée dune trame de 480
lignes balayées de haut en bas, à raison de 60
trames par seconde. Chaque ligne comprend 640
pixels et est balayée de gauche à droite.
De façon simplifiée, un écran VGA (LCD ou
cathodique) est piloté par 5 signaux
2 signaux logiques de synchronisation
synchronisation horizontale signale le début
dune nouvelle ligne
synchronisation verticale signale le début
dune nouvelle trame
3 signaux analogiques vidéo (rouge, vert, bleu)
damplitude maximale 1 volt sur charge de 75 ohms.
5Le contrôleur vidéo VGA
A laide de deux compteurs X et Y, le contrôleur
vidéo VGA sert à adresser en continu un espace
525 x 800 dans lequel se trouve inclus lespace
vidéo 480 x 640 comme le montre la figure
suivante
X
0
Espace vidéo
479 480 524
Blanking
Y
En dehors de lespace vidéo les signaux vidéo
(RVB) doivent être à 0. Le contrôleur vidéo VGA
délivre un signal blanking destiné à
bloquer les signaux RVB dans cet espace.
6Timing de la synchronisation
Le contrôleur VGA délivre les signaux de
synchronisation horizontale et verticale en
fonction des valeurs des compteurs X et Y selon
le timing suivant
Synchro horizontale (fonction de X)
La fréquence dadressage X sera de (800/31.75)
25.196 MHz, soit environ 25 MHz
Synchro verticale (fonction de Y)
7Structure du contrôleur VGA
Le contrôleur VGA est composé de 2 compteurs X et
Y dont les valeurs fournissent par décodage les
signaux de synchronisation et de blanking.
Sauf pour les besoins dune simulation, une
remise à zéro asynchrone des compteurs X et Y
n est pas souhaitable en raison du décrochement
momentané de la synchronisation au niveau de
lécran utilisé.
8Génération de limage dun objet simple
Supposons que le noyau fournisse simplement les
coordonneés XP et YP dun objet qui doit être
affiché sous l aspect dun carré blanc de 10
pixels de côté, sur fond vert, avec le coin
supérieur gauche calé sur (XP,YP). Le module
DISPLAY aura la structure suivante
9Process de génération de limage dun objet simple
Process de génération du signal VC validant la
zone du carré
P_VC process (X,Y,XP,YP) begin if XgtXP and
XltXP10 and YgtYP and YltYP10 then VC lt
1 else VC lt 0 end if end process
P_VC
Process de génération des signaux vidéo RVB
P_RVB process (CLK) begin if CLKevent and
CLK 1 then if BLANK 1 then RVB lt
000 elsif VC 1 then RVB lt 111 else
RVB lt 010 end if end if end process
P_RVB
10Génération de limage dun objet complexe (sprite)
Lobjet à afficher ne se résume plus à une forme
géométrique simple. Il sinscrit cependant dans
une matrice de L lignes de K pixels. Sa position
est celle du coin supérieur gauche (XS, YS).
Le contenu de la matrice décrit lobjet (sprite)
à afficher. On lui associe un tableau de L
vecteurs de K bits pour un objet monochrome ou L
vecteurs de K entiers pour un objet multicolore.
Autant que possible ce tableau est implémenté à
laide dun bloc RAM du FPGA cible si ce dernier
en dispose. Ceci est inféré automatiquement par
la plupart des synthétiseurs.
11Process de description dun sprite monochrome
signal SPRITE bit_vector (0 to 6) signal
AD_SPRITE integer range 0 to 9 ...
P_SPRITE process (AD_SPRITE) begin case
AD_SPRITE is when 0 gt SPRITE lt
"0111110" when 1 gt SPRITE lt
"1000001" when 2 gt SPRITE lt
"1010101" when 3 gt SPRITE lt
"1000001" when 4 gt SPRITE lt
"1001001" when 5 gt SPRITE lt
"1001001" when 6 gt SPRITE lt
"1000001" when 7 gt SPRITE lt
"1011101" when 8 gt SPRITE lt
"1000001" when 9 gt SPRITE lt "0111110" end
case end process P_SPRITE
12Process de génération de limage dun sprite
monochrome
AD_SPRITE lt Y-YS -- adresse de la ligne du
sprite
Process de génération du signal VS validant les
pixels du sprite
P_VS process (X,Y,XS,YS,SPRITE) begin if XgtXS
and XltXS7 and YgtYS and YltYS10 then VS lt
SPRITE(X-XS) else VS lt '0' end
if end process P_VS
Process de génération des signaux vidéo RVB
P_RVB process (CLK) begin if CLKevent and
CLK '1' then if BLANK '1' then RVB lt
"000" elsif VS '1' then RVB lt "111" else
RVB lt "010" end if end if end process
P_RVB
13Thème du TP
Spécifications fonctionnelles
Le jeu vidéo à réaliser est un jeu de squash à un
joueur, avec une balle et une raquette
virtuelles qui se déplaceront dans le champ dun
écran VGA. Le jeu consistera simplement à
renvoyer la balle vers le fond du court en la
touchant avec la raquette dont la position dépend
du joueur. Un score affiché sur lécran
sincrémentera à chaque balle renvoyée. Lorsque
le score atteint 15, la partie en cours est
gagnée et sera arrêtée jusqu à la relance dune
nouvelle partie. La partie sarrête aussi
lorsque le joueur a raté une balle
14Implémentation
Le jeu sera implémenté à laide dune carte munie
dun FPGA Spartan3 de 200 000 portes et équipée
entre autres dun port de sortie VGA et de 4
boutons poussoirs BTN0 à BTN3. On adoptera les
spécifications techniques suivantes
Ecran VGA 480 lignes de 640 pixels, 60
trames/sec, couleurs 1 bit. (On aura donc 8
couleurs possibles noir, blanc, rouge, vert,
bleu, jaune, cyan, magenta.)
Court vert, mur à gauche de lécran, joueur à
droite.
Balle carré blanc 16x16 animé selon une
trajectoire à /- 45 degrés avec rebonds sur le
fond et les côtés du court.
Raquette rectangle rouge (largeur 16, hauteur
64) mobile verticalement à labscisse X 512.
Ses mouvements sont contrôlés par deux boutons
poussoirs (BTN0 gt DOWN, BTN1 gt UP).
15Implémentation (suite)
Affichage du score (0 à 15) en jaune, sur le haut
de lécran. Il sera fait appel à un component
VHDL existant pour générer les chiffres à
partir de la valeur du score.
Règles comportementales lorsque la balle
rencontre la raquette il y a rebond et le score
est incrémenté. Sinon la balle continue vers la
droite et la partie est arrêtée (GAME_OVER)
jusquau redémarrage dune nouvelle partie par
le bouton NEW_GAME (BTN2). Lorsque le score
atteint 15, le joueur a gagné (WIN) et la partie
sarrête également.
En outre
Oscillateur à quartz externe 50 MHz
Réinitialisation asynchrone par BTN3 (RAZ)
16Vue externe
UP
HSYNC
DOWN
NEW_GAME
VSYNC
SQUASH
3
RAZ
RVB
QUARTZ
Types
Toutes les entrées std_logic
Sorties HSYNC, VSYNC std_logic
Sortie RVB std_logic_vector (0 to 2)
17Analyse du noyau
On peut procéder par objet à gérer raquette,
balle, score
Raquette compteur/décompteur (0 479)
produisant lordonnée YR. Activé par les boutons
UP et DOWN, il sincrémente ou se décrémente à un
rythme imposé par un temporisateur TIMER.
Balle deux compteurs/décompteurs (0 639 et 0
- 479) produisant les coordonnées XB et YB. Ils
sincrémentent ou se décrémentent à un rythme
imposé par le même temporisateur TIMER (mais plus
lentement que la raquette ! ). Ces deux
compteurs auront besoin en interne de deux
drapeaux SENS_X et SENS_Y à gérer sur les valeurs
extrêmes de XB et YB ou sur contact avec la
raquette.
Score compteur SCORE (0-15) sincrémentant à
chaque rebond de la balle sur la raquette. Chaque
rebond produit une impulsion COUP. Remis à zéro à
chaque départ de nouvelle partie.
Un petit séquenceur gérera le départ du jeu et
son arrêt.
18Schéma structurel du niveau supérieur
SQUASH
YR
UP
XB
HSYNC
DOWN
CORE
DISPLAY
YB
VSYNC
NEW_GAME
SCORE
RVB
CLK
RAZ
PREDIV P_CLK
QUARTZ
Types signaux internes CLK
std_logic XB integer range 0 to 639 YR,
YB integer range 0 to 479 SCORE integer
range 0 to 15
19Schéma structurel du component CORE
La même horloge CLK de 25 MHz est appliquée à
tous les process synchrones.
Le signal RAZ sapplique à tous les process
synchrones.
20Séquencement de CORE
0
CS_YB
NEW_GAME 1
1
CS_SCORE
CS_XB
NEW_GAME 0
2
EN_XB
EN_YB
SCORE15
XB639
3
4
GAME_OVER
WIN
NEW_GAME 1
Les signaux WIN et GAME_OVER peuvent être
utilisés de diverses façons changement de
couleurs, accélération du jeu, etc.
21Schéma structurel du component DISPLAY
X,Y
GEN_RAQ P_VR
X
VR
CTRL_VGA
Y
HSYNC VSYNC
YR
BLANK
GEN_BALL P_VB
VB
GEN_RVB P_RVB
XB
3
YB
RVB
VS
VIDEO_SCORE
SCORE
VIDEO_SCORE est un component générateur de
caractères pour laffichage du score.
22Développement
Le projet comportera 6 fichiers (.VHD) dont
voici larborescence
Niveau supérieur SQUASH.VHD
VIDEO_SCORE est un component à importer. GEN_CHIFF
RE est importé par VIDEO_SCORE.
23Étapes du développement (1)
Réalisation du component CTRL_VGA codage et
simulation.
Codage des entity CORE et DISPLAY (entity seule),
puis codage du niveau supérieur SQUASH (entity et
architecture).
Architecture de CORE initialiser les signaux
transmis à DISPLAY. (XB 320, YB 240, YR
240, SCORE 0 par exemple)
Architecture de DISPLAY instancier CTRL_VGA et
VIDEO_SCORE et coder les process P_VR, P_VB et
P_RVB. Synthétiser et tester le système sur écran
VGA. A ce stade, la balle, la raquette et le
score doivent apparaître (immobiles) conformément
aux spécifications.
24Étapes du développement (2)
Architecture de CORE codage et test progressifs
Gestion de raquette (YR) sous contrôle de UP et
DOWN avec ralentissement par TIMER. Tester.
Gestion de la balle (XB,YB) avec ralentissement
par TIMER. Mouvement libre avec rebonds sur les
bords du champ ou sur la raquette (rebond
provoqué par le signal CONTACT) . Tester.
Gestion du score production dun signal
impulsionnel COUP qui doit apparaître à chaque
entrée en contact avec la raquette. Ce
signal doit servir à incrémenter SCORE. Tester.
25Étapes du développement (3)
Architecture de CORE codage et test progressifs
(suite)
Codage du séquenceur (signal ETAT)
Mise sous contrôle de la balle et du score par
ETAT. Test final.
Étude de la mise en forme circulaire de la balle
(sprite circulaire).