Obsah:

Hra Mastermind ve VHDL: 3 kroky
Hra Mastermind ve VHDL: 3 kroky

Video: Hra Mastermind ve VHDL: 3 kroky

Video: Hra Mastermind ve VHDL: 3 kroky
Video: Mastermind 2018 - How To Play 2024, Červenec
Anonim
Hra Mastermind ve VHDL
Hra Mastermind ve VHDL
Hra Mastermind ve VHDL
Hra Mastermind ve VHDL

Pro náš projekt jsme vytvořili hru „Mastermind“ve VHDL, kterou lze hrát na desce Basys3. Mastermind je hra rozbíjející kód, která se tradičně hraje s kolíčky a herním plánem. Hráč jeden umístí kolíky různých barev do řady 4, skryté před hráčem dva. Hráč dva pak má počet x odhadů umístěním kolíků na hrací desku v řadě viditelné pro hráče jedna. Po každém hádání je hráč dva informován o 2 číslech: kolik kolíků má správnou barvu a kolik kolíků je ve správné pozici v řadě. Pomocí těchto stop musí hráč dva uhodnout správnou posloupnost kolíků, které hráč jeden umístil do přiděleného odhadu čísel.

V naší implementaci je hra pro jednoho hráče. Program vygeneruje náhodnou kombinaci kolíků a hráč musí použít desku Basys3 k uhádnutí správné sekvence. Existují čtyři „barvy“reprezentované binárními hodnotami. 7segmentový displej zobrazuje tři hodnoty: zbývající otáčky, počet kolíků ve správné poloze a počet kolíků, které mají správnou barvu ve špatné poloze (tyto hodnoty začínají na 9, 0 a 0). Hráč používá přepínače na hrací ploše k výběru binárních hodnot pro svůj odhad a otočením dalšího přepínače předloží odhad. Pokud jsou správné, hra končí a na 7segmentovém displeji se zobrazí „GG“. Pokud ne, počítadlo tahů se sníží o 1 a hráč obdrží zpětnou vazbu na základě toho, kolik kolíků v jejich odhadech odpovídá barvě nebo poloze kolíků v kombinaci. Pokud hráči dojdou tahy, aniž by správně uhodli, na displeji se zobrazí „GO“(představující konec hry). Hráč může také kdykoli přepnout přepínač resetování a začít znovu.

Krok 1: Materiály

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

Vzhledem k tomu, že celou hru lze hrát na desce samotné, jsou jediným potřebným materiálem Basys3 Board, kabel micro USB pro připojení k desce a počítač/notebook, pomocí kterého můžete kódovat!

Krok 2: Kód

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

Aby tato hra fungovala na FPGA, nejjednodušším způsobem psaní by bylo vytvoření stavového stroje. Mít stavový stroj umožňuje sekvenční a interaktivní zážitek nezbytný k tomu, aby hra skutečně fungovala. Aby vše fungovalo hladce, stavový stroj bude založen na vnitřním hodinovém signálu FPGA a zajistí, že je vše synchronizováno. Hlavní modul je stavový stroj se čtyřmi stavy; Počáteční stav (počáteční), stav SubmitAnswer (subAns), stav zobrazení (Dis) a stav CheckEndGame (CheckEnd). Spolu se stavovým automatem má hlavní modul dva submoduly, čtyřmístný displej se sedmi segmenty (který má svůj vlastní submodul ClkDivider) a generátor náhodných čísel (ve skutečnosti generátor náhodných čísel psuedo). K dispozici je také základní procesní blok, aby se LED diody nad každým spínačem rozsvítily, když jsou zapnuty, aby lidé lépe viděli, co zadávají. Základní přehled kódu je vidět na myšlenkové mapě na obrázku.

První komponentou, na kterou je třeba se podívat, je generátor náhodných čísel (randomgen). Protože není technicky možné získat skutečná náhodná čísla generovaná hardwarem, bylo nejjednodušším řešením mít randomgen ve skutečnosti posuvný registr s lineární zpětnou vazbou (LFSR). LFSR má vstup clk a výstup „a“(12bitové číslo). Každý hodinový cyklus generuje nové 12bitové číslo začínající na „000000000001“, nakonec prochází všemi kombinacemi 12bitových 1 a 0, než se opakuje. Výstup „a“je dán každým hodinovým cyklem, takže běží nepřetržitě po celou dobu. Clk je mapován na Clk z hlavního modulu a „a“je mapováno na signál RandNum v hlavním modulu.

Druhým submodulem je čtyřmístný sedmimístný displej. Toto je docela přímočarý způsob, jak předvést 4místný sedmisegmentový displej. Zobrazení je nastaveno na Clk z hlavního modulu, ale tento submodul má svůj vlastní submodul ClkDivider. ClkDivider (nastavený na 1298 Hz) se používá k urychlení hodin pro sedmý segment, takže se zdá, že všechny číslice jsou zapnuté současně (protože ve skutečnosti může být současně zapnuta pouze jedna číslice). Proměnná „číslice“se používá k procházení skvrn na displeji a s každou číslicí přicházejí podmínky základního 4bitového vstupního displeje s možnostmi zobrazovat číslice 0 až 9 a také nic. Nejvzdálenější levá číslice na displeji je nastavena na nic, protože se v této hře nepoužívá.

Hlavní modul se skládá ze stavového stroje. Čtyři stavy v procesu jsou Initial, SubAns, Dis a CheckEnd. Když je stroj v počátečním stavu, pokud je SubmitBtn (přepínač používaný k odeslání vaší odpovědi ke kontrole) nastaven na „1“, stroj se přesune do stavu SubAns. Kdykoli je Rbtn (přepínač používaný k resetování stroje) nastaven na „1“, pak se počítač vrátí do počátečního stavu. Když je ve stavu SubAns, když SubmitBtn = ‘0’ znovu, přejde do stavu Dis. Když je počítač ve stavu Dis, pokud odpočítávání = 0 (odbočky doleva k hádání klesnou na 0) nebo RSpotCount = 4 (což znamená hráče jako všechny správné barvy na správných místech), stroj přejde do stavu CheckEnd. Pokud k žádnému z nich nedojde, pak se znovu při SubmitBtn = ‘1’ vrátí do stavu SubAns, aby bylo možné další hádání. Když jste ve stavu CheckEnd, tím hra končí a jediným východiskem je reset a návrat do počátečního stavu. To lze snadno zobrazit v diagramu stavového stroje. Behaviorálně počáteční stav inicializuje vše zpět do výchozí polohy. Odpočítávání (signál, který ukládá počet zbývajících tahů, které hráč má) je nastaven na 9, RSpotCount (signál, který ukládá, kolik barev jste uhodli, že jsou na správném místě) je nastaven na 0, RColorCount (signál, který ukládá kolik barvy, které jste uhádli, jsou správné, ale na špatném místě) je nastaven na 0 a smallcountdown (signál, který je nakonec mapován na Countdown, který ve skutečnosti mění každé kolo v pozdějších stavech) je nastaven na 9. Také v počátečním stavu RandNum (psuedo-náhodně generované číslo) je rozděleno do čtyř různých kontrol (jedna pro každé 3bitové barvy) a uložena do signálů check1, check2, check3, check4. S těmito kontrolami se ve skutečnosti porovnává váš odhad, takže i když LFSR vždy způsobí, že RandNum změní každý cyklus, jakmile opustíte počáteční stav, kontroly zůstanou stejné, což umožní uložené hodnotě porovnat vaši odpověď s. To také znamená, že kdykoli je stroj resetován, má hráč novou hodnotu, kterou může uhodnout.

Stát SubmitAnswer (SubAns) změní aktivátor odpočítávání (signál „změna“) na „1“. To je potřeba později, aby sledování odbočení fungovalo. Poté stát porovná vstupy hráče z přepínačů s kontrolami provedenými ve výše uvedeném stavu. Signál rs1, rs2, rs3, rs4 a signály rc1, rc2, rc3, rc4 jsou celočíselné typy, které jsou v případě příkazů If nastaveny na 1 nebo 0. Signál rs je pro správné místo a rc pro správnou barvu. Pokud se například odhad barvy 1 hráče rovná check1 v RandNum, pak rs1 = 1, protože to znamená, že správná barva je na správném místě. Pokud se barva 1 nerovná check1, ale rovná se jedné z ostatních kontrol, pak rc = 1. To se provádí pro každou barvu a každou kontrolu.

Stav zobrazení (Dis) nejprve vyhledá aktivátor odpočítávání. Pokud je „1“, pak malý odpočet klesne o 1 (takže v prvním kole jde z 9 na 8 atd.). Jinak se tah nezmění. Bez ohledu na to povolte, všechny výše uvedené hodnoty rs se sečtou a přiřadí k signálu RSpotCounter. Také všechny hodnoty rc jsou přidány a přiřazeny k RColorCounter. Nakonec Countdown je přiřazena hodnota smallcountdown. Signály RSpotCounter, RColorCounter a Countdown jsou všechny převedeny na 4bitové std_logic_vectors mimo proces a jsou přeneseny do submodulu zobrazení sedmi segmentů prostřednictvím mapy portů. Tímto způsobem displej zobrazuje správné věci, dokud neodevzdáte novou odpověď.

Stav CheckEnd slouží k tomu, zda jste vyhráli nebo prohráli. Pokud jste vyhráli (všechny 4 barvy jsou na správném místě, jinak známý jako RSpotCounter = 4), pak se v sedmém segmentu zobrazí „GG“(technicky zobrazeno jako 66), což ukazuje, že jste vyhráli. Pokud jste prohráli (odpočítávání dosáhlo 0), pak se na displeji pro Game Over zobrazí „GO“(technicky zobrazeno jako 60). V obou případech se přepnutím přepínače do polohy zapnuto vrátí stroj zpět do počátečního stavu, aby mohl hrát znovu.

Zdrojový kód naleznete zde.

Krok 3: Závěr

Dokončení tohoto projektu nás hodně naučilo stavět složitější obvody. Náš původní návrh nebyl stroj s konečným stavem. Zjistili jsme, že je obtížné ladit a několikrát přepsat kód pomocí různých metod (včetně FSM). Na návrh instruktora jsme se drželi přístupu FSM a byli jsme schopni hru dokončit. Dozvěděli jsme se, že je mnohem efektivnější navrhnout kód na základě hardwaru než pomocí tradičního programovacího přístupu. Také jsme čelili několika výzvám souvisejícím se sedmisegmentovým displejem. Získání zobrazení více čísel bez „ghostingu“bylo obtížné a museli jsme k tomu použít dělič hodin. Pokud bychom tento projekt dále rozvíjeli, připojili bychom k Basys3 barevné LED diody, aby uživatel viděl barvy (jako v tradiční hře) spíše než numerické znázornění barev. Nakonec jsme lépe porozuměli komplexnímu návrhu obvodů, aplikacím v reálném životě a výzvám při používání hardwaru, nikoli při spouštění simulací za perfektních podmínek.

Doporučuje: