Turinys:

„Mastermind“žaidimas VHDL: 3 žingsniai
„Mastermind“žaidimas VHDL: 3 žingsniai

Video: „Mastermind“žaidimas VHDL: 3 žingsniai

Video: „Mastermind“žaidimas VHDL: 3 žingsniai
Video: Lady popular - Mastermind 2024, Lapkritis
Anonim
„Mastermind“žaidimas VHDL
„Mastermind“žaidimas VHDL
„Mastermind“žaidimas VHDL
„Mastermind“žaidimas VHDL

Savo projektui mes sukūrėme „Mastermind“žaidimą VHDL, kuris bus žaidžiamas ant „Basys3“lentos. „Mastermind“yra kodų laužymo žaidimas, tradiciškai žaidžiamas su kaiščiais ir žaidimų lenta. Pirmasis žaidėjas įdeda įvairių spalvų kaiščius į 4 eilutes, paslėptas nuo antro žaidėjo. Antrasis žaidėjas turi „x“spėjimų skaičių, uždėdamas kaiščius ant lentos iš eilės, matomą vienam žaidėjui. Po kiekvieno spėjimo antrasis žaidėjas informuojamas apie 2 skaičius: kiek kaiščių yra teisingos spalvos ir kiek kaiščių yra teisingoje eilės vietoje. Naudodamasis šiais įkalčiais, antrasis žaidėjas turi atspėti teisingą smeigtukų seką, kurią vienas žaidėjas įdėjo į numanomą skaičių.

Mūsų įgyvendinimo atveju žaidimas yra vieno žaidėjo. Programa sukuria atsitiktinį kaiščių derinį, o žaidėjas turi naudoti „Basys3“lentą, kad atspėtų teisingą seką. Yra keturios „spalvos“, vaizduojamos dvejetainėmis reikšmėmis. 7 segmentų ekrane rodomos trys vertės: likę posūkiai, smeigtukų skaičius teisingoje padėtyje ir smeigtukų skaičius, kurie yra tinkamos spalvos netinkamoje padėtyje (šios vertės prasideda nuo 9, 0 ir 0). Žaidėjas naudoja lentelėje esančius jungiklius, kad pasirinktų savo spėlionės dvejetaines vertes, ir pasuka kitą jungiklį, kad pateiktų spėjimą. Jei jie teisingi, žaidimas baigiasi ir 7 segmentų ekrane rodoma „GG“. Jei ne, apsisukimų skaitiklis sumažėja 1 ir žaidėjas gauna grįžtamąjį ryšį, atsižvelgdamas į tai, kiek jų spėliojimų atitinka kaiščių spalvą ar padėtį derinyje. Jei žaidėjas pabėga be teisingų spėjimų, ekrane rodomas „GO“(žaidimo pabaiga). Grotuvas taip pat gali pasukti atstatymo jungiklį, kad bet kuriuo metu pradėtų iš naujo.

1 žingsnis: medžiagos

Medžiagos
Medžiagos
Medžiagos
Medžiagos
Medžiagos
Medžiagos

Kadangi visą žaidimą galima žaisti pačioje lentoje, vienintelės reikalingos medžiagos yra „Basys3 Board“, mikro USB kabelis, skirtas prijungti prie lentos, ir kompiuteris/nešiojamas kompiuteris, kurį galite naudoti koduodami!

2 žingsnis: kodas

Kodas
Kodas
Kodas
Kodas

Kad šis žaidimas veiktų FPGA, paprasčiausias būdas jį parašyti būtų sukurti būsenos mašiną. Turėdami būsenos mašiną, nuosekli ir interaktyvi patirtis, reikalinga žaidimui iš tikrųjų veikti. Kad viskas vyktų sklandžiai, būsenos mašina bus pagrįsta vidiniu FPGA laikrodžio signalu, užtikrinant, kad viskas būtų sinchronizuota. Pagrindinis modulis yra būsenos mašina, turinti keturias būsenas; Pradinė būsena (pradinė), „SubmitAnswer State“(„SubAns“), rodymo būsena („Dis“) ir „CheckEndGame“būsena („CheckEnd“). Kartu su būsenos mašina pagrindinis modulis turi du submodulius, 4 skaitmenų septynių segmentų ekraną (kuris turi savo „ClkDivider“submodulį) ir atsitiktinių skaičių generatorių (iš tikrųjų psuedo atsitiktinių skaičių generatorius). Taip pat yra pagrindinis proceso blokas, kad šviesos diodai virš kiekvieno jungiklio įsijungtų, kai jie būtų įjungti, kad žmonės galėtų lengviau matyti, ką jie įveda. Pagrindinę kodo apžvalgą galima pamatyti pavaizduotame minčių žemėlapyje.

Pirmasis komponentas, į kurį reikia atkreipti dėmesį, yra atsitiktinių skaičių generatorius (atsitiktinis). Kadangi techniškai neįmanoma gauti tikrų atsitiktinių skaičių, generuojamų iš aparatūros, paprasčiausias sprendimas buvo tai, kad atsitiktinis skaičius iš tikrųjų būtų linijinio grįžtamojo ryšio poslinkio registras (LFSR). LFSR turi įvestį clk ir išėjimą „a“(12 bitų skaičius). Kiekvienas laikrodžio ciklas sukuria naują 12 bitų skaičių, prasidedantį „000000000001“, galiausiai pereinant prie visų 12 bitų 1 ir 0 derinių, prieš tai kartojant. Išėjimas „a“pateikiamas kiekvieną laikrodžio ciklą, todėl jis nuolat veikia. „Clk“yra susietas su „Clk“iš pagrindinio modulio, o „a“- su signalu „RandNum“pagrindiniame modulyje.

Antrasis submodulis yra 4 skaitmenų septynių segmentų ekranas. Tai gana paprastas būdas parodyti 4 skaitmenų septynių segmentų ekraną. Ekranas nustatytas ant pagrindinio modulio „Clk“, tačiau šis submodulis turi savo „ClkDivider“submodulį. „ClkDivider“(nustatytas į 1298 Hz) naudojamas pagreitinti Septynių segmentų laikrodį, kad visi skaitmenys būtų rodomi vienu metu (nes iš tikrųjų vienu metu gali būti įjungtas tik vienas skaitmuo). Kintamasis „skaitmuo“naudojamas ekrane esančioms dėmėms perjungti, o su kiekvienu skaitmeniu pateikiamos pagrindinio 4 bitų įvesties ekrano sąlygos su galimybėmis rodyti skaitmenis nuo 0 iki 9 ir nieko. Tolimiausias kairysis skaitmuo ekrane nėra nustatytas, nes jis nėra naudojamas šiame žaidime.

Pagrindinį modulį sudaro būsenos mašina. Keturios proceso būsenos yra „Initial“, „SubAns“, „Dis“ir „CheckEnd“. Pradinėje būsenoje, jei „SubmitBtn“(jungiklis, naudojamas atsakymui pateikti tikrinimui) nustatytas į „1“, įrenginys pereina į „SubAns“būseną. Bet kuriuo metu „Rbtn“(jungiklis, naudojamas iš naujo nustatyti įrenginį) yra nustatytas į „1“, tada aparatas grįžta į pradinę būseną. Kai būsite „SubAns“būsenoje, kai „SubmitBtn“vėl bus „0“, jis pereis į Dis būseną. Esant dis būsenai, jei atgalinis skaičiavimas = 0 (posūkiai į kairę atspėti nukrenta iki 0) arba jei „RSpotCount“= 4 (tai reiškia, kad žaidėjas yra visos teisingos spalvos teisingose vietose), aparatas pereina į „CheckEnd“būseną. Jei nė vienas iš jų neįvyksta, tada, kai SubmitBtn = '1' vėl, jis grįžta į „SubAns“būseną, kad būtų galima atspėti. Kai esate „CheckEnd“būsenoje, tai yra žaidimo pabaiga, ir vienintelė išeitis yra paspausti iš naujo ir grąžinti jį į pradinę būseną. Tai lengvai matoma būsenos mašinos schemoje. Elgesio požiūriu pradinė būsena viską inicijuoja į pradinę padėtį. Skaičiavimas (signalas, kuris išsaugo, kiek žaidėjui liko posūkių) yra nustatytas į 9, RSpotCount (signalas, kuris išsaugo, kiek spalvų atspėjote tinkamoje vietoje) yra nustatytas į 0, RColorCount (signalas, kuris išsaugo kiek spalvos, kurias atspėjote, yra teisingos, bet netinkamoje vietoje) yra nustatyta į 0, o mažasis atgalinis skaičiavimas (signalas, kuris galiausiai susiejamas su „Countdown“, kuris iš tikrųjų keičia kiekvieną posūkį vėlesnėse būsenose) yra nustatytas į 9. Be to, pradinėje būsenoje „RandNum“(psuedo-atsitiktinis sugeneruotas skaičius) yra padalintas į keturis skirtingus patikrinimus (po vieną kiekvienai 3 bitų spalvai) ir įrašomas į signalus check1, check2, check3, check4. Šie patikrinimai yra tai, su kuo jūsų spėjimas iš tikrųjų lyginamas, taigi, nors LFSR visada sukelia RandNum keitimą kiekvieną ciklą, kai išeinate iš pradinės būsenos, patikrinimai lieka tie patys, todėl išsaugota vertė gali palyginti jūsų atsakymą. Tai taip pat reiškia, kad bet kuriuo metu, kai įrenginys iš naujo nustatomas, grotuvas turi naują atspėti vertę.

„SubmitAnswer“būsena („SubAns“) pakeičia atgalinio skaičiavimo funkciją (signalo „keitimas“) į „1“. To reikia vėliau, kad posūkių sekimas veiktų. Po to būsena palygina grotuvo įvestis iš jungiklių su patikrinimais, atliktais aukščiau. Signalas rs1, rs2, rs3, rs4 ir signalai rc1, rc2, rc3, rc4 yra sveikų skaičių tipai, kurie, priklausomai nuo If, yra 1 arba 0. Pavyzdžiui, jei 1 spalvos žaidėjo spėjimas yra lygus „RandNum“čekiui1, tada rs1 = 1, nes tai reiškia, kad tinkama spalva yra tinkamoje vietoje. Jei 1 spalva nėra lygi tikrinimui1, bet atitinka vieną iš kitų patikrinimų, tada rc = 1. Tai daroma kiekvienai spalvai ir kiekvienam patikrinimui.

Rodymo būsena (Dis) pirmiausia ieško atgalinės atskaitos laikmačio. Jei tai yra „1“, tada mažasis skaičiavimas sumažėja 1 (taigi per pirmąjį posūkį jis sumažėja nuo 9 iki 8 ir tt). Priešingu atveju posūkis nesikeičia. Nepaisant to, kad įjungta, visos rs vertės iš viršaus yra sudedamos ir priskiriamos signalo RSpotCounter. Taip pat visos rc vertės pridedamos ir priskiriamos RColorCounter. Galiausiai „Countdown“priskiriama „smallcountdown“vertė. Signalai „RSpotCounter“, „RColorCounter“ir „Countdown“yra konvertuojami į 4 bitų std_logic_vectors ne proceso metu ir perkeliami į septynių segmentų ekrano submodulį per prievadų žemėlapį. Tokiu būdu ekrane rodomi teisingi dalykai, kol nepateiksite naujo atsakymo.

„CheckEnd“būsena yra skirta laimėti ar pralaimėti. Jei laimėjote (visos 4 spalvos yra tinkamoje vietoje, kitaip vadinamos RSpotCounter = 4), tada septyniuose segmentuose rodomas „GG“(techniškai rodomas kaip 66), rodantis, kad laimėjote. Jei pralaimėjote (atgalinis skaičiavimas pasiekė 0), ekrane rodomas žaidimas „GO“(techniškai rodomas kaip 60). Bet kuriuo atveju, paspaudus atstatymo jungiklį į padėtį, įrenginys bus grąžintas į pradinę būseną, kad būtų galima vėl paleisti.

Šaltinio kodą rasite čia.

3 žingsnis: Išvada

Baigę šį projektą mes daug išmokėme kurti sudėtingesnes grandines. Mūsų pradinis dizainas nebuvo baigtinės būsenos mašina. Mums buvo sunku derinti ir kelis kartus perrašėme kodą įvairiais metodais (įskaitant FSM). Instruktoriaus pasiūlymu mes laikėmės FSM metodo ir galėjome baigti žaidimą. Mes sužinojome, kad kuriant kodą pagal aparatūrą yra daug efektyviau, nei naudojant tradicinį programavimo metodą. Mes taip pat susidūrėme su keliais iššūkiais, susijusiais su septynių segmentų ekranu. Buvo sunku parodyti kelis skaičius be „vaiduoklių“, todėl tam turėjome naudoti laikrodžio daliklį. Jei norėtume toliau plėtoti šį projektą, prie „Basys3“prijungtume spalvotus šviesos diodus, kad vartotojas galėtų matyti spalvas (kaip ir tradiciniame žaidime), o ne skaičių atvaizdus. Galų gale mes geriau supratome sudėtingą grandinės dizainą, realaus gyvenimo programas ir techninės įrangos naudojimo iššūkius, o ne paleisti simuliacijas puikiomis sąlygomis.

Rekomenduojamas: