Inhoudsopgave:

FPGA-reactiespel: 10 stappen
FPGA-reactiespel: 10 stappen

Video: FPGA-reactiespel: 10 stappen

Video: FPGA-reactiespel: 10 stappen
Video: Голубая стрела (1958) фильм 2024, November
Anonim
FPGA-reactiespel
FPGA-reactiespel

Door Summer Rutherford en Regita Soetandar

Stap 1: Inleiding

Voor ons afstudeerproject voor CPE 133 hebben we een reactiespel in VHDL ontworpen voor een Basys3-bord. Dit spel kan het beste worden vergeleken met het arcadespel "Stacker" waarbij de speler de blokken op het juiste moment moet laten vallen. Het Basys3-bord is aangesloten op een breadboard, dat is voorzien van afwisselende LED's. Deze LED-lampjes wisselen elkaar af op een bepaalde frequentie, afhankelijk van het niveau. Deze game maakt gebruik van de klokverdeler en het 4-cijferige 7-segmentsdisplay, evenals een eindige-toestandsmachine. Wanneer de speler de juiste schakelaar activeert terwijl de middelste LED oplicht, gaat de speler door naar het volgende niveau van het spel, waarbij de frequentie van de afwisselende LED's wordt verhoogd. Dit maakt elk volgend niveau moeilijker dan het vorige niveau. Wanneer de speler niveau 7, het hoogste niveau, met succes verslaat, verschijnt er een bericht op het segmentdisplay en knipperen alle LED's tegelijkertijd aan en uit.

Stap 2: Materialen

Materialen
Materialen
Materialen
Materialen
Materialen
Materialen

De materialen die je nodig hebt zijn:

  • Digilent Basys3-bord met micro-USB-kabel
  • Breadboard
  • 5 LED's
  • 5 weerstanden (we gebruikten 220 ohm)
  • 11 jumperdraden
  • Computer met Vivado

Stap 3: Black Box-ontwerp op het hoogste niveau

Diagram op het hoogste niveau Black Box-ontwerp
Diagram op het hoogste niveau Black Box-ontwerp
Diagram op het hoogste niveau Black Box-ontwerp
Diagram op het hoogste niveau Black Box-ontwerp

Zoals je kunt zien, begint ons blokdiagram op het hoogste niveau met het ophalen van de vereiste klokken uit onze submodule, ClkDivide. Deze klokken zijn inputs in de verschillende procesblokken. In wezen moet het spel erkennen dat wanneer een gebruiker de schakelaar correct aanzet, de LED's sneller moeten gaan wisselen en het display één niveau omhoog moet. Het blokschema ziet er misschien een beetje gek uit, maar dat komt omdat er veel signalen zijn die in een bepaald proces tot stand komen en dat signaal vervolgens een ander signaal definieert in een ander procesblok.

Uiteindelijk zijn de enige inputs die het spel nodig heeft de inputklok op het Basys3-bord die op 100 Mhz loopt, zeven schakelaars op het Basys3-bord en de resetknop. Wat wordt uitgevoerd, is de anode voor het zevensegmentendisplay, de zeven segmenten voor het display en de LED's.

Stap 4: CLKVerdelen

CLKVerdelen
CLKVerdelen
CLKVerdelen
CLKVerdelen
CLKVerdelen
CLKVerdelen

Deze klokverdeler-submodule creëerde een langzamere klok, afhankelijk van de waarde die we eraan hebben toegewezen in ons hoofdbestand. We hebben deze submodule gebruikt om Clk400, PushClk en newlck te bepalen. Deze submodule heeft een klok en een 32-bits deler als invoer. Een vertraagde klok wordt uitgevoerd. Er is een procesblok voor de verdeler en de vertraagde klok. In het proces is een tijdelijke variabele, die we count noemden, die elke keer dat een stijgende flank van de ingevoerde klok wordt geraakt, één optelt. Zodra het het delernummer bereikt, schakelt de vertraagde klok om en wordt de telling teruggezet naar nul.

Stap 5: Verschuif procesblok

Shift Proces Blok
Shift Proces Blok

Het procesblok Shift regelt de afwisselende beweging en snelheid van de LED's. In de gevoeligheidslijst staan de newclk- en stop-signalen. Stop veroorzaakt een korte vertraging wanneer de gebruiker het niveau passeert. Als Stop niet hoog is, wisselen de LED's normaal af op basis van de snelheid van newclk. Dit afwisselende patroon wordt bepaald door twee variabelen: Track en count. Count bepaalt welke LED moet branden, terwijl Track bepaalt of de count omhoog of omlaag moet worden geteld. Er is nog een ander signaal, Final, dat alleen van toepassing is als het niveau "111" is, wat aangeeft dat de speler het spel heeft verslagen. Final wisselt tussen 0 en 1 elke klokrand om de LED's continu in en uit te schakelen. Dit is slechts een visueel element voor de uiteindelijke weergave.

Dit shiftproces is de perfecte start voor dit project. Als u uw LED's correct en consistent kunt laten afwisselen, hoeft u vanaf hier alleen het gedrag bij het nivelleren toe te voegen!

Stap 6: Eindige-toestandsmachine

Eindigetoestandsautomaat
Eindigetoestandsautomaat

We hebben een Finite State Machine gemaakt om het gedrag te dicteren wanneer de invoerschakelaar of resetknop wordt ingedrukt. Elke status is een "niveau" en als de schakelaar op het verkeerde moment wordt ingeschakeld of als reset wordt ingedrukt, keert het niveau terug naar "000". Anders, als de schakelaar correct is ingeschakeld, gaat het niveau omhoog totdat het de laatste staat, "111" bereikt, en het einde wordt weergegeven. De FSM is gebaseerd op de twee procesblokken sync_proc en comb_proc. Sync_proc gebruikt de klok die we PushClk hebben genoemd. Deze klok bepaalt hoe snel de volgende toestand de huidige toestand wordt. Deze klok zou vrij snel moeten zijn; we kozen voor een snelheid die ongeveer twee keer sneller was dan onze snelste LED-snelheid.

We hebben deze code geïmplementeerd met behulp van een FSM voor de niveaus; na dit project realiseerden we ons echter dat een efficiënter gebruik van een FSM het hebben van een optelstatus, een resetstatus of een verblijfsstatus zou kunnen zijn. Als er niets wordt ingedrukt, bevindt het zich in de verblijfsstatus. Als er op reset wordt gedrukt of als de speler een fout heeft gemaakt, bevindt deze zich in de reset-status. Als het correct wordt ingedrukt, bevindt het zich in de optelstatus. Er zijn ook veel andere manieren om een FSM in dit spel te gebruiken!

Stap 7: Weergaveprocesblok besturen met niveau

Aansturen van weergaveprocesblok met niveau
Aansturen van weergaveprocesblok met niveau

Niveau bestuurt het procesblok Weergave. De variabelen in de gevoeligheidslijst zijn Level, Reset en Clk400. Het 7-segments display begint met het weergeven van '1' voor het eerste niveau. Het telt tot 7 elke keer dat de gebruiker een niveau passeert om de gebruiker te laten zien op welk niveau hij zich bevindt. Zodra de gebruiker level 7 heeft gepasseerd, wordt "COOL" weergegeven om aan te geven dat de speler het spel heeft verslagen. Dit "COOL" -scherm werkt op een 400 Hz-klok die we Clk400 noemden. Als u op Reset drukt, keert het display terug naar "1".

Stap 8: LED-snelheid regelen met niveau

LED-snelheid regelen met niveau
LED-snelheid regelen met niveau

Ten slotte regelt Level de snelheid van de LED's. Niveau is het enige signaal in de gevoeligheidslijst. D1 is het signaal dat naar het Clock Divider-proces gaat om newclk te krijgen. Elke keer dat het niveau wordt gewijzigd of de status verandert, wordt het procesblok "Snelheid" weergegeven. Dit proces bepaalt de waarde van D1. Er zijn 8 gedefinieerde waarden van D1 die we hebben gekozen op basis van hoe snel we elk niveau wilden laten lopen. D1 wordt kleiner elke keer dat het niveau stijgt, zodat de newclk sneller loopt.

Stap 9: Hardwaremontage

Hardware-assemblage
Hardware-assemblage

We hebben het breadboard op de Basys3 aangesloten met een van de pmod-connectoren. Zes van de pmod-poorten werden gebruikt om een mannelijke naar mannelijke connector aan te sluiten, één voor aarde en de andere vijf voor de 5 LED's. Ook hebben we voor elke LED een weerstand geplaatst. Deze weerstanden zijn 220Ω en voorkomen dat de leds kortsluiten en doorbranden. Hoewel elke LED enige weerstand heeft, is de weerstand niet voldoende om de spanning van de bron te belemmeren.

Stap 10: Veel plezier

Dit spel is heel gemakkelijk te spelen. De speler begint op de uiterst rechtse schakelaar 1 van het bord, V17. Ze moeten de schakelaar hoog zetten als de middelste LED brandt. Ze bewegen dan één schakelaar naar links en doen hetzelfde! Als de speler het einde haalt, komen ze terecht op de zevende schakelaar, W14. Als ze het spel verslaan, krijgen ze een heel leuk eindscherm te zien!

Iets om op te merken is dat bij het maken van dit spel de snelheden helemaal aan jou zijn! Als de snelheden die we hebben gekozen te laag zijn, voel je vrij om het te versnellen en het nog uitdagender te maken! Er is ook geen vast aantal niveaus. Als je wilt dat het nog meer niveaus heeft, zijn er wijzigingen die moeten worden aangebracht aan de FSM en de procesblokken die door Niveau zijn bepaald, maar dit zijn zeer eenvoudige wijzigingen.

We hebben er ook voor gekozen om schakelaars op het bord te gebruiken als gebruikersinvoer, maar dit kan ook met een knop op het Basys3-bord; de knop elimineert de noodzaak om de schakelaars te resetten telkens wanneer de gebruiker opnieuw begint. We gebruikten aanvankelijk een knop, maar dit veroorzaakte fouten bij het definiëren van het niveau omdat het meerdere niveaus zou springen als twee stijgende flanken van PushClk werden geraakt wanneer de knop werd ingedrukt.

Hieronder vindt u een video die laat zien hoe u moet spelen, de eerste 4 niveaus doorloopt en de uiteindelijke eindweergave.

Het hoofdbestand voor dit project is hieronder opgenomen.

bronnen

Basys3 referentiehandleiding

Inspiratie voor project - Arduino Stop It-game

Aanbevolen: