Indholdsfortegnelse:

FPGA Asteroid Game: 7 trin (med billeder)
FPGA Asteroid Game: 7 trin (med billeder)

Video: FPGA Asteroid Game: 7 trin (med billeder)

Video: FPGA Asteroid Game: 7 trin (med billeder)
Video: Игровая система для ПК ретро система Batocera TF SD Steam/Windows PC/MAC 2024, Oktober
Anonim
FPGA Asteroid spil
FPGA Asteroid spil

Til vores CPE 133-afsluttende projekt besluttede vi at oprette et asteroidespil på vores FPGA ved hjælp af to trykknapkontakter og 7-segment displayet. Spillet fungerer således, at en asteroide gyder i en af tre tilfældigt udvalgte rækker, og kommer skævende mod skibet på den anden side af 7-segmentet display. Den øverste knap og den nederste knap kan bruges til at flytte dit skib væk fra asteroiden. Hvis det ikke lykkes, viser displayet 'BAnG' et øjeblik og genstarter derefter spillet hurtigt, så brugeren kan prøve igen. Det følgende er en kort beskrivelse af, hvordan projektet blev lavet, så enhver bruger kan replikere eller forbedre vores design.

Trin 1: Oversigt

Oversigt
Oversigt
Oversigt
Oversigt

Projektet består stort set af Finite State Machines (FSM'er), som bruger logik til at overføre FPGA mellem stater, der gemmer og viser forskellige værdier af skibs- og klippestillinger. De to store moduler er spillet FSM'er til klippen og skibet og den binære til 7-segmenters displaydekoder FSM, som er integreret sammen ved hjælp af en meget enkel strukturel model i VHDL.

FSM'er blev oprettet til skibets position, klippens position og til 7-segment dekoderen. Formålet med skibets FSM er, så skibet kan bevæge sig til den korrekte position, når spilleren trykker på en op eller ned -knap. FSM er nødvendig, fordi den skal huske, hvilken position den sidst var i for at flytte til den korrekte position.

Formålet med klippens FSM er at flytte klippen til den korrekte position baseret på hvilken række den er i og den sidste position i den række. Derudover holder den styr på positionen for modulet, der vil vise det, og pseudo-tilfældigt vælger en ny række, der skal vises på næste.

FSM til 7-segment display-dekoderen blev brugt til ikke kun at vise skibet og klippen, men også til at vise “BAnG”, når skibets position og bjergpositionen er den samme.

Trin 2: Materialer

Materialerne anvendt i projektet var:

  • Basys3 Development Board fra Digilent, Inc.
  • Vivado Design Suite
  • sseg_dec.vhd (Denne fil blev leveret til os på Polylearn og blev skrevet af Bryan Mealy)
  • Clk_div.vhd (Denne fil blev leveret til os på Polylearn og blev skrevet af Bryan Mealy)
  • Three Finite State Machines (FSM'er)

Trin 3: Lav spillet

At lave spillet
At lave spillet
At lave spillet
At lave spillet
At lave spillet
At lave spillet
At lave spillet
At lave spillet

Spillemodulet blev oprettet ved at bruge adfærdsmodellering til at beskrive skibets og rockens tilstande for deres egne respektive FSM'er. Fordelen ved dette er, at det er langt lettere at modellere kredsløbet adfærdsmæssigt ved at beskrive, hvad det gør frem for at finde ud af alle de komponenter, der er nødvendige for at designe hardwaren.

Stenstaterne blev udført ved hjælp af en pseudo -tilfældig talgenerator til klippens første position. For at opnå dette gav vi generatoren sit eget ur, som var ekstremt hurtigt i forhold til spillets hastighed. På hver stigende kant øges et tre bit -nummer, og alle dets værdier svarer til en af tre starttilstande for skibet. Derfor svarer tre værdier til position 3 (øverst til højre), tre svarer til position 7 (midten), og to svarer til position 11 (nederst til højre).

Når den tilfældige generation er sket, og asteroiden har fået en starttilstand, flyder den vandret mod skibet uden afbrydelse.

0 ← 1 ← 2 ← 3

4 ← 5 ← 6 ← 7

11 ← 10 ← 9 ← 8

Uret, der bruges til rockens næste tilstandslogik, styrer spillets hastighed; Vi fandt gennem forsøg og fejl, at 9999999 er en god værdi for dets maksimale antal.

Skibets logik fungerer ved at initialisere til midterpositionen (position 4) yderst til venstre. Hvis der trykkes på den øverste knap eller den nederste knap, bevæger skibet sig op og ned til position 0 og 11 svarende til den knap, der er blevet trykket på.

For at få skibets bevægelse til at føle sig godt for brugeren, gjorde vi ikke dens bevægelse asynkron. Vi brugte et ur til dets tilstandsændringer, og vi brugte et maxantal på 5555555.

Trin 4: Visning af resultatet

Den binære til 7-segment dekoder indtager 4-bit positionsvariablerne for skibet og asteroiden og viser det passende billede (enten skib og sten eller meddelelsen "BAnG").

Det opnår dette ved først at kontrollere, om de to er ens og derefter vise meddelelsen "BAnG", hvis checken returnerer sand.

Hvis det ikke vender tilbage, vil dekoderen vise skibet og klippen ved at skifte mellem dem med en meget høj urfrekvens og narre øjet til at se dem, som om de vises samtidigt.

Trin 5: Sæt det hele sammen

Samler det hele
Samler det hele

Vi omfattede skibets og rockens FSM i en stor FSM, som vi tilsluttede displayet FSM. Inputene til spillet er op -knappen og ned -knappen på BASYS3 -kortet og systemuret. Outputene er segment- og anodevektorerne syv segment-display.

Disse input og output vil blive set i begrænsningsfilen, hvor de er portkortlagt.

Trin 6: Fremtidige ændringer

I fremtiden ville det være en forbedring at tilføje flere funktioner til skibsbevægelse til projektet. Dette kan opnås ved blot at give yderligere 2 knapindgange og lade skibet indtage andre positioner (tilstande) end 0, 4 og 8. En anden mulig ændring kan være at kontrollere asteroidens næste tilstandstiming, så det starter langsomt og øger hastigheden med 1,5x hver gang det savner skibet, indtil det får et hit, hvor det ville genstarte og blive langsomt igen. Dette ville øge spillets sværhedsgrad og gøre det sjovere for brugeren, hvis det blev implementeret, og det kunne gøres ved at oprette en variabel for den maksimale tælling af klippens næste tilstandsur, multiplicere denne variabel med 1,5 hver gang asteroiden ikke ikke rammer, og nulstiller den til sin oprindelige værdi, hver gang rocken rammer.

Trin 7: Konklusion

Dette projekt har hjulpet os med bedre at forstå endelige tilstandsmaskiner, ure og interaktivt visning på de syv segmenter.

Den største ting ved endelige statsmaskiner er, at det er vigtigt at vide (husk) hvilken tilstand du er i øjeblikket for at flytte til næste ønskede tilstand. Ironisk nok gode livsråd; du skal vide, hvor du er for at vide, hvor du skal hen.

Ved at manipulere forskellige forekomster af ure, kunne vi tilfældigt generere tal, flytte klippen til den næste position og styre visningen af skibet, klippen og slut-of-game-besked.

Vi lærte, at mere end en anode ikke kan vises samtidigt. Det modul, vi fik, udnyttede, at det menneskelige øje kun kan se forskellen op til en bestemt frekvens. Så en højere frekvens for at skifte anoder blev valgt. Skibet og klippen, der ses på samme tid, er faktisk en hentydning, da hver vises separat, men meget hurtigt. Dette koncept blev anvendt til at vise bevægelsen af skibet, klippen og meddelelsen "BAnG".

Anbefalede: