Cuprins:

Joc FPGA Asteroid: 7 pași (cu imagini)
Joc FPGA Asteroid: 7 pași (cu imagini)

Video: Joc FPGA Asteroid: 7 pași (cu imagini)

Video: Joc FPGA Asteroid: 7 pași (cu imagini)
Video: SquareLED Intermezzo - 3in1 Effect LED Bar BEAM - STROBE - LED STRIPE 2024, Noiembrie
Anonim
FPGA Asteroid Game
FPGA Asteroid Game

Pentru proiectul nostru final CPE 133, am decis să creăm un joc de asteroizi pe FPGA folosind două butoane și afișajul pe 7 segmente. Jocul funcționează astfel încât un asteroid să apară într-unul din cele trei rânduri selectate aleatoriu și să se îndrepte spre navă pe cealaltă parte a afișajului cu 7 segmente. Butonul superior și butonul inferior pot fi folosiți pentru a vă deplasa nava din calea asteroidului. În caz contrar, pe ecran se afișează „BAnG” pentru o clipă și apoi repornește rapid jocul, astfel încât utilizatorul să poată încerca din nou. Ceea ce urmează este o scurtă descriere a modului în care a fost realizat proiectul, astfel încât orice utilizator să poată reproduce sau îmbunătăți designul nostru.

Pasul 1: Prezentare generală

Prezentare generală
Prezentare generală
Prezentare generală
Prezentare generală

Proiectul constă în mare parte din mașini de stat finit (FSM), care utilizează logica pentru a transfera FPGA între state care stochează și afișează diferite valori ale pozițiilor navei și ale stâncii. Cele două module majore sunt FSM-urile de joc pentru rock and ship și decodarul de afișare binară pe 7 segmente FSM, care sunt integrate împreună utilizând un model structural foarte simplu în VHDL.

FSM-urile au fost create pentru poziția navei, poziția rocii și pentru decodorul cu 7 segmente. Scopul FSM al navei este ca nava să se poată deplasa în poziția corectă atunci când jucătorul apasă un buton sus sau jos. FSM este necesar deoarece trebuie să-și amintească în ce poziție a fost ultima pentru a trece la poziția corectă.

Scopul FSM al pietrei este de a muta piatra în poziția corectă în funcție de rândul în care se află și ultima poziție din rândul respectiv. În plus, ține evidența poziției modulului care îl va afișa și alege pseudo-aleatoriu un rând nou pentru a apărea pe următorul.

FSM pentru decodorul de afișare pe 7 segmente a fost folosit nu numai pentru a afișa nava și stânca, ci și pentru a afișa „BAnG” atunci când poziția navei și poziția stâncii sunt aceleași.

Pasul 2: Materiale

Materialele utilizate în proiect au fost:

  • Consiliul de dezvoltare Basys3 de la Digilent, Inc.
  • Vivado Design Suite
  • sseg_dec.vhd (Acest fișier ne-a fost furnizat pe Polylearn și a fost scris de Bryan Mealy)
  • Clk_div.vhd (Acest fișier ne-a fost furnizat pe Polylearn și a fost scris de Bryan Mealy)
  • Trei mașini cu stat finit (FSM)

Pasul 3: Realizarea jocului

Realizarea jocului
Realizarea jocului
Realizarea jocului
Realizarea jocului
Realizarea jocului
Realizarea jocului
Realizarea jocului
Realizarea jocului

Modulul de joc a fost creat prin utilizarea modelării comportamentale pentru a descrie stările navei și ale rocii pentru propriile FSM-uri respective. Avantajul este că este mult mai ușor să modelați circuitul comportamental, descriind ceea ce face, mai degrabă decât să aflați toate componentele necesare pentru proiectarea hardware-ului.

Stările stâncii au fost realizate folosind un generator de numere pseudo-aleatorii pentru prima poziție a stâncii. Pentru a realiza acest lucru, am dat generatorului propriul ceas, care a fost extrem de rapid în raport cu viteza jocului. Pe fiecare margine ascendentă, se crește un număr de trei biți, iar toate valorile sale corespund uneia dintre cele trei stări de pornire pentru navă. Prin urmare, trei valori corespund poziției 3 (dreapta sus), trei corespund poziției 7 (centru) și două corespund poziției 11 (dreapta jos).

Odată ce s-a produs generația aleatorie și asteroidului i s-a dat o stare inițială, acesta curge orizontal către navă fără întrerupere.

0 ← 1 ← 2 ← 3

4 ← 5 ← 6 ← 7

11 ← 10 ← 9 ← 8

Ceasul folosit pentru logica stării următoare a stâncii controlează viteza jocului; am constatat prin încercări și erori că 9999999 este o valoare bună pentru numărul său maxim.

Logica navei funcționează inițializând în poziția centrală (poziția 4) din extrema stângă. Dacă butonul superior sau butonul inferior sunt apăsate, nava se va deplasa în sus și în jos în poziția 0 și 11 corespunzătoare butonului care a fost apăsat.

Pentru ca mișcarea navei să se simtă bine pentru utilizator, nu am făcut mișcarea sa asincronă. Am folosit un ceas pentru modificările sale de stare și am folosit un număr maxim de 5555555.

Pasul 4: Afișarea rezultatului

Decodorul binar în 7 segmente preia variabilele de poziție pe 4 biți pentru navă și asteroid și afișează imaginea corespunzătoare (fie nava și stânca, fie mesajul „BAnG”).

Se realizează acest lucru verificând mai întâi dacă cele două sunt egale și apoi afișând mesajul „BAnG” dacă verificarea revine adevărată.

Dacă nu revine adevărat, decodorul va afișa nava și stânca, comutând între ele la o frecvență de ceas foarte mare și păcălind ochii să le vadă ca și cum ar fi afișate în același timp.

Pasul 5: Puneți totul împreună

Punând totul împreună
Punând totul împreună

Am cuprins FSM-ul navei și al pietrei într-un singur FSM mare pe care l-am conectat la afișajul FSM. Intrările în joc sunt butonul sus și butonul jos de pe placa BASYS3 și ceasul sistemului. Ieșirile sunt vectorii de segment și anod de afișare a șapte segmente.

Aceste intrări și ieșiri vor fi văzute în fișierul de constrângeri unde sunt mapate port.

Pasul 6: Modificări viitoare

În viitor, adăugarea mai multor funcționalități de deplasare a navei la proiect ar fi o îmbunătățire. Acest lucru poate fi realizat pur și simplu oferind încă 2 intrări de butoane și permițând navei să ia poziții (stări), altele decât 0, 4 și 8. O altă posibilă modificare ar putea fi controlul următorului moment al asteroidului, astfel încât acesta să înceapă încet și să crească viteza cu De 1,5 ori de fiecare dată când pierde nava până când primește o lovitură, unde ar reporni și va deveni din nou lent. Acest lucru ar crește dificultatea jocului și l-ar face mai distractiv pentru utilizator dacă ar fi implementat, și ar putea fi realizat prin crearea unei variabile pentru numărul maxim al următorului ceas de stare al rocii, multiplicând acea variabilă cu 1,5 de fiecare dată când asteroidul nu Nu s-a lovit și a-l readuce la valoarea inițială de fiecare dată când lovește stânca.

Pasul 7: Concluzie

Acest proiect ne-a ajutat să înțelegem mai bine mașinile cu stări finite, ceasurile și afișarea interactivă pe afișajele cu șapte segmente.

Cel mai mare lucru despre mașinile cu stări finite este că este important să știți (să vă amintiți) în ce stare vă aflați în prezent pentru a trece la următoarea stare dorită. În mod ironic, sfaturi bune de viață; trebuie să știi unde ești pentru a ști unde te duci.

Prin manipularea diferitelor instanțe de ceasuri, am reușit să generăm aleatoriu numere, să mutăm stânca în următoarea poziție și să gestionăm afișarea navei, stânca și mesajul de la sfârșitul jocului.

Am aflat că mai mult de un anod nu poate fi afișat în același timp. Modulul care ni s-a oferit a profitat că ochiul uman nu poate vedea diferența decât până la o anumită frecvență. Deci a fost aleasă o frecvență mai mare de comutare a anodilor. Nava și stânca văzute în același timp sunt de fapt o aluzie, deoarece fiecare este afișată separat, dar foarte repede. Acest concept a fost aplicat pentru a afișa mișcarea navei, a stâncii și a mesajului „BAnG”.

Recomandat: