Innholdsfortegnelse:

FPGA Asteroid Game: 7 trinn (med bilder)
FPGA Asteroid Game: 7 trinn (med bilder)

Video: FPGA Asteroid Game: 7 trinn (med bilder)

Video: FPGA Asteroid Game: 7 trinn (med bilder)
Video: Asteroids game using FPGA 2024, Oktober
Anonim
FPGA Asteroid Game
FPGA Asteroid Game

For vårt CPE 133-sluttprosjekt bestemte vi oss for å lage et asteroider-spill på vår FPGA ved hjelp av to trykknappbrytere og 7-segmenters display. Spillet fungerer slik at en asteroide gyter i en av tre tilfeldig utvalgte rader, og kommer rasende mot skipet på den andre siden av 7-segmentet. Den øvre knappen og den nedre knappen kan brukes til å flytte skipet ditt fra veien til asteroiden. Hvis du ikke gjør det, viser displayet ‘BAnG’ et øyeblikk og starter deretter spillet raskt på nytt slik at brukeren kan prøve igjen. Det som følger er en kort beskrivelse av hvordan prosjektet ble laget slik at enhver bruker kan replikere eller forbedre designet vårt.

Trinn 1: Oversikt

Oversikt
Oversikt
Oversikt
Oversikt

Prosjektet består i stor grad av Finite State Machines (FSMs), som bruker logikk for å overføre FPGA mellom stater som lagrer og viser forskjellige verdier for skip og bergposisjoner. De to hovedmodulene er FSM-spill for rock og skip, og den binære til 7-segmenters display dekoder FSM, som er integrert sammen ved hjelp av en veldig enkel strukturell modell i VHDL.

FSM ble opprettet for skipets posisjon, bergets posisjon og for 7-segmenters dekoder. Hensikten med skipets FSM er slik at skipet kan bevege seg til riktig posisjon når spilleren trykker på en opp- eller ned -knapp. FSM er nødvendig fordi den må huske hvilken posisjon den var sist i for å flytte til riktig posisjon.

Hensikten med bergartens FSM er å flytte bergarten til riktig posisjon basert på hvilken rad den er i og den siste posisjonen i den raden. I tillegg holder den oversikt over posisjonen for modulen som skal vise den, og pseudo-tilfeldig plukker en ny rad som skal vises på neste.

FSM for 7-segmenters displaydekoder ble brukt til ikke bare å vise skipet og fjellet, men også for å vise “BAnG” når skipets posisjon og bergposisjonen er den samme.

Trinn 2: Materialer

Materialene som ble brukt i prosjektet var:

  • Basys3 Development Board fra Digilent, Inc.
  • Vivado Design Suite
  • sseg_dec.vhd (Denne filen ble levert til oss på Polylearn og ble skrevet av Bryan Mealy)
  • Clk_div.vhd (Denne filen ble levert til oss på Polylearn og ble skrevet av Bryan Mealy)
  • Three Finite State Machines (FSMs)

Trinn 3: Lag spillet

Å lage spillet
Å lage spillet
Å lage spillet
Å lage spillet
Å lage spillet
Å lage spillet
Å lage spillet
Å lage spillet

Spillmodulen ble opprettet ved å bruke atferdsmodellering for å beskrive tilstandene til skipet og rocken for sine egne respektive FSM -er. Fordelen med dette er at det er langt lettere å modellere kretsen atferdsmessig ved å beskrive hva den gjør i stedet for å finne ut alle komponentene som trengs for å designe maskinvaren.

Bergtilstandene ble gjort ved hjelp av en pseudo tilfeldig tallgenerator for bergens første posisjon. For å oppnå dette ga vi generatoren sin egen klokke som var ekstremt rask i forhold til hastigheten på spillet. På hver stigende kant økes et tre biters tall, og alle verdiene tilsvarer en av tre starttilstander for skipet. Derfor tilsvarer tre verdier posisjon 3 (øverst til høyre), tre tilsvarer posisjon 7 (midten), og to tilsvarer posisjon 11 (nederst til høyre).

Når den tilfeldige generasjonen har skjedd og asteroiden har fått en starttilstand, flyter den horisontalt mot skipet uten avbrudd.

0 ← 1 ← 2 ← 3

4 ← 5 ← 6 ← 7

11 ← 10 ← 9 ← 8

Klokken som ble brukt til rockens neste statslogikk styrer spillets hastighet; Vi fant gjennom prøving og feiling at 9999999 er en god verdi for sitt maksimale antall.

Skipets logikk fungerer ved å initialisere til midtposisjonen (posisjon 4) helt til venstre. Hvis du trykker på den øvre knappen eller den nedre knappen, vil skipet bevege seg opp og ned til posisjon 0 og 11 som tilsvarer knappen som er trykket.

For å få skipsbevegelsen til å føles bra for brukeren, gjorde vi ikke bevegelsen asynkron. Vi brukte en klokke for tilstandsendringer, og vi brukte en maksimal telling på 5555555.

Trinn 4: Viser resultatet

Den binære til 7-segment dekoderen tar inn 4-biters posisjonsvariabler for skipet og asteroiden og viser det riktige bildet (enten skipet og steinen eller meldingen "BAnG").

Den oppnår dette ved først å kontrollere om de to er like og deretter vise meldingen “BAnG” hvis sjekken returnerer sann.

Hvis det ikke går tilbake, vil dekoderen vise skipet og berget ved å bytte mellom dem med en veldig høy klokkefrekvens og lure øyet til å se dem som om de vises samtidig.

Trinn 5: Sett alt sammen

Sette alt sammen
Sette alt sammen

Vi omfattet skipets og rockens FSM i en stor FSM som vi koblet til displayet FSM. Inngangene til spillet er opp -knappen og ned -knappen på BASYS3 -kortet og systemklokken. Utgangene er segment- og anodevektorene syv segmentvisning.

Disse inngangene og utgangene vil bli sett i begrensningsfilen der de er portkartlagt.

Trinn 6: Fremtidige modifikasjoner

I fremtiden ville det være en forbedring å legge til flere funksjoner for bevegelse av skip i prosjektet. Dette kan oppnås ganske enkelt ved å gi ytterligere to knappinnganger og la skipet ta andre posisjoner (tilstander) enn 0, 4 og 8. En annen mulig modifikasjon kan være å kontrollere asteroidens neste tilstandstid, slik at den starter sakte og øker hastigheten med 1,5 ganger hver gang det savner skipet til det får et treff, hvor det vil starte på nytt og bli sakte igjen. Dette vil øke vanskeligheten med spillet og gjøre det morsommere for brukeren hvis det ble implementert, og det kan gjøres ved å opprette en variabel for maksimal telling av bergets neste tilstandsklokke, multiplisere variabelen med 1,5 hver gang asteroiden ikke gjør det ikke treffer, og tilbakestiller den til sin opprinnelige verdi hver gang rocken treffer.

Trinn 7: Konklusjon

Dette prosjektet har hjulpet oss med å bedre forstå endelige tilstandsmaskiner, klokker og interaktivt visning på de syv segmenter.

Den største tingen med endelige tilstandsmaskiner er at det er viktig å vite (husk) hvilken tilstand du er i for å gå til neste ønskede tilstand. Ironisk nok, gode livsråd; du må vite hvor du er for å vite hvor du skal.

Ved å manipulere forskjellige forekomster av klokker, kunne vi tilfeldig generere tall, flytte steinen til neste posisjon og administrere visningen av skipet, berget og slutten av spillet.

Vi lærte at mer enn en anode ikke kan vises samtidig. Modulen gitt til oss utnyttet at det menneskelige øyet bare kan se forskjellen opp til en viss frekvens. Så en høyere frekvens for bytte av anoder ble valgt. Skipet og steinen som sees på samme tid er faktisk en hentydning siden hver vises separat, men veldig raskt. Dette konseptet ble brukt for å vise bevegelsen av skipet, berget og "BAnG" -meldingen.

Anbefalt: