Animer la balle et la raquette

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.

Déplacement de la raquette

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 :

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.

Déplacement de la balle

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.