Kazalo:

Igra Mastermind v VHDL: 3 koraki
Igra Mastermind v VHDL: 3 koraki

Video: Igra Mastermind v VHDL: 3 koraki

Video: Igra Mastermind v VHDL: 3 koraki
Video: FPGA/ПЛИС - Сдвиговый регистр или то, о чем не расскажут в видео для начинающих :: атрибуты синтеза 2024, Julij
Anonim
Mastermind igra v VHDL
Mastermind igra v VHDL
Mastermind igra v VHDL
Mastermind igra v VHDL

Za naš projekt smo ustvarili igro "Mastermind" v VHDL, ki jo bomo igrali na deski Basys3. Mastermind je igra za razbijanje kod, ki se tradicionalno igra s kljukicami in igralno desko. Igralec ena postavi kljuke različnih barv v vrsto 4, skrite pred igralcem dva. Igralec dva ima nato število ugibanja 'x', ki da kljukice na tablo v vrsti, ki je vidna igralcu ena. Po vsakem ugibanju je igralec dva obveščen o 2 številkah: koliko klinov je pravilne barve in koliko klinov je v pravilnem položaju v vrsti. Z uporabo teh namigov mora igralec dva uganiti pravilno zaporedje nožic, ki jih je igralec eden postavil v dodeljeno število ugibanj.

V naši izvedbi je igra za enega igralca. Program ustvari naključno kombinacijo kljukic in igralec mora s pomočjo deske Basys3 uganiti pravilno zaporedje. Obstajajo štiri "barve", predstavljene z binarnimi vrednostmi. 7-segmentni zaslon prikazuje tri vrednosti: preostale zavoje, število zatičev v pravilnem položaju in število zatičev pravilne barve v napačnem položaju (te vrednosti se začnejo pri 9, 0 in 0). Igralec s pomočjo stikal na plošči izbere binarne vrednosti za svojo ugibanje in obrne drugo stikalo, da predloži ugibanje. Če so pravilne, se igra konča in na 7-segmentnem zaslonu se prikaže »GG«. V nasprotnem primeru se števec zavojev zmanjša za 1 in igralec prejme povratne informacije glede na to, koliko zatičev v njihovi ugibanju ustreza barvi ali položaju zatičev v kombinaciji. Če igralcu zmanjka zavojev, ne da bi pravilno uganili, se na zaslonu prikaže »GO« (predstavlja igro konec). Predvajalnik lahko kadar koli obrne stikalo za ponastavitev, da začne znova.

1. korak: Materiali

Materiali
Materiali
Materiali
Materiali
Materiali
Materiali

Ker je celotno igro mogoče igrati na sami plošči, so potrebni le materiali Basys3 Board, kabel mikro USB za povezavo s ploščo in računalnik/prenosni računalnik, ki ga lahko uporabite za kodiranje!

2. korak: Koda

Kodeks
Kodeks
Kodeks
Kodeks

Če želite, da bi ta igra delovala na FPGA, bi najpreprosteje pisali, da ustvarite državni stroj. Državni stroj omogoča zaporedno in interaktivno izkušnjo, potrebno za dejansko delovanje igre. Da bi vse potekalo brez težav, bo državni stroj temeljil na signalu notranje ure FPGA, kar bo zagotovilo sinhronizacijo. Glavni modul je stroj stanja s štirimi stanji; Začetno stanje (začetno), stanje oddanega odgovora (podAns), stanje prikaza (Dis) in stanje CheckEndGame (CheckEnd). Poleg državnega stroja ima glavni modul dva podmodula, 4-mestni sedemsegmentni zaslon (ki ima svoj podmodul ClkDivider) in generator naključnih števil (pravzaprav generator psuedo-naključnih števil). Obstaja tudi osnovni procesni blok, ki LED -diode nad vsakim stikalom vklopi, ko so vklopljene, tako da ljudje lažje vidijo, kaj vnesejo. Osnovni pregled kode je razviden iz miselne karte na sliki.

Prva komponenta, ki jo je treba pogledati, je generator naključnih števil (randomgen). Ker tehnično ni mogoče dobiti resničnih naključnih števil, ustvarjenih iz strojne opreme, je bila najpreprostejša rešitev, da je bil naključni gen dejansko linearni povratni premični register (LFSR). LFSR ima vhod clk in izhod "a" (12-bitno število). Vsak cikel ure ustvari novo 12-bitno število, ki se začne pri "000000000001", nato pa se konča skozi vse kombinacije 12-bitnih številk 1 in 0, preden se ponovi. Izhod "a" je podan vsakemu ciklu, zato se ves čas izvaja. Clk je preslikan v Clk iz glavnega modula, "a" pa v signal RandNum v glavnem modulu.

Drugi podmodul je 4-mestni sedemsegmentni zaslon. To je precej preprost način predstavitve 4-mestnega sedemsegmentnega zaslona. Zaslon je nastavljen na Clk iz glavnega modula, vendar ima ta podmodul svoj podmodul ClkDividerja. ClkDivider (nastavljen na 1298 Hz) se uporablja za pospešitev ure za sedem segmentov, tako da se zdi, da so vse številke vklopljene hkrati (saj je lahko naenkrat vklopljena samo ena številka). Spremenljivka »števka« se uporablja za kroženje po točkah na zaslonu, z vsako števko pa pridejo pogoji osnovnega 4-bitnega vhodnega zaslona z možnostmi prikaza števk od 0 do 9 in tudi nič. Najdaljša leva številka na zaslonu je nastavljena na nič, ker se v tej igri ne uporablja.

Glavni modul je sestavljen iz stroja stanja. Štiri stanja v procesu so Initial, SubAns, Dis in CheckEnd. Če je v začetnem stanju, če je SubmitBtn (stikalo, ki uporablja vaš odgovor za preverjanje) nastavljeno na „1“, se naprava premakne v stanje SubAns. Kadar koli je Rbtn (stikalo za ponastavitev stroja) nastavljeno na „1“, nato se naprava vrne v začetno stanje. Ko je v stanju SubAns, ko je SubmitBtn = '0', se premakne v stanje Dis. Ko je v stanju Dis, če odštevanje = 0 (Zavoji za ugibanje padejo na 0) ali če je RSpotCount = 4 (kar pomeni, da je predvajalnik kot vse pravilne barve na pravilnih mestih), naprava preide v stanje CheckEnd. Če se ne zgodi nič od tega, se, ko je SubmitBtn = "1", vrne v stanje SubAns, da dovoli novo ugibanje. Ko ste v stanju CheckEnd, je to konec igre in edini izhod je, da pritisnete na ponastavitev in jo vrnete v začetno stanje. To je enostavno prikazati v diagramu stanja stroja. Vedenjsko začetno stanje inicializira vse nazaj v začetni položaj. Odštevanje (signal, ki shrani, koliko igralcev ima levo) ima nastavljeno na 9, RSpotCount (signal, ki shrani, koliko barv ste uganili, da je na pravem mestu), nastavljeno na 0, RColorCount (signal, ki shrani, koliko barve, za katere ste uganili, da so pravilne, vendar na napačnem mestu) nastavljena na 0, smallcountdown (signal, ki se sčasoma preslika v odštevanje, ki dejansko spremeni vsak obrat v poznejših stanjih) pa na 9. Prav tako je v začetnem stanju RandNum (psuedo-naključno generirano število) je razdeljeno na štiri različne kontrole (po eno za vsako 3-bitno barvo) in shranjeno v signale check1, check2, check3, check4. Vaša preverjanja so v resnici primerjava, zato čeprav LFSR vedno povzroči, da RandNum spremeni vsak cikel, ko zapustite začetno stanje, preverjanja ostanejo enaka, kar omogoča shranjeno vrednost za primerjavo vašega odgovora. To tudi pomeni, da ima predvajalnik ob vsaki ponastavitvi naprave novo vrednost.

Stanje SubmitAnswer (SubAns) spremeni omogočilo odštevanje (signal »spremeni«) v »1«. To je potrebno pozneje, da bo sledenje obratom delovalo. Po tem stanje primerja vnose igralcev s stikal s preverjanji v zgornjem stanju. Signal rs1, rs2, rs3, rs4 in signali rc1, rc2, rc3, rc4 so celobrojne vrste, ki so glede na stavke If nastavljene na 1 ali 0. Signal rs je za desno mesto in rc za pravo barvo. Na primer, če je ugibanje igralca barve 1 enako check1 RandNum, potem je rs1 = 1, saj to pomeni, da je prava barva na pravem mestu. Če barva 1 ni enaka check1, vendar je enaka eni od drugih preverjanj, potem je rc = 1. To se naredi za vsako barvo in vsako preverjanje.

Prikazno stanje (Dis) najprej poišče orodje za odštevanje. Če je "1", se smallcountdown zniža za 1 (torej na prvem zavoju gre z 9 na 8 itd.). V nasprotnem primeru se obrat ne spremeni. Ne glede na to možnost vklopa se vse vrednosti rs od zgoraj seštejejo in dodelijo signalu RSpotCounter. Prav tako so vse vrednosti rc dodane in dodeljene RColorCounterju. Na koncu odštevanju je dodeljena vrednost smallcountdown. Signali RSpotCounter, RColorCounter in Countdown se pretvorijo v 4-bitne std_logic_vectors zunaj procesa in se po zemljevidu vrat potisnejo v podmodul za prikaz sedmih segmentov. Na ta način se na zaslonu prikažejo prave stvari, dokler ne pošljete novega odgovora.

Država CheckEnd določa, ali ste zmagali ali izgubili. Če ste zmagali (vse 4 barve so na pravem mestu, sicer znane kot RSpotCounter = 4), se na sedmem segmentu prikaže "GG" (tehnično prikazano kot 66), ki dokazuje, da ste zmagali. Če ste izgubili (odštevanje je doseglo 0), se na zaslonu prikaže "GO" (tehnično prikazano kot 60) za Game Over. Pri obeh izidih, če pritisnete stikalo za ponastavitev na vklopljeno, se naprava premakne nazaj v začetno stanje za ponovno predvajanje.

Izvorno kodo najdete tukaj.

3. korak: Zaključek

Dokončanje tega projekta nas je veliko naučilo o gradnji bolj zapletenih vezij. Naša prvotna zasnova ni bila stroj s končnim stanjem. Pri odpravljanju napak smo kodo večkrat prepisali z različnimi metodami (vključno s FSM). Na predlog inštruktorja smo se držali pristopa FSM in smo lahko igro zaključili. Izvedeli smo, da je oblikovanje kode na podlagi strojne opreme veliko učinkovitejše kot pri tradicionalnem pristopu programiranja. Soočili smo se tudi z več izzivi, povezanimi s sedemsegmentnim zaslonom. Prikaz več številk brez "prikazovanja duhov" je bil težak, zato smo morali za to uporabiti razdelilnik ure. Če bi ta projekt še razvijali, bi na Basys3 povezali barvne LED diode, tako da lahko uporabnik vidi barve (tako kot v tradicionalni igri) in ne številčne predstavitve barv. Konec koncev smo bolje razumeli zasnovo zapletenega vezja, aplikacije v resničnem življenju in izzive pri uporabi strojne opreme namesto simulacij s popolnimi pogoji.

Priporočena: