Obsah:

Hra Mastermind vo VHDL: 3 kroky
Hra Mastermind vo VHDL: 3 kroky

Video: Hra Mastermind vo VHDL: 3 kroky

Video: Hra Mastermind vo VHDL: 3 kroky
Video: Mastermind 2018 - How To Play 2024, November
Anonim
Hra Mastermind vo VHDL
Hra Mastermind vo VHDL
Hra Mastermind vo VHDL
Hra Mastermind vo VHDL

Pre náš projekt sme vytvorili hru „Mastermind“vo VHDL, ktorú je možné hrať na doske Basys3. Mastermind je hra na lámanie kódu, ktorá sa tradične hrá s kolíkmi a hracou doskou. Hráč jeden umiestni kolíky rôznych farieb do radu 4, skryté pred hráčom dva. Hráč dva má potom „x“počet hádaní umiestnením kolíkov na hraciu plochu v rade viditeľnom pre hráča jedna. Po každom hádaní je hráč dva informovaný o 2 číslach: koľko kolíkov má správnu farbu a koľko kolíkov je na správnom mieste v rade. Pomocou týchto indícií musí hráč dva uhádnuť správnu postupnosť pinov, ktoré hráč jeden umiestnil do prideleného uhádnutia čísla.

V našej implementácii je hra pre jedného hráča. Program vygeneruje náhodnú kombináciu kolíkov a hráč musí pomocou dosky Basys3 uhádnuť správnu postupnosť. Existujú štyri „farby“reprezentované binárnymi hodnotami. 7-segmentový displej zobrazuje tri hodnoty: zostávajúce otáčky, počet kolíkov v správnej polohe a počet kolíkov, ktoré majú správnu farbu v nesprávnej polohe (tieto hodnoty začínajú na 9, 0 a 0). Hráč používa prepínače na doske na výber binárnych hodnôt pre svoj odhad a otočením ďalšieho prepínača predloží odhad. Ak sú správne, hra sa skončí a na 7-segmentovom displeji sa zobrazí „GG“. Ak nie, počítadlo otáčok sa zníži o 1 a hráč dostane spätnú väzbu podľa toho, koľko kolíkov v ich odhade zodpovedá farbe alebo polohe kolíkov v kombinácii. Ak dôjde hráčovi striedanie bez správneho uhádnutia, na displeji sa zobrazí „GO“(predstavujúce koniec hry). Hráč môže tiež kedykoľvek otočiť prepínač resetovania a začať odznova.

Krok 1: Materiály

Materiály
Materiály
Materiály
Materiály
Materiály
Materiály

Pretože celú hru je možné hrať na doske samotnej, jediným materiálom, ktorý potrebujete, sú doska Basys3, kábel micro USB na pripojenie k doske a počítač/prenosný počítač, pomocou ktorého môžete kódovať!

Krok 2: Kód

Kód
Kód
Kód
Kód

Aby táto hra fungovala na FPGA, najjednoduchším spôsobom písania by bolo vytvorenie stavového stroja. Vďaka stavovému stroju umožňuje sekvenčný a interaktívny zážitok potrebný na to, aby hra skutočne fungovala. Aby všetko fungovalo hladko, stavový automat bude založený na vnútornom hodinovom signáli FPGA, pričom zaistí synchronizáciu všetkého. Hlavný modul je stavový stroj so štyrmi stavmi; Počiatočný stav (počiatočný), stav SubmitAnswer (podúčty), stav zobrazenia (Dis) a stav CheckEndGame (CheckEnd). Spolu so stavovým automatom má hlavný modul dva submoduly, 4-miestny sedemsegmentový displej (ktorý má vlastný submodul ClkDivider) a generátor náhodných čísel (v skutočnosti generátor náhodných čísel). K dispozícii je tiež základný procesný blok, aby sa diódy LED nad každým prepínačom zapli, keď sú zapnuté, aby ľudia ľahšie videli, čo zadávajú. Základný prehľad kódu môžete vidieť na myšlienkovej mape na obrázku.

Prvá zložka, na ktorú sa treba pozrieť, je generátor náhodných čísel (randomgen). Pretože nie je technicky možné získať skutočné náhodné čísla generované z hardvéru, najjednoduchším riešením bolo nechať náhodný kmeň v skutočnosti posunovým registrom s lineárnou spätnou väzbou (LFSR). LFSR má vstup clk a výstup „a“(12-bitové číslo). Každý hodinový cyklus vygeneruje nové 12-bitové číslo začínajúce na „000000000001“, nakoniec prejde všetkými kombináciami 12-bitových číslic 1 a 0 a potom sa zopakuje. Výstup „a“je daný každým hodinovým cyklom, takže beží nepretržite. CLK je namapovaný na Clk z hlavného modulu a „a“je namapované na signál RandNum v hlavnom module.

Druhý submodul je 4-miestny sedemsegmentový displej. Je to celkom jednoduchý spôsob, ako predviesť 4-miestny sedemsegmentový displej. Displej je nastavený na Clk z hlavného modulu, ale tento submodul má svoj vlastný submodul ClkDivider. ClkDivider (nastavený na 1 298 Hz) sa používa na zrýchlenie hodín pre sedem segmentov, takže sa zdá, že všetky číslice sú zapnuté súčasne (pretože v skutočnosti môže byť súčasne zapnutá iba jedna číslica). Premenná „číslica“sa používa na cyklické prechádzanie bodmi na displeji a s každou číslicou prichádzajú aj podmienky základného 4-bitového vstupného displeja s možnosťami zobrazovania číslic 0 až 9 a tiež nič. Najvzdialenejšia ľavá číslica na displeji je nastavená na nič, pretože sa v tejto hre nepoužíva.

Hlavný modul pozostáva zo stavového stroja. Štyrmi stavmi v tomto procese sú Počiatočný, SubAns, Dis a CheckEnd. Keď je stroj v počiatočnom stave, ak je SubmitBtn (prepínač používaný na odoslanie vašej odpovede na kontrolu) nastavený na „1“, stroj sa presunie do stavu SubAns. Kedykoľvek je Rbtn (prepínač používaný na resetovanie zariadenia) nastavený na „1“, zariadenie sa potom vráti do počiatočného stavu. Keď sa nachádzate v štáte SubAns, keď sa SubmitBtn = ‘0’ znova, prejde do stavu Dis. Keď je počítač v stave Dis, ak odpočítavanie = 0 (odbočky vľavo hádajú na 0) alebo RSpotCount = 4 (čo znamená hráča ako všetky správne farby na správnych miestach), stroj prejde do stavu CheckEnd. Ak sa nič z toho nevyskytne, potom keď sa SubmitBtn = ‘1’ znova, vráti sa do stavu SubAns, aby umožnil ďalší odhad. Keď ste v stave CheckEnd, je to koniec hry a jediným východiskom je resetovanie a návrat do počiatočného stavu. To je možné ľahko zobraziť v diagrame stavového stroja. Počiatočný stav inicializuje všetko späť do východiskovej polohy. Odpočítavanie (signál, ktorý ukladá počet zostávajúcich ťahov hráčovi) je nastavený na 9, RSpotCount (signál, ktorý ukladá, koľko farieb ste uhádli, sú na správnom mieste) je nastavený na 0, RColorCount (signál, ktorý ukladá koľko farby, ktoré ste uhádli, sú správne, ale na zlom mieste) je nastavené na 0 a malé odpočítavanie (signál, ktorý je nakoniec mapovaný na Odpočítavanie, ktoré v skutočnosti mení každé otočenie v neskorších stavoch) je nastavené na 9. Tiež v počiatočnom stave RandNum (náhodne vygenerované číslo) je rozdelené do štyroch rôznych kontrol (jedna pre každú 3-bitovú farbu) a uložené do signálov check1, check2, check3, check4. Tieto kontroly sú v skutočnosti porovnávané s vašim odhadom, takže aj keď LFSR vždy spôsobuje, že sa RandNum zmení v každom cykle, akonáhle opustíte počiatočný stav, kontroly zostanú rovnaké, čo umožní uloženej hodnote porovnať vašu odpoveď s. To tiež znamená, že pri každom resetovaní hracieho automatu má hráč novú uhádnutú hodnotu.

Štát SubmitAnswer (SubAns) zmení aktivátor odpočítavania (signál „zmena“) na „1“. Toto je potrebné neskôr, aby sledovanie odbočenia fungovalo. Potom štát porovná vstupy hráča z prepínačov s kontrolami vykonanými vo vyššie uvedenom stave. Signál rs1, rs2, rs3, rs4 a signály rc1, rc2, rc3, rc4 sú celočíselné typy, ktoré sú v závislosti od príkazov If nastavené na 1 alebo 0. Signál rs je pre správne miesto a rc pre správnu farbu. Napríklad, ak sa odhad farby 1 hráča rovná šeku 1 RandNum, potom rs1 = 1, pretože to znamená, že správna farba je na správnom mieste. Ak sa farba 1 nerovná kontrole1, ale rovná sa jednej z ostatných kontrol, potom rc = 1. To sa robí pre každú farbu a každú kontrolu.

Stav zobrazenia (Dis) najskôr vyhľadá aktivátor odpočítavania. Ak je „1“, potom malé odpočítavanie klesne o 1 (takže pri prvom otočení ide z 9 na 8 atď.). V opačnom prípade sa odbočka nezmení. Bez ohľadu na to, ktoré zapnutie je, všetky vyššie uvedené hodnoty rs sa sčítajú a priradia k signálu RSpotCounter. Tiež sú pridané a priradené k RColorCounter všetky hodnoty rc. Nakoniec je odpočítavaniu priradená hodnota malého odpočítavania. Signály RSpotCounter, RColorCounter a Countdown sú všetky prevedené na 4-bitové std_logic_vectors mimo procesu a sú posunuté do submodulu zobrazenia siedmich segmentov prostredníctvom mapy portov. Takto displej zobrazí správne veci, kým neodošlete novú odpoveď.

Stav CheckEnd slúži na to, či ste vyhrali alebo prehrali. Ak ste vyhrali (všetky 4 farby sú na správnom mieste, inak známy ako RSpotCounter = 4), potom sa v siedmom segmente zobrazí „GG“(technicky zobrazené ako 66), aby sa ukázalo, že ste vyhrali. Ak ste prehrali (odpočítavanie dosiahlo 0), potom sa na displeji pre Game Over zobrazí „GO“(technicky zobrazené ako 60). V oboch prípadoch sa prepnutím vypínača do polohy zapnuté zariadenie vráti do počiatočného stavu, aby sa mohlo hrať znova.

Zdrojový kód nájdete tu.

Krok 3: Záver

Dokončenie tohto projektu nás naučilo veľa o stavaní komplikovanejších obvodov. Náš pôvodný návrh nebol stroj s konečným stavom. Zistili sme, že je ťažké ladiť a niekoľkokrát sme prepísali kód pomocou rôznych metód (vrátane FSM). Na návrh inštruktora sme sa držali prístupu FSM a mohli sme hru dokončiť. Dozvedeli sme sa, že je oveľa efektívnejšie navrhnúť kód na základe hardvéru ako pomocou tradičného programovacieho prístupu. Stáli sme tiež pred niekoľkými výzvami súvisiacimi so sedemsegmentovým displejom. Dosiahnutie zobrazenia viacerých čísel bez „duchov“bolo náročné a museli sme na to použiť rozdeľovač hodín. Ak by sme tento projekt ďalej rozvíjali, pripojili by sme k Basys3 farebné LED diódy, aby používateľ mohol vidieť farby (ako v tradičnej hre), a nie numerické znázornenie farieb. Nakoniec sme lepšie pochopili komplexný návrh obvodov, aplikácie v reálnom živote a výzvy súvisiace s používaním hardvéru, a nie so spustením simulácií za perfektných podmienok.

Odporúča: