Indholdsfortegnelse:
Video: Mastermind -spil i VHDL: 3 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:29
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
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
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:
Cordisk algoritme ved hjælp af VHDL: 4 trin
Cordisk algoritme ved hjælp af VHDL: ## Dette er det mest klikede, populære link i Google til VHDL -implementering af CORDIC ALGORITHM for at generere sinus og cosinusbølge ## På nuværende tidspunkt findes der mange hardwareeffektive algoritmer, men disse er ikke velkendte pga. dominans af softwar
Mastermind Star Wars With Arduino MEGA: 5 trin (med billeder)
Mastermind Star Wars With Arduino MEGA: Det er ugunstige tider for oprør. Selvom Death Star er blevet ødelagt, bruger de kejserlige tropper gratis hardware og Arduino som et hemmeligt våben. Det er fordelen ved gratis teknologier, enhver person (enten god eller dårlig) kan bruge dem. Jeg
Design af en simpel 4-vejs sæt associeret cache-controller i VHDL: 4 trin
Design af en simpel firevejssæt associeret cachecontroller i VHDL: I min tidligere instruerbare så vi, hvordan vi designede en simpel direkte kortlagt cachecontroller. Denne gang går vi et skridt foran. Vi designer en simpel associeret cache-controller med fire veje. Fordel? Mindre miss -rate, men på bekostning af perfo
Design af en programmerbar afbrydelsescontroller i VHDL: 4 trin
Design af en programmerbar afbrydelsescontroller i VHDL: Jeg er overvældet over den slags svar, jeg får i denne blog. Tak fyre for at besøge min blog og motivere mig til at dele min viden med jer. Denne gang vil jeg præsentere designet af et andet interessant modul, vi ser i alle SOC'er - Interrupt C
Mastermind Med en 8x8 RGB LED Matrix: 5 trin (med billeder)
Mastermind Med en 8x8 RGB LED Matrix: Påkrævede dele: Basys3 FPGA 8x8 RGB LED Matrix fra GEEETECH9V batteri2N3904 transistorer (x32) 1K modstand (x32) 100 Ohm modstand (x1) 50 Ohm modstand (x1) LED Matrix er en fælles anodematrix med 32 stifter i alt. Den fælles anode betyder, at hver række er