Sadržaj:

Mastermind igra u VHDL -u: 3 koraka
Mastermind igra u VHDL -u: 3 koraka

Video: Mastermind igra u VHDL -u: 3 koraka

Video: Mastermind igra u VHDL -u: 3 koraka
Video: Mastermind 2018 - How To Play 2024, Srpanj
Anonim
Mastermind igra u VHDL -u
Mastermind igra u VHDL -u
Mastermind igra u VHDL -u
Mastermind igra u VHDL -u

Za naš projekt stvorili smo igru “Mastermind” u VHDL -u koja će se igrati na Basys3 ploči. Mastermind je igra za razbijanje kodova koja se tradicionalno igra klinovima i pločom za igru. Igrač jedan postavlja klinove različitih boja u niz od 4, skrivene od igrača dva. Igrač dva tada ima 'x' broj nagađanja postavljajući klinove na ploču u nizu vidljive igraču jedan. Nakon svakog pogađanja, igrač dva dobiva dva broja: koliko je klinova ispravne boje i koliko je klinova na ispravnom mjestu u redu. Koristeći te tragove, igrač dva mora pogoditi ispravan slijed pinova koje je igrač jedan postavio u dodijeljenu brojku.

U našoj implementaciji, igra je za jednog igrača. Program generira slučajnu kombinaciju klinova, a igrač mora pomoću ploče Basys3 pogoditi ispravan slijed. Postoje četiri "boje", predstavljene binarnim vrijednostima. Zaslon sa 7 segmenata prikazuje tri vrijednosti: preostale zavoje, broj pinova u ispravnom položaju i broj pinova ispravne boje u pogrešnom položaju (ove vrijednosti počinju na 9, 0 i 0). Igrač koristi prekidače na ploči za odabir binarnih vrijednosti za svoje pogađanje i okreće drugi prekidač za slanje nagađanja. Ako su točni, igra se završava i na 7-segmentnom zaslonu prikazuje se "GG". Ako nije, brojač zaokreta se smanjuje za 1 i igrač prima povratnu informaciju na temelju toga koliko iglica u njihovoj pretpostavci odgovara boji ili položaju igle u kombinaciji. Ako igrač ostane bez zavoja, a da nije ispravno pogodio, na zaslonu se prikazuje “GO” (predstavlja igru završenom). Igrač također može u bilo kojem trenutku okrenuti prekidač za poništavanje kako bi započeo ispočetka.

Korak 1: Materijali

Materijali
Materijali
Materijali
Materijali
Materijali
Materijali

Budući da se cijela igra može igrati na samoj ploči, jedini potrebni materijali su Basys3 ploča, mikro USB kabel za spajanje na ploču i računalo/prijenosno računalo koje možete koristiti za kodiranje!

Korak 2: Kôd

Kod
Kod
Kod
Kod

Kako bi ova igra radila na FPGA -i, najjednostavniji način pisanja bio bi stvaranje državnog stroja. Državni stroj omogućuje uzastopno i interaktivno iskustvo potrebno da bi igra zaista funkcionirala. Kako bi sve radilo bez problema, državni stroj će se temeljiti na unutarnjem signalu takta FPGA -e, osiguravajući da je sve sinkronizirano. Glavni modul je stroj stanja s četiri stanja; Početno stanje (početno), stanje podnošenja odgovora (podAns), stanje prikaza (Dis) i stanje CheckEndGame (CheckEnd). Uz državni stroj, glavni modul ima dva podmodula, četveroznamenkasti sedmosegmentni zaslon (koji ima vlastiti podmodul ClkDivider) i generator slučajnih brojeva (zapravo generator psuedo-slučajnih brojeva). Postoji i osnovni procesni blok za uključivanje LED dioda iznad svakog prekidača kada su uključene kako bi ljudi lakše vidjeli što unose. Osnovni pregled koda može se vidjeti na mentalnoj karti na slici.

Prva komponenta koju treba pogledati je Generator slučajnih brojeva (randomgen). Budući da tehnički nije moguće dobiti prave slučajne brojeve generirane iz hardvera, najjednostavnije rješenje bilo je da slučajni gen zapravo bude Registar pomaka linearne povratne sprege (LFSR). LFSR ima ulaz clk i izlaz "a" (12-bitni broj). Svaki ciklus takta generira se novi 12-bitni broj koji počinje s “000000000001”, na kraju prolazi kroz sve kombinacije 12-bitnih brojeva 1 i 0 prije nego što se ponovi. Izlaz “a” se daje svakom ciklusu takta, tako da se neprestano izvodi tijekom cijelog ciklusa. Clk se preslikava u Clk iz glavnog modula, a "a" se preslikava u signal RandNum u glavnom modulu.

Drugi podmodul je četveroznamenkasti zaslon sa sedam segmenata. Ovo je prilično jednostavan način prikazivanja četveroznamenkastog sedmo segmentnog zaslona. Prikaz je postavljen na Clk iz glavnog modula, ali ovaj podmodul ima vlastiti podmodul ClkDivider -a. ClkDivider (postavljen na 1298 Hz) koristi se za ubrzanje sata za sedam segmenata tako da se čini da su sve znamenke uključene u isto vrijeme (budući da samo jedna znamenka može biti uključena odjednom). Promjenjiva "znamenka" koristi se za kretanje po točkama na zaslonu, a sa svakom znamenkom dolaze i uvjeti osnovnog 4-bitnog ulaznog zaslona, s opcijama za prikaz znamenki od 0 do 9, a također ništa. Najdalja lijeva znamenka na zaslonu postavljena je na ništa jer se ne koristi u ovoj igri.

Glavni modul sastoji se od stroja stanja. Četiri stanja u procesu su Initial, SubAns, Dis i CheckEnd. Kad je u početnom stanju, ako je SubmitBtn (prekidač koji se koristi za slanje vašeg odgovora na provjeru) postavljen na ‘1’, stroj se pomiče u stanje SubAns. Kad god je Rbtn (prekidač za resetiranje stroja) postavljen na ‘1’, tada se stroj vraća u početno stanje. Kad ste u stanju SubAns, kada je SubmitBtn = ‘0’, prelazi u stanje Dis. Kada je u Dis stanju, ako odbrojavanje = 0 (skretanja ulijevo za pogađanje padaju na 0) ili ako je RSpotCount = 4 (što znači da je igrač kao sve ispravne boje na ispravnim mjestima), stroj ide u stanje CheckEnd. Ako se ništa od navedenog ne dogodi, onda kad je SubmitBtn = ‘1’ ponovno se vraća u stanje SubAns kako bi se omogućilo još jedno pogađanje. Kad ste u stanju CheckEnd, ovo je kraj igre, a jedini izlaz je da poništite vraćanje i vratite ga u početno stanje. To se lako može vidjeti u dijagramu stroja stanja. Ponašanje početno stanje sve inicijalizira natrag u početni položaj. Odbrojavanje (signal koji sprema koliko zavoja lijevo ima igrač) postavljeno je na 9, RSpotCount (signal koji sprema koliko ste boja pogodili na pravom mjestu) postavljeno je na 0, RColorCount (signal koji sprema koliko boje za koje ste pretpostavili da su ispravne, ali na pogrešnom mjestu) postavljeno je na 0, a smallcountdown (signal koji se na kraju preslikava na Odbrojavanje koji zapravo mijenja svaki zavoj u kasnijim stanjima) postavljen je na 9. Također, u početnom stanju RandNum (psuedo-nasumično generiran broj) podijeljen je u četiri različite provjere (po jedna za svaku 3-bitnu boju) i spremljen u signale check1, check2, check3, check4. Vaše se provjere zapravo uspoređuju, pa iako LFSR uvijek uzrokuje da RandNum mijenja svaki ciklus, nakon što napustite početno stanje, provjere ostaju iste, što omogućuje spremljenu vrijednost za usporedbu vašeg odgovora. To također znači da svaki put kada se stroj resetira, igrač ima novu vrijednost koju treba pogoditi.

Stanje SubmitAnswer (SubAns) mijenja omogućavanje odbrojavanja (signal "promjena") u "1". To je potrebno kasnije kako bi praćenje skretanja funkcioniralo. Nakon toga stanje uspoređuje unose igrača s prekidača s provjerama izvršenim u gore navedenom stanju. Signal rs1, rs2, rs3, rs4 i signali rc1, rc2, rc3, rc4 su cjelobrojni tipovi koji su ovisno o naredbama If postavljeni na 1 ili 0. Signal rs je za desno mjesto, a rc za pravu boju. Na primjer, ako je pogodak igrača u boji 1 jednak check1 RandNum -a, tada je rs1 = 1 jer to znači da je prava boja na pravom mjestu. Ako boja 1 nije jednaka check1, ali jednaka je jednoj od ostalih provjera, tada je rc = 1. To se radi za svaku boju i svaku provjeru.

Stanje prikaza (Dis) prvo traži omogućavanje odbrojavanja. Ako je '1', tada smallcountdown ide dolje za 1 (pa pri prvom skretanju ide s 9 na 8 itd.). Inače se zaokret ne mijenja. Bez obzira na omogućeno uključivanje, sve rs vrijednosti odozgo se zbrajaju i dodjeljuju signalu RSpotCounter. Također se sve rc vrijednosti dodaju i dodjeljuju RColorCounteru. Na kraju odbrojavanju se dodjeljuje vrijednost smallcountdown. Signali RSpotCounter, RColorCounter i Countdown svi se pretvaraju u 4-bitne std_logic_vectors izvan procesa i guraju u podmodul prikaza sedam segmenata kroz kartu porta. Na ovaj način zaslon prikazuje prave stvari dok ne pošaljete novi odgovor.

CheckEnd State služi za to jeste li pobijedili ili izgubili. Ako ste pobijedili (sve 4 boje su na pravom mjestu, inače poznate kao RSpotCounter = 4), tada se na sedmom segmentu prikazuje "GG" (tehnički prikazano kao 66) kako bi se pokazalo da ste pobijedili. Ako ste izgubili (odbrojavanje je doseglo 0), na pokazivaču se prikazuje "GO" (tehnički prikazano kao 60) za Game Over. U oba slučaja, ako pritisnete prekidač za resetiranje na uključeno, stroj će se vratiti u početno stanje za ponovnu reprodukciju.

Izvorni kod možete pronaći ovdje.

Korak 3: Zaključak

Dovršetak ovog projekta naučio nas je mnogo o izgradnji složenijih krugova. Naš početni dizajn nije bio stroj konačnih stanja. Bilo nam je teško otkloniti pogreške i prepisati kôd nekoliko puta koristeći različite metode (uključujući FSM). Na prijedlog instruktora, držali smo se FSM pristupa i uspjeli smo dovršiti igru. Naučili smo da je mnogo učinkovitije dizajnirati kôd na temelju hardvera nego tradicionalnim pristupom programiranja. Također smo se suočili s nekoliko izazova u vezi sa zaslonom sa sedam segmenata. Bilo je teško postići da se prikaže više brojeva bez "duhova", pa smo za to morali koristiti razdjelnik sata. Ako bismo dalje razvijali ovaj projekt, na Basys3 bismo povezali LED u boji kako bi korisnik mogao vidjeti boje (kao u tradicionalnoj igri), a ne numeričke prikaze boja. U konačnici, stekli smo bolje razumijevanje složenog dizajna kola, aplikacija u stvarnom životu i izazova korištenja hardvera, a ne izvođenja simulacija sa savršenim uvjetima.

Preporučeni: