Բովանդակություն:

Գլխավոր խաղ VHDL- ում ՝ 3 քայլ
Գլխավոր խաղ VHDL- ում ՝ 3 քայլ

Video: Գլխավոր խաղ VHDL- ում ՝ 3 քայլ

Video: Գլխավոր խաղ VHDL- ում ՝ 3 քայլ
Video: նոր խաղ 01 - Nor Xagh 01 (ARTN 2022) 2024, Նոյեմբեր
Anonim
Գլխավոր խաղ VHDL- ում
Գլխավոր խաղ VHDL- ում
Գլխավոր խաղ VHDL- ում
Գլխավոր խաղ VHDL- ում

Մեր նախագծի համար մենք ստեղծեցինք «Mastermind» խաղը VHDL- ով `խաղալու Basys3- ի տախտակին: Mastermind- ը ծածկագիր կոտրող խաղ է, որն ավանդաբար խաղում են կեռներով և խաղատախտակով: Մեկ խաղացողը 4 -րդ շարքում տեղադրում է գույների տեսականի, որոնք թաքնված են երկրորդ խաղացողից: Երկրորդ խաղացողն ունի «x» թվով գուշակություններ, որոնք տեղադրում են մեխերը տախտակին անընդմեջ ՝ տեսանելի խաղացողի համար: Յուրաքանչյուր գուշակությունից հետո խաղացող 2 -ը տեղեկանում է 2 թվերի մասին. Քանի մեխից է ճիշտ գույնը, և քանի մեխ է շարքում ճիշտ դիրքում: Օգտագործելով այդ հուշումները, խաղացողը երկուսը պետք է կռահի, թե որ քորոցների ճիշտ հաջորդականությունն է այն խաղացողը, որը տեղադրեց համարի հատկացված գուշակության մեջ:

Մեր իրականացման ընթացքում խաղը միայնակ խաղացող է: Byրագիրը ստեղծում է մեխերի պատահական համադրություն, և խաղացողը պետք է օգտագործի Basys3 տախտակը `գուշակելու ճիշտ հաջորդականությունը: Կան չորս «գույներ», որոնք ներկայացված են երկուական արժեքներով: 7 հատվածից բաղկացած էկրանը ցույց է տալիս երեք արժեք ՝ մնացած շրջադարձեր, ճիշտ դիրքում կապում համարներ և սխալ դիրքում ճիշտ գույն ունեցող կապում (այս արժեքները սկսվում են 9, 0 և 0): Խաղացողը օգտագործում է գրատախտակի անջատիչները `իր գուշակության համար երկուական արժեքներն ընտրելու համար, և շրջում է մեկ այլ անջատիչ` գուշակությունը ներկայացնելու համար: Եթե դրանք ճիշտ են, խաղն ավարտվում է, և 7 հատվածից բաղկացած էկրանին ցուցադրվում է «GG»: Եթե ոչ, շրջադարձի հաշվիչը նվազում է 1 -ով, և խաղացողը ստանում է հետադարձ կապ ՝ հիմնվելով այն բանի վրա, թե քանի քորոց է իրենց ենթադրությանը համընկնում համադրության քորոցների գույնի կամ դիրքի հետ: Եթե խաղացողը առանց ճիշտ կռահելու շրջադարձերի վերջանում է, էկրանին ցուցադրվում է «GO» (ցույց է տալիս խաղը ավարտվածը): Նվագարկիչը կարող է նաև շրջել վերակայման անջատիչը ՝ ցանկացած պահի նորից սկսելու համար:

Քայլ 1: Նյութեր

Նյութեր
Նյութեր
Նյութեր
Նյութեր
Նյութեր
Նյութեր

Քանի որ ամբողջ խաղը կարելի է խաղալ հենց տախտակի վրա, անհրաժեշտ են միայն Basys3 տախտակը, տախտակին միանալու համար միկրո USB մալուխ և համակարգիչ/նոութբուք, որը կարող եք օգտագործել ծածկագրելու համար:

Քայլ 2: Կոդ

Օրենսգիրքը
Օրենսգիրքը
Օրենսգիրքը
Օրենսգիրքը

Որպեսզի այս խաղը աշխատի FPGA- ի վրա, գրելու ամենապարզ ճանապարհը կլինի պետական մեքենա ստեղծել: Պետական մեքենա ունենալը թույլ է տալիս խաղի իրական աշխատանքի համար անհրաժեշտ հաջորդական և ինտերակտիվ փորձ: Որպեսզի ամեն ինչ սահուն աշխատի, պետական մեքենան հիմնված կլինի FPGA- ի ներքին ժամացույցի ազդանշանի վրա `ապահովելով, որ ամեն ինչ համաժամեցված է: Հիմնական մոդուլը չորս մեքենա ունեցող պետական մեքենա է. Նախնական վիճակ (սկզբնական), SubmitAnswer պետություն (SubAns), Display State (Dis) և CheckEndGame State (CheckEnd): Պետական մեքենայի հետ միասին, հիմնական մոդուլն ունի երկու ենթամոդուլ ՝ 4-նիշ Seven Segment Display (որն ունի իր սեփական ClkDivider ենթամոդուլը) և Պատահական թվերի գեներատոր (իրականում psuedo- պատահական թվերի գեներատոր): Կա նաև հիմնական գործընթացի բլոկ, որի միջոցով յուրաքանչյուր անջատիչից LED- ները միացված են, երբ միացված են, որպեսզի մարդիկ տեսնեն, թե ինչն են ավելի հեշտ մուտքագրում: Կոդի հիմնական ակնարկը կարելի է տեսնել պատկերված մտքի քարտեզում:

Առաջին բաղադրիչը, որին պետք է ուշադրություն դարձնել, Պատահական թվերի գեներատոր է (պատահականություն): Քանի որ տեխնիկապես անհնար է ստանալ ապարատից ստացված իրական պատահական թվեր, ամենապարզ լուծումն այն էր, որ պատահականությունը իրականում լիներ Գծային հետադարձ կապի հերթափոխի գրանցամատյան (LFSR): LFSR- ն ունի clk մուտքագրում և ելք «a» (12-բիթանոց համար): Clockամացույցի յուրաքանչյուր ցիկլ, ստեղծվում է նոր 12-բիթանոց համար `սկսած« 000000000001 »-ից, որն ի վերջո անցնում է 1-ի և 0-ի 12-բիթանոց բոլոր կոմբինացիաներով ՝ նախքան կրկնվելը: «A» ելքը տրվում է ժամացույցի յուրաքանչյուր ցիկլի, այնպես որ այն անընդհատ աշխատում է ամբողջ ընթացքում: Clk- ը հիմնական մոդուլից քարտեզագրվում է Clk- ին, իսկ «a» - ն ՝ հիմնական մոդուլում RandNum ազդանշանին:

Երկրորդ ենթամոդուլը 4-նիշ Seven Segment Display- ն է: Սա բավականին պարզ միջոց է յոթ հատվածից ցուցադրվող 4 նիշանոց ցուցադրման համար: Displayուցադրումը հիմնական մոդուլից տեղադրված է Clk- ի վրա, սակայն այս ենթամոդուլն ունի ClkDivider- ի սեփական ենթամոդուլը: ClkDivider- ը (սահմանել է 1298 Հց) օգտագործվում է Յոթ հատվածի ժամացույցը արագացնելու համար, որպեսզի բոլոր թվանշանները միաժամանակ միացված լինեն (քանի որ իրականում միայն մեկ թվանշան կարող է միաժամանակ միացված լինել): «Թվային» փոփոխականն օգտագործվում է ցուցադրման կետերում պտտվելու համար, և յուրաքանչյուր թվանշանի հետ գալիս են հիմնական 4-բիթանոց մուտքի էկրանի պայմանները ՝ 0-ից 9 թվանշանները ցուցադրելու ընտրանքներով, ինչպես նաև ոչինչ: Theուցադրման ամենահեռավոր ձախ թվանշանը ոչինչ է սահմանվում, քանի որ այն չի օգտագործվում այս խաղում:

Հիմնական մոդուլը բաղկացած է պետական մեքենայից: Ընթացքի մեջ գտնվող չորս նահանգներն են ՝ Initial, SubAns, Dis և CheckEnd: Երբ գտնվում եք սկզբնական վիճակում, եթե SubmitBtn- ը (անջատիչը, որն օգտագործվում է ստուգման համար ձեր պատասխանը ներկայացնելու համար) սահմանել է «1», ապա մեքենան տեղափոխվում է SubAns պետություն: Ytանկացած Rbtn (անջատիչը, որն օգտագործվում է մեքենան վերակայելու համար) սահմանվում է «1», այնուհետև մեքենան վերադառնում է Նախնական վիճակին: Երբ SubAns պետությունում է, երբ SubmitBtn = ‘0’ կրկին, այն անցնում է Dis State- ին: Երբ գտնվում եք Dis State- ում, եթե Countdown = 0 (Կռահելու համար ձախ շրջադարձները ընկնում են 0 -ի) կամ եթե RSpotCount = 4 (նկատի ունի նվագարկիչը, ինչպես բոլոր ճիշտ գույները ճիշտ կետերում), մեքենան գնում է CheckEnd վիճակ: Եթե դրանցից ոչ մեկը չպատահի, ապա երբ SubmitBtn = ‘1’ կրկին, այն վերադառնում է SubAns վիճակին ՝ այլ գուշակություն թույլ տալու համար: Երբ CheckEnd State- ում եք, սա խաղի ավարտն է, և միակ ելքը `վերականգնելը հարվածելն է` այն վերադարձնելով Նախնական վիճակին: Սա հեշտությամբ կարելի է դիտել պետական մեքենայի դիագրամում: Վարքագծային սկզբնական վիճակը ամեն ինչ սկզբնական դիրքի է վերադառնում: Հետհաշվարկը (ազդանշանը, որը խնայում է խաղացողի ձախ շրջադարձը) սահմանվում է 9, RSpotCount (ազդանշան, որը պահպանում է այն գույների քանակը, որոնք դուք կռահել եք, որ ճիշտ տեղում են) `0, RColorCount (ազդանշան, որը խնայում է քանիսը Ձեր ենթադրած գույները ճիշտ են, բայց սխալ տեղում) սահմանվում է 0, իսկ փոքր հաշվարկը (ազդանշանը, որն ի վերջո քարտեզագրվում է Հետհաշվարկի մեջ, որն իրականում փոխում է յուրաքանչյուր շրջադարձ ավելի ուշ վիճակներում) սահմանվում է 9. Բացի այդ, Նախնական վիճակում RandNum (psuedo-random generated number) բաժանվում է չորս տարբեր ստուգումների (մեկը յուրաքանչյուր 3-բիթ գույնի համար) և պահվում է ազդանշաններում check1, check2, check3, check4: Այս ստուգումներն իրականում համեմատվում են ձեր ենթադրությունների հետ, չնայած LFSR- ն միշտ ստիպում է RandNum- ին փոխել ամեն ցիկլ, Նախնական վիճակից դուրս գալուց հետո ստուգումները մնում են անփոփոխ ՝ թույլ տալով պահպանված արժեքին համեմատել ձեր պատասխանը: Սա նաև նշանակում է, որ ցանկացած պահի, երբ մեքենան վերակայվի, խաղացողը կռահելու նոր արժեք ունի:

SubmitAnswer State- ը (SubAns) փոխում է հետհաշվարկի միացման հնարավորությունը (ազդանշանի «փոփոխություն») դեպի «1»: Սա անհրաժեշտ է ավելի ուշ, որպեսզի շրջադարձի հետևումն աշխատի: Դրանից հետո պետությունը համեմատում է նվագարկիչի մուտքերը անջատիչներից վերը նշված վիճակում կատարված չեկերի հետ: Ազդանշանը rs1, rs2, rs3, rs4 և ազդանշանները rc1, rc2, rc3, rc4 ամբողջ թվեր են, որոնք կախված են եթե հայտարարությունները դրված են կամ 1 կամ 0. Ազդանշանի rs- ը ճիշտ տեղում է, իսկ rc- ն `ճիշտ գույնի համար: Օրինակ, եթե 1 գույնի խաղացողի կռահումը հավասար է RandNum- ի check1- ին, ապա rs1 = 1, քանի որ դա նշանակում է, որ ճիշտ գույնը ճիշտ տեղում է: Եթե 1 գույնը հավասար չէ check1- ի, բայց հավասար է մյուս ստուգումներից մեկին, ապա rc = 1. Սա արվում է յուրաքանչյուր գույնի և յուրաքանչյուր չեկի համար:

Stateուցադրման վիճակն (Dis) առաջին հերթին փնտրում է հետհաշվարկի միացման հնարավորությունը: Եթե այն «1» է, ապա փոքր հաշվարկը իջնում է 1 -ով (այսինքն, առաջին շրջադարձի դեպքում այն 9 -ից հասնում է 8 -ի և այլն): Հակառակ դեպքում հերթը չի փոխվում: Անկախ այն հնարավորությունից, rs- ի բոլոր վերը նշված արժեքները գումարվում են և նշանակվում RSpotCounter ազդանշանին: Նաև բոլոր rc արժեքները ավելացվում և նշանակվում են RColorCounter- ին: Վերջապես Countdown- ին տրվում է smallcountdown- ի արժեքը: RSpotCounter, RColorCounter և Countdown ազդանշանները բոլորը փոխակերպվում են գործընթացից դուրս 4-բիթանոց std_logic_vectors և նավահանգստի քարտեզի միջոցով մղվում դեպի Seven Segment ցուցադրման ենթամոդուլ: Այս կերպ, ցուցադրումը ցույց է տալիս ճիշտ իրերը, մինչև նոր պատասխան չներկայացնեք:

CheckEnd State- ը վերաբերում է հաղթած կամ պարտված լինելու հանգամանքին: Եթե հաղթել եք (բոլոր 4 գույներն էլ ճիշտ տեղում են, այլապես հայտնի է որպես RSpotCounter = 4), ապա «GG» (տեխնիկապես ցուցադրված է 66) ցուցադրվում է Յոթ հատվածում ՝ ցույց տալու համար, որ դուք հաղթել եք: Եթե պարտվել եք (հետհաշվարկը հասել է 0 -ի), ապա «GO» (տեխնիկապես ցուցադրվում է որպես 60) ցուցադրվում է Game Over- ի էկրանին: Outcomeանկացած ելքի դեպքում վերակայման անջատիչին միացնելը մեքենան կվերադառնա Նախնական վիճակի ՝ նորից խաղալու համար:

Աղբյուրի կոդը կարելի է գտնել այստեղ:

Քայլ 3: Եզրակացություն

Այս նախագծի ավարտը մեզ շատ բան սովորեցրեց ավելի բարդ սխեմաներ կառուցելու մասին: Մեր սկզբնական նախագիծը վերջնական վիճակի մեքենա չէր: Մենք դժվարացանք կարգաբերել և ծածկագիրը մի քանի անգամ վերաշարադրել տարբեր մեթոդների միջոցով (ներառյալ FSM): Ուսուցչի առաջարկով մենք մնացինք FSM մոտեցման վրա և կարողացանք ավարտել խաղը: Մենք իմացանք, որ շատ ավելի արդյունավետ է ծածկագիրը սարքավորումների հիման վրա նախագծելը, քան ծրագրավորման ավանդական մոտեցումը: Մենք նաև բախվեցինք մի քանի մարտահրավերների ՝ կապված յոթ հատվածի ցուցադրման հետ: Դժվար էր այն ստանալ բազմաթիվ թվեր առանց «ուրվականների» ցուցադրման, և դա անելու համար մենք ստիպված եղանք օգտագործել ժամացույցի բաժանարար: Եթե մենք հետագայում զարգացնեինք այս նախագիծը, մենք գունավոր լուսադիոդներ կմիացնեինք Basys3- ին, որպեսզի օգտագործողը կարողանար տեսնել գույներ (ինչպես ավանդական խաղում), այլ ոչ թե գույների թվային ներկայացում: Ի վերջո, մենք ավելի մեծ պատկերացում կազմեցինք սխեմաների բարդ նախագծման, իրական կյանքի ծրագրերի և սարքավորումների օգտագործման մարտահրավերների մասին, քան կատարյալ պայմաններով սիմուլյացիաների գործարկման:

Խորհուրդ ենք տալիս: