INHOUDSOPGAWE:

Mastermind Game in VHDL: 3 stappe
Mastermind Game in VHDL: 3 stappe

Video: Mastermind Game in VHDL: 3 stappe

Video: Mastermind Game in VHDL: 3 stappe
Video: Mastermind Game on Basys3 2024, Julie
Anonim
Mastermind Game in VHDL
Mastermind Game in VHDL
Mastermind Game in VHDL
Mastermind Game in VHDL

Vir ons projek het ons die 'Mastermind' -speletjie in VHDL geskep om op die Basys3 -bord gespeel te word. Mastermind is 'n kodebrekende spel wat tradisioneel met penne en 'n speelbord gespeel word. Speler een plaas penne van verskillende kleure in 'n ry van 4, weggesteek vir speler twee. Speler twee het dan 'x' aantal raaiskote wat penne op die bord in 'n ry plaas wat vir speler een sigbaar is. Na elke raaiskoot word speler twee ingelig oor 2 nommers: hoeveel van die penne het die regte kleur en hoeveel penne is in die regte posisie in die ry. Deur hierdie leidrade te gebruik, moet speler twee die korrekte volgorde van penne raai wat speler een in die toegekende aantal raai geplaas het.

In ons implementering is die spel enkel speler. 'N Willekeurige kombinasie van penne word deur die program gegenereer, en die speler moet die Basys3 -bord gebruik om die regte volgorde te raai. Daar is vier 'kleure', wat deur binêre waardes voorgestel word. Die 7-segment vertoning toon drie waardes: oorblywende draaie, aantal penne in die regte posisie en aantal penne wat die regte kleur in die verkeerde posisie het (hierdie waardes begin by 9, 0 en 0). Die speler gebruik die skakelaars op die bord om die binêre waardes vir sy/haar raaiskoot te kies, en draai 'n ander skakelaar om die raai in te dien. As dit korrek is, eindig die spel en die 7-segment-skerm toon 'GG'. As dit nie die geval is nie, neem die beurteller af met 1 en ontvang die speler terugvoer gebaseer op hoeveel penne in die raaiskoot ooreenstem met die kleur of posisie van die penne in die kombinasie. As die speler om die beurt loop sonder om korrek te raai, toon die skerm "GO" (verteenwoordig spel). Die speler kan ook die reset -skakelaar draai om te eniger tyd te begin.

Stap 1: materiaal

Materiaal
Materiaal
Materiaal
Materiaal
Materiaal
Materiaal

Aangesien die hele spel op die bord self gespeel kan word, is die enigste materiaal wat u benodig, die Basys3 -bord, 'n mikro -USB -kabel om aan te sluit op die bord, en 'n rekenaar/skootrekenaar wat u kan gebruik om te kodeer!

Stap 2: Die kode

Die kode
Die kode
Die kode
Die kode

Om hierdie speletjie aan die FPGA te werk, is die eenvoudigste manier om dit te skryf, deur 'n staatsmasjien te skep. Met 'n staatsmasjien kan die opeenvolgende en interaktiewe ervaring wat nodig is vir die spel, werklik werk. Om alles glad te laat verloop, is die staatsmasjien gebaseer op die interne kloksein van die FPGA, wat verseker dat alles in ooreenstemming is. Die hoofmodule is 'n staatsmasjien met vier toestande; Oorspronklike toestand (aanvanklike), SubmitAnswer State (SubAns), Display State (Dis) en die CheckEndGame State (CheckEnd). Saam met die staatsmasjien het die hoofmodule twee submodules, 'n vier-syfer-sewe segment-skerm (wat sy eie ClkDivider-submodule het) en die willekeurige getalgenerator (eintlik 'n psuedo-ewekansige getalgenerator). Daar is ook 'n basiese prosesblok om die LED's bo elke skakelaar aan te skakel as dit aangeskakel word, sodat mense makliker kan sien wat hulle invoer. 'N Basiese oorsig van die kode kan op die prentkaart gesien word.

Die eerste komponent om na te kyk, is die ewekansige getalgenerator (randomgen). Aangesien dit nie tegnies moontlik is om ware ewekansige getalle uit hardeware gegenereer te kry nie, was die eenvoudigste oplossing dat die randomgenome eintlik 'n lineêre terugvoerverskuiwingsregister (LFSR) is. Die LFSR het 'n invoer van clk en 'n uitset "a" ('n 12-bis nommer). Elke kloksiklus word 'n nuwe 12-bis getal gegenereer vanaf "000000000001", wat uiteindelik deur alle kombinasies van 12-bisse van 1's en 0's gaan voordat dit herhaal word. Die uitset "a" word elke kloksiklus gegee, sodat dit deurlopend loop. Die clk word vanaf die hoofmodule aan die Clk gekarteer, en 'a' word aan die sein RandNum in die hoofmodule gekarteer.

Die tweede submodule is die vier-syfer-sewe segment-skerm. Dit is 'n redelike eenvoudige manier om 'n vier-syfer-sewe segment-skerm te vertoon. Die skerm word op die Clk ingestel vanaf die hoofmodule, maar hierdie submodule het sy eie submodule van 'n ClkDivider. Die ClkDivider (ingestel op 1298 Hz) word gebruik om die klok vir die sewe segment te bespoedig sodat alle syfers terselfdertyd aangeskakel is (aangesien slegs een syfer op 'n slag kan wees). Die veranderlike "syfer" word gebruik om deur die kolle op die skerm te blaai, en met elke syfer kom die voorwaardes van 'n basiese 4-bis invoervertoning, met opsies om die syfers 0 tot 9 te wys en ook niks. Die syfer wat die verste links op die skerm is, word op niks gestel nie, aangesien dit nie in hierdie speletjie gebruik word nie.

Die hoofmodule bestaan uit die staatsmasjien. Die vier state in die proses is Initial, SubAns, Dis en CheckEnd. As die SubmitBtn (skakelaar wat gebruik is om u antwoord vir kontrolering in te dien) in 'n aanvanklike toestand is, is dit '1', dan skuif die masjien na die SubAns -staat. Elke keer dat Rbtn (skakelaar wat gebruik word om die masjien terug te stel) op '1' gestel is, keer die masjien terug na die aanvanklike toestand. As dit weer in die SubAns -staat is, as die SubmitBtn = '0' weer oorgaan, gaan dit oor na die dis -staat. As dit in die toestand is, as die aftelling = 0 (die afdraaie links om te raai tot 0 val) of as die RSpotCount = 4 (wat beteken dat die speler al die regte kleure op die regte plekke het), gaan die masjien na die CheckEnd -toestand. As nie een van die twee voorkom nie, gaan SubmitBtn = '1' weer terug na die SubAns -toestand om 'n ander raaiskoot toe te laat. As dit in die CheckEnd -toestand is, is dit die einde van die spel, en die enigste uitweg is om die reset te slaan en dit terug te keer na die oorspronklike toestand. Dit kan maklik gesien word in die toestand masjien diagram. Gedragsmatig initialiseer die aanvanklike toestand alles terug na die beginposisie. Die aftelling (sein wat bespaar hoeveel beurte die speler oor het) word op 9 gestel, RSpotCount (sein wat bespaar hoeveel van die kleure wat u raai op die regte plek) word op 0, RColorCount (sein wat bespaar hoeveel van die kleure wat u raai, is reg, maar op die verkeerde plek) is op 0 gestel, en die klein aftelling (sein wat uiteindelik gekarteer word na aftelling wat eintlik elke beurt in latere toestande verander) is ingestel op 9. Ook in die aanvanklike toestand is die RandNum (psuedo-ewekansige gegenereerde getal) word in vier verskillende tjeks verdeel (een vir elke 3-bis kleur) en gestoor op seine check1, check2, check3, check4. Met hierdie kontrole word u raaiskoot eintlik vergelyk, maar alhoewel die LFSR RandNum altyd elke siklus laat verander, bly die tjeks dieselfde as u die aanvanklike toestand verlaat, sodat 'n gestoorde waarde u antwoord kan vergelyk. Dit beteken ook dat die speler 'n nuwe waarde het om te raai wanneer die masjien herstel word.

Die SubmitAnswer -staat (SubAns) verander die afteller (sein "verandering") na '1'. Dit is later nodig om die beurtopsporing te laat werk. Daarna vergelyk die staat die speler se insette van die skakelaars met die kontrole wat in die bogenoemde toestand gedoen is. Sein rs1, rs2, rs3, rs4 en seine rc1, rc2, rc3, rc4 is heelgetaltipes wat, afhangende van die If -stellings, óf 1 óf 0. Die sein rs is vir die regte plek en rc vir die regte kleur. As die raai van kleur 1 speler byvoorbeeld gelyk is aan die tjek1 van die RandNum, dan is rs1 = 1, aangesien dit beteken dat die regte kleur op die regte plek is. As kleur 1 nie gelyk is aan tjek1 nie, maar gelyk is aan een van die ander tjeks, dan is rc = 1. Dit word gedoen vir elke kleur en elke tjek.

Die vertoontoestand (dis) soek eers na die afteller. As dit '1' is, dan is die klein afname 1 af (dus met die eerste draai van 9 na 8, ens.). Anders verander die beurt nie. Ongeag die inskakel, word alle rs -waardes van bo bymekaargetel en toegewys om RSpotCounter te sein. Al die rc -waardes word ook bygevoeg en aan die RColorCounter toegeken. Uiteindelik word Countdown die waarde van smallcountdown toegeken. Die seine RSpotCounter, RColorCounter en Countdown word almal omskakel na 4-bis std_logic_vectors buite die proses, en deur die poortkaart na die sewe segment vertoon submodule gestoot. Op hierdie manier wys die skerm die regte dinge totdat u 'n nuwe antwoord ingedien het.

Die CheckEnd -staat is of jy gewen of verloor het. As u gewen het (al 4 kleure is op die regte plek, ook bekend as RSpotCounter = 4), dan word "GG" (tegnies 66 getoon) op die sewe segment vertoon om te wys dat u gewen het. As u verloor het (aftelling het 0 bereik), word "GO" (tegnies aangedui as 60) op die skerm vir Game Over vertoon. Met beide resultate, as u die reset -skakelaar aanskakel, sal die masjien terugkeer na die oorspronklike toestand om weer te speel.

Die bronkode kan hier gevind word.

Stap 3: Gevolgtrekking

Die voltooiing van hierdie projek het ons baie geleer oor die bou van meer ingewikkelde stroombane. Ons aanvanklike ontwerp was nie 'n eindstaatsmasjien nie. Ons het dit moeilik gevind om te ontfout en die kode 'n paar keer herskryf met behulp van verskillende metodes (insluitend 'n FSM). Op die voorstel van die instrukteur het ons vasgehou met die FSM -benadering en kon ons die wedstryd voltooi. Ons het geleer dat dit baie meer effektief is om die kode op grond van die hardeware te ontwerp as met 'n tradisionele programmeringsbenadering. Ons het ook verskeie uitdagings in die gesig gestaar wat verband hou met die sewe segment vertoon. Dit was moeilik om veelvuldige getalle te vertoon sonder om 'te spook', en ons moes 'n klokverdeler gebruik om dit te bereik. As ons hierdie projek verder sou ontwikkel, sou ons gekleurde LED's aan die Basys3 koppel, sodat die gebruiker kleure (soos in die tradisionele spel) eerder as numeriese voorstellings van kleure kan sien. Uiteindelik het ons 'n groter begrip gekry van komplekse stroombaanontwerp, werklike toepassings en die uitdagings om hardeware te gebruik eerder as om simulasies onder perfekte omstandighede uit te voer.

Aanbeveel: