Përmbajtje:

Lojë kryesore në VHDL: 3 hapa
Lojë kryesore në VHDL: 3 hapa

Video: Lojë kryesore në VHDL: 3 hapa

Video: Lojë kryesore në VHDL: 3 hapa
Video: «Развлечение с музыкой и программированием», Коннор Харрис и Стивен Крюсон 2024, Nëntor
Anonim
Lojë kryesore në VHDL
Lojë kryesore në VHDL
Lojë kryesore në VHDL
Lojë kryesore në VHDL

Për projektin tonë, ne krijuam lojën "Mastermind" në VHDL për t'u luajtur në tabelën Basys3. Mastermind është një lojë thyerja e kodit e luajtur tradicionalisht me kunja dhe një tabelë lojërash. Lojtari një vendos kunjat e ngjyrave të ndryshme në një rresht prej 4, të fshehura nga lojtari dy. Lojtari dy më pas ka numrin ‘x’ të hamendjeve që vendosin kunjat në tabelë në një rresht të dukshëm për lojtarin një. Pas çdo supozimi, lojtari dy informohet për 2 numra: sa prej kunjave kanë ngjyrën e duhur dhe sa kunja janë në pozicionin e duhur në rresht. Duke përdorur ato të dhëna, lojtari dy duhet të marrë me mend sekuencën e saktë të kunjave që lojtari i parë vendosi në supozimin e numrit të caktuar.

Në zbatimin tonë, loja është një lojtar i vetëm. Një kombinim i rastësishëm i kunjave krijohet nga programi, dhe lojtari duhet të përdorë tabelën Basys3 për të marrë me mend sekuencën e saktë. Ekzistojnë katër "ngjyra", të përfaqësuara nga vlerat binare. Ekrani me 7 segmente tregon tre vlera: kthesat e mbetura, numri i kunjave në pozicionin e duhur dhe numri i kunjave që kanë ngjyrën e duhur në pozicionin e gabuar (këto vlera fillojnë nga 9, 0 dhe 0). Luajtësi përdor çelsat në tabelë për të zgjedhur vlerat binare për supozimin e tij/saj dhe rrokullis një çelës tjetër për të paraqitur supozimin. Nëse ato janë të sakta, loja përfundon dhe ekrani me 7 segmente tregon "GG". Nëse jo, numëruesi i kthesës zvogëlohet me 1 dhe lojtari merr reagime bazuar në atë se sa kunja në supozimin e tyre përputhen me ngjyrën ose pozicionin e kunjave në kombinim. Nëse lojtari mbaron me kthesat pa e marrë me mend saktë, ekrani shfaq "GO" (që përfaqëson lojën e përfunduar). Luajtësi gjithashtu mund të kthejë çelësin e rivendosjes për të filluar nga e para në çdo kohë.

Hapi 1: Materialet

Materiale
Materiale
Materiale
Materiale
Materiale
Materiale

Meqenëse e gjithë loja mund të luhet në vetë tabelën, të vetmet materiale të nevojshme janë Bordi Basys3, një kabllo mikro USB për t'u lidhur me tabelën dhe një kompjuter/laptop që mund t'i përdorni për të koduar!

Hapi 2: Kodi

Kodi
Kodi
Kodi
Kodi

Në mënyrë që kjo lojë të funksionojë në FPGA, mënyra më e thjeshtë për të shkruar është të krijoni një makinë shtetërore. Të kesh një makinë shtetërore lejon përvojën vijuese dhe ndërvepruese të nevojshme që loja të funksionojë në të vërtetë. Në mënyrë që gjithçka të funksionojë pa probleme, makina shtetërore do të bazohet në sinjalin e brendshëm të orës së FPGA, duke siguruar që gjithçka është në sinkron. Moduli kryesor është një makinë shtetërore me katër gjendje; Gjendja fillestare (fillestare), gjendja SubmitAnswer (nënAns), gjendja e shfaqjes (Dis) dhe gjendja CheckEndGame (CheckEnd). Së bashku me makinën shtetërore, moduli kryesor ka dy nënmodule, një ekran 4-shifror me shtatë segmente (i cili ka nënmodulin e vet ClkDivider) dhe gjeneratorin e numrave të rastësishëm (në fakt një gjenerator i numrave të rastësishëm psuedo). Ekziston gjithashtu një bllok procesor bazë për të ndezur LED -të mbi secilin çelës kur ndizen si një mënyrë për njerëzit që të shohin atë që po futin më lehtë. Një përmbledhje themelore e kodit mund të shihet në hartën e mendjes të paraqitur.

Komponenti i parë që duhet shikuar është Gjeneratori i Numrave të Rastit (randomgen). Meqenëse nuk është teknikisht e mundur të merren numra të vërtetë të rastësishëm të gjeneruar nga hardueri, zgjidhja më e thjeshtë ishte që rastisja të ishte në të vërtetë Regjistri i Zhvendosjes së Reagimit Linear (LFSR). LFSR ka një hyrje të clk dhe një dalje "a" (një numër 12-bit). Çdo cikël i orës, krijohet një numër i ri 12-bit duke filluar nga "000000000001", duke kaluar përfundimisht nëpër të gjitha kombinimet e 12-bitëve të 1 dhe 0 para se të përsëritet. Dalja "a" i jepet çdo cikli të orës, kështu që vazhdon të funksionojë gjatë gjithë kohës. Clk është i lidhur me Clk nga moduli kryesor, dhe "a" është i lidhur me sinjalin RandNum në modulin kryesor.

Nënmoduli i dytë është 4-shifror Seven Segment Display. Kjo është një mënyrë mjaft e drejtpërdrejtë për të shfaqur një ekran 4-shifror me shtatë segmente. Ekrani është vendosur në Clk nga moduli kryesor, megjithatë ky nënmodul ka nënmodulin e vet të një ClkDivider. ClkDivider (i vendosur në 1298 Hz) përdoret për të shpejtuar orën për Segmentin Shtatë në mënyrë që të gjitha shifrat të jenë të ndezura në të njëjtën kohë (pasi në fakt vetëm një shifër mund të jetë aktive në të njëjtën kohë). Ndryshorja "shifër" përdoret për të qarkulluar nëpër pikat në ekran, dhe me secilën shifër vijnë kushtet e një ekrani bazë të hyrjes 4-bit, me mundësi për të treguar shifrat 0 deri në 9 dhe gjithashtu asgjë. Shifra më e majtë në ekran është vendosur në asgjë pasi nuk përdoret në këtë lojë.

Moduli kryesor përbëhet nga makina shtetërore. Katër shtetet në proces janë Initial, SubAns, Dis dhe CheckEnd. Kur në gjendjen fillestare, nëse SubmitBtn (çelësi i përdorur për të paraqitur përgjigjen tuaj për kontroll) është vendosur në '1', atëherë makina lëviz në Gjendjen NënAns. Çdo herë Rbtn (çelësi i përdorur për të rivendosur makinën) është vendosur në '1', pastaj makina kthehet në gjendjen fillestare. Kur është në gjendjen SubAns, kur SubmitBtn = '0' përsëri, ai kalon në Dis State. Kur jeni në Dis Dis, nëse Countdown = 0 (Kthesat e majta për të supozuar bien në 0) ose nëse RSpotCount = 4 (që do të thotë lojtari si të gjitha ngjyrat e sakta në pikat e duhura), makina shkon në Gjendjen e Kontrollit. Nëse asnjëra prej tyre nuk ndodh, atëherë kur SubmitBtn = ‘1’ përsëri, kthehet në gjendjen SubAns për të lejuar një supozim tjetër. Kur jeni në gjendjen CheckEnd, ky është fundi i lojës, dhe e vetmja rrugëdalje është të godisni rivendosjen, duke e kthyer atë në gjendjen fillestare. Kjo mund të shihet lehtësisht në diagramin e makinës shtetërore. Sjellje Shteti Fillestar inicializon gjithçka përsëri në pozicionin fillestar. Numërimi mbrapsht (sinjali i cili kursen sa kthesa ka lënë lojtari) është vendosur në 9, RSpotCount (sinjal që kursen sa nga ngjyrat që keni menduar se janë në vendin e duhur) është vendosur në 0, RColorCount (sinjal që kursen sa prej ngjyrat që keni menduar janë të drejta, por në vendin e gabuar) është vendosur në 0, dhe numërimi i vogël (sinjali që përfundimisht është hartuar në Countdown i cili në fakt ndryshon çdo kthesë në gjendjet e mëvonshme) është vendosur në 9. Gjithashtu, në gjendjen fillestare, RandNum (numri i gjeneruar psuedo-i rastësishëm) ndahet në katër kontrolle të ndryshme (një për çdo ngjyrë 3-bit) dhe ruhet në sinjalet check1, check2, check3, check4. Këto kontrolle janë ato me të cilat supozimi juaj krahasohet në të vërtetë, kështu që edhe pse LFSR gjithmonë po shkakton që RandNum të ndryshojë çdo cikël, sapo të dilni nga gjendja fillestare, kontrollet mbeten të njëjta, duke lejuar një vlerë të ruajtur të krahasojë përgjigjen tuaj kundër. Kjo gjithashtu do të thotë në çdo kohë që pajisja të rivendoset, lojtari ka një vlerë të re për të marrë me mend.

Gjendja SubmitAnswer (SubAns) ndryshon aktivizimin e numërimit mbrapsht (sinjali "ndryshim") në '1'. Kjo është e nevojshme më vonë që gjurmimi i kthesës të funksionojë. Pas kësaj, shteti krahason hyrjet e lojtarit nga çelsat me kontrollet e bëra në gjendjen e mësipërme. Sinjali rs1, rs2, rs3, rs4 dhe sinjalet rc1, rc2, rc3, rc4 janë lloje të numrave të plotë të cilët në varësi të pohimeve If janë vendosur në 1 ose 0. Sinjali rs janë për vendin e duhur dhe rc për ngjyrën e duhur. Për shembull, nëse ngjyra e supozimit të lojtarit 1 është e barabartë me kontrollin1 të RandNum, atëherë rs1 = 1 pasi kjo do të thotë që ngjyra e duhur është në vendin e duhur. Nëse ngjyra 1 nuk është e barabartë me check1, por barazohet me një nga kontrollet e tjera, atëherë rc = 1. Kjo bëhet për secilën ngjyrë dhe çdo kontroll.

Gjendja e shfaqjes (Dis) së pari kërkon aktivizuesin e numërimit mbrapsht. Nëse është '1', atëherë numërimi i vogël zbret 1 (kështu që në kthesën e parë shkon nga 9 në 8, etj.). Përndryshe radha nuk ndryshon. Pavarësisht nga aktivizimi, të gjitha vlerat rs nga lart shtohen dhe caktohen në sinjal RSpotCounter. Gjithashtu të gjitha vlerat e rc shtohen dhe i caktohen RColorCounter. Së fundi, Countdown i caktohet vlera e countdown të vogël. Sinjalet RSpotCounter, RColorCounter dhe Countdown të gjitha shndërrohen në vektorë std_logic_ 4-bit jashtë procesit, dhe shtyhen në nënmodulin e shfaqjes Seven Segment përmes një harte porti. Në këtë mënyrë, ekrani tregon gjërat e duhura derisa të paraqisni një përgjigje të re.

CheckEnd State është nëse keni fituar apo humbur. Nëse keni fituar (të 4 ngjyrat janë në vendin e duhur, të njohur ndryshe si RSpotCounter = 4), atëherë "GG" (e treguar teknikisht si 66) shfaqet në Segmentin Shtatë për të treguar që keni fituar. Nëse keni humbur (Countdown ka arritur në 0) atëherë "GO" (e treguar teknikisht si 60) shfaqet në ekran për Game Over. Me secilin prej përfundimeve, ndezja e çelësit të rivendosjes do ta lëvizë makinën përsëri në gjendjen fillestare për të luajtur përsëri.

Kodi Burimor mund të gjendet këtu.

Hapi 3: Përfundimi

Përfundimi i këtij projekti na mësoi shumë për ndërtimin e qarqeve më të komplikuara. Dizajni ynë fillestar nuk ishte një makinë me gjendje të fundme. Ne e kishim të vështirë të korrigjonim dhe rishkruan kodin disa herë duke përdorur metoda të ndryshme (përfshirë një FSM). Me sugjerimin e instruktorit, ne qëndruam me qasjen FSM dhe ishim në gjendje ta përfundonim lojën. Mësuam se është shumë më efektive të hartohet kodi bazuar në harduer sesa me një qasje tradicionale programimi. Ne gjithashtu u përballëm me disa sfida që lidhen me shfaqjen e shtatë segmenteve. Ishte e vështirë për të shfaqur numra të shumtë pa "ghosting" dhe na duhej të përdorim një ndarës të orës për ta arritur këtë. Nëse do të zhvillonim më tej këtë projekt, ne do të lidhnim LED me ngjyra në Basys3 në mënyrë që përdoruesi të shikojë ngjyrat (si në lojën tradicionale) dhe jo përfaqësimet numerike të ngjyrave. Në fund të fundit, ne fituam një kuptim më të madh të dizajnit kompleks të qarkut, aplikacioneve të jetës reale dhe sfidave të përdorimit të harduerit në vend të ekzekutimit të simulimeve me kushte perfekte.

Recommended: