Inhoudsopgave:

FPGA Asteroid Game: 7 stappen (met afbeeldingen)
FPGA Asteroid Game: 7 stappen (met afbeeldingen)

Video: FPGA Asteroid Game: 7 stappen (met afbeeldingen)

Video: FPGA Asteroid Game: 7 stappen (met afbeeldingen)
Video: Asteroids game using FPGA 2024, November
Anonim
FPGA Asteroïde-spel
FPGA Asteroïde-spel

Voor ons CPE 133 Final Project hebben we besloten om een asteroïdenspel te maken op onze FPGA met behulp van twee drukknopschakelaars en het 7-segments display. De game werkt zo dat een asteroïde in een van de drie willekeurig geselecteerde rijen spawnt en naar het schip aan de andere kant van het 7-segmentsdisplay raast. De bovenste knop en de onderste knop kunnen worden gebruikt om je schip uit de weg van de asteroïde te verplaatsen. Als u dit niet doet, wordt op het scherm even 'BAnG' weergegeven en wordt het spel dan snel opnieuw opgestart, zodat de gebruiker het opnieuw kan proberen. Wat volgt is een korte beschrijving van hoe het project is gemaakt, zodat elke gebruiker ons ontwerp kan repliceren of verbeteren.

Stap 1: Overzicht

Overzicht
Overzicht
Overzicht
Overzicht

Het project bestaat grotendeels uit Finite State Machines (FSM's), die logica gebruiken om de FPGA over te dragen tussen staten die verschillende waarden van scheeps- en rotsposities opslaan en weergeven. De twee belangrijkste modules zijn de spel-FSM's voor de rots en het schip, en de binaire tot 7-segmenten display-decoder FSM, die samen zijn geïntegreerd met behulp van een zeer eenvoudig structureel model in VHDL.

FSM's zijn gemaakt voor de positie van het schip, de positie van de rots en voor de 7-segmentdecoder. Het doel van de FSM van het schip is dat het schip naar de juiste positie kan bewegen wanneer de speler op een knop omhoog of omlaag drukt. De FSM is nodig omdat hij moet onthouden in welke positie hij het laatst was om naar de juiste positie te gaan.

Het doel van de FSM van de rots is om de rots naar de juiste positie te verplaatsen op basis van de rij waarin deze zich bevindt en de laatste positie in die rij. Bovendien houdt het de positie bij voor de module die het zal weergeven en kiest het pseudo-willekeurig een nieuwe rij om als volgende te verschijnen.

De FSM voor de 7-segment display-decoder werd gebruikt om niet alleen het schip en de rots weer te geven, maar ook om "BAnG" weer te geven wanneer de scheepspositie en de rotspositie hetzelfde zijn.

Stap 2: Materialen

De gebruikte materialen in het project waren:

  • Basys3-ontwikkelingsbord van Digilent, Inc.
  • Vivado Design Suite
  • sseg_dec.vhd (Dit bestand is aan ons verstrekt op Polylearn en is geschreven door Bryan Mealy)
  • Clk_div.vhd (Dit bestand is aan ons verstrekt op Polylearn en is geschreven door Bryan Mealy)
  • Drie Finite State Machines (FSM's)

Stap 3: Het spel maken

Het spel maken
Het spel maken
Het spel maken
Het spel maken
Het spel maken
Het spel maken
Het spel maken
Het spel maken

De spelmodule is gemaakt door gedragsmodellering te gebruiken om de toestanden van het schip en de rots te beschrijven voor hun eigen respectievelijke FSM's. Het voordeel hiervan is dat het veel gemakkelijker is om het circuit gedragsmatig te modelleren door te beschrijven wat het doet in plaats van alle componenten uit te zoeken die nodig zijn om de hardware te ontwerpen.

De rotstoestanden werden gedaan met behulp van een pseudo-willekeurige nummergenerator voor de eerste positie van de rots. Om dit te bereiken, hebben we de generator een eigen klok gegeven die extreem snel was in verhouding tot de snelheid van het spel. Op elke stijgende flank wordt een getal van drie bits opgehoogd en al zijn waarden komen overeen met een van de drie starttoestanden voor het schip. Daarom komen drie waarden overeen met positie 3 (rechtsboven), drie komen overeen met positie 7 (het midden) en twee komen overeen met positie 11 (rechtsonder).

Zodra de willekeurige generatie heeft plaatsgevonden en de asteroïde een begintoestand heeft gekregen, stroomt deze zonder onderbreking horizontaal naar het schip.

0 ← 1 ← 2 ← 3

4 ← 5 ← 6 ← 7

11 ← 10 ← 9 ← 8

De klok die wordt gebruikt voor de logica van de volgende staat van de rots bepaalt de snelheid van het spel; we hebben met vallen en opstaan gevonden dat 9999999 een goede waarde is voor het maximale aantal.

De logica van het schip werkt door te initialiseren in de middenpositie (positie 4) helemaal links. Als de bovenste knop of de onderste knop wordt ingedrukt, zal het schip op en neer bewegen in positie 0 en 11 die overeenkomt met de knop die is ingedrukt.

Om de scheepsbeweging voor de gebruiker goed te laten voelen, hebben we de beweging niet asynchroon gemaakt. We gebruikten een klok voor zijn statusveranderingen en we gebruikten een maximale telling van 5555555.

Stap 4: Het resultaat weergeven

De decoder van binair naar 7-segment neemt de 4-bits positievariabelen voor het schip en de asteroïde op en geeft het juiste beeld weer (het schip en de rots of het bericht "BAnG").

Dit wordt bereikt door eerst te controleren of de twee gelijk zijn en vervolgens het bericht "BAnG" weer te geven als de controle waar is.

Als het niet waar is, zal de decoder het schip en de rots weergeven door er met een zeer hoge klokfrequentie tussen te schakelen en het oog voor de gek te houden door ze te zien alsof ze tegelijkertijd worden weergegeven.

Stap 5: Alles samenbrengen

Alles bij elkaar zetten
Alles bij elkaar zetten

We omvatten de FSM van het schip en de rots in één grote FSM die we hebben aangesloten op de FSM van het display. De inputs voor het spel zijn de omhoog-knop en de omlaag-knop op het BASYS3-bord en de systeemklok. De uitgangen zijn de segment- en anodevectoren zeven segment-display.

Deze in- en uitgangen zijn te zien in het bestand met beperkingen waar ze zijn toegewezen aan de poort.

Stap 6: Toekomstige wijzigingen

In de toekomst zou het een verbetering zijn om meer functionaliteit voor scheepsbewegingen aan het project toe te voegen. Dit kan eenvoudig worden bereikt door nog 2 knopinvoeren te geven en het schip andere posities (toestanden) dan 0, 4 en 8 te laten innemen. Een andere mogelijke wijziging zou kunnen zijn de timing van de volgende toestand van de asteroïde te regelen, zodat deze langzaam begint en de snelheid verhoogt met 1.5x elke keer dat het het schip mist totdat het een hit krijgt, waar het opnieuw zou starten en weer langzaam zou worden. Dit zou de moeilijkheidsgraad van het spel verhogen en het voor de gebruiker leuker maken als het zou worden geïmplementeerd, en zou kunnen worden gedaan door een variabele te creëren voor het maximale aantal van de volgende staatsklok van de rots, die variabele vermenigvuldigd met 1,5 elke keer dat de asteroïde niet 't hit, en het resetten naar zijn beginwaarde elke keer dat de steen raakt.

Stap 7: Conclusie

Dit project heeft ons geholpen om finite state machines, klokken en interactieve weergave op de zeven-segment displays beter te begrijpen.

Het belangrijkste aan eindige-toestandsmachines is dat het belangrijk is om te weten (onthoud) in welke staat je je momenteel bevindt om naar de volgende gewenste toestand te gaan. Ironisch genoeg, goed levensadvies; je moet weten waar je bent om te weten waar je heen gaat.

Door verschillende klokken te manipuleren, konden we willekeurig getallen genereren, de steen naar de volgende positie verplaatsen en de weergave van het schip, de steen en het bericht aan het einde van het spel beheren.

We hebben geleerd dat er niet meer dan één anode tegelijkertijd kan worden weergegeven. De aan ons gegeven module maakte gebruik van het feit dat het menselijk oog het verschil slechts tot een bepaalde frequentie kan zien. Er is dus gekozen voor een hogere frequentie van schakelanodes. Het schip en de rots die tegelijkertijd worden gezien, is eigenlijk een toespeling, omdat ze elk afzonderlijk worden weergegeven, maar heel snel. Dat concept werd toegepast om de beweging van het schip, de rots en de "BANG"-boodschap weer te geven.

Aanbevolen: