Indholdsfortegnelse:

FPGA -reaktionsspil: 10 trin
FPGA -reaktionsspil: 10 trin

Video: FPGA -reaktionsspil: 10 trin

Video: FPGA -reaktionsspil: 10 trin
Video: How to Begin a Simple FPGA Design 2024, November
Anonim
FPGA -reaktionsspil
FPGA -reaktionsspil

Af Summer Rutherford og Regita Soetandar

Trin 1: Introduktion

Til vores sidste projekt for CPE 133 designede vi et reaktionsspil i VHDL til et Basys3 -bord. Dette spil kan nærmest sammenlignes med arkadespillet "Stacker", hvor spilleren skal tabe blokkene på det rigtige tidspunkt. Basys3 -kortet er forbundet til et brødbræt, som har de skiftende lysdioder. Disse LED -lys skifter med en bestemt frekvens, afhængigt af niveauet. Dette spil bruger urdeleren og det 4 -cifrede 7 -segment display, samt en finite state -maskine. Når spilleren aktiverer den korrekte switch, når den midterste LED lyser, går spilleren videre til det næste niveau i spillet og øger frekvensen af de skiftende LED'er. Dette gør hvert successive niveau sværere end det foregående niveau. Når spilleren med succes slår niveau 7, det højeste niveau, vises der en meddelelse på segmentdisplayet, og alle LED'er blinker samtidigt til og fra.

Trin 2: Materialer

Materialer
Materialer
Materialer
Materialer
Materialer
Materialer

De materialer, du skal bruge, er:

  • Digilent Basys3 -kort med mikro -USB -kabel
  • Brødbræt
  • 5 lysdioder
  • 5 modstande (vi brugte 220 ohm)
  • 11 springtråde
  • Computer med Vivado

Trin 3: Diagram med sort kasse på øverste niveau

Top Level Diagram Black Box Design
Top Level Diagram Black Box Design
Top Level Diagram Black Box Design
Top Level Diagram Black Box Design

Som du kan se, starter vores blokdiagram på øverste niveau med at hente de nødvendige ure fra vores submodul, ClkDivide. Disse ure er input til de forskellige procesblokke. I det væsentlige skal spillet erkende, at når en bruger tænder kontakten korrekt, skal lysdioderne begynde at skifte hurtigere, og displayet skal op et niveau. Blokdiagrammet ser måske lidt skørt ud, men det er fordi der er mange signaler, der etableres i en bestemt proces, og derefter definerer det signal et andet signal i en anden procesblok.

I sidste ende er de eneste input, spillet tager, input -uret på Basys3 -kortet, der kører på 100 Mhz, syv switche på Basys3 -kortet og reset -knappen. Det, der udsendes, er anoden til det syv segment display, de syv segmenter til displayet og LED'erne.

Trin 4: CLKDivide

CLKDel
CLKDel
CLKDel
CLKDel
CLKDel
CLKDel

Denne uropdeler -submodul skabte et langsommere ur afhængigt af den værdi, vi har tilknyttet det i vores hovedfil. Vi brugte denne submodul til at bestemme Clk400, PushClk og newlck. Denne submodul tager et ur og en 32 bit divider som input. Et sænket ur udsendes. Der er en procesblok til skillelinjen og det sænkede ur. I processen er en midlertidig variabel, som vi kaldte count, der tæller en hver gang en stigende kant af det indførte ur bliver ramt. Når det når divisortallet, skiftede det sænkede ur og tællingen nulstilles til nul.

Trin 5: Skift procesblok

Skift procesblok
Skift procesblok

Shift -procesblokken styrer lysdiodernes skiftende bevægelse og hastighed. På følsomhedslisten er newclk og Stop signaler. Stop forårsager en kort forsinkelse, når brugeren passerer niveauet. Hvis Stop ikke er højt, skifter lysdioderne som normalt baseret på hastigheden på newclk. Dette vekslende mønster styres af to variabler: Track and count. Count bestemmer hvilken LED der skal være tændt, mens Track bestemmer om count skal tælle op eller ned. Der er et andet signal, Final, der kun gælder, når niveauet er "111", hvilket indikerer, at spilleren har slået spillet. Final skifter mellem 0 og 1 hver urkant for at tænde og slukke lysdioderne kontinuerligt. Dette er blot et visuelt element til den endelige visning.

Denne skiftproces er det perfekte sted at starte for dette projekt. Hvis du kan få dine lysdioder til at skifte korrekt og konsekvent, så skal du herfra bare tilføje adfærd, når du nivellerer!

Trin 6: Finite State Machine

Finite State Machine
Finite State Machine

Vi skabte en Finite State Machine til at diktere adfærden, når der trykkes på inputkontakten eller nulstillingsknappen. Hver tilstand er et "niveau", og hvis kontakten tændes på det forkerte tidspunkt eller der trykkes på nulstilling, vender niveauet tilbage til "000." Ellers, hvis kontakten er korrekt tændt, bevæger niveauet sig, indtil det når den endelige tilstand, "111", og slutvisningen vises. FSM er baseret på de to procesblokke sync_proc og comb_proc. Sync_proc bruger det ur, som vi kaldte PushClk. Dette ur styrer, hvor hurtigt den næste tilstand bliver den nuværende tilstand. Dette ur skal være ret hurtigt; vi valgte en hastighed, der var cirka to gange hurtigere end vores hurtigste LED -hastighed.

Vi implementerede denne kode ved hjælp af en FSM til niveauerne; efter dette projekt indså vi imidlertid, at en mere effektiv brug af en FSM kunne have været at have en optællingstilstand, en nulstillingstilstand eller en opholdstilstand. Hvis der ikke trykkes på noget, er det i opholdstilstand. Hvis der trykkes på nulstilling eller afspilleren ødelægger, er den i nulstillingstilstand. Hvis den trykkes korrekt, er den i optællingstilstanden. Der er også mange andre måder at bruge en FSM i dette spil!

Trin 7: Kontrol af displayprocesblok med niveau

Kontrol af displayprocesblok med niveau
Kontrol af displayprocesblok med niveau

Niveau styrer displayprocesblokken. Variablerne i følsomhedslisten er Niveau, Nulstil og Clk400. Displayet med 7 segmenter starter med at vise '1' for det første niveau. Det tæller op til 7, hver gang brugeren passerer et niveau for at vise brugeren, hvilket niveau de er på. Når brugeren har passeret niveau 7, viser den “COOL” for at angive, at spilleren har slået spillet. Denne “COOL” display kører ud af et 400 Hz ur, som vi kaldte Clk400. Hvis der trykkes på Reset, går displayet tilbage til “1.”

Trin 8: Kontrol af LED -hastighed med niveau

Kontrol af LED -hastighed med niveau
Kontrol af LED -hastighed med niveau

Endelig kontrollerer Level hastigheden på lysdioderne. Niveau er det eneste signal i følsomhedslisten. D1 er det signal, der går ind i Clock Divider -processen for at få newclk. Hver gang niveau ændres, eller staten ændres, blokerer procesblokken "hastighed". Denne proces bestemmer værdien af D1. Der er 8 definerede værdier af D1, som vi valgte baseret på, hvor hurtigt vi ønskede, at hvert niveau skulle køre. D1 bliver mindre for hver gang niveauet stiger, så newclk kører hurtigere.

Trin 9: Hardware -samling

Hardware samling
Hardware samling

Vi sluttede brødbrættet til Basys3 med et af pmod -stik. Seks af pmod -portene blev brugt til at tilslutte et han -til -han -stik, en til jord og de andre fem til de 5 lysdioder. Vi placerede også en modstand for hver LED. Disse modstande er 220Ω og forhindrer lysdioderne i at blive kortsluttet og brændt ud. Selvom hver LED har en vis modstand, er modstanden ikke nok til at hæmme spændingen fra kilden.

Trin 10: God fornøjelse

Dette spil er meget let at spille. Spilleren starter på kontakten yderst til højre 1 på brættet, V17. De skal vende kontakten højt, når den midterste LED er tændt. De flytter derefter en kontakt til venstre og gør det samme! Hvis spilleren gør det til enden, ender de på den syvende switch, W14. Hvis de slår spillet, får de se et virkelig sjovt slutdisplay!

Noget at bemærke er, at når du opretter dette spil, er hastighederne helt op til dig! Hvis de hastigheder, vi har valgt, er for langsomme, er du velkommen til at fremskynde det og gøre det endnu mere udfordrende! Der er heller ikke et bestemt antal niveauer. Hvis du vil få det til at have endnu flere niveauer, er der ændringer, der skal foretages i FSM og procesblokkene bestemt af niveau, men det er meget enkle ændringer.

Vi valgte også at bruge kontakter på kortet som brugerinput, men dette er også muligt med en knap på Basys3 -kortet; knappen fjerner behovet for at nulstille kontakterne hver gang brugeren starter forfra. Vi brugte oprindeligt en knap, men dette forårsagede fejl i definitionen af niveauet, fordi det ville hoppe flere niveauer, hvis to stigende kanter på PushClk blev ramt, når knappen blev holdt nede.

Nedenfor er en video, der demonstrerer, hvordan man spiller, gennemgår de første 4 niveauer og det sidste afsluttende display.

Hovedfilen til dette projekt er inkluderet nedenfor.

Kilder

Basys3 reference manual

Inspiration til projekt - Arduino Stop It -spil

Anbefalede: