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, Juli
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 tablom za igru. Igrač jedan postavlja klinove različitih boja u red 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 se obavještava o 2 broja: koliko je klinova ispravne boje i koliko je klinova na ispravnoj poziciji u redu. Koristeći te tragove, igrač dva mora pogoditi ispravan niz 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 koristiti Basys3 ploču da pogodi 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 odgovarajuće 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 svoju pretpostavku, a zatim okreće drugi prekidač za slanje pogađanja. Ako su točne, 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 osnovu toga koliko pinova u njihovoj pretpostavci odgovara boji ili položaju iglica u kombinaciji. Ako igraču ponestane zavoja, a da nije pravilno pogodio, na ekranu se prikazuje “GO” (predstavlja igru završenom). Igrač također može okrenuti prekidač za poništavanje kako bi započeo u bilo kojem trenutku.

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čunar/laptop koji možete koristiti za kodiranje!

Korak 2: Kodeks

Kodeks
Kodeks
Kodeks
Kodeks

Da bi ova igra radila na FPGA -i, najjednostavniji način pisanja bio bi stvoriti državnu mašinu. Imati državnu mašinu omogućava sekvencijalno i interaktivno iskustvo potrebno da igra zaista funkcionira. Da bi sve radilo glatko, mašina države će se zasnivati na signalu unutrašnjeg takta FPGA -e, osiguravajući da je sve sinhronizirano. Glavni modul je mašina stanja sa četiri stanja; Početno stanje (početno), stanje podnošenja odgovora (podAns), stanje prikaza (Dis) i stanje CheckEndGame (CheckEnd). Uz mašinu stanja, glavni modul ima dva podmodula, četveroznamenkasti sedmosegmentni ekran (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 šta unose. Osnovni pregled koda može se vidjeti na slici uma.

Prva komponenta koju treba pogledati je Generator slučajnih brojeva (randomgen). S obzirom da tehnički nije moguće dobiti prave slučajne brojeve generirane hardverom, 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 ekrana. Prikaz je postavljen na Clk iz glavnog modula, ali ovaj podmodul ima vlastiti podmodul ClkDivider -a. ClkDivider (postavljen na 1298 Hz) koristi se za ubrzavanje takta sedmog segmenta 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). Promenljiva "cifra" se koristi za kretanje po tačkama na ekranu, a sa svakom cifrom dolaze uslovi osnovnog 4-bitnog ulaza za prikaz, sa opcijama za prikazivanje cifara od 0 do 9 i takođe ništa. Krajnja lijeva znamenka na ekranu postavljena je na ništa jer se ne koristi u ovoj igri.

Glavni modul se sastoji od mašine za stanje. Četiri stanja u procesu su Initial, SubAns, Dis i CheckEnd. Kada je u početnom stanju, ako je SubmitBtn (prekidač koji se koristi za slanje vašeg odgovora na provjeru) postavljen na ‘1’, tada se stroj prelazi u stanje SubAns. Kad god je Rbtn (prekidač koji se koristi za resetiranje stroja) postavljen na ‘1’, tada se stroj vraća u početno stanje. Kada ste u stanju SubAns, kada je SubmitBtn = ‘0’, prelazi u stanje Dis. Kada je u Dis stanju, ako odbrojavanje = 0 (skretanje ulijevo za pogađanje padne na 0) ili ako je RSpotCount = 4 (što znači da igrač ima sve ispravne boje na tačnim mjestima), stroj ide u stanje završetka. Ako se ništa od navedenog ne dogodi, onda kada SubmitBtn = ‘1’ ponovo se vraća u stanje SubAns kako bi se omogućilo drugo pogađanje. Kada ste u CheckEnd stanju, ovo je kraj igre, a jedini izlaz je da poništite vraćanje i vratite ga u početno stanje. Ovo se lako može vidjeti na dijagramu mašine stanja. Ponašanje početno stanje sve inicijalizira natrag u početnu poziciju. 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. Ove provjere su ono s čime se vaše nagađanje zapravo uspoređuje, pa iako LFSR uvijek uzrokuje da RandNum mijenja svaki ciklus, nakon što napustite početno stanje, provjere ostaju iste, dopuštajući spremljenu vrijednost da uporedi vaš odgovor. To također znači da svaki put kada se stroj resetira, igrač ima novu vrijednost koju treba pogoditi.

Stanje SubmitAnswer (SubAns) menjač za odbrojavanje (signal „promena“) menja u „1“. To je potrebno kasnije kako bi praćenje skretanja funkcioniralo. Nakon toga, država uspoređuje ulaze igrača sa prekidača sa 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 desnu 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.). U suprotnom 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. Konačno, 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 mapu portova. Na ovaj način zaslon prikazuje prave stvari dok ne pošaljete novi odgovor.

CheckEnd State služi za to da li ste dobili 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), tada se na displeju 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 ponovno pokretanje.

Izvorni kod možete pronaći ovdje.

Korak 3: Zaključak

Završetak ovog projekta naučio nas je mnogo o izgradnji složenijih kola. Naš početni dizajn nije bio stroj konačnih stanja. Bilo nam je teško otklanjati greške i prepisivati 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 završiti igru. Naučili smo da je mnogo učinkovitije dizajnirati kod zasnovan na hardveru nego s tradicionalnim pristupom programiranja. Suočili smo se i sa nekoliko izazova u vezi sa sedmosegmentnim ekranom. 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. Na kraju smo stekli bolje razumijevanje složenog dizajna kola, aplikacija iz stvarnog života i izazova korištenja hardvera umjesto izvođenja simulacija sa savršenim uvjetima.

Preporučuje se: