Satura rādītājs:

VHDL Basys3: Connect 4 Spēle: 5 soļi
VHDL Basys3: Connect 4 Spēle: 5 soļi

Video: VHDL Basys3: Connect 4 Spēle: 5 soļi

Video: VHDL Basys3: Connect 4 Spēle: 5 soļi
Video: NLUUG 2021 NJ Conference: Rudi van Drunen -- What are FPGAs anyway 2024, Novembris
Anonim
Spēle VHDL Basys3: Connect 4
Spēle VHDL Basys3: Connect 4

Ievads:

Šī ir Connect 4 digitālā loģikas spēle, kas izstrādāta VHDL, izmantojot programmatūru Vivado un ieprogrammēta Basys3 panelī. Šī projekta uzbūve un dizains ir starpposma, bet jaunpienācēji var kopēt soļus un veidot digitālo spēli.

Spēle darbojas tāpat kā Connect 4 spēle. Spēlētāji var pārvietot kursoru pa ekrānu, izmantojot kreiso un labo pogu, kas atrodas uz tāfeles. Nospiežot vidējo pogu uz tāfeles, spēlētājs novieto marķieri uz šīs kolonnas, un tad tā būs nākamā spēlētāja kārta. Kad spēlētājs uzvar, spēli var atiestatīt, nospiežot uz tāfeles augšup esošo pogu.

1. darbība: ātra informācija un materiāli

Ātra tehniskā informācija:

  • Plātnē tiek izmantoti trīs PMOD savienojumu komplekti (JA, JB, JC)

    • 8 tapas (izņemot Vcc un GND tapas), ko izmanto katram PMOD savienotājam
    • JA - Rindu kontrole
    • JB - zaļo kolonnu kontrole
    • JC - sarkano kolonnu kontrole
  • Ekrāna pulkstenis darbojas 960 Hz frekvencē

    Vienā reizē iedegas tikai 8 gaismas diodes. Ekrāns tiek atsvaidzināts ar pietiekami ātru pulksteņa ātrumu, lai radītu ilūziju, ka noteiktā laikā iedegas vairāk nekā 8 gaismas diodes

  • Pogas pulkstenis darbojas pie 5 Hz; Pēc izvēles to var noregulēt, rediģējot VHDL kodu.
  • Dārlingtonas masīvu iekšējā pretestība ir pietiekama, lai novērstu LED izdegšanu

Spēle ir veidota, izmantojot šādus komponentus un rīkus:

  • (1) Basys3 padome
  • (2) LED matrica divkrāsu 8x5:
  • (2) ULN2803 - Dārlingtonas tranzistoru masīvi - datu lapa
  • Stiepļu spoles
  • Jumper vadi
  • Stiepļu noņēmējs
  • Maizes dēļi (pietiek ar lielu laukumu)
  • Multimetrs un barošanas avots (problēmu novēršana)

2. darbība. Aparatūras pievienošana

Aparatūras savienošana
Aparatūras savienošana
Aparatūras savienošana
Aparatūras savienošana

Vadlīnijas:

Projekta elektroinstalācija var būt ļoti sarežģīta, lūdzu, veltiet laiku un pārbaudiet, vai visi savienojumi ir pareizi pa vienam.

Projekts ietver divu LED ekrānu izmantošanu, bet tos apvieno, veidojot vienu lielu ekrānu. To var izdarīt, savienojot visas rindas ar vienu punktu. Tā kā katrs ekrāns ir divkrāsains, viena ekrāna sarkanās un zaļās rindas ir arī jāpiesaista otra ekrāna sarkanajām un zaļajām rindām. To darot, mēs varam kontrolēt visas rindas tikai ar 8 tapām. Pārējās 16 tapas tiek izmantotas, lai kontrolētu displeja kolonnas. 8 tapas kārbai var savienot tieši, izmantojot savienojuma kabeļus, ar pmod savienotājiem. Pmod savienojumi vispirms tiek ievadīti ULN2083A ievadē, un ULN2083A izeja ir savienota tieši ar ekrāna kolonnu. Tā kā dizains ir 8x8, dažas kolonnas fiziski netiks savienotas.

  • JA: rindu savienojumi: 1. rinda līdz JA: 1 līdz 8. rinda JA: 10.
  • JA: Sarkanās kolonnas savienojumi:
  • JC: Zaļās kolonnas savienojumi

Lūdzu, skatiet publicētos attēlus, lai uzzinātu, kuras tapas atbilst kādām rindām/kolonnām.

Piezīme. Tranzistoriem ir iebūvētas pretestības, tāpēc gaismas diodēm nav nepieciešama papildu pretestība, lai tās sērijveidā savienotu.

3. darbība. Tehniskais skaidrojums: ekrāns

Ekrāns darbojas ar redzes noturību. Ekrāns tiek atsvaidzināts tik ātri, ka cilvēka acs nevar pamanīt, ka dažas gaismas diodes tiek ātri izslēgtas un ieslēgtas. Patiesībā, palēninot displeja pulksteni, var pamanīt mirgošanu.

Displejs ieslēdz visas astoņas rindas atbilstoši šīm rindām saglabātajiem datiem, un displejs ieslēdz vienu kolonnu. Pēc tam tas ātri pāriet uz nākamo astoņu rindu datu ievadi un ieslēdz nākamo kolonnu, vienlaikus izslēdzot visas pārējās kolonnas. Šis process turpinās ar pietiekami ātru pulksteņa ātrumu, lai gaismas diodes mirgošana kļūtu nepamanāma.

Displeja datu glabāšana tiek inicializēta tūlīt pēc arhitektūras VHDL failā šādā veidā:

signāls RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 līdz 0): = "00000000";

signāls GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 līdz 0): = "00000000"; - Rindas dati atkarībā no kolonnas: ZAĻA

Tālāk neliels fragments no procesa, kas kontrolē LED displeja matricu.

- Process, kas kontrolē LED displeja matricas displeju: process (ColCLK) - 0 - 16, lai atsvaidzinātu gan 8X8 RED, gan 8x8 GREEn matricas mainīgo RowCount: veselu skaitļu diapazons no 0 līdz 16: = 0; sākt, ja (pieaugošā mala (ColCLK)), tad, ja (RowCount = 0), tad DORow <= RedA; - Rindas dati attiecīgajai slejai DOCol <= "1000000000000000"; - Kolonnas aktivizētājs- Atkārtojiet šo kodu līdz “0000000000000001”- Mainiet uz RedB, RedC… GreenA, GreenB… GreenH

GreenH beigās, tieši pirms procesa beigām, šis fragments ir iekļauts, lai atiestatītu RowCount uz nulli.

ja (RowCount = 15), tad - Restartējiet atsvaidzināšanu no kolonnas A RowCount: = 0; cits RowCount: = RowCount + 1; - pārslēgties pa kolonnām beidzas, ja;

Tagad, lai izskaidrotu pulksteni, kas ir displeja procesa jutīguma sarakstā. Plātnei Basys3 ir iekšējais pulkstenis, kas darbojas 100 MHz. Mūsu nolūkos tas ir pārāk ātrs pulkstenis, tāpēc mums būs jāsadala šis pulkstenis līdz 960 Hz pulkstenim, izmantojot šādu procesu.

- Pulksteņa process, kas darbojas pie 960 HzCLKDivider: process (CLK) mainīgais clkcount: veselu skaitļu diapazons no 0 līdz 52083: = 0; sākt, ja (pieaugošā mala (CLK)), tad clkcount: = clkcount + 1; ja (clkcount = 52083), tad ColCLK <= nav (ColCLK); clkcount: = 0; beigt, ja; beigt, ja; beigu process;

4. darbība. Tehniskais skaidrojums: parādītās informācijas maiņa

Tehniskais skaidrojums: Parādītās informācijas maiņa
Tehniskais skaidrojums: Parādītās informācijas maiņa

VHDL kodā informāciju vai datus, kas tiks parādīti ekrānā, kontrolē kursora process, kura jutīguma sarakstā ir atšķirīgs pulkstenis. Šo kodu sauca par BtnCLK - pulksteni, kas paredzēts, lai samazinātu pogu atkausēšanu, kad tās tiek nospiestas. Tas ir iekļauts, lai, nospiežot pogu, kursors augšējā rindā nepārvietotos ļoti ātri pa kolonnām.

- Pulksteņa process darbojas pie 5 Hz. ButtonCLK: process (CLK) mainīgais btnclkcount: veselu skaitļu diapazons no 0 līdz 10000001: = 0; sākt, ja (pieaugošā mala (CLK)), tad ja (btnclkcount = 10000000), tad btnclkcount: = 0; BtnCLK <= nav (BtnCLK); cits btnclkcount: = btnclkcount + 1; beigt, ja; beigt, ja; beigu process;

Izmantojot šī procesa BtnCLK signāla izvadi, mēs tagad varam izskaidrot kursora procesu. Kursora procesa jutīguma sarakstā ir tikai BtnCLK, bet koda blokā tiek pārbaudīts pogu stāvoklis, un tāpēc RedA, RedB… GreenH dati mainīsies. Šeit ir kursora koda fragments, kas ietver atiestatīšanas bloku un pirmās kolonnas bloku.

kursors: process (BtnCLK) mainīgais OCursorCol: STD_LOGIC_VECTOR (2 līdz 0): = "000"; - OCursorCol izseko iepriekšējās kolonnas mainīgo NCursorCol: STD_LOGIC_VECTOR (2 līdz 0): = "000"; -NCursorCol nosaka jaunu kursora kolonnas sākumu-ATiestatīt nosacījumu (poga UP)-Padome ir notīrīta, lai spēle varētu atsākties, ja (pieaugošā mala (BtnCLK)), tad, ja (RST = '1'), tad RedA <= "00000000"; SarkansB <= "00000000"; SarkansC <= "00000000"; SarkansD <= "00000000"; Sarkans <= "00000000"; SarkansF <= "00000000"; SarkansG <= "00000000"; SarkansH <= "00000000"; GreenA <= "00000000"; ZaļšB <= "00000000"; GreenC <= "00000000"; ZaļšD <= "00000000"; Zaļš <= "00000000"; ZaļšF <= "00000000"; GreenG <= "00000000"; GreenH ja (Lbtn = '1'), tad NCursorCol: = "111"; - H sleja elsif (Rbtn = '1'), tad NCursorCol: = "001"; - B sleja elsif (Cbtn = '1'), tad NCursorCol: = OCursorCol; - Kolonna paliek nemainīga NTurnState <= nav (TurnState); - Aktivizē nākamā spēlētāja gājienu- Pārbauda pašreizējo kolonnu no apakšas uz augšu un ieslēdz pirmo gaismas diodi, kas nedeg. Krāsa ir atkarīga no pašreizējā spēlētāja kursora krāsas. ck 7 līdz 1 cilpai, ja (RedA (0) = '1') un (RedA (ck) = '0') un (GreenA (ck) = '0'), tad RedA (Ck) <= '1'; SarkansA (0) <= '0'; IZEJA; beigt, ja;

ja (GreenA (0) = '1') un (RedA (ck) = '0') un (GreenA (ck) = '0'), tad

GreenA (Ck) <= '1'; GreenA (0) - sarkanais spēlētājs GreenA (0) <= '0'; ja (NCursorCol = OCursorCol) tad - Ja nekas netika nospiests RedA (0) <= '1'; elsif (NCursorCol = "111") tad - Ja Lbtn tika nospiests RedH (0) <= '1'; SarkansA (0) <= '0'; elsif (NCursorCol = "001") tad - Iff Rbtn tika nospiests RedB (0) <= '1'; RedA (0) - Green Player RedA (0) <= '0'; ja (NCursorCol = OCursorCol), tad GreenA (0) <= '1'; elsif (NCursorCol = "111"), tad GreenH (0) <= '1'; GreenA (0) <= '0'; elsif (NCursorCol = "001"), tad GreenB (0) <= '1'; GreenA (0) <= '0'; beigt, ja; beigu korpuss;

Ņemiet vērā, ka pirmais gadījuma paziņojums ar nosaukumu: OCursorCol (kas apzīmē veco kursoru kolonnu) ir galīgā stāvokļa mašīnas sākums. Katra displeja kolonna MFV tiek uzskatīta par savu stāvokli. Ir 8 kolonnas, tāpēc, lai identificētu katru kolonnu kā stāvokli, tika izmantota 3 bitu bināro skaitļu kopa. Tas, kā MFV pārvietojas starp stāvokļiem, ir atkarīgs no nospiestās pogas. Iepriekš redzamajā fragmentā, nospiežot kreiso pogu, MFV pāriet uz "111", kas būtu displeja pēdējā kolonna. Ja tiek nospiesta labā poga, MFV pāriet uz "001", kas būtu displeja otrā kolonna.

Ja tiek nospiesta vidējā poga, MFV NAV pāriet jaunā stāvoklī, bet tā vietā izraisīs TurnState signāla izmaiņas, kas ir viena bita signāls, lai atzīmētu, kura spēlētāja kārta ir. Turklāt vidējā poga darbinās koda bloku, kas pārbauda, vai pašā apakšā līdz augšai ir tukša rinda. Tas mēģinās ievietot marķieri zemākajā, neaizpildītajā rindā. Atcerieties, ka šī ir spēle četri.

Ligzdotajā gadījuma paziņojumā ar nosaukumu: TurnState, mēs mainām kursora krāsu un pirmās slejas kolonnu, kurā vēlamies mainīt datus, lai displeja process varētu atspoguļot izmaiņas.

Mēs atkārtojam šo pamatkodu atlikušajiem septiņiem gadījumiem. MFV diagramma var būt noderīga, lai saprastu, kā mainās stāvokļi.

5. darbība: kods

Kods
Kods

Šis ir Connect 4 funkcionālais kods, ko var apkopot VHDL, izmantojot programmatūru Vivado.

Tiek nodrošināts arī ierobežojums, lai ļautu jums sākt spēli.

Mēs sniedzām blokshēmu, kurā paskaidrots, kā katra procesa ieejas un izejas ir savstarpēji saistītas.

Ieteicams: