Innholdsfortegnelse:

Mastermind Game i VHDL: 3 trinn
Mastermind Game i VHDL: 3 trinn

Video: Mastermind Game i VHDL: 3 trinn

Video: Mastermind Game i VHDL: 3 trinn
Video: Mastermind Game on Basys3 2024, Juli
Anonim
Mastermind Game i VHDL
Mastermind Game i VHDL
Mastermind Game i VHDL
Mastermind Game i VHDL

For vårt prosjekt skapte vi "Mastermind" -spillet i VHDL som skal spilles på Basys3 -brettet. Mastermind er et kodebrytende spill som tradisjonelt spilles med pinner og et spillebrett. Spiller en plasserer pinner av forskjellige farger på en rad med 4, skjult for spiller to. Spiller to har da 'x' antall gjetninger som plasserer pinner på brettet i en rad som er synlig for spiller en. Etter hvert gjetning blir spiller to informert om 2 tall: hvor mange av pinnene har riktig farge, og hvor mange pinner som er i riktig posisjon på rekken. Ved å bruke disse ledetrådene må spiller to gjette riktig sekvens av pinner som spiller en plasserte i antallet gjetninger som er tildelt.

I vår implementering er spillet en spiller. En tilfeldig kombinasjon av pinner genereres av programmet, og spilleren må bruke Basys3 -brettet for å gjette riktig sekvens. Det er fire "farger", representert med binære verdier. 7-segmentet viser tre verdier: gjenværende svinger, antall pinner i riktig posisjon og antall pinner som har riktig farge i feil posisjon (disse verdiene starter ved 9, 0 og 0). Spilleren bruker bryterne på brettet for å velge de binære verdiene for hans/hennes gjetning, og vender en annen bryter for å sende inn gjetningen. Hvis de er riktige, slutter spillet og 7-segmentet viser "GG." Hvis ikke, reduseres svingtelleren med 1 og spilleren mottar tilbakemelding basert på hvor mange pinner i gjetningen som matcher fargen eller posisjonen til pinnene i kombinasjonen. Hvis spilleren går tom for svinger uten å gjette riktig, viser displayet “GO” (representerer spillet over). Spilleren kan også snu tilbakestillingsbryteren for å starte på nytt når som helst.

Trinn 1: Materialer

Materialer
Materialer
Materialer
Materialer
Materialer
Materialer

Siden hele spillet kan spilles på selve brettet, er det eneste materialet som trengs Basys3 -kortet, en mikro -USB -kabel for å koble til brettet, og en datamaskin/bærbar datamaskin som du kan bruke til å kode!

Trinn 2: Koden

Koden
Koden
Koden
Koden

For at dette spillet skal fungere på FPGA, ville den enkleste måten å skrive det være å lage en statlig maskin. Å ha en statsmaskin gjør at den sekvensielle og interaktive opplevelsen som er nødvendig for at spillet faktisk skal fungere. For at alt skal fungere jevnt, vil statsmaskinen være basert på det interne klokkesignalet til FPGA, og sikre at alt er synkronisert. Hovedmodulen er en statlig maskin med fire tilstander; Initial State (Initial), SubmitAnswer State (SubAns), Display State (Dis), and CheckEndGame State (CheckEnd). Sammen med statsmaskinen har hovedmodulen to submoduler, en firesifret syv segmentvisning (som har sin egen ClkDivider-undermodul) og Random Number Generator (faktisk en psuedo-tilfeldig tallgenerator). Det er også en grunnleggende prosessblokk for at LED -lampene over hver bryter skal slås på når de er slått på, slik at folk lettere kan se hva de legger inn. En grunnleggende oversikt over koden kan sees på tankekartet på bildet.

Den første komponenten å se på er Random Number Generator (randomgen). Siden det ikke er teknisk mulig å få sanne tilfeldige tall generert fra maskinvare, var den enkleste løsningen å få tilfeldigheten faktisk til å være et lineært tilbakemeldingsskiftregister (LFSR). LFSR har en inngang på clk og utgang “a” (et 12-bits tall). Hver klokkesyklus genereres et nytt 12-biters tall som begynner på "000000000001", og går til slutt gjennom alle kombinasjoner av 12-bits på 1 og 0 før det gjentas. Utgangen "a" gis hver klokkesyklus, så den kjører kontinuerlig. Clk blir kartlagt til Clk fra hovedmodulen, og "a" er kartlagt til signalet RandNum i hovedmodulen.

Den andre delmodulen er det firesifrede displayet med syv segmenter. Dette er en ganske enkel måte å vise frem et firesifret display med syv segmenter. Displayet er satt på Clk fra hovedmodulen, men denne delmodulen har sin egen submodul av en ClkDivider. ClkDivider (satt til 1298 Hz) brukes til å fremskynde klokken for det syv segmentet slik at alle sifrene ser ut til å være på samtidig (siden bare ett siffer faktisk kan være på om gangen). Variabelen "siffer" brukes til å bla gjennom punktene på displayet, og for hver siffer følger betingelsene for en grunnleggende 4-bits inndisplay, med alternativer for å vise sifrene 0 til 9 og heller ingenting. Det lengste sifferet til venstre på displayet er satt til ingenting siden det ikke brukes i dette spillet.

Hovedmodulen består av statsmaskinen. De fire tilstandene i prosessen er Initial, SubAns, Dis og CheckEnd. I den opprinnelige tilstanden, hvis SubmitBtn (bryteren som ble brukt til å sende svaret ditt for kontroll) er satt til ‘1’, flytter maskinen til tilstanden SubAns. Når som helst Rbtn (bryteren som brukes til å tilbakestille maskinen) er satt til ‘1’, deretter går maskinen tilbake til utgangsstatus. Når den er i SubAns -tilstanden, når SubmitBtn = ‘0’ igjen, går den videre til Dis State. Når du er i Dis -tilstand, hvis nedtellingen = 0 (svingene til venstre for å gjette faller til 0) eller hvis RSpotCount = 4 (betyr at spilleren har alle de riktige fargene på de riktige stedene), går maskinen til CheckEnd -tilstanden. Hvis ingen av disse skjer, når SubmitBtn = ‘1’ igjen, går det tilbake til SubAns -tilstanden for å tillate et nytt gjetning. Når du er i CheckEnd -tilstanden, er dette slutten på spillet, og den eneste utveien er å treffe tilbakestillingen og returnere den til den opprinnelige tilstanden. Dette er lett å se i tilstandsmaskindiagrammet. Atferdsmessig initialiserer initialtilstanden alt tilbake til startposisjonen. Nedtellingen (signal som lagrer hvor mange svinger spilleren har igjen) er satt til 9, RSpotCount (signal som sparer hvor mange av fargene du gjettet er på riktig sted) er satt til 0, RColorCount (signal som sparer hvor mange av fargene du gjettet er riktige, men på feil sted) er satt til 0, og den lille nedtellingen (signalet som til slutt blir kartlagt til nedtelling som faktisk endrer hver sving i senere tilstander) er satt til 9. Også i den opprinnelige tilstanden er RandNum (psuedo-tilfeldig generert tall) er delt inn i fire forskjellige sjekker (en for hver 3-bits farge) og lagret i signaler check1, check2, check3, check4. Disse sjekkene er hva gjetningen din faktisk sammenlignes med, så selv om LFSR alltid får RandNum til å endre hver syklus, forblir kontrollene de samme når du forlater den opprinnelige tilstanden, slik at en lagret verdi kan sammenligne svaret ditt mot. Dette betyr også at hver gang maskinen blir tilbakestilt, har spilleren en ny verdi å gjette.

SubmitAnswer State (SubAns) endrer nedtellingen (signal "endring") til "1". Dette er nødvendig senere for at svingsporingen skal fungere. Etter det sammenligner staten spillerinngangene fra bryterne med kontrollene som er gjort i tilstanden ovenfor. Signal rs1, rs2, rs3, rs4 og signalene rc1, rc2, rc3, rc4 er heltallstyper som avhengig av if -setningene er satt til enten 1 eller 0. Signalet rs er for riktig sted og rc for riktig farge. For eksempel hvis gjetningen for farge 1 spiller er lik sjekken 1 i RandNum, så er rs1 = 1 siden det betyr at riktig farge er på riktig sted. Hvis farge 1 ikke er lik sjekk1, men er lik en av de andre kontrollene, så er rc = 1. Dette gjøres for hver farge og hver sjekk.

Displaystatus (Dis) ser først etter nedtellingen. Hvis det er ‘1’, går nedtellingen ned 1 (så på den første svingen går den fra 9 til 8 osv.). Ellers endrer ikke turen seg. Uavhengig av hvilken aktivering i, blir alle rs -verdiene ovenfra lagt sammen og tilordnet til signal RSpotCounter. Alle rc -verdiene legges til og tildeles RColorCounter. Til slutt blir nedtelling tildelt verdien av smallcountdown. Signalene RSpotCounter, RColorCounter og Countdown konverteres alle til 4-biters std_logic_vectors utenfor prosessen, og skyves til undermodulen for Seven Segment display via et portkart. På denne måten viser displayet de riktige tingene til du sender inn et nytt svar.

CheckEnd -staten er for om du har vunnet eller tapt. Hvis du har vunnet (alle 4 fargene er på rett sted, ellers kjent som RSpotCounter = 4), vises “GG” (vist teknisk som 66) på det syv segmentet for å vise at du har vunnet. Hvis du har tapt (nedtellingen har nådd 0), vises “GO” (vist teknisk som 60) på displayet for Game Over. Med begge utfallene, hvis du trykker på tilbakestillingsbryteren til på, flyttes maskinen tilbake til den opprinnelige tilstanden for å spille igjen.

Kildekode finner du her.

Trinn 3: Konklusjon

Å fullføre dette prosjektet lærte oss mye om å bygge mer kompliserte kretser. Vår første design var ikke en endelig statsmaskin. Vi fant det vanskelig å feilsøke og skrev om koden flere ganger ved å bruke forskjellige metoder (inkludert en FSM). Etter instruktørens forslag, holdt vi oss til FSM -tilnærmingen, og vi klarte å fullføre spillet. Vi lærte at det er mye mer effektivt å designe koden basert på maskinvaren enn med en tradisjonell programmeringsmetode. Vi møtte også flere utfordringer knyttet til displayet med syv segmenter. Det var vanskelig å få det til å vise flere tall uten "spøkelse", og vi måtte bruke en klokkeskille for å oppnå dette. Hvis vi skulle videreutvikle dette prosjektet, ville vi koble fargede lysdioder til Basys3 slik at brukeren kan se farger (som i det tradisjonelle spillet) i stedet for numeriske representasjoner av farger. Til slutt fikk vi en større forståelse av kompleks kretsdesign, virkelige applikasjoner og utfordringene ved å bruke maskinvare i stedet for å kjøre simuleringer med perfekte forhold.

Anbefalt: