Inhoudsopgave:
- Stap 1: Overzicht
- Stap 2: Materialen
- Stap 3: Het spel maken
- Stap 4: Het resultaat weergeven
- Stap 5: Alles samenbrengen
- Stap 6: Toekomstige wijzigingen
- Stap 7: Conclusie
Video: FPGA Asteroid Game: 7 stappen (met afbeeldingen)
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:19
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
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
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
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:
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze
Een computer demonteren met eenvoudige stappen en afbeeldingen: 13 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Een computer demonteren met eenvoudige stappen en afbeeldingen: dit is een instructie over het demonteren van een pc. De meeste basiscomponenten zijn modulair en gemakkelijk te verwijderen. Wel is het belangrijk dat je er goed over georganiseerd bent. Dit zal helpen voorkomen dat u onderdelen kwijtraakt, en ook bij het maken van de hermontage e
PCB-ontwerp met eenvoudige en gemakkelijke stappen: 30 stappen (met afbeeldingen)
PCB-ontwerp met eenvoudige en gemakkelijke stappen: HELLO VRIENDEN Het is een zeer nuttige en gemakkelijke tutorial voor diegenen die PCB-ontwerp willen leren, laten we beginnen
Een video met gesplitst scherm maken in vier stappen: 4 stappen (met afbeeldingen)
Een video met gesplitst scherm maken in vier stappen: we zien vaak dezelfde persoon twee keer in een scène in een tv-toneelstuk. En voor zover we weten heeft de acteur geen tweelingbroer. We hebben ook gezien dat er twee zangvideo's op één scherm worden gezet om hun zangkunsten te vergelijken. Dit is de kracht van spl
Uw afbeeldingen opslaan voor uw taak: 4 stappen (met afbeeldingen)
Uw afbeeldingen opslaan voor uw taak: 1. Open een nieuw Google-document en gebruik deze pagina om uw afbeeldingen te beveiligen.2. Gebruik ctrl (control) en de "c" sleutel om te kopiëren.3. Gebruik ctrl (control) en de "v" sleutel om te plakken