Orodha ya maudhui:

Mchezo wa Mastermind katika VHDL: 3 Hatua
Mchezo wa Mastermind katika VHDL: 3 Hatua

Video: Mchezo wa Mastermind katika VHDL: 3 Hatua

Video: Mchezo wa Mastermind katika VHDL: 3 Hatua
Video: Mbinu muhimu kufahamu katika mchezo wa draft 2024, Julai
Anonim
Mchezo wa Mastermind katika VHDL
Mchezo wa Mastermind katika VHDL
Mchezo wa Mastermind katika VHDL
Mchezo wa Mastermind katika VHDL

Kwa mradi wetu, tuliunda mchezo wa "Mastermind" katika VHDL ili ichezwe kwenye bodi ya Basys3. Mastermind ni mchezo wa kuvunja nambari kawaida unachezwa na vigingi na bodi ya mchezo. Mchezaji anaweka kigingi cha rangi zilizo na rangi safu ya 4, iliyofichwa kutoka kwa mchezaji mbili. Mchezaji wa pili basi ana idadi ya 'x' ya kukadiria akiweka vigingi ubaoni mfululizo mfululizo unaoonekana kwa mchezaji mmoja. Baada ya kila nadhani, mchezaji mbili anafahamishwa kwa nambari 2: ngapi nguruwe hizo ni rangi sahihi, na ngapi ziko katika nafasi sahihi kwenye safu. Kutumia dalili hizo, mchezaji wa mbili lazima nadhani mlolongo sahihi wa pini ambazo mchezaji mmoja amewekwa katika nambari ya nambari iliyotengwa.

Katika utekelezaji wetu, mchezo ni mchezaji mmoja. Mchanganyiko wa vigae hutengenezwa na programu, na mchezaji lazima atumie bodi ya Basys3 kukisia mlolongo sahihi. Kuna "rangi" nne, zinazowakilishwa na maadili ya binary. Onyesho la sehemu 7 linaonyesha maadili matatu: zamu zilizobaki, idadi ya pini katika nafasi sahihi, na idadi ya pini ambazo zina rangi sahihi katika nafasi isiyofaa (maadili haya huanza saa 9, 0, na 0). Mchezaji hutumia swichi kwenye ubao kuchagua maadili ya dhana ya kubahatisha, na kubonyeza swichi nyingine kuwasilisha nadhani. Ikiwa ni sahihi, mchezo huisha na onyesho la sehemu 7 linaonyesha "GG." Ikiwa sivyo, kaunta ya zamu inapungua kwa 1 na mchezaji anapokea maoni kulingana na pini ngapi katika nadhani yao inalingana na rangi au msimamo wa pini katika mchanganyiko. Ikiwa mchezaji anamaliza zamu bila kubahatisha kwa usahihi, onyesho linaonyesha "GO" (inayowakilisha mchezo juu). Kichezaji pia anaweza kubofya swichi ya kuweka upya ili kuanza tena wakati wowote.

Hatua ya 1: Vifaa

Vifaa
Vifaa
Vifaa
Vifaa
Vifaa
Vifaa

Kwa kuwa mchezo wote unaweza kuchezwa kwenye ubao wenyewe, vifaa pekee vinavyohitajika ni Bodi ya Basys3, kebo ndogo ya USB kuungana na bodi, na kompyuta / kompyuta ambayo unaweza kutumia kukodi!

Hatua ya 2: Kanuni

Kanuni
Kanuni
Kanuni
Kanuni

Ili mchezo huu ufanye kazi kwenye FPGA, njia rahisi zaidi ya kuandika ingekuwa kuunda mashine ya serikali. Kuwa na mashine ya serikali inaruhusu uzoefu mtiririko na maingiliano muhimu kwa mchezo kufanya kazi kweli. Ili kila kitu kiendeshe vizuri, mashine ya serikali itatengwa kwa ishara ya saa ya ndani ya FPGA, kuhakikisha kila kitu kimesawazishwa. Moduli kuu ni mashine ya serikali yenye majimbo manne; Jimbo la Awali (Awali), Tuma Jibu la Kujibu (SubAns), Jimbo la Kuonyesha (Dis), na Jimbo la CheckEndGame (CheckEnd). Pamoja na mashine ya serikali, moduli kuu ina vijidudu viwili, Onyesho la Sehemu Saba yenye tarakimu 4 (ambayo ina kijitabu chake cha ClkDivider), na Jenereta ya Nambari Isiyo ya Random (haswa jenereta ya nambari ya psuedo-nasibu). Pia kuna mchakato wa kimsingi wa kuwa na mwangaza wa taa juu ya kila swichi wakati imewashwa kama njia ya watu kuona ni nini wanaingiza rahisi. Muhtasari wa msingi wa nambari unaweza kuonekana kwenye ramani ya akili iliyoonyeshwa.

Sehemu ya kwanza kutazama ni Jenereta ya Nambari Isiyo na Mpangilio (randomgen). Kwa kuwa haiwezekani kitaalam kupata nambari za kweli za nasibu zinazozalishwa kutoka kwa vifaa, suluhisho rahisi zaidi ilikuwa kuwa na nasibu ya kawaida kuwa Rejista ya Maoni ya Mistari (LFSR). LFSR ina pembejeo ya clk na pato "a" (nambari 12-bit). Kila mzunguko wa saa, nambari mpya ya 12-bit hutengenezwa kuanzia "000000000001", mwishowe kupitia michanganyiko yote ya vipande-12 vya 1 na 0 kabla ya kujirudia. Pato "a" hupewa kila mzunguko wa saa, kwa hivyo inaendelea kuendelea kote. Clk imepangwa kwa Clk kutoka moduli kuu, na "a" imepangwa kwa ishara ya RandNum kwenye moduli kuu.

Manukuu ndogo ya pili ni Onyesho la Sehemu Saba yenye tarakimu nne. Hii ni njia nzuri ya kuonyesha Maonyesho ya Sehemu Saba yenye tarakimu nne. Onyesho limewekwa kwenye Clk kutoka kwa moduli kuu, hata hivyo submodule hii ina submodule yake mwenyewe ya ClkDivider. ClkDivider (iliyowekwa hadi 1298 Hz) hutumiwa kuharakisha saa ya Sehemu ya Saba ili tarakimu zote zionekane ziko kwa wakati mmoja (kwa kuwa nambari moja tu inaweza kuwaka kwa wakati mmoja). "Nambari" inayobadilika hutumiwa kuzunguka kupitia matangazo kwenye onyesho, na kwa kila tarakimu huja hali ya onyesho la msingi la 4-bit, na chaguzi za kuonyesha nambari 0 hadi 9 na pia hakuna chochote. Nambari ya kushoto zaidi kwenye onyesho imewekwa bure kwani haitumiki katika mchezo huu.

Moduli kuu ina mashine ya serikali. Mataifa manne katika mchakato huo ni ya Mwanzo, SubAns, Dis, na CheckEnd. Unapokuwa katika hali ya kwanza, ikiwa SubmitBtn (swichi inayotumiwa kutuma jibu lako kwa kuangalia) imewekwa kuwa '1', basi mashine hiyo huenda kwa Jimbo la SubAns. Wakati wowote Rbtn (swichi inayotumika kuweka upya mashine) imewekwa kuwa '1', kisha mashine inarudi katika hali ya Awali. Unapokuwa katika Jimbo la SubAns, wakati SubmitBtn = '0' tena, inahamia Jimbo la Dis. Unapokuwa katika Jimbo la Dis, ikiwa Countdown = 0 (Zamu za kushoto nadhani zinaanguka kwa 0) au ikiwa RSpotCount = 4 (ikimaanisha mchezaji kama rangi zote sahihi katika matangazo sahihi), mashine inakwenda Jimbo la CheckEnd. Ikiwa hakuna moja ya hayo yanayotokea, basi wakati SubmitBtn = '1' tena, inarudi kwa hali ya SubAns kuruhusu nadhani nyingine. Wakati katika Jimbo la CheckEnd, huu ndio mwisho wa mchezo, na njia pekee ya kutoka ni kugonga upya, kuirudisha kwa Jimbo la Awali. Hii ni mtazamo rahisi kwa uwezo katika mchoro wa mashine ya serikali. Kitabia Jimbo la Awali linaanzisha kila kitu kurudi kwenye nafasi ya kuanzia. Kuhesabu (ishara ambayo inaokoa zamu ngapi kushoto mchezaji anayo) imewekwa kwa 9, RSpotCount (ishara ambayo inaokoa rangi ngapi ulidhani iko katika eneo la kulia) imewekwa 0, RColorCount (ishara ambayo inaokoa ngapi ya rangi ulizodhani ni sawa lakini katika sehemu isiyo sahihi) imewekwa kwa 0, na hesabu ndogo (ishara ambayo mwishowe imepangwa kwa Countdown ambayo inabadilisha kila zamu katika majimbo ya baadaye) imewekwa kwa 9. Pia, katika Jimbo la Awali RandNum (nambari iliyotengenezwa kwa nasibu ya psuedo) imegawanywa katika hundi nne tofauti (moja kwa kila rangi ya 3-bit) na imehifadhiwa kwa ishara check1, check2, check3, check4. Hundi hizi ndizo nadhani yako kweli ikilinganishwa nayo, kwa hivyo ingawa LFSR kila wakati inasababisha RandNum kubadilisha kila mzunguko, mara tu utakapoondoka katika Jimbo la Awali hundi zinakaa sawa, ikiruhusu thamani iliyohifadhiwa kulinganisha jibu lako dhidi ya. Hii inamaanisha wakati wowote mashine inapowekwa upya, kichezaji ina dhamana mpya ya kukisia.

Jimbo la SubmitAnswer (SubAns) hubadilisha kiwezeshi cha hesabu (ishara "badili") kuwa '1'. Hii inahitajika baadaye kwa ufuatiliaji wa zamu ufanye kazi. Baada ya hapo, serikali inalinganisha pembejeo za kichezaji kutoka kwa swichi hadi hundi zilizofanywa katika jimbo hapo juu. Ishara rs1, rs2, rs3, rs4 na ishara rc1, rc2, rc3, rc4 ni idadi kamili ambayo kulingana na taarifa ikiwa imewekwa kuwa 1 au 0. Rs ya ishara ni ya mahali pa kulia na rc kwa rangi ya kulia. Kwa mfano ikiwa nadhani mchezaji 1 wa rangi ni sawa na hundi1 ya RandNum, basi rs1 = 1 kwani hiyo inamaanisha rangi inayofaa iko mahali pazuri. Ikiwa rangi 1 hailingani na hundi1, lakini inalingana na cheki zingine, basi rc = 1. Hii imefanywa kwa kila rangi na kila hundi.

Jimbo la Kuonyesha (Dis) linatafuta kwanza kuwezeshwa kwa hesabu. Ikiwa ni '1', basi hesabu ndogo ndogo huenda chini 1 (kwa hivyo kwa zamu ya kwanza huenda kutoka 9 hadi 8 n.k.). Vinginevyo zamu haibadilika. Bila kujali kuwezeshwa kwa, maadili yote ya rs kutoka hapo juu yameongezwa na kupewa ishara ya RSpotCounter. Pia maadili yote ya rc yameongezwa na kupewa RColorCounter. Hatimaye hesabu ya hesabu imepewa dhamana ya hesabu ndogo ndogo. Ishara za RSpotCounter, RColorCounter, na Countdown zote zimebadilishwa kuwa 4-bit std_logic_vectors nje ya mchakato, na kusukumwa kwa submodule ya Sehemu Saba kupitia ramani ya bandari. Kwa njia hii, onyesho linaonyesha vitu sahihi hadi utakapowasilisha jibu mpya.

Jimbo la CheckEnd ni la kuwa umeshinda au umeshindwa. Ikiwa umeshinda (rangi zote 4 ziko mahali pazuri, inajulikana kama RSpotCounter = 4), basi "GG" (iliyoonyeshwa kiufundi kama 66) imeonyeshwa kwenye Sehemu Saba kuonyesha umeshinda. Ikiwa umepoteza (Countdown imefikia 0) basi "GO" (iliyoonyeshwa kitaalam kama 60) inaonyeshwa kwenye onyesho la Game Over. Kwa matokeo yoyote, kupiga swichi ya kuweka upya kutasonga mashine kurudi kwenye hali ya Awali ili kucheza tena.

Nambari ya Chanzo inaweza kupatikana hapa.

Hatua ya 3: Hitimisho

Kukamilisha mradi huu kulitufundisha mengi juu ya kujenga mizunguko ngumu zaidi. Ubunifu wetu wa awali haukuwa mashine ya serikali yenye ukomo. Tuliona ni ngumu kumaliza, na kuandika msimbo mara kadhaa kwa kutumia njia tofauti (pamoja na FSM). Kwa maoni ya mwalimu, tulizingatia njia ya FSM na tuliweza kumaliza mchezo. Tulijifunza kuwa ni bora zaidi kubuni nambari kulingana na vifaa kuliko kwa njia ya jadi ya programu. Tulikabiliwa pia na changamoto kadhaa zinazohusiana na onyesho la sehemu saba. Kuipata ili kuonyesha nambari nyingi bila "mzuka" ilikuwa ngumu, na ilibidi tutumie saa ya kutimiza jambo hili. Ikiwa tungeendeleza mradi huu, tungeunganisha taa za rangi na Basys3 ili mtumiaji aweze kuona rangi (kama kwenye mchezo wa jadi) badala ya uwakilishi wa nambari za rangi. Mwishowe, tulipata uelewa mkubwa wa muundo tata wa mzunguko, matumizi halisi ya maisha, na changamoto za kutumia vifaa badala ya kuiga na hali bora.

Ilipendekeza: