Turinys:

„VHDL Basys3: Connect 4“žaidimas: 5 žingsniai
„VHDL Basys3: Connect 4“žaidimas: 5 žingsniai

Video: „VHDL Basys3: Connect 4“žaidimas: 5 žingsniai

Video: „VHDL Basys3: Connect 4“žaidimas: 5 žingsniai
Video: Getting started with Vivado and Basys3 2024, Lapkritis
Anonim
Žaidimas „VHDL Basys3: Connect 4“
Žaidimas „VHDL Basys3: Connect 4“

Įvadas:

Tai „Connect 4“skaitmeninis loginis žaidimas, sukurtas VHDL naudojant „Vivado“programinę įrangą ir užprogramuotas „Basys3“lentoje. Šio projekto konstrukcija ir dizainas yra tarpiniai, tačiau naujokai gali nukopijuoti veiksmus ir sukurti skaitmeninį žaidimą.

Žaidimas veikia kaip „Connect 4“žaidimas. Žaidėjai gali perkelti žymeklį per ekraną naudodami kairiajame ir dešiniajame lentoje esančius mygtukus. Paspaudus vidurinį lentos mygtuką, žaidėjas uždės žymeklį ant to stulpelio ir tada jis taps kito žaidėjo eilė. Kai žaidėjas laimi, žaidimą galima atkurti paspaudus lentos mygtuką aukštyn.

1 žingsnis: Greita informacija ir medžiagos

Greita techninė informacija:

  • Naudojami trys PMOD jungčių rinkiniai lentoje (JA, JB, JC)

    • 8 kaiščiai (išskyrus Vcc ir GND kaiščius), naudojami kiekvienai PMOD jungčiai
    • JA - Eilučių kontrolė
    • JB - žaliųjų stulpelių valdymas
    • JC - raudonų stulpelių valdymas
  • Ekrano laikrodis veikia 960 Hz dažniu

    Vienu metu dega tik 8 šviesos diodai. Ekranas atsinaujina pakankamai sparčiu laikrodžio greičiu, todėl atsiranda iliuzija, kad tam tikru metu dega daugiau nei 8 šviesos diodai

  • Mygtuko laikrodis veikia 5 Hz dažniu; Pasirinktinai galima sureguliuoti redaguojant VHDL kodą.
  • Vidinis Darlingtono masyvų pasipriešinimas yra pakankamas, kad būtų išvengta šviesos diodų perdegimo

Žaidimas sukurtas naudojant šiuos komponentus ir įrankius:

  • (1) „Basys3“lenta
  • (2) Dviejų spalvų LED matrica 8x5:
  • (2) ULN2803 - Darlingtono tranzistorių masyvai - duomenų lapas
  • Vielos ritės
  • Trumpieji laidai
  • Vielos nuėmiklis
  • Duonos lentos (turėtų užtekti didelės aikštės)
  • Multimetras ir maitinimo šaltinis (trikčių šalinimas)

2 žingsnis: Aparatūros prijungimas

Aparatūros prijungimas
Aparatūros prijungimas
Aparatūros prijungimas
Aparatūros prijungimas

Gairės:

Projekto laidai gali būti labai sudėtingi, neskubėkite ir patikrinkite, ar visos jungtys yra tinkamos vienu metu.

Projektas apima dviejų LED ekranų naudojimą, tačiau kartu jie sudaro vieną didelį ekraną. Tai galima padaryti prijungus visas eilutes prie to paties taško. Kadangi kiekvienas ekranas yra dviejų spalvų, vieno ekrano raudonos ir žalios eilutės taip pat turi būti susietos su raudona ir žalia kito ekrano eilutėmis. Tai darydami galime valdyti visas eilutes tik 8 kaiščiais. Kiti 16 kaiščių naudojami ekrano stulpeliams valdyti. 8 kaiščius galima tiesiogiai prijungti per jungiamąjį kabelį prie pmod jungčių. Pmod jungtys pirmiausia pereina prie ULN2083A įvesties, o ULN2083A išvestis yra tiesiogiai prijungta prie ekrano stulpelio. Kadangi dizainas yra 8x8, kai kurie stulpeliai nebus fiziškai prijungti.

  • JA: Eilutės jungtys: 1 eilutė į JA: 1 iki 8 eilutė JA: 10.
  • JA: Raudonos stulpelio jungtys:
  • JC: žaliosios kolonos jungtys

Žiūrėkite paskelbtus vaizdus, kad sužinotumėte, kurios smeigtukai atitinka eilutes/stulpelius.

Pastaba: tranzistoriai turi įmontuotą varžą, todėl šviesos diodams nereikalingas papildomas pasipriešinimas, kad būtų galima juos nuosekliai prijungti.

3 žingsnis: Techninis paaiškinimas: ekranas

Ekranas veikia dėl regėjimo patvarumo. Ekranas atnaujinamas taip greitai, kad žmogaus akis negali pastebimai pastebėti, kad kai kurie šviesos diodai greitai išjungiami ir įjungiami. Tiesą sakant, sulėtinus ekrano laikrodį, galima pastebėti mirksėjimą.

Ekranas įjungia visas aštuonias eilutes pagal tų eilučių saugomus duomenis, o ekranas įjungia vieną stulpelį. Tada jis greitai pereina prie kito aštuonių eilučių duomenų įvedimo ir įjungia kitą stulpelį - išjungdamas visus kitus stulpelius. Šis procesas tęsiasi pakankamai greitai, kad šviesos diodas mirgėtų.

Ekrano duomenų saugojimas inicijuojamas iškart po architektūros VHDL faile tokiu būdu:

signalas RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (nuo 7 iki 0): = "00000000";

signalas GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 iki 0): = "00000000"; - Eilutės duomenys, priklausomai nuo stulpelio: ŽALIA

Toliau pateikiamas nedidelis proceso, valdančio LED ekrano matricą, fragmentas.

- Procesas, kuris valdo LED ekrano matricos rodymą: procesas (ColCLK) - 0 - 16, kad būtų atnaujintas 8X8 RED ir 8x8 GREEn matricos kintamasis RowCount: sveikasis skaičius nuo 0 iki 16: = 0; pradėti, jei (kylančio krašto (ColCLK)), tada jei (RowCount = 0), tada DORow <= RedA; - atitinkamo stulpelio DOCol eilutės duomenys <= "1000000000000000"; - Stulpelio paleidiklis- pakartokite šį kodą iki „0000000000000001“- Pakeiskite į RedB, RedC… GreenA, GreenB… GreenH

„GreenH“pabaigoje, prieš pat proceso pabaigą, šis fragmentas yra įtrauktas, kad „RowCount“būtų grąžintas į nulį.

jei (RowCount = 15), tada - Iš naujo paleiskite atnaujinimą iš A stulpelio RowCount: = 0; else RowCount: = RowCount + 1; - pereikite prie stulpelių pabaigos, jei;

Dabar paaiškinkite laikrodį, kuris yra ekrano proceso jautrumo sąraše. „Basys3“plokštėje yra vidinis laikrodis, veikiantis 100 MHz dažniu. Mūsų tikslais tai yra per greitas laikrodis, todėl turėsime padalyti šį laikrodį į 960 Hz laikrodį, atlikdami šį procesą.

- Laikrodžio procesas, veikiantis 960 Hz dažniuCLKDivider: proceso (CLK) kintamasis clkcount: sveikasis skaičius nuo 0 iki 52083: = 0; pradėti, jei (kylančioji briauna (CLK)) tada clkcount: = clkcount + 1; jei (clkcount = 52083), tada ColCLK <= ne (ColCLK); clkcount: = 0; pabaiga, jei; pabaiga, jei; pabaigos procesas;

4 žingsnis: Techninis paaiškinimas: Rodomos informacijos keitimas

Techninis paaiškinimas: Rodomos informacijos keitimas
Techninis paaiškinimas: Rodomos informacijos keitimas

Naudojant VHDL kodą, informacija ar duomenys, kurie bus rodomi ekrane, valdomi žymeklio procesu, kurio jautrumo sąraše yra kitoks laikrodis. Šis kodas buvo vadinamas „BtnCLK“- laikrodžiu, skirtu sumažinti mygtukų pašalinimą, kai jie paspaudžiami. Tai įtraukta taip, kad jei paspaudžiamas mygtukas, žymeklis viršutinėje eilutėje nejuda labai greitai per stulpelius.

- Laikrodžio procesas, veikiantis 5 Hz dažniu. ButtonCLK: proceso (CLK) kintamasis btnclkcount: sveikasis skaičius nuo 0 iki 10000001: = 0; pradėti, jei (kylančioji briauna (CLK)), tada jei (btnclkcount = 10000000), tada btnclkcount: = 0; BtnCLK <= ne (BtnCLK); else btnclkcount: = btnclkcount + 1; pabaiga, jei; pabaiga, jei; pabaigos procesas;

Naudodami šio proceso BtnCLK signalo išvestį, dabar galime paaiškinti žymeklio procesą. Žymeklio proceso jautrumo sąraše yra tik „BtnCLK“, tačiau kodo bloke yra tikrinama mygtukų būsena ir dėl to pasikeis „RedA“, „RedB… GreenH“duomenys. Čia yra žymeklio kodo fragmentas, kuriame yra atstatymo blokas ir pirmojo stulpelio blokas.

žymeklis: proceso (BtnCLK) kintamasis OCursorCol: STD_LOGIC_VECTOR (2 iki 0): = "000"; - „OCursorCol“stebi ankstesnio stulpelio kintamąjį NCursorCol: STD_LOGIC_VECTOR (2 iki 0): = "000"; -„NCursorCol“nustato naujo žymeklio stulpelio pradžią-ATStatyti sąlygą (mygtukas AUKŠTYN)-lenta išvalyta, kad žaidimas būtų paleistas iš naujo, jei (kylančio krašto (BtnCLK)), tada jei (RST = '1'), tada RedA <= "00000000"; RaudonaB <= "00000000"; RaudonaC <= "00000000"; RaudonaD <= "00000000"; Raudona <= "00000000"; RaudonaF <= "00000000"; RaudonaG <= "00000000"; RaudonaH <= "00000000"; ŽaliaA <= "00000000"; ŽaliaB <= "00000000"; ŽaliaC <= "00000000"; ŽaliaD <= "00000000"; ŽaliaE <= "00000000"; ŽaliaF <= "00000000"; ŽaliaG <= "00000000"; ŽaliaH jei (Lbtn = '1'), tada NCursorCol: = "111"; - H stulpelis elsif (Rbtn = '1'), tada NCursorCol: = "001"; - B stulpelis elsif (Cbtn = '1'), tada NCursorCol: = OCursorCol; - Stulpelis lieka tas pats NTurnState <= ne (TurnState); - Suaktyvina kito žaidėjo eilę- tikrina esamą stulpelį iš apačios į viršų ir įjungia pirmąjį šviesos diodą, kuris neįsijungia. Spalva priklauso nuo dabartinio žaidėjo žymeklio spalvos. ck per 7 iki 1 kilpos, jei (RedA (0) = '1') ir (RedA (ck) = '0') ir (GreenA (ck) = '0'), tada RedA (Ck) <= '1'; RaudonaA (0) <= '0'; EXIT; pabaiga, jei;

jei (GreenA (0) = '1') ir (RedA (ck) = '0') ir (GreenA (ck) = '0'), tada

GreenA (Ck) <= '1'; GreenA (0) - raudonas žaidėjas GreenA (0) <= '0'; if (NCursorCol = OCursorCol) tada - Jei nieko nebuvo paspausta RedA (0) <= '1'; elsif (NCursorCol = "111") tada - Jei Lbtn buvo paspaustas RedH (0) <= '1'; RaudonaA (0) <= '0'; elsif (NCursorCol = "001") tada - Iff Rbtn buvo paspaustas RedB (0) <= '1'; RedA (0) - žalias žaidėjas RedA (0) <= '0'; jei (NCursorCol = OCursorCol), tada GreenA (0) <= '1'; elsif (NCursorCol = "111"), tada GreenH (0) <= '1'; ŽaliaA (0) <= '0'; elsif (NCursorCol = "001"), tada GreenB (0) <= '1'; ŽaliaA (0) <= '0'; pabaiga, jei; pabaigos atvejis;

Atminkite, kad pirmasis atvejo teiginys, vadinamas „OCursorCol“(reiškia „Senojo žymeklio stulpelis“), yra baigtinės būsenos mašinos pradžia. Kiekvienas ekrano stulpelis yra laikomas savo būsena MFV. Yra 8 stulpeliai, todėl 3 bitų dvejetainių skaičių rinkinys buvo naudojamas kiekvienam stulpeliui identifikuoti kaip būsenai. Kaip FMV juda tarp būsenų, priklauso nuo paspausto mygtuko. Aukščiau esančiame fragmente, paspaudus kairįjį mygtuką, FSM pereis prie „111“, kuris būtų paskutinis ekrano stulpelis. Paspaudus dešinįjį mygtuką, FSM pereis prie „001“, kuris būtų antrasis ekrano stulpelis.

Jei paspaudžiamas vidurinis mygtukas, FSM nepereis į naują būseną, o pakeis „TurnState“signalą, kuris yra vieno bitų signalas, skirtas atkreipti dėmesį į tai, koks žaidėjo eilė. Be to, vidurinis mygtukas paleis kodo bloką, kuris patikrins, ar apačioje iki viršaus yra tuščia eilutė. Jis bandys įdėti žymeklį į žemiausią, neužpildytą eilutę. Atminkite, kad tai yra „connect four“žaidimas.

Įdėtame atvejo sakinyje, pavadintame „TurnState“, mes keičiame, kokia yra žymeklio spalva ir kurio stulpelio pirmoje eilutėje norime pakeisti duomenis, kad rodymo procesas atspindėtų pakeitimą.

Šį pagrindinį kodą kartojame likusiems septyniems atvejams. FSM diagrama gali padėti suprasti, kaip keičiasi būsenos.

5 žingsnis: kodas

Kodas
Kodas

Tai funkcinis „Connect 4“kodas, kurį galima surinkti VHDL naudojant „Vivado“programinę įrangą.

Taip pat pateikiamas suvaržymas, leidžiantis pradėti žaidimą.

Mes pateikėme blokinę schemą, kurioje paaiškinama, kaip kiekvieno proceso įėjimai ir išėjimai yra tarpusavyje susiję.

Rekomenduojamas: