Dans cette étape, nous nous intéressons aux déplacements de la balle et de la raquette sans nous préoccuper du déroulement de la partie.
Le fichier SquashCommon.v
définit une constante
PADDLE_CYCLES_PER_PIXEL
qui règle la vitesse de déplacement de la raquette.
La valeur de cette constante correspond à la durée, en périodes d’horloges,
que met la raquette pour parcourir un pixel.
Dans le fichier SquashCore.v
, ajoutez deux processus pour gérer le déplacement
de la raquette :
PADDLE_CYCLES_PER_PIXEL
produira un signal paddle_timer_reg
.paddle_timer_reg
, un compteur-décompteur
mettra à jour la sortie paddle_y_o
en fonction des entrées up_i
et down_i
.
On veillera à ce que la raquette ne sorte pas de l’écran.Pour réaliser cette étape, vous devrez appliquer les notions suivantes :
Pensez à supprimer l’affectation de paddle_y_o
que vous avez utilisée
pour tester l’affichage.
Synthétisez le circuit et observez son fonctionnement sur la carte Basys3.
Le fichier SquashCommon.v
définit une constante
BALL_CYCLES_PER_PIXEL
qui règle la vitesse de déplacement de la balle.
La valeur de cette constante correspond à la durée, en périodes d’horloges,
que met la balle pour parcourir un pixel.
En utilisant la même technique que pour la raquette, l’état de la balle
sera mis à jour tous les BALL_CYCLES_PER_PIXEL
cycles d’horloge
à l’aide d’un compteur ball_timer_reg
.
Créez deux signaux ball_x_dir_reg
et ball_y_dir_reg
indiquant le sens de déplacement de la balle en respectant la convention
suivante :
0 | 1 | |
---|---|---|
ball_x_dir_reg |
Vers la droite | Vers la gauche |
ball_y_dir_reg |
Vers le bas | Vers le haut |
Pour décider des changements de direction, définissez les quatre signaux logiques suivants :
Signal | Indique une collision avec | Agit sur |
---|---|---|
hit_screen_x |
un bord vertical de l’écran | ball_x_dir_reg |
hit_screen_y |
un bord horizontal de l’écran | ball_y_dir_reg |
hit_paddle_x |
un bord vertical de la raquette | ball_x_dir_reg |
hit_paddle_y |
un bord horizontal de la raquette | ball_y_dir_reg |
Ces quatre signaux doivent être affectés de façon combinatoire. Ils indiquent si une collision va se produire au prochain front d’horloge.
Par exemple, si la balle se déplace vers la droite (ball_x_dir_reg
= 0)
et si elle s’apprête à toucher le bord droit de l’écran
(ball_x_o
= VGA_SCREEN_WIDTH - BALL_WIDTH - 1
),
on met à 1 le signal hit_screen_x
.
Au front d’horloge suivant, la balle atteint le bord droit
(ball_x_o
= VGA_SCREEN_WIDTH - BALL_WIDTH
)
et repart vers la gauche (ball_x_dir_reg
= 1).
Complétez la gestion des sorties ball_x_o
et ball_y_o
.
Synthétisez le circuit et observez son fonctionnement sur la carte Basys3.
Pour réaliser cette étape, vous devrez appliquer les notions suivantes :
Pensez à supprimer les affectations de ball_x_o
et ball_y_o
que vous avez
utilisées pour tester l’affichage.