Indholdsfortegnelse:

Mastermind -spil i VHDL: 3 trin
Mastermind -spil i VHDL: 3 trin

Video: Mastermind -spil i VHDL: 3 trin

Video: Mastermind -spil i VHDL: 3 trin
Video: Don't Drag use this Excel Tricks ||#excel 2024, November
Anonim
Mastermind Game i VHDL
Mastermind Game i VHDL
Mastermind Game i VHDL
Mastermind Game i VHDL

Til vores projekt skabte vi "Mastermind" -spillet i VHDL, der skulle spilles på Basys3 -tavlen. Mastermind er et kodebrydende spil, der traditionelt spilles med pinde og et spillebræt. Spiller en placerer pinde med forskellige farver i en række på 4, skjult for spiller to. Spiller to har derefter 'x' antal gæt, der placerer pinde på brættet i en række, der er synlige for spiller en. Efter hvert gæt får spiller to besked om 2 tal: hvor mange af pindene er den korrekte farve, og hvor mange pinde der er i den korrekte position i rækken. Ved hjælp af disse spor skal spiller to gætte den korrekte række af pins, som spiller en placerede i det tildelte antal gæt.

I vores implementering er spillet en spiller. En tilfældig kombination af pinde genereres af programmet, og spilleren skal bruge Basys3 -tavlen til at gætte den korrekte rækkefølge. Der er fire “farver”, repræsenteret ved binære værdier. 7-segmentet viser tre værdier: resterende omdrejninger, antal ben i den korrekte position og antal ben, der har den rigtige farve i den forkerte position (disse værdier starter ved 9, 0 og 0). Spilleren bruger switcherne på brættet til at vælge de binære værdier til hans/hendes gæt, og vender en anden switch for at indsende gætten. Hvis de er korrekte, slutter spillet, og 7-segmentet viser "GG". Hvis ikke, falder drejetælleren med 1, og spilleren modtager feedback baseret på, hvor mange ben i deres gæt, der matcher farven eller positionen af stifterne i kombinationen. Hvis spilleren løber tør for sving uden at gætte korrekt, viser displayet “GO” (repræsenterer game over). Spilleren kan også vende nulstillingskontakten for at starte forfra når som helst.

Trin 1: Materialer

Materialer
Materialer
Materialer
Materialer
Materialer
Materialer

Da hele spillet kan spilles på selve brættet, er det eneste nødvendige materiale Basys3 -kortet, et mikro -USB -kabel til tilslutning til brættet og en computer/bærbar computer, som du kan bruge til at kode!

Trin 2: Koden

Koden
Koden
Koden
Koden

For at dette spil kan fungere på FPGA, ville den enkleste måde at skrive det være at oprette en statsmaskine. At have en statsmaskine tillader den sekventielle og interaktive oplevelse, der er nødvendig for, at spillet rent faktisk kan fungere. For at alt kan fungere gnidningsløst, vil statsmaskinen være baseret på FPGA's interne ur -signal og sikre, at alt er synkroniseret. Hovedmodulet er en statsmaskine med fire tilstande; Initial State (Initial), SubmitAnswer State (SubAns), Display State (Dis), and CheckEndGame State (CheckEnd). Sammen med statsmaskinen har hovedmodulet to submoduler, en firecifret syv segmentvisning (som har sin egen ClkDivider-submodul) og Random Number Generator (faktisk en psuedo-tilfældig talgenerator). Der er også en grundlæggende procesblok for at få lysdioderne over hver kontakt til at tænde, når de er tændt, som en måde for folk at se, hvad de indtaster lettere. En grundlæggende oversigt over koden kan ses på tankekortet på billedet.

Den første komponent at se på er Random Number Generator (randomgen). Da det ikke er teknisk muligt at få sande tilfældige tal genereret fra hardware, var den enkleste løsning at få randomgenet faktisk til at være et Linear-feedback Shift Register (LFSR). LFSR har et input på clk og output "a" (et 12-bit tal). Hver urcyklus genereres et nyt 12-bit tal, der starter ved "000000000001", og går til sidst igennem alle kombinationer af 12-bits på 1'er og 0'er, før de gentager sig selv. Outputtet "a" gives hver urcyklus, så den kører kontinuerligt hele vejen igennem. Clk'en tilknyttes Clk fra hovedmodulet, og "a" tilknyttes signalet RandNum i hovedmodulet.

Den anden delmodul er det firecifrede syv segment display. Dette er en ret ligetil måde at vise et firecifret syv segment display på. Displayet er indstillet på Clk fra hovedmodulet, men alligevel har denne submodul sin egen submodul af en ClkDivider. ClkDivider (indstillet til 1298 Hz) bruges til at fremskynde uret for de syv segmenter, så alle cifrene ser ud til at være tændt på samme tid (da der faktisk kun kan være et ciffer ad gangen). Variablen "ciffer" bruges til at bladre gennem pletterne på displayet, og med hvert ciffer følger betingelserne for et grundlæggende 4-bit inputdisplay, med muligheder for at vise cifrene 0 til 9 og heller ingenting. Det længste venstre ciffer på displayet er sat til ingenting, da det ikke bruges i dette spil.

Hovedmodulet består af statsmaskinen. De fire tilstande i processen er Initial, SubAns, Dis og CheckEnd. I den oprindelige tilstand, hvis SubmitBtn (switch brugt til at indsende dit svar til kontrol) er indstillet til ‘1’, flytter maskinen til tilstanden SubAns. Når som helst Rbtn (switch, der bruges til at nulstille maskinen) er sat til ‘1’, derefter vender maskinen tilbage til den oprindelige tilstand. Når den er i SubAns -tilstanden, når SubmitBtn = ‘0’ igen, går den videre til Dis -tilstanden. Når den er i Dis -tilstand, hvis nedtællingen = 0 (svingene til venstre for at gætte falder til 0) eller hvis RSpotCount = 4 (hvilket betyder spilleren som alle de korrekte farver på de korrekte pletter), går maskinen til CheckEnd -tilstand. Hvis ingen af disse forekommer, når SubmitBtn = '1' igen, går det tilbage til SubAns -tilstanden for at tillade et andet gæt. Når det er i CheckEnd -tilstanden, er dette slutningen på spillet, og den eneste vej ud er at slå nulstillingen og returnere den til den oprindelige tilstand. Dette kan let ses i tilstandsmaskindiagrammet. Adfærdsmæssigt initialiserer initialtilstanden alt tilbage til startpositionen. Nedtællingen (signal, der gemmer, hvor mange omgange spilleren har tilbage) er sat til 9, RSpotCount (signal, der gemmer, hvor mange af de farver, du gættede er på det rigtige sted) er indstillet til 0, RColorCount (signal, der gemmer, hvor mange af de farver, du gættede er rigtige, men på det forkerte sted) er sat til 0, og den lille nedtælling (signal, der til sidst er kortlagt til nedtælling, som faktisk ændrer hver tur i senere tilstande) er sat til 9. Også i den oprindelige tilstand er RandNum (psuedo-tilfældigt genereret nummer) opdeles i fire forskellige kontroller (en for hver 3-bit farve) og gemmes i signaler check1, check2, check3, check4. Disse kontroller er, hvad dit gæt faktisk sammenlignes med, så selvom LFSR altid får RandNum til at ændre hver cyklus, forbliver kontrollerne, når du forlader den oprindelige tilstand, de samme, så en gemt værdi kan sammenligne dit svar mod. Dette betyder også, at hver gang maskinen nulstilles, har spilleren en ny værdi at gætte.

SubmitAnswer State (SubAns) ændrer nedtællingsaktiveren (signal "ændring") til '1'. Dette er nødvendigt senere for at svingsporing kan fungere. Derefter sammenligner staten afspillerens input fra switcherne med kontrollerne foretaget i ovenstående tilstand. Signal rs1, rs2, rs3, rs4 og signaler rc1, rc2, rc3, rc4 er heltalstyper, der afhængigt af If -sætningerne er indstillet til enten 1 eller 0. Signalet rs er for det rigtige sted og rc for den rigtige farve. For eksempel hvis farve 1 spillerens gæt er lig med check1 i RandNum, så er rs1 = 1, da det betyder, at den rigtige farve er på det rigtige sted. Hvis farve 1 ikke er lig med check1, men er lig med en af de andre kontroller, så er rc = 1. Dette gøres for hver farve og hver markering.

Displaystatus (Dis) leder først efter nedtællingsfunktionen. Hvis det er '1', går nedtællingen ned 1 (så ved den første sving går den fra 9 til 8 osv.). Ellers ændrer turen sig ikke. Uanset hvilken aktivering der er, tilføjes alle rs -værdier ovenfra og tildeles signal RSpotCounter. Alle rc -værdier tilføjes og tildeles RColorCounter. Endelig tildeles nedtælling værdien af smallcountdown. Signalerne RSpotCounter, RColorCounter og Countdown konverteres alle til 4-bit std_logic_vectors uden for processen og skubbes til undermodulet Seven Segment display via et portkort. På denne måde viser displayet de rigtige ting, indtil du sender et nyt svar.

CheckEnd -tilstanden er for, om du har vundet eller tabt. Hvis du har vundet (alle 4 farver er på det rigtige sted, ellers kendt som RSpotCounter = 4), vises “GG” (vist teknisk som 66) på det syv segment for at vise, at du har vundet. Hvis du har tabt (nedtællingen har nået 0), vises "GO" (vist teknisk som 60) på displayet for Game Over. Med begge udfald vil et tryk på nulstillingsknappen for at flytte maskinen tilbage til den oprindelige tilstand for at afspille igen.

Kildekode findes her.

Trin 3: Konklusion

Afslutningen af dette projekt lærte os meget om at bygge mere komplicerede kredsløb. Vores oprindelige design var ikke en endelig maskine. Vi fandt det svært at fejlsøge og omskrev koden et antal gange ved hjælp af forskellige metoder (herunder en FSM). Efter instruktørens forslag holdt vi fast i FSM -tilgangen, og vi kunne afslutte spillet. Vi lærte, at det er meget mere effektivt at designe koden baseret på hardware end med en traditionel programmeringsmetode. Vi stod også over for flere udfordringer i forbindelse med displayet med syv segmenter. Det var svært at få det til at vise flere numre uden "ghosting", og vi var nødt til at bruge en urdeler for at opnå dette. Hvis vi skulle videreudvikle dette projekt, ville vi forbinde farvede lysdioder med Basys3, så brugeren kan se farver (som i det traditionelle spil) frem for numeriske repræsentationer af farver. I sidste ende fik vi en større forståelse af komplekse kredsløbsdesign, virkelige applikationer og udfordringerne ved at bruge hardware frem for at køre simuleringer med perfekte forhold.

Anbefalede: