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

VHDL Basys3: Connect 4 Խաղ ՝ 5 քայլ
VHDL Basys3: Connect 4 Խաղ ՝ 5 քայլ

Video: VHDL Basys3: Connect 4 Խաղ ՝ 5 քայլ

Video: VHDL Basys3: Connect 4 Խաղ ՝ 5 քայլ
Video: 4.FPGA FOR BEGINNERS- Combining logic gates in VHDL (DIGILENT Basys3) 2024, Նոյեմբեր
Anonim
VHDL Basys3: Connect 4 խաղ
VHDL Basys3: Connect 4 խաղ

Ներածություն:

Սա 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- ը:

Նաև սահմանափակում է նախատեսված, որը թույլ կտա ձեզ սկսել խաղը գործարկել:

Մենք տրամադրեցինք բլոկ -դիագրամ, որը բացատրում է, թե ինչպես են յուրաքանչյուր գործընթացի մուտքերն ու ելքերը փոխկապակցված:

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