Cuprins:

Joc de reacție FPGA: 10 pași
Joc de reacție FPGA: 10 pași

Video: Joc de reacție FPGA: 10 pași

Video: Joc de reacție FPGA: 10 pași
Video: 10 SFATURI PENTRU MENȚINEREA FUNCȚIEI CREIERULUI ȘI PĂSTRAREA LUI ÎNTR-O FORMĂ BUNĂ PENTRU MULT TIMP 2024, Iulie
Anonim
Joc de reacție FPGA
Joc de reacție FPGA

De Summer Rutherford și Regita Soetandar

Pasul 1: Introducere

Pentru proiectul nostru final pentru CPE 133, am proiectat un joc de reacție în VHDL pentru o placă Basys3. Acest joc poate fi cel mai strâns comparat cu jocul arcade „Stacker”, unde jucătorul trebuie să arunce blocurile la momentul potrivit. Placa Basys3 este conectată la o placă de măsurare, care are LED-uri alternative. Aceste lumini LED vor alterna la o anumită frecvență, în funcție de nivel. Acest joc folosește divizorul de ceas și afișajul cu 4 cifre din 7 segmente, precum și o mașină cu stări finite. Când jucătorul activează comutatorul corect pe măsură ce LED-ul din mijloc se aprinde, jucătorul va avansa la următorul nivel al jocului, crescând frecvența LED-urilor alternative. Acest lucru face ca fiecare nivel succesiv să fie mai greu decât nivelul anterior. Când jucătorul bate cu succes nivelul 7, cel mai înalt nivel, un mesaj va fi afișat pe afișajul segmentului și toate LED-urile vor clipi simultan aprinse și stinse.

Pasul 2: Materiale

Materiale
Materiale
Materiale
Materiale
Materiale
Materiale

Materialele de care veți avea nevoie sunt:

  • Placă Digilent Basys3 cu cablu micro USB
  • Pană de pâine
  • 5 LED-uri
  • 5 rezistențe (am folosit 220 ohmi)
  • 11 fire jumper
  • Computer cu Vivado

Pasul 3: Diagrama de nivel superior Proiectare cutie neagră

Diagrama de nivel superior Proiectare cutie neagră
Diagrama de nivel superior Proiectare cutie neagră
Diagrama de nivel superior Proiectare cutie neagră
Diagrama de nivel superior Proiectare cutie neagră

După cum puteți vedea, diagrama noastră bloc de nivel superior începe prin obținerea ceasurilor necesare din submodulul nostru, ClkDivide. Aceste ceasuri sunt intrări în diferitele blocuri de proces. În esență, jocul trebuie să recunoască faptul că atunci când un utilizator pornește corect comutatorul, LED-urile trebuie să înceapă să se alterneze mai repede și afișajul trebuie să urce cu un nivel. Diagrama bloc ar putea părea puțin nebună, dar asta pentru că există multe semnale care sunt stabilite într-un anumit proces și apoi acel semnal definește un alt semnal într-un alt bloc de proces.

În cele din urmă, singurele intrări pe care le ia jocul sunt ceasul de intrare de pe placa Basys3 care rulează la 100 Mhz, șapte comutatoare pe placa Basys3 și butonul de resetare. Ceea ce se produce este anodul pentru afișajul cu șapte segmente, cele șapte segmente pentru afișaj și LED-urile.

Pasul 4: CLKDivide

CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide
CLKDivide

Acest submodul divizor de ceas a creat un ceas mai lent, în funcție de valoarea pe care am mapat-o în fișierul nostru principal. Am folosit acest submodul pentru a determina Clk400, PushClk și newlck. Acest submodul ia ca intrări un ceas și un divizor pe 32 de biți. Se produce un ceas încetinit. Există un bloc de proces pentru divizor și ceasul încetinit. În proces este o variabilă temporară, pe care am numit-o numărare, care se numără una de fiecare dată când este lovită o margine ascendentă a ceasului introdus. Odată ce a ajuns la numărul divizorului, ceasul încetinit s-a comutat și contorul se resetează la zero.

Pasul 5: Shift Process Block

Shift Process Block
Shift Process Block

Blocul de proces Shift controlează mișcarea alternativă și viteza LED-urilor. În lista de sensibilitate sunt semnalele newclk și Stop. Oprirea provoacă o scurtă întârziere când utilizatorul trece nivelul. Dacă Stop nu este ridicat, atunci LED-urile alternează normal în funcție de viteza newclk. Acest model alternativ este controlat de două variabile: Urmărire și numărare. Numărul determină ce LED trebuie să fie aprins, în timp ce Track determină dacă numărătoarea trebuie să fie numărătoare sus sau jos. Există un alt semnal, Final, care se aplică numai atunci când nivelul este „111”, indicând faptul că jucătorul a învins jocul. Finalul alternează între 0 și 1 la fiecare margine de ceas pentru a porni și a stinge LED-urile continuu. Acesta este doar un element vizual pentru afișarea finală.

Acest proces de schimbare este locul perfect pentru a începe acest proiect. Dacă puteți obține LED-urile dvs. alternând corect și consecvent, atunci de aici trebuie doar să adăugați comportamentul la ridicarea nivelului!

Pasul 6: Mașină de stat finit

Mașină de stat finit
Mașină de stat finit

Am creat o mașină de stare finită pentru a dicta comportamentul atunci când este apăsat comutatorul de intrare sau butonul de resetare. Fiecare stare este un „nivel” și dacă comutatorul este pornit la momentul greșit sau resetarea este apăsată, nivelul revine la „000”. În caz contrar, dacă comutatorul este corect pornit, atunci nivelul se deplasează în sus până ajunge la starea finală, „111” și apare afișajul final. FSM se bazează pe cele două blocuri de proces sync_proc și comb_proc. Sync_proc folosește ceasul pe care l-am numit PushClk. Acest ceas controlează cât de repede starea următoare devine starea actuală. Acest ceas ar trebui să fie destul de rapid; am ales o viteză care a fost de aproximativ două ori mai rapidă decât cea mai rapidă viteză LED.

Am implementat acest cod folosind un FSM pentru niveluri; totuși, după acest proiect, am realizat că o utilizare mai eficientă a unui FSM ar fi putut avea o stare de contorizare, o stare de resetare sau o stare de staționare. Dacă nu este apăsat nimic, acesta se află în starea de ședere. Dacă resetarea este apăsată sau playerul este deranjat, aceasta se află în starea de resetare. Dacă este apăsat corect, acesta se află în starea de numărare în sus. Există multe alte modalități de a utiliza un FSM și în acest joc!

Pasul 7: Controlul blocului procesului de afișare cu nivel

Controlul blocului procesului de afișare cu nivel
Controlul blocului procesului de afișare cu nivel

Nivelul controlează blocul procesului de afișare. Variabilele din lista de sensibilitate sunt Level, Reset și Clk400. Afișajul pe 7 segmente începe prin afișarea „1” pentru primul nivel. Numără până la 7 de fiecare dată când utilizatorul trece un nivel pentru a-i arăta utilizatorului la ce nivel se află. Odată ce utilizatorul a trecut nivelul 7, acesta afișează „COOL” pentru a semnifica faptul că jucătorul a învins jocul. Acest afișaj „COOL” rulează dintr-un ceas de 400 Hz pe care l-am numit Clk400. Dacă Reset este apăsat, afișajul revine la „1.”

Pasul 8: Controlul vitezei LED-ului cu nivelul

Controlul vitezei LED-ului cu nivel
Controlul vitezei LED-ului cu nivel

În cele din urmă, Level controlează viteza LED-urilor. Nivelul este singurul semnal din lista de sensibilitate. D1 este semnalul care intră în procesul Clock Divider pentru a obține newclk. De fiecare dată când Nivelul este modificat sau starea se modifică, blocul de proces „Viteză”. Acest proces determină valoarea lui D1. Există 8 valori definite pentru D1 pe care le-am ales în funcție de cât de repede am vrut să ruleze fiecare nivel. D1 devine mai mic de fiecare dată când nivelul crește, astfel încât newclk să ruleze mai repede.

Pasul 9: Asamblare hardware

Asamblare hardware
Asamblare hardware

Am conectat placa de bază la Basys3 cu unul dintre conectorii pmod. Șase dintre porturile pmod au fost utilizate pentru a conecta un conector tată la tată, unul pentru masă și celelalte cinci pentru cele 5 LED-uri. De asemenea, am amplasat un rezistor pentru fiecare LED. Aceste rezistențe sunt de 220Ω și împiedică scurtcircuitul și arderea LED-urilor. Deși fiecare LED are o anumită rezistență, rezistența nu este suficientă pentru a împiedica tensiunea de la sursă.

Pasul 10: Distrează-te

Acest joc este foarte ușor de jucat. Jucătorul pornește pe butonul 1 din dreapta al tabloului, V17. Acestea trebuie să întoarcă comutatorul în sus când LED-ul din mijloc este aprins. Apoi mișcă un comutator spre stânga și fac același lucru! Dacă jucătorul ajunge la final, vor ajunge pe al șaptelea comutator, W14. Dacă înving jocul, vor vedea un final extrem de distractiv!

Ceva de remarcat este că, atunci când creați acest joc, viteza depinde de dvs.! Dacă viteza pe care am ales-o este prea lentă, nu ezitați să o accelerați și să o faceți și mai provocatoare! De asemenea, nu există un număr stabilit de niveluri. Dacă doriți să faceți ca acesta să aibă și mai multe niveluri, trebuie făcute modificări la FSM și la blocurile de proces determinate de Nivel, dar acestea sunt modificări foarte simple.

De asemenea, am ales să folosim comutatoare de pe placa ca intrare de utilizator, dar acest lucru este posibil și cu un buton de pe placa Basys3; butonul va elimina necesitatea de a reseta comutatoarele de fiecare dată când utilizatorul reia. Am folosit inițial un buton, cu toate acestea, acest lucru a cauzat erori în definirea nivelului, deoarece ar sari mai multe niveluri dacă două margini ascendente ale PushClk ar fi lovite atunci când butonul a fost ținut apăsat.

Mai jos este un videoclip care demonstrează cum să joci, parcurgând primele 4 niveluri și afișarea finală finală.

Fișierul principal pentru acest proiect este inclus mai jos.

Surse

Manual de referință Basys3

Inspirație pentru proiect - jocul Arduino Stop It

Recomandat: