Sisukord:

Mastermind mäng VHDL -is: 3 sammu
Mastermind mäng VHDL -is: 3 sammu

Video: Mastermind mäng VHDL -is: 3 sammu

Video: Mastermind mäng VHDL -is: 3 sammu
Video: Чип Монк • Интервью с легендой светодизайна 2024, November
Anonim
Mastermind mäng VHDL -is
Mastermind mäng VHDL -is
Mastermind mäng VHDL -is
Mastermind mäng VHDL -is

Oma projekti jaoks lõime VHDL -is mängu “Mastermind”, mida saab mängida Basys3 laual. Mastermind on koodimurdmismäng, mida traditsiooniliselt mängitakse tihvtide ja mängulauaga. Mängija üks asetab erinevat värvi värvid 4 -ne reale, mis on teise mängija eest peidetud. Mängijal 2 on siis x arv arvamusi, mis asetavad lauale tihvtid mängijale nähtavale reale. Pärast iga oletust teatatakse mängijale 2 kahest numbrist: mitu tihvti on õiget värvi ja mitu tihvti on reas õiges asendis. Neid vihjeid kasutades peab mängija teine ära arvama õige nööpnõelte jada, mille mängija üks pani etteantud arvule.

Meie rakenduses on mäng ühe mängijaga. Programm genereerib juhusliku tihvtide kombinatsiooni ja mängija peab õige järjestuse äraarvamiseks kasutama Basys3 tahvlit. Seal on neli "värvi", mida tähistavad binaarsed väärtused. 7-segmendilisel ekraanil kuvatakse kolm väärtust: ülejäänud pöörded, tihvtide arv õiges asendis ja tihvtide arv, mis on õige värviga vales asendis (need väärtused algavad 9, 0 ja 0). Mängija kasutab tahvlil olevaid lüliteid, et valida oma oletuse jaoks binaarväärtused, ja pöörab oletuse esitamiseks teise lüliti. Kui need on õiged, lõpeb mäng ja seitsme segmendi ekraanil kuvatakse „GG”. Kui ei, siis pöörde loendur väheneb 1 võrra ja mängija saab tagasisidet selle põhjal, kui palju nööpnõelad vastavad nende kombinatsiooni tihvtide värvile või asukohale. Kui mängija pöörleb ilma õigesti ära arvamata, ilmub ekraanile “GO” (tähistab mängu lõppu). Mängija saab ka nullimislülitit igal ajal otsast alustamiseks pöörata.

Samm: materjalid

Materjalid
Materjalid
Materjalid
Materjalid
Materjalid
Materjalid

Kuna kogu mängu saab mängida laual ise, on vaja ainult materjale Basys3 Board, mikro -USB -kaabel plaadiga ühendamiseks ja arvuti/sülearvuti, mille abil saate kodeerida!

2. samm: kood

Kood
Kood
Kood
Kood

Selleks, et see mäng töötaks FPGA -ga, oleks selle kirjutamise lihtsaim viis olekumasina loomine. Olekumasina olemasolu võimaldab mängu jaoks vajalikku järjestikust ja interaktiivset kogemust. Selleks, et kõik sujuks, põhineb olekumasin FPGA sisemise kella signaalil, tagades, et kõik on sünkroonis. Põhimoodul on nelja olekuga olekumasin; Algseisund (esialgne), SubmitAnswer State (SubAns), Display State (Dis) ja CheckEndGame State (CheckEnd). Koos olekumasinaga on põhimoodulil kaks alammoodulit, 4-kohaline seitsme segmendi kuva (millel on oma alammoodul ClkDivider) ja juhuslike arvude generaator (tegelikult psuedo-juhuslike arvude generaator). Samuti on olemas põhiprotsessiplokk, mille abil lülitatakse iga lüliti kohal olevad valgusdioodid sisse, kui inimesed näevad, mida nad sisestavad. Põhiline ülevaade koodist on näha kujutatud mõttekaardil.

Esimene komponent, mida tuleb vaadata, on juhuslike arvude generaator (juhuslik arv). Kuna tehniliselt ei ole tehniliselt võimalik saada riistvaralt genereeritud tõelisi juhuslikke numbreid, oli lihtsaim lahendus see, et juhuvalik oleks tegelikult Linear-feedback Shift Register (LFSR). LFSR-il on sisend clk ja väljund “a” (12-bitine number). Iga kellatsükli jooksul genereeritakse uus 12-bitine number, mis algab numbrist “000000000001”, läbides enne kordamist kõik 12-bitiste 1-de ja 0-de kombinatsioonid. Väljund "a" antakse igal kellaajal, seega töötab see pidevalt. Clk kaardistatakse põhimoodulist Clk -ga ja “a” põhimooduli signaaliga RandNum.

Teine alammoodul on 4-kohaline seitsme segmendi kuva. See on üsna lihtne viis 4-kohalise seitsme segmendi kuva esitlemiseks. Ekraan on seatud põhimoodulist Clk -le, kuid sellel alammoodulil on oma alammoodul ClkDividerist. ClkDividerit (seatud 1298 Hz) kasutatakse seitsme segmendi kella kiirendamiseks, nii et kõik numbrid näivad olevat korraga sisse lülitatud (kuna tegelikult saab korraga sisse lülitada ainult ühe numbri). Muutujat „number” kasutatakse ekraanil olevate täppide sirvimiseks ja iga numbriga kaasnevad põhilised 4-bitise sisendkuva tingimused koos võimalustega näidata numbreid 0–9 ja ka mitte midagi. Ekraani kaugeim vasakpoolne number on tühi, kuna seda selles mängus ei kasutata.

Põhimoodul koosneb olekumasinast. Protsessi neli olekut on Initial, SubAns, Dis ja CheckEnd. Kui SubmitBtn (lüliti, mida kasutati vastuse kontrollimiseks esitamiseks) on algseisundis, on seatud väärtusele 1, liigub masin alamseisundisse. Iga kord, kui Rbtn (masina lähtestamiseks kasutatav lüliti) on seatud väärtusele 1, siis naaseb masin algolekusse. Kui viibite SubAns olekus, kui SubmitBtn = '0', liigub see edasi Dis -olekusse. Dis -olekus, kui loendur = 0 (äraarvamise pöörded vasakule langevad 0 -le) või kui RSpotCount = 4 (see tähendab, et mängija on kõik õiged värvid õigetes kohtades), läheb masin CheckEnd olekusse. Kui kumbki neist ei esine, siis kui SubmitBtn = '1', läheb see tagasi alamseisundisse, et lubada teist oletust. CheckEndi olekus on see mängu lõpp ja ainus väljapääs on vajutada lähtestamist, tagastades selle algolekusse. Seda on hõlpsasti näha olekumasina skeemil. Käitumuslikult lähteseisund lähtestab kõik tagasi algasendisse. Loendur (signaal, mis salvestab mängijale jäänud pöörete arvu) on seatud 9, RSpotCount (signaal, mis salvestab, kui palju värve arvasite, et need on õiges kohas) on seatud väärtusele 0, RColorCount (signaal, mis salvestab mitu värvid, mida arvasite, et need on õiged, kuid vales kohas) on seatud väärtusele 0 ja smallcountdown (signaal, mis lõpuks kaardistatakse loenduriks, mis tegelikult muudab iga pöörde hilisemates olekutes) väärtuseks 9. Samuti on algseisundis RandNum (psuedo-juhuslikult genereeritud arv) jagatakse neljaks erinevaks kontrolliks (üks iga 3-bitise värvi kohta) ja salvestatakse signaalidesse check1, check2, check3, check4. Nende kontrollidega võrreldakse teie oletust, nii et kuigi LFSR põhjustab RandNumi muutmist alati iga tsükli järel, jäävad esialgsest olekust lahkudes kontrollid samaks, võimaldades salvestatud väärtusel teie vastust võrrelda. See tähendab ka igal ajal, kui masin lähtestatakse, on mängijal uus väärtus ära arvata.

SubmitAnswer State (SubAns) muudab loenduri võimaliku (signaali „muutus”) väärtuseks „1”. Seda on hiljem vaja pöörde jälgimise toimimiseks. Pärast seda võrdleb riik lülitite mängija sisendeid ülaltoodud olekus tehtud kontrollidega. Signaal rs1, rs2, rs3, rs4 ja signaalid rc1, rc2, rc3, rc4 on täisarvulised tüübid, mis sõltuvalt If -i lausetest on seatud kas 1 või 0. Signaal rs on õige koha jaoks ja rc õige värvi jaoks. Näiteks kui värvi 1 mängija arvamus on võrdne RandNumi tšekiga1, siis rs1 = 1, kuna see tähendab, et õige värv on õiges kohas. Kui värv 1 ei võrdu tšekiga1, kuid võrdub ühega teistest kontrollidest, siis rc = 1. Seda tehakse iga värvi ja iga kontrolli puhul.

Kuva olek (Dis) otsib esmalt loenduri võimaldaja. Kui see on "1", siis väheneb loendus 1 võrra (nii et esimesel pöördel läheb see 9 -lt 8 -le jne). Muidu pööre ei muutu. Olenemata sellest sisselülitamisest liidetakse kõik ülalt saadavad rs väärtused ja omistatakse signaalile RSpotCounter. Samuti lisatakse kõik rc väärtused ja määratakse need RColorCounterile. Lõpuks omistatakse loendusele smallcountdown väärtus. Signaalid RSpotCounter, RColorCounter ja Countdown konverteeritakse kõik väljaspool protsessi 4-bitisteks std_logic_vektoriteks ja lükatakse pordikaardi kaudu seitsme segmendi kuva alammoodulisse. Nii kuvatakse ekraanil õiged asjad, kuni esitate uue vastuse.

CheckEndi osariik näitab, kas olete võitnud või kaotanud. Kui olete võitnud (kõik 4 värvi on õiges kohas, muidu tuntud kui RSpotCounter = 4), kuvatakse seitsmes segmendis „GG” (tehniliselt näidatud kui 66), mis näitab, et olete võitnud. Kui olete kaotanud (loendur on jõudnud 0 -ni), kuvatakse mängu lõppedes ekraanil “GO” (tehniliselt näidatud kui 60). Mõlema tulemuse korral viib nullimislüliti asendisse lülitamine masina uuesti algseisundisse, et seda uuesti mängida.

Lähtekoodi leiate siit.

3. samm: järeldus

Selle projekti lõpuleviimine õpetas meile palju keerukamate ahelate ehitamisest. Meie esialgne disain ei olnud piiratud olekuga masin. Meil oli raske siluda ja kirjutasime koodi mitu korda, kasutades erinevaid meetodeid (sh FSM). Instruktori soovitusel jäime FSM -i lähenemisviisi juurde ja saime mängu lõpetada. Saime teada, et riistvaral põhineva koodi kujundamine on palju tõhusam kui traditsioonilise programmeerimismeetodi puhul. Samuti seisime silmitsi mitmete seitsme segmendi kuvariga seotud väljakutsetega. Mitme numbri kuvamine ilma „kummituseta” oli keeruline ja selle saavutamiseks pidime kasutama kellajagurit. Kui me peaksime seda projekti edasi arendama, ühendaksime Basys3 -ga värvilised LED -id, et kasutaja näeks värve (nagu traditsioonilises mängus), mitte värvide numbrilisi esitusviise. Lõppkokkuvõttes saime parema arusaamise keerukast vooluahela disainist, tegelikest rakendustest ja riistvara kasutamise väljakutsetest, mitte simulatsioonide läbiviimisest täiuslikes tingimustes.

Soovitan: