Sisällysluettelo:

Mastermind -peli VHDL: 3 vaihetta
Mastermind -peli VHDL: 3 vaihetta

Video: Mastermind -peli VHDL: 3 vaihetta

Video: Mastermind -peli VHDL: 3 vaihetta
Video: Mastermind Game on Basys3 2024, Heinäkuu
Anonim
Mastermind -peli VHDL -muodossa
Mastermind -peli VHDL -muodossa
Mastermind -peli VHDL -muodossa
Mastermind -peli VHDL -muodossa

Projektia varten loimme Mastermind -pelin VHDL: ssä pelattavaksi Basys3 -laudalla. Mastermind on koodinmurtopeli, jota perinteisesti pelataan tappeilla ja pelilaudalla. Pelaaja yksi asettaa eriväriset tapit neljän riville, piilossa pelaajalta kaksi. Pelaajalla kaksi on sitten "x" määrä arvauksia, jotka asettavat tapit laudalle riville, joka näkyy pelaajalle yksi. Jokaisen arvauksen jälkeen pelaajalle kaksi ilmoitetaan 2 numeroa: kuinka monta tapista on oikeaa väriä ja kuinka monta tappia on oikeassa paikassa rivillä. Näiden vihjeiden avulla pelaajan kahden on arvattava oikea nastajärjestys, jonka pelaaja yksi on asettanut arvaamaan numeroon.

Toteutuksessamme peli on yksinpeli. Ohjelma luo satunnaisen yhdistelmän tappeja, ja pelaajan täytyy arvata oikea sekvenssi käyttämällä Basys3 -korttia. On neljä "väriä", joita edustavat binaariset arvot. 7-segmenttinäytössä näkyy kolme arvoa: jäljellä olevat kierrokset, nastojen määrä oikeassa asennossa ja nastat, jotka ovat oikeaa väriä väärässä asennossa (nämä arvot alkavat 9, 0 ja 0). Pelaaja valitsee taululla olevien kytkimien avulla arvauksensa binaariarvot ja kääntää toisen kytkimen lähettääkseen arvauksen. Jos ne ovat oikein, peli päättyy ja seitsemän segmentin näytössä näkyy "GG". Jos ei, kääntölaskuri pienenee yhdellä ja pelaaja saa palautetta sen perusteella, kuinka monta nastaa arvauksessaan vastaa nastan väriä tai sijaintia yhdistelmässä. Jos pelaaja loppuu vuorostaan arvaamatta oikein, näytössä näkyy "GO" (joka tarkoittaa peliä ohi). Soitin voi myös kääntää nollauskytkimen aloittaakseen alusta milloin tahansa.

Vaihe 1: Materiaalit

Materiaalit
Materiaalit
Materiaalit
Materiaalit
Materiaalit
Materiaalit

Koska koko peli voidaan pelata itse laudalla, ainoat tarvittavat materiaalit ovat Basys3 -kortti, mikro -USB -kaapeli korttiin liittämistä varten ja tietokone/kannettava tietokone, jolla voit koodata!

Vaihe 2: Koodi

Koodi
Koodi
Koodi
Koodi

Jotta tämä peli toimisi FPGA: lla, yksinkertaisin tapa kirjoittaa sitä olisi luoda tilakone. Tilan kone mahdollistaa pelin tarvitseman peräkkäisen ja vuorovaikutteisen kokemuksen. Jotta kaikki toimisi sujuvasti, tilakone perustuu FPGA: n sisäiseen kellosignaaliin ja varmistaa, että kaikki on synkronoituna. Päämoduuli on tilakone, jossa on neljä tilaa; Alkuperäinen tila (alkuperäinen), SubmitAnswer State (SubAns), Display State (Dis) ja CheckEndGame State (CheckEnd). Tilakoneen ohella päämoduulissa on kaksi alimoduulia, 4-numeroinen seitsemän segmentin näyttö (jolla on oma ClkDivider-alimoduuli) ja satunnaislukugeneraattori (itse asiassa psuedo-satunnaislukugeneraattori). On myös perusprosessilohko, jonka avulla LEDit syttyvät jokaisen kytkimen yläpuolella, kun ne on kytketty päälle, jotta ihmiset näkevät syöttämänsä helpommin. Peruskuva koodista näkyy kuvassa olevassa ajatuskartassa.

Ensimmäinen tarkasteltava komponentti on satunnaislukugeneraattori (randomgen). Koska ei ole teknisesti mahdollista saada todellisia satunnaislukuja laitteistosta, yksinkertaisin ratkaisu oli saada satunnaisgeeni itse asiassa lineaarisen palautteen siirtorekisteri (LFSR). LFSR: ssä on tulo clk ja lähtö "a" (12-bittinen luku). Jokaisessa kellosyklissä luodaan uusi 12-bittinen numero alkaen "000000000001", joka käy lopulta läpi kaikki 12- ja 1-bittien yhdistelmät ennen kuin toistaa itseään. Lähtö "a" annetaan joka kellosyklin aikana, joten se toimii jatkuvasti. Clk yhdistetään päämoduulista Clk: ksi ja "a" päämoduulin RandNum -signaaliin.

Toinen alimoduuli on 4-numeroinen seitsemän segmentin näyttö. Tämä on melko yksinkertainen tapa esitellä 4-numeroinen seitsemän segmentin näyttö. Näyttö asetetaan päämoduulin Clk: lle, mutta tällä alimoduulilla on oma ClkDivider -alimoduuli. ClkDivideria (asetettu 1298 Hz) käytetään nopeuttamaan seitsemän segmentin kelloa niin, että kaikki numerot näyttävät olevan päällä samanaikaisesti (koska vain yksi numero voi olla päällä kerrallaan). Muuttujaa "numero" käytetään selaamaan näytön pisteitä, ja jokaisen numeron mukana tulee 4-bittisen perusnäytön ehdot, joissa on vaihtoehtoja näyttää numerot 0-9 ja myös mitään. Näytön kauimpana oleva vasen numero on tyhjä, koska sitä ei käytetä tässä pelissä.

Päämoduuli koostuu tilakoneesta. Prosessin neljä tilaa ovat Initial, SubAns, Dis ja CheckEnd. Jos alkutilassa SubmitBtn (vastauksen lähettämiseen käytettävä kytkin) on asetettu arvoon 1, laite siirtyy SubAns -tilaan. Aina kun Rbtn (koneen nollaamiseen käytetty kytkin) on asetettu asentoon 1, laite palaa alkutilaan. SubAns -tilassa ollessaan SubmitBtn =’0’ se siirtyy Dis -tilaan. Dis -tilassa, jos lähtölaskenta = 0 (käännökset vasemmalle arvaamaan putoavat 0: een) tai jos RSpotCount = 4 (eli pelaaja on kaikki oikeat värit oikeissa kohdissa), kone siirtyy CheckEnd -tilaan. Jos kumpikaan näistä ei tapahdu, kun SubmitBtn = '1' jälleen, se palaa SubAns -tilaan sallimaan toisen arvauksen. CheckEnd -tilassa tämä on pelin loppu, ja ainoa tapa päästä ulos on palauttaa nollaus ja palauttaa se alkuperäiseen tilaan. Tämä on helppo nähdä tilan konekaaviossa. Käyttäytymistilaisuudessa alkutila alustaa kaiken takaisin lähtöasentoon. Ajastin (signaali, joka säästää kuinka monta kierrosta pelaajalla on jäljellä) on asetettu 9: ksi, RSpotCount (signaali, joka tallentaa kuinka monta väriä arvasit olevan oikeassa paikassa) on asetettu arvoon 0, RColorCount (signaali, joka säästää kuinka monta värit, jotka arvasit olevan oikeat, mutta väärässä paikassa) on asetettu arvoon 0, ja pienlaskenta (signaali, joka lopulta yhdistetään lähtölaskentaan, joka todella muuttaa jokaisen kierroksen myöhemmissä tiloissa) on asetettu arvoon 9. Myös alkutilassa RandNum (psuedo-satunnaisesti luotu luku) jaetaan neljään eri tarkistukseen (yksi jokaiselle 3-bittiselle värille) ja tallennetaan signaaleihin check1, check2, check3, check4. Näitä tarkistuksia verrataan arvaukseesi, joten vaikka LFSR saa RandNumin aina muuttumaan jokaisen syklin aikana, lähtötasosta poistumisen jälkeen tarkistukset pysyvät samana, jolloin tallennettu arvo voi verrata vastaustasi. Tämä tarkoittaa myös sitä, että aina kun kone nollataan, pelaajalla on uusi arvo arvattavaksi.

SubmitAnswer State (SubAns) muuttaa ajastimen (signaalin "muutos") arvoksi "1". Tätä tarvitaan myöhemmin, jotta käännöksen seuranta toimisi. Tämän jälkeen tila vertaa kytkimien tuloja yllä olevaan tilaan tehtyihin tarkastuksiin. Signaali rs1, rs2, rs3, rs4 ja signaalit rc1, rc2, rc3, rc4 ovat kokonaislukutyyppejä, jotka If -lausekkeista riippuen ovat joko 1 tai 0. Signaali rs on oikea piste ja rc oikea väri. Jos esimerkiksi värin 1 pelaajan arvaus on yhtä suuri kuin RandNumin tarkistus1, rs1 = 1, koska se tarkoittaa, että oikea väri on oikeassa paikassa. Jos väri 1 ei ole sama kuin tarkistus1, mutta vastaa yhtä muista tarkistuksista, niin rc = 1. Tämä tehdään jokaiselle värille ja jokaiselle tarkistukselle.

Näyttötila (Dis) etsii ensin ajastimen. Jos se on "1", pienlaskenta laskee alaspäin 1 (eli ensimmäisellä kierroksella se siirtyy 9: stä 8: een jne.). Muuten käänne ei muutu. Tästä käyttöönotosta riippumatta kaikki ylhäältä tulevat rs -arvot lasketaan yhteen ja osoitetaan signaalille RSpotCounter. Myös kaikki rc -arvot lisätään ja määritetään RColorCounterille. Lopuksi Countdownille määritetään smallcountdown -arvo. Signaalit RSpotCounter, RColorCounter ja Countdown muunnetaan prosessin ulkopuolella 4-bittisiksi std_logic_vectors-järjestelmiksi ja siirretään seitsemän segmentin näyttöalimoduuliin porttikartan kautta. Tällä tavalla näyttö näyttää oikeat asiat, kunnes lähetät uuden vastauksen.

CheckEnd -tila kertoo, oletko voittanut vai hävinnyt. Jos olet voittanut (kaikki 4 väriä ovat oikeassa paikassa, joka tunnetaan myös nimellä RSpotCounter = 4), "GG" (näkyy teknisesti nimellä 66) näytetään seitsemässä segmentissä osoittamaan, että olet voittanut. Jos olet hävinnyt (lähtölaskenta on saavuttanut 0), "GO" (näkyy teknisesti 60: na) näkyy Game Over -näytössä. Jos jompikumpi lopputulos on, nollauskytkimen painaminen asentoon siirtää laitteen takaisin alkutilaan toistettavaksi.

Lähdekoodi löytyy täältä.

Vaihe 3: Johtopäätös

Tämän projektin suorittaminen opetti meille paljon monimutkaisempien piirien rakentamisesta. Alkuperäinen suunnittelumme ei ollut äärellinen tilakone. Huomasimme, että virheiden vianmääritys oli vaikeaa, ja kirjoitimme koodin uudelleen useita kertoja eri menetelmillä (mukaan lukien FSM). Valmentajan ehdotuksesta pysyimme FSM -lähestymistavassa ja pystyimme lopettamaan pelin. Opimme, että on paljon tehokkaampaa suunnitella koodi laitteiston perusteella kuin perinteisellä ohjelmointimenetelmällä. Meillä oli myös useita haasteita, jotka liittyivät seitsemän segmentin näyttöön. Useiden numeroiden näyttäminen ilman haamukuvia oli vaikeaa, ja meidän täytyi käyttää kellonjakajaa tämän saavuttamiseksi. Jos kehitämme tätä projektia edelleen, liitämme värilliset LEDit Basys3: een, jotta käyttäjä voi nähdä värit (kuten perinteisessä pelissä) värien numeeristen esitysten sijaan. Lopulta saimme paremman käsityksen monimutkaisesta piirisuunnittelusta, tosielämän sovelluksista ja laitteiston käytön haasteista sen sijaan, että simulaatioita suoritettaisiin täydellisissä olosuhteissa.

Suositeltava: