Բովանդակություն:
- Քայլ 1: Արագ մանրամասներ և նյութեր
- Քայլ 2: Սարքաշարի միացում
- Քայլ 3. Տեխնիկական բացատրություն. Էկրան
- Քայլ 4. Տեխնիկական բացատրություն. Chanուցադրվող տեղեկատվության փոփոխություն
- Քայլ 5: Կոդ
Video: VHDL Basys3: Connect 4 Խաղ ՝ 5 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:48
Ներածություն:
Սա Connect 4 թվային տրամաբանական խաղ է, որը նախագծված է VHDL- ով ՝ օգտագործելով Vivado ծրագրաշարը և ծրագրավորված է Basys3 տախտակին: Այս նախագծի կառուցումն ու ձևավորումը միջանկյալ է, սակայն նորեկները կարող են պատճենել քայլերը և կառուցել թվային խաղը:
Խաղը գործում է Connect 4 խաղի պես: Խաղացողները կարող են իրենց կուրսորը տեղափոխել էկրանի վրայով ՝ օգտագործելով տախտակի վրա հայտնաբերված ձախ և աջ կոճակները: Տախտակի վրա միջին կոճակը սեղմելը կհանգեցնի նրան, որ խաղացողը տեղադրի իր նշիչը այդ սյունակի վրա, այնուհետև հաջորդ խաղացողի հերթը կդառնա: Երբ խաղացողը հաղթում է, խաղը կարող է վերակայվել ՝ սեղմելով տախտակի վրա գտնվող վերևի կոճակը:
Քայլ 1: Արագ մանրամասներ և նյութեր
Արագ տեխնիկական մանրամասներ.
-
Տախտակի վրա օգտագործում է PMOD միացումների երեք հավաքածու (JA, JB, JC)
- 8 կապում (առանց Vcc- ի և GND կապում) օգտագործվող յուրաքանչյուր PMOD միակցիչի համար
- JA - Տողերի վերահսկում
- JB - Կանաչ սյուների վերահսկում
- JC - Կարմիր սյուների վերահսկում
-
Էկրանի ժամացույցն աշխատում է 960 Հց հաճախականությամբ
Տվյալ պահին միացված է ընդամենը 8 LED: Էկրանը թարմացվում է բավականաչափ արագ ժամացույցի արագությամբ, որի պատրանքն այն է, որ տվյալ պահին միացված է ավելի քան 8 LED:
- Կոճակի ժամացույցը գործում է 5 Հց հաճախականությամբ; Անկության դեպքում կարելի է տուգանվել ՝ կարգավորելով VHDL ծածկագիրը:
- Darlington Arrays- ի ներքին դիմադրությունը բավարար է LED- ի այրումը կանխելու համար
Խաղը կառուցված է հետևյալ բաղադրիչների և գործիքների միջոցով.
- (1) Basys3 խորհուրդ
- (2) LED մատրիցա երկգույն 8x5 ՝
- (2) ULN2803 - Դարլինգթոնի տրանզիստորային զանգվածներ - տվյալների թերթիկ
- Մետաղալարեր
- Jumper լարերը
- Մետաղական մերկացուցիչ
- Գրատախտակներ (մեծ հրապարակը պետք է բավական լինի)
- Բազմաչափ և էլեկտրամատակարարում (անսարքությունների վերացում)
Քայլ 2: Սարքաշարի միացում
Ուղեցույցներ.
Նախագծի էլեկտրագծերը կարող են չափազանց խճճված լինել: Խնդրում ենք ժամանակ տրամադրել և ստուգել, որ բոլոր միացումները միաժամանակ մեկ անգամ ճիշտ են:
Նախագիծը ներառում է երկու LED էկրանների օգտագործումը, սակայն դրանք միավորված են և կազմում են մեկ մեծ էկրան: Դա կարելի է անել `բոլոր տողերը միևնույն կետին միացնելով: Քանի որ յուրաքանչյուր էկրան երկգույն է, մի էկրանի կարմիր և կանաչ տողերը պետք է կապված լինեն նաև մյուս էկրանի կարմիր և կանաչ տողերին: Դրանով մենք կարող ենք վերահսկել բոլոր տողերը միայն 8 կապում: Մնացած 16 կապում օգտագործվում են ցուցադրման սյուները վերահսկելու համար: Պահարանի համար նախատեսված 8 կապումներն ուղղակիորեն jumper մալուխների միջոցով կարող են միացվել pmod միակցիչներին: Pmod կապերը նախ անցնում են ULN2083A մուտքագրմանը, իսկ ULN2083A- ի ելքը միացված է անմիջապես էկրանի սյունակին: Քանի որ դիզայնը 8x8 է, որոշ սյուներ ֆիզիկապես միացված չեն լինի:
- JA: Տողի միացումներ. 1 տող JA: 1 տող 8 JA: 10:
- JA: Red Column կապեր.
- JC: Կանաչ սյունակի միացումներ
Խնդրում ենք անդրադառնալ տեղադրված պատկերներին `իմանալու համար, թե որ կապերն են որ տողերին/սյուներին համապատասխանում:
Նշում. Տրանզիստորները կառուցել են դիմադրողականություն, ուստի LED- ները չեն պահանջում լրացուցիչ դիմադրություն `դրանց հաջորդաբար միանալու համար:
Քայլ 3. Տեխնիկական բացատրություն. Էկրան
Էկրանը գործում է տեսողության կայունության վրա: Էկրանն այնքան արագ է թարմացվում, որ մարդու աչքը չի կարող տեսանելիորեն նկատել, որ որոշ LED- ներ արագորեն անջատվում և միանում են: Փաստորեն, դանդաղեցնելով ցուցադրման ժամացույցը, կարելի է նկատել առկայծումը:
Էկրանը միանում է բոլոր ութ տողերին `համաձայն այդ տողերի համար պահված տվյալների, և ցուցադրումը միանում է մեկ սյունակով: Այնուհետև այն արագորեն անցնում է ութ տողերի հաջորդ տվյալների մուտքագրմանը և միանում է հաջորդ սյունակին, մինչդեռ մնացած բոլոր սյունակները անջատված են: Այս գործընթացը շարունակվում է այնքան արագ ժամացույցի արագությամբ, որ LED- ի թարթումը դառնում է աննկատ:
Displayուցադրման համար տվյալների պահեստավորումը սկսվում է VHDL ֆայլում ճարտարապետությունից անմիջապես հետո հետևյալ կերպ.
ազդանշան RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 ներքև 0): = "00000000";
ազդանշան GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 դեպի 0): = "00000000"; - Տողի տվյալները ՝ կախված սյունակից ՝ Կանաչ
Ստորև բերված է գործընթացի մի փոքր հատված, որը վերահսկում է LED ցուցադրման մատրիցան:
- Գործընթաց, որը վերահսկում է լուսադիոդային ցուցադրման matrixdisplay. Գործընթացը (ColCLK) - 0 - 16 ՝ թարմացնելու և՛ 8X8 RED, և՛ 8x8 GREEn մատրիցային փոփոխական RowCount: ամբողջական միջակայք 0 -ից 16: = 0; սկսել եթե (բարձրանում_եզր (ColCLK)) ապա եթե (RowCount = 0) ապա DORow <= RedA; - Տողային տվյալներ համապատասխան սյունակի DOCol <= "1000000000000000"; - Column Trigger- Կրկնեք այս ծածկագիրը մինչև «0000000000000001»- Փոխեք RedB, RedC… GreenA, GreenB… GreenH
GreenH- ի վերջում, գործընթացի ավարտից անմիջապես առաջ, այս հատվածը ներառված է ՝ RowCount- ը զրոյականացնելու համար:
եթե (RowCount = 15) ապա - Վերագործարկեք թարմացումը A սյունակից RowCount: = 0; else RowCount: = RowCount + 1; - Անցնել սյունակների միջով, եթե;
Այժմ, բացատրելու համար այն ժամացույցը, որը ցուցադրման գործընթացի զգայունության ցուցակում է: Basys3 տախտակն ունի 100 ՄՀց հաճախականությամբ աշխատող ներքին ժամացույց: Մեր նպատակների համար սա շատ արագ է ժամացույցի համար, այնպես որ մենք պետք է բաժանենք այս ժամացույցը 960 Հց ժամացույցի ՝ օգտագործելով հետևյալ գործընթացը.
- 60ամացույցի գործընթաց, որն աշխատում է 960 Հց-ով CLKDivider: գործընթաց (CLK) փոփոխական clkcount: ամբողջական միջակայք 0-ից 52083: = 0; սկսել եթե (բարձրանալու_սահման (CLK)) ապա clkcount: = clkcount + 1; եթե (clkcount = 52083) ապա ColCLK <= ոչ (ColCLK); clkcount: = 0; ավարտ, եթե; ավարտ, եթե; ավարտի գործընթացը;
Քայլ 4. Տեխնիկական բացատրություն. Chanուցադրվող տեղեկատվության փոփոխություն
VHDL ծածկագրում այն տեղեկատվությունը կամ տվյալները, որոնք կցուցադրվեն էկրանին, վերահսկվում են կուրսորի գործընթացի միջոցով, որն իր զգայունության ցուցակում ունի այլ ժամացույց: Այս ծածկագիրը կոչվում էր BtnCLK, ժամացույց, որը նախատեսված էր կոճակները սեղմելիս նվազագույնի հասցնելու համար: Սա ներառված է այնպես, որ եթե կոճակը սեղմվի, վերին տողի կուրսորը շատ արագ չի շարժվում սյուների վրայով:
- Hամացույցի գործընթաց, որն աշխատում է 5 Հց-ով: ButtonCLK: գործընթաց (CLK) փոփոխական btnclkcount: ամբողջական միջակայք 0-ից 10000001: = 0; սկսեք եթե (բարձրացման_սահման (CLK)) ապա եթե (btnclkcount = 10000000) ապա btnclkcount: = 0; BtnCLK <= ոչ (BtnCLK); այլապես btnclkcount: = btnclkcount + 1; ավարտ, եթե; ավարտ, եթե; ավարտի գործընթացը;
Այս գործընթացի BtnCLK ազդանշանի ելքով մենք այժմ կարող ենք բացատրել կուրսորը: Կուրսորի գործընթացում միայն BtnCLK- ն ունի իր զգայունության ցանկում, սակայն կոդի բլոկում կոճակների վիճակը ստուգվում է, և դա կհանգեցնի RedA, RedB… GreenH- ի տվյալների փոփոխության: Ահա կուրսորի կոդի մի հատված, որը ներառում է վերակայման բլոկը և առաջին սյունակի բլոկը:
կուրսորը `գործընթացի (BtnCLK) փոփոխական OCursorCol: STD_LOGIC_VECTOR (2 դեպի 0): =" 000 "; - OCursorCol- ը հետևում է NCursorCol- ի նախորդ սյունակի փոփոխականին ՝ STD_LOGIC_VECTOR (2 դեպի 0) ՝ = "000"; -NCursorCol- ը սահմանում է նոր կուրսորի սյունակի սկիզբ --RESET պայման (UP կոճակ) RedB <= "00000000"; RedC <= "00000000"; RedD <= "00000000"; RedE <= "00000000"; RedF <= "00000000"; RedG <= "00000000"; RedH <= "00000000"; GreenA <= "00000000"; GreenB <= "00000000"; GreenC <= "00000000"; GreenD <= "00000000"; GreenE <= "00000000"; GreenF <= "00000000"; GreenG <= "00000000"; GreenH if (Lbtn = '1') ապա NCursorCol: = "111"; - Սյունակ H elsif (Rbtn = '1'), այնուհետև NCursorCol: = "001"; - B սյունակ elsif (Cbtn = '1') ապա NCursorCol: = OCursorCol; - Սյունակը մնում է նույնը NTurnState <= ոչ (TurnState); - Գործարկում է հաջորդ խաղացողի հերթը- Ստուգում է ընթացիկ սյունակը ներքևից վերև և միացնում առաջին LED- ը, որը միացված չէ: Գույնը կախված է ընթացիկ խաղացողի կուրսորի գույնից: ck- ի համար 7 downto 1 loop if (RedA (0) = '1') և [RedA (ck) = '0') և [GreenA (ck) = '0') ապա RedA (Ck) <= '1'; RedA (0) <= '0'; ԵԼՔ; ավարտ, եթե;
եթե (GreenA (0) = '1') և (RedA (ck) = '0') և (GreenA (ck) = '0') ապա
GreenA (Ck) <= '1'; GreenA (0) - Red Player GreenA (0) <= '0'; եթե (NCursorCol = OCursorCol) ապա - Եթե ոչինչ սեղմված չէր RedA (0) <= '1'; elsif (NCursorCol = "111") ապա - Եթե Lbtn սեղմված էր RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = "001") ապա - Iff Rbtn սեղմվեց RedB (0) <= '1'; RedA (0) - Green Player RedA (0) <= '0'; եթե (NCursorCol = OCursorCol) ապա GreenA (0) <= '1'; elsif (NCursorCol = "111") ապա GreenH (0) <= '1'; GreenA (0) <= '0'; elsif (NCursorCol = "001") ապա GreenB (0) <= '1'; GreenA (0) <= '0'; ավարտ, եթե; վերջնական գործ;
Ուշադրություն դարձրեք, առաջին դեպքի հայտարարությանը, որը կոչվում է. Displayուցադրման յուրաքանչյուր սյունակ դիտվում է որպես իր սեփական վիճակը FSM- ում: Կան 8 սյուներ, այնպես որ 3-բիթանոց երկուական համար է օգտագործվել յուրաքանչյուր սյունակ որպես վիճակ նույնականացնելու համար: Ինչպես է FSM- ն շարժվում վիճակի միջև ՝ կախված է սեղմված կոճակից: Վերևի հատվածում, եթե ձախ կոճակը սեղմվի, FSM- ը կտեղափոխվի «111», որը կլինի ցուցադրման վերջին սյունակը: Եթե աջ կոճակը սեղմվի, FSM- ը կտեղափոխվի «001», որը կլինի ցուցադրման երկրորդ սյունակը:
Եթե միջին կոճակը սեղմված է, FSM- ը ՉԻ տեղափոխվի նոր վիճակ, այլ փոխարենը կհանգեցնի TurnState ազդանշանի փոփոխության, որը մեկ բիթանոց ազդանշան է `նշելու, թե որ խաղացողի հերթն է: Բացի այդ, միջին կոճակը գործարկելու է ծածկագրերի բլոկ, որը ստուգում է, թե արդյոք ներքևում դատարկ տող կա մինչև վերև: Այն կփորձի ցուցիչ տեղադրել ամենացածր, չլրացված շարքում: Հիշեք, սա մի կապ չորս խաղ է:
Ներդրված դեպքի հայտարարության մեջ, որը կոչվում է ՝ TurnState, մենք փոխում ենք, թե որն է կուրսորի գույնը և առաջին տողի ո՞ր սյունակում ենք ուզում փոխել տվյալները, որպեսզի ցուցադրման գործընթացը կարողանա արտացոլել փոփոխությունը:
Մենք կրկնում ենք այս հիմնական ծածկագիրը մնացած յոթ դեպքերի համար: FSM դիագրամը կարող է օգտակար լինել հասկանալու համար, թե ինչպես են փոխվում նահանգները:
Քայլ 5: Կոդ
Սա Connect 4 -ի ֆունկցիոնալ կոդն է, որը կարող է կազմվել VHDL- ում `օգտագործելով Vivado Software- ը:
Նաև սահմանափակում է նախատեսված, որը թույլ կտա ձեզ սկսել խաղը գործարկել:
Մենք տրամադրեցինք բլոկ -դիագրամ, որը բացատրում է, թե ինչպես են յուրաքանչյուր գործընթացի մուտքերն ու ելքերը փոխկապակցված:
Խորհուրդ ենք տալիս:
Arduino Connect բազմաթիվ I2C սարքեր `6 քայլ
Arduino Connect Multiple I2C Սարքեր. Այս ձեռնարկում մենք կսովորենք, թե ինչպես միացնել մի քանի մոդուլ I2C միացումով arduino- ին: Դիտեք տեսանյութը: Մեր դեպքում մենք որպես օրինակ կօգտագործենք 4 OLED դիսփլեյ, բայց դուք կարող եք օգտագործել ցանկացած այլ I2C մոդուլներ/ ցանկության դեպքում տվիչներ: Նշում. 4 OLED ցուցադրում է համատեղ
Էլեկտրոնային խաղ Tic-Tac-Toe խաղ փայտե տուփի մեջ. 5 քայլ
Էլեկտրոնային խաղ Tic-Tac-Toe- ը փայտե տուփի մեջ
Aruduino LED խաղ Արագ կտտացնելով երկու խաղացողի խաղ. 8 քայլ
Aruduino LED խաղ Արագ սեղմում երկու խաղացողի խաղ. Այս նախագիծը ոգեշնչված է @HassonAlkeim- ից: Եթե պատրաստ եք խորը հայացք նետել, այստեղ կա մի հղում, որը կարող եք ստուգել https://www.instructables.com/id/Arduino-Two-Player-Fast-Button-Clicking-Game/: Այս խաղը Alkeim's- ի կատարելագործված տարբերակն է: Դա է
Հիմնական վայրկյանաչափ ՝ օգտագործելով VHDL և Basys3 տախտակ ՝ 9 քայլ
Հիմնական վայրկյանաչափ ՝ օգտագործելով VHDL և Basys3 տախտակ. Բարի գալուստ ուսանելի, թե ինչպես կառուցել վայրկյանաչափ ՝ օգտագործելով հիմնական VHDL և Basys 3 տախտակները: Մենք ուրախ ենք կիսվել մեր նախագծով ձեզ հետ: Սա վերջնական նախագիծ էր CPE 133 (Թվային ձևավորում) Cal Poly- ում, SLO 2016 թվականի աշնանը: projectրագիրը, որը մենք կառուցում ենք
Գլխավոր խաղ VHDL- ում ՝ 3 քայլ
Mastermind Game VHDL- ում. Մեր նախագծի համար մենք ստեղծեցինք “ Mastermind ” խաղ VHDL- ում խաղալու է Basys3 տախտակին: Mastermind- ը ծածկագիր կոտրող խաղ է, որն ավանդաբար խաղում են մեխերով և խաղատախտակով: Մեկ խաղացողը տեղադրում է բազմազան գույներ 4 շարքով անընդմեջ