Talaan ng mga Nilalaman:

Mastermind Game sa VHDL: 3 Hakbang
Mastermind Game sa VHDL: 3 Hakbang

Video: Mastermind Game sa VHDL: 3 Hakbang

Video: Mastermind Game sa VHDL: 3 Hakbang
Video: How To Beat The DEATH GAMES In "Usogui" 2024, Hulyo
Anonim
Mastermind Game sa VHDL
Mastermind Game sa VHDL
Mastermind Game sa VHDL
Mastermind Game sa VHDL

Para sa aming proyekto, nilikha namin ang laro na "Mastermind" sa VHDL upang i-play sa board ng Basys3. Ang Mastermind ay isang larong paglabag sa code na ayon sa kaugalian na nilalaro sa mga peg at isang board game. Ang isang player ay naglalagay ng mga peg ng iba't ibang kulay sa isang hilera ng 4, nakatago mula sa player ng dalawa. Ang manlalaro dalawa pagkatapos ay mayroong ‘x’ bilang ng mga hula na naglalagay ng mga peg sa pisara sa isang hilera na nakikita ng isa sa manlalaro. Matapos ang bawat hula, ang dalawang manlalaro ay may alam sa 2 numero: ilan sa mga peg ang tamang kulay, at kung ilang mga peg ang nasa tamang posisyon sa hilera. Gamit ang mga pahiwatig na iyon, dapat hulaan ng manlalaro ang tamang pagkakasunud-sunod ng mga pin na ang manlalaro ay inilagay sa bilang na inilaan sa hula.

Sa aming pagpapatupad, ang laro ay solong manlalaro. Ang isang random na kumbinasyon ng mga peg ay nabuo ng programa, at dapat gamitin ng manlalaro ang board ng Basys3 upang hulaan ang tamang pagkakasunud-sunod. Mayroong apat na "mga kulay," na kinakatawan ng mga halagang binary. Ang pagpapakita ng 7-segment ay nagpapakita ng tatlong mga halaga: natitirang mga liko, bilang ng mga pin sa tamang posisyon, at bilang ng mga pin na tamang kulay sa maling posisyon (ang mga halagang ito ay nagsisimula sa 9, 0, at 0). Ginagamit ng manlalaro ang mga switch sa board upang piliin ang mga halagang binary para sa kanyang hula, at i-flip ang isa pang switch upang isumite ang hula. Kung tama ang mga ito, nagtatapos ang laro at ang pagpapakita ng 7-segment ay nagpapakita ng "GG." Kung hindi, ang turn counter ay nababawasan ng 1 at ang manlalaro ay tumatanggap ng feedback batay sa kung gaano karaming mga pin sa kanilang hula ang tumutugma sa kulay o posisyon ng mga pin sa kumbinasyon. Kung ang player ay naubusan ng mga pagliko nang hindi hulaan nang tama, ipinapakita ng display ang "GO" (na kumakatawan sa laro sa paglipas). Maaari ding i-flip ng player ang reset switch upang magsimula muli sa anumang oras.

Hakbang 1: Mga Kagamitan

Mga Kagamitan
Mga Kagamitan
Mga Kagamitan
Mga Kagamitan
Mga Kagamitan
Mga Kagamitan

Dahil ang buong laro ay maaaring i-play sa board mismo, ang mga materyales na kinakailangan lamang ay ang Basys3 Board, isang micro USB cable upang kumonekta sa board, at isang computer / laptop na maaari mong gamitin upang mag-code!

Hakbang 2: Ang Code

Ang Code
Ang Code
Ang Code
Ang Code

Upang gumana ang larong ito sa FPGA, ang pinakasimpleng paraan upang magsulat ito ay upang lumikha ng isang makina ng estado. Ang pagkakaroon ng isang makina ng estado ay nagbibigay-daan sa sunud-sunod at interactive na karanasan na kinakailangan para sa laro na talagang gumana. Upang maayos na tumakbo ang lahat, ang makina ng estado ay ibabatay sa panloob na signal ng orasan ng FPGA, na tinitiyak na ang lahat ay naka-sync. Ang pangunahing module ay isang machine ng estado na may apat na estado; Paunang Estado (Pauna), Isumite ang Sagot ng Estado (SubAns), Display State (Dis), at ang CheckEndGame State (CheckEnd). Kasama ng makina ng estado, ang pangunahing module ay may dalawang submodule, isang 4 na digit na Seven Segment Display (na mayroong sariling ClkDivider submodule), at ang Random Number Generator (talagang isang psuedo-random number generator). Mayroon ding pangunahing block ng proseso upang magkaroon ng LED sa itaas ng bawat switch na nakabukas kapag binuksan bilang isang paraan para makita ng mga tao kung ano ang kanilang madaling ipinasok. Ang isang pangunahing pangkalahatang-ideya ng code ay maaaring makita sa mind map na nakalarawan.

Ang unang sangkap na tiningnan ay ang Random Number Generator (randomgen). Dahil hindi posible sa teknikal na makakuha ng totoong mga random na numero na nabuo mula sa hardware, ang pinakasimpleng solusyon ay ang pagkakaroon ng randomgen na talagang isang Linear-feedback Shift Register (LFSR). Ang LFSR ay may input ng clk at isang output na "a" (isang 12-bit na numero). Ang bawat pag-ikot ng orasan, isang bagong 12-bit na numero ay nabuo simula sa "000000000001", kalaunan dumaan sa lahat ng mga kumbinasyon ng 12-bit ng 1 at 0 bago ulitin ang sarili nito. Ang output na "a" ay ibinibigay sa bawat pag-ikot ng orasan, kaya't patuloy itong tumatakbo sa kabuuan. Ang clk ay nai-map sa Clk mula sa pangunahing module, at ang "a" ay nai-map sa signal RandNum sa pangunahing module.

Ang pangalawang submodule ay ang 4-digit na Seven Segment Display. Ito ay isang medyo prangka na paraan ng pagpapakita ng isang 4 na digit na Pitong Segment na Display. Ang display ay nakatakda sa Clk mula sa pangunahing module, ngunit ang submodule na ito ay may sariling submodule ng isang ClkDivider. Ang ClkDivider (nakatakda sa 1298 Hz) ay ginagamit upang mapabilis ang orasan para sa Pitong Segment upang ang lahat ng mga digit ay lilitaw na nasa parehong oras (dahil isang digit lamang ang aktwal na maaaring magkasama). Ang variable na "digit" ay ginagamit upang paikotin ang mga spot sa display, at sa bawat digit ay dumarating ang mga kundisyon ng isang pangunahing 4-bit input display, na may mga pagpipilian upang maipakita ang mga digit na 0 hanggang 9 at wala rin. Ang pinakamalayong kaliwang digit sa display ay nakatakda sa wala dahil hindi ito ginagamit sa larong ito.

Ang pangunahing module ay binubuo ng makina ng estado. Ang apat na estado sa proseso ay Pauna, SubAns, Dis, at CheckEnd. Kailan sa paunang estado, kung ang SubmitBtn (switch na ginamit upang isumite ang iyong sagot para sa pag-check) ay nakatakda sa '1', pagkatapos ang machine ay lumilipat sa SubAns State. Anumang oras Rbtn (switch na ginamit upang i-reset ang makina) ay nakatakda sa '1', pagkatapos ay ang machine ay bumalik sa Paunang estado. Kapag nasa SubAns State, kapag ang submBtn = ‘0’ muli, lumipat ito sa Dis State. Kapag nasa Dis State, kung ang Countdown = 0 (Ang liko sa kaliwa upang hulaan ay nahuhulog sa 0) o kung ang RSpotCount = 4 (nangangahulugang ang manlalaro bilang lahat ng mga tamang kulay sa tamang mga spot), ang makina ay pupunta sa Estado ng CheckEnd. Kung wala sa alinman sa mga iyon ang naganap, pagkatapos kapag muling isumite angBebn = ‘1’, bumalik ito sa estado ng SubAns upang payagan ang isa pang hulaan. Kapag sa CheckEnd State, ito ang pagtatapos ng laro, at ang tanging paraan lamang ay upang maabot ang reset, ibabalik ito sa Paunang Estado. Madali itong makita na makita sa diagram ng makina ng estado. Pag-uugali ng Paunang Estado na pinasimulan ang lahat pabalik sa panimulang posisyon. Ang Countdown (signal kung saan makatipid kung gaano karaming mga kaliwa ang mayroon ang player) ay nakatakda sa 9, RSpotCount (signal na nakakatipid kung ilan sa mga kulay na nahulaan mo na sa tamang lugar) ay nakatakda sa 0, RColorCount (signal na nakakatipid kung ilan sa ang mga kulay na nahulaan mo ay tama ngunit sa maling lugar) ay nakatakda sa 0, at ang maliit na bilang (signal na sa paglaon ay nai-map sa Countdown na talagang binabago ang bawat pagliko sa mga susunod na estado) ay nakatakda sa 9. Gayundin, sa Paunang Estado ng RandNum (Ang psuedo-random na nabuong numero) ay nahahati sa apat na magkakaibang mga tseke (isa para sa bawat 3-bit na kulay) at nai-save sa mga signal check1, check2, check3, check4. Ang mga tseke na ito ay talagang ihinahambing sa iyong hula, kaya't kahit na ang LFSR ay palaging nagiging sanhi ng RandNum na baguhin ang bawat ikot, sa sandaling umalis ka sa Paunang estado ang mga tseke ay mananatiling pareho, na pinapayagan ang isang nai-save na halaga upang ihambing ang iyong sagot laban sa. Nangangahulugan din ito anumang oras na nai-reset ang makina, ang player ay may isang bagong halaga upang hulaan.

Binabago ng submAnswer State (SubAns) ang tagabigay ng countdown (signal na "pagbabago") sa '1'. Kailangan ito sa paglaon upang gumana ang pagsubaybay sa pagliko. Pagkatapos nito, ihinahambing ng estado ang mga input ng manlalaro mula sa mga switch sa mga tseke na ginawa sa estado sa itaas. Ang mga signal ng rs1, rs2, rs3, rs4 at signal rc1, rc2, rc3, rc4 ay mga uri ng integer na depende sa Kung ang mga pahayag ay nakatakda sa alinman sa 1 o 0. Ang signal rs ay para sa tamang lugar at rc para sa tamang kulay. Halimbawa kung ang hula ng manlalaro ng kulay na 1 ay katumbas ng check1 ng RandNum, kung gayon ang rs1 = 1 dahil nangangahulugang ang tamang kulay ay nasa tamang lugar. Kung ang kulay 1 ay hindi pantay na check1, ngunit pantay ang isa sa iba pang mga tseke, pagkatapos rc = 1. Ginagawa ito para sa bawat kulay at bawat tseke.

Una nang hahanapin ng Display State (Dis) ang bilang ng enabler ng countdown. Kung ito ay '1', pagkatapos ang maliit na account ay bumaba sa 1 (kaya sa unang pagliko ay 9 hanggang 8 atbp.). Kung hindi man ay hindi magbabago. Anuman ang paganahin, ang lahat ng mga halaga ng rs mula sa itaas ay naidagdag at naitalaga sa signal na RSpotCounter. Gayundin ang lahat ng mga halaga ng rc ay idinagdag at nakatalaga sa RColorCounter. Sa wakas ang Countdown ay nakatalaga sa halagang maliit na pagkalkula. Ang mga signal na RSpotCounter, RColorCounter, at Countdown lahat ay na-convert sa 4-bit std_logic_vector sa labas ng proseso, at itinulak sa Seven Segment display submodule sa pamamagitan ng isang mapa ng port. Sa ganitong paraan, ipinapakita ng display ang mga tamang bagay hanggang magsumite ka ng isang bagong sagot.

Ang CheckEnd State ay para sa kung nanalo ka o natalo. Kung nanalo ka (lahat ng 4 na kulay ay nasa tamang lugar, kung hindi man kilala bilang RSpotCounter = 4), kung gayon ang "GG" (ipinapakita bilang tekniko bilang 66) ay ipinapakita sa Pitong Segment upang maipakita na nanalo ka. Kung natalo ka (Umabot na sa 0 ang countdown) pagkatapos ay ang "GO" (ipinapakita sa teknikal na bilang 60) ay ipinapakita sa display para sa Game Over. Sa alinmang kinalabasan, ang pagpindot sa reset switch sa on ay ilipat ang makina pabalik sa Paunang estado upang i-play muli.

Ang Source Code ay matatagpuan dito.

Hakbang 3: Konklusyon

Ang pagkumpleto sa proyektong ito ay nagturo sa amin ng maraming tungkol sa pagbuo ng mas kumplikadong mga circuit. Ang aming paunang disenyo ay hindi isang may takdang makina ng estado. Nahirapan kaming mag-debug, at muling isulat ang code nang maraming beses gamit ang iba't ibang pamamaraan (kasama ang isang FSM). Sa mungkahi ng nagtuturo, natigil kami sa diskarte ng FSM at nagawa naming matapos ang laro. Nalaman namin na mas epektibo ang disenyo ng code batay sa hardware kaysa sa isang tradisyunal na diskarte sa pagprograma. Nakaharap din kami ng maraming hamon na nauugnay sa pitong segment na pagpapakita. Ang pagkuha nito upang maipakita ang maraming mga numero nang walang "ghosting" ay mahirap, at kailangan naming gumamit ng isang divider ng orasan upang magawa ito. Kung nais pa nating paunlarin ang proyektong ito, ikokonekta namin ang mga may kulay na LED sa Basys3 upang makita ng gumagamit ang mga kulay (tulad ng sa tradisyunal na laro) kaysa sa mga bilang na representasyon ng mga kulay. Sa huli, nakakuha kami ng higit na pag-unawa sa kumplikadong disenyo ng circuit, mga application ng totoong buhay, at mga hamon ng paggamit ng hardware kaysa sa pagpapatakbo ng mga simulation na may perpektong mga kondisyon.

Inirerekumendang: