Table des matières:

Jeu de réaction FPGA : 10 étapes
Jeu de réaction FPGA : 10 étapes

Vidéo: Jeu de réaction FPGA : 10 étapes

Vidéo: Jeu de réaction FPGA : 10 étapes
Vidéo: MiSTer FPGA #00 : Tout savoir de A à Z 2024, Juillet
Anonim
Jeu de réaction FPGA
Jeu de réaction FPGA

Par Summer Rutherford et Regita Soetandar

Étape 1: Présentation

Pour notre projet final pour le CPE 133, nous avons conçu un jeu de réaction en VHDL pour une carte Basys3. Ce jeu peut être comparé le plus étroitement au jeu d'arcade "Stacker" où le joueur doit laisser tomber les blocs au bon moment. La carte Basys3 est connectée à une maquette, qui a des LED alternées. Ces lumières LED alterneront à une fréquence spécifique, en fonction du niveau. Ce jeu utilise le diviseur d'horloge et l'affichage à 4 chiffres et 7 segments, ainsi qu'une machine à états finis. Lorsque le joueur active le bon interrupteur lorsque la LED du milieu s'allume, le joueur passe au niveau suivant du jeu, en augmentant la fréquence des LED en alternance. Cela rend chaque niveau successif plus difficile que le niveau précédent. Lorsque le joueur bat avec succès le niveau 7, le niveau le plus élevé, un message s'affiche sur l'affichage à segments et toutes les LED clignotent simultanément.

Étape 2: Matériaux

Matériaux
Matériaux
Matériaux
Matériaux
Matériaux
Matériaux

Les matériaux dont vous aurez besoin sont:

  • Carte Digilent Basys3 avec câble micro USB
  • Planche à pain
  • 5 LED
  • 5 résistances (nous avons utilisé 220 ohms)
  • 11 fils de liaison
  • Ordinateur avec Vivado

Étape 3: Conception de la boîte noire du diagramme de haut niveau

Diagramme de haut niveau Conception de la boîte noire
Diagramme de haut niveau Conception de la boîte noire
Diagramme de haut niveau Conception de la boîte noire
Diagramme de haut niveau Conception de la boîte noire

Comme vous pouvez le voir, notre diagramme de niveau supérieur commence par obtenir les horloges requises à partir de notre sous-module, ClkDivide. Ces horloges sont entrées dans les différents blocs de processus. Essentiellement, le jeu doit reconnaître que lorsqu'un utilisateur allume correctement l'interrupteur, les LED doivent commencer à alterner plus rapidement et l'affichage doit monter d'un niveau. Le schéma fonctionnel peut sembler un peu fou, mais c'est parce qu'il y a beaucoup de signaux qui sont établis dans un certain processus et ensuite ce signal définit un autre signal dans un autre bloc de processus.

En fin de compte, les seules entrées que le jeu prend sont l'horloge d'entrée sur la carte Basys3 qui fonctionne à 100 Mhz, sept commutateurs sur la carte Basys3 et le bouton de réinitialisation. Ce qui est sorti est l'anode pour l'affichage à sept segments, les sept segments pour l'affichage et les LED.

Étape 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Ce sous-module diviseur d'horloge a créé une horloge plus lente en fonction de la valeur que nous lui avons mappée dans notre fichier principal. Nous avons utilisé ce sous-module pour déterminer Clk400, PushClk et newlck. Ce sous-module prend une horloge et un diviseur 32 bits comme entrées. Une horloge ralentie est émise. Il y a un bloc de processus pour le diviseur et l'horloge ralentie. Dans le processus, il y a une variable temporaire, que nous avons appelée count, qui compte un à chaque fois qu'un front montant de l'horloge entrée est atteint. Une fois qu'il atteint le nombre de diviseur, l'horloge ralentie bascule et le compte est remis à zéro.

Étape 5: Bloc de processus de décalage

Bloc de processus de décalage
Bloc de processus de décalage

Le bloc de processus Shift contrôle le mouvement alternatif et la vitesse des LED. Dans la liste de sensibilité se trouvent les signaux newclk et Stop. L'arrêt provoque un bref délai lorsque l'utilisateur passe le niveau. Si Stop n'est pas élevé, les LED alternent normalement en fonction de la vitesse de newclk. Ce modèle d'alternance est contrôlé par deux variables: Track et count. Count détermine quelle LED doit être allumée, tandis que Track détermine si count doit être compté vers le haut ou vers le bas. Il existe un autre signal, Final, qui s'applique uniquement lorsque le niveau est « 111 », indiquant que le joueur a terminé la partie. Final alterne entre 0 et 1 à chaque front d'horloge pour allumer et éteindre les LED en continu. Ceci est juste un élément visuel pour l'affichage final.

Ce processus de changement est le point de départ idéal pour ce projet. Si vous pouvez faire alterner vos LED correctement et de manière cohérente, alors à partir de là, il vous suffit d'ajouter le comportement lors de la mise à niveau !

Étape 6: Machine à états finis

Machine à états finis
Machine à états finis

Nous avons créé une machine à états finis pour dicter le comportement lorsque le commutateur d'entrée ou le bouton de réinitialisation est enfoncé. Chaque état est un « niveau » et si le commutateur est activé au mauvais moment ou si la réinitialisation est enfoncée, le niveau revient à « 000 ». Sinon, si l'interrupteur est correctement activé, le niveau monte jusqu'à ce qu'il atteigne l'état final, « 111 » et l'affichage de fin se produit. Le FSM est basé sur les deux blocs de processus sync_proc et comb_proc. Sync_proc utilise l'horloge que nous avons appelée PushClk. Cette horloge contrôle à quelle vitesse l'état suivant devient l'état actuel. Cette horloge devrait être assez rapide; nous avons choisi une vitesse environ deux fois plus rapide que notre vitesse LED la plus rapide.

Nous avons implémenté ce code en utilisant un FSM pour les niveaux; Cependant, après ce projet, nous avons réalisé qu'une utilisation plus efficace d'un FSM aurait pu être d'avoir un état de comptage, un état de réinitialisation ou un état de séjour. Si rien n'est pressé, il est à l'état de séjour. Si la réinitialisation est enfoncée ou si le lecteur est en panne, il est en état de réinitialisation. S'il est correctement enfoncé, il est dans l'état de comptage. Il existe également de nombreuses autres façons d'utiliser un FSM dans ce jeu !

Étape 7: Contrôle du bloc de processus d'affichage avec le niveau

Contrôle du bloc de processus d'affichage avec niveau
Contrôle du bloc de processus d'affichage avec niveau

Le niveau contrôle le bloc de processus d'affichage. Les variables de la liste de sensibilité sont Level, Reset et Clk400. L'affichage à 7 segments commence par afficher « 1 » pour le premier niveau. Il compte jusqu'à 7 à chaque fois que l'utilisateur passe un niveau pour montrer à l'utilisateur à quel niveau il se trouve. Une fois que l'utilisateur a passé le niveau 7, il affiche « COOL » pour signifier que le joueur a terminé la partie. Cet affichage « COOL » fonctionne avec une horloge à 400 Hz que nous avons appelée Clk400. Si vous appuyez sur Reset, l'affichage revient à « 1 ».

Étape 8: Contrôle de la vitesse des LED avec le niveau

Contrôle de la vitesse des LED avec le niveau
Contrôle de la vitesse des LED avec le niveau

Enfin, Level contrôle la vitesse des LED. Le niveau est le seul signal de la liste de sensibilité. D1 est le signal qui entre dans le processus Clock Divider pour obtenir newclk. Chaque fois que le niveau est modifié ou que l'état change, le bloc de processus « Vitesse ». Ce processus détermine la valeur de D1. Il y a 8 valeurs définies de D1 que nous avons choisies en fonction de la vitesse à laquelle nous voulions que chaque niveau s'exécute. D1 devient plus petit à chaque fois que le niveau augmente afin que le newclk s'exécute plus rapidement.

Étape 9: Assemblage du matériel

Assemblage du matériel
Assemblage du matériel

Nous avons connecté la maquette au Basys3 avec l'un des connecteurs pmod. Six des ports pmod ont été utilisés pour brancher un connecteur mâle à mâle, un pour la masse et les cinq autres pour les 5 LED. Nous avons également placé une résistance pour chaque LED. Ces résistances sont de 220Ω et empêchent les LED d'être court-circuitées et grillées. Bien que chaque LED ait une certaine résistance, la résistance n'est pas suffisante pour empêcher la tension de la source.

Étape 10: Amusez-vous

Ce jeu est très facile à jouer. Le joueur démarre sur l'interrupteur 1 à l'extrême droite du plateau, V17. Ils doivent basculer l'interrupteur vers le haut lorsque la LED du milieu est allumée. Ils déplacent ensuite un interrupteur vers la gauche et font la même chose ! Si le joueur arrive à la fin, il se retrouvera sur le septième interrupteur, W14. S'ils battent le jeu, ils peuvent voir un affichage de fin vraiment amusant !

Quelque chose à noter est que lors de la création de ce jeu, les vitesses dépendent totalement de vous ! Si les vitesses que nous avons choisies sont trop lentes, n'hésitez pas à les accélérer et à les rendre encore plus difficiles ! Il n'y a pas non plus de nombre défini de niveaux. Si vous voulez qu'il ait encore plus de niveaux, il y a des modifications qui doivent être apportées au FSM et aux blocs de processus déterminés par Level, mais ce sont des changements très simples.

Nous avons également choisi d'utiliser des commutateurs sur la carte comme entrée utilisateur, mais cela est également possible avec un bouton sur la carte Basys3; le bouton éliminera le besoin de réinitialiser les commutateurs chaque fois que l'utilisateur recommence. Nous avons initialement utilisé un bouton, mais cela provoquait des erreurs dans la définition du niveau car il sauterait de plusieurs niveaux si deux fronts montants de PushClk étaient touchés lorsque le bouton était maintenu enfoncé.

Vous trouverez ci-dessous une vidéo montrant comment jouer, en passant par les 4 premiers niveaux et l'affichage final.

Le fichier principal de ce projet est inclus ci-dessous.

Sources

Manuel de référence Basys3

Inspiration pour le projet - Arduino Stop It game

Conseillé: