Sisukord:

VHDL Basys3: Connect 4 Mäng: 5 sammu
VHDL Basys3: Connect 4 Mäng: 5 sammu

Video: VHDL Basys3: Connect 4 Mäng: 5 sammu

Video: VHDL Basys3: Connect 4 Mäng: 5 sammu
Video: AMD Xilinx Arty A7, Artix 7 FPGA Evaluation Board - Getting Started 2024, November
Anonim
VHDL Basys3: ühendage 4 mäng
VHDL Basys3: ühendage 4 mäng

Sissejuhatus:

See on Connect 4 digitaalne loogikamäng, mis on loodud VHDL -is, kasutades tarkvara Vivado ja programmeeritud Basys3 -tahvlile. Selle projekti ülesehitus ja disain on vahepealsed, kuid uustulnukad saavad samme kopeerida ja digitaalse mängu üles ehitada.

Mäng toimib nagu Connect 4 mäng. Mängijad saavad kursorit üle ekraani liigutada, kasutades tahvlilt leitud vasakut ja paremat nuppu. Laua keskmise nupu vajutamine paneb mängija oma märgi sellele veerule ja siis saab järgmise mängija kord. Kui mängija võidab, saab mängu lähtestada, vajutades tahvli ülesnuppu.

Samm: Kiired üksikasjad ja materjalid

Kiired tehnilised üksikasjad:

  • Kasutab tahvlil kolme komplekti PMOD -ühendusi (JA, JB, JC)

    • 8 tihvti (välja arvatud Vcc ja GND tihvtid), mida kasutatakse iga PMOD -pistiku jaoks
    • JA - ridade kontroll
    • JB - roheliste veergude juhtimine
    • JC - punaste veergude juhtimine
  • Ekraani kell töötab sagedusel 960 Hz

    Korraga põleb ainult 8 LED -i. Ekraan värskendatakse piisavalt kiirel taktsagedusel, et tekiks illusioon, et antud ajal põleb rohkem kui 8 LED -i

  • Nupukell töötab sagedusel 5 Hz; Soovi korral saab seda trahvida VHDL -koodi redigeerimisega.
  • Darlingtoni masside sisemine takistus on LED-i läbipõlemise vältimiseks piisav

Mäng on üles ehitatud järgmiste komponentide ja tööriistade abil:

  • (1) Basys3 juhatus
  • (2) LED-maatriks kahevärviline 8x5:
  • (2) ULN2803 - Darlingtoni transistorimassiivid - andmeleht
  • Traadi poolid
  • Jumper juhtmed
  • Traadi eemaldaja
  • Leivalauad (suurest ruudust peaks piisama)
  • Multimeeter ja toiteallikas (tõrkeotsing)

Samm: riistvara ühendamine

Riistvara ühendamine
Riistvara ühendamine
Riistvara ühendamine
Riistvara ühendamine

Juhised:

Projekti juhtmestik võib olla äärmiselt keerukas, võtke aega ja kontrollige, kas kõik ühendused on ükshaaval õiged.

Projekt hõlmab kahe LED -ekraani kasutamist, kuid need moodustavad ühe suure ekraani. Seda saab teha, ühendades kõik read sama punktiga. Kuna iga ekraan on kahevärviline, tuleb ühe ekraani punane ja roheline rida siduda ka teise ekraani punase ja rohelise reaga. Seda tehes saame kontrollida kõiki ridu ainult 8 tihvtiga. Ülejäänud 16 tihvti kasutatakse ekraani veergude juhtimiseks. Kaheksa tihvti saab ühendada otse hüppajakaablite kaudu pmod -pistikutega. Pmod -ühendused lähevad kõigepealt ULN2083A sisendisse ja ULN2083A väljund on ühendatud otse ekraanil oleva veeruga. Kuna disain on 8x8, ei ole mõned veerud füüsiliselt ühendatud.

  • JA: ridaühendused: rida 1 kuni JA: 1 kuni rida 8 JA: 10 jaoks.
  • JA: punase veeru ühendused:
  • JC: roheliste veergude ühendused

Palun vaadake postitatud pilte, et teada saada, millised tihvtid vastavad ridadele/veergudele.

Märkus: transistoridel on sisseehitatud takistused, seega ei vaja LED -id nendega järjestikku ühendamiseks täiendavat takistust.

3. samm: tehniline selgitus: ekraan

Ekraan töötab nägemise püsivuse järgi. Ekraan värskendab nii kiiresti, et inimsilm ei suuda nähtavalt tuvastada, et mõned valgusdioodid lülitatakse kiiresti välja ja sisse. Tegelikult võib ekraanikella aeglustades märgata vilkumist.

Ekraan lülitab sisse kõik kaheksa rida vastavalt nende ridade jaoks salvestatud andmetele ja ekraan lülitab sisse ühe veeru. Seejärel läheb see kiiresti üle järgmisele kaheksa rea andmesisestusele ja lülitab järgmise veeru sisse - samal ajal kui kõik muud veerud on välja lülitatud. See protsess jätkub piisavalt kiirel taktsagedusel, et LED -i vilkumine muutub märkamatuks.

Ekraani andmete salvestamine lähtestatakse kohe pärast arhitektuuri VHDL -failis järgmisel viisil.

signaal RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 kuni 0): = "00000000";

signaal GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 kuni 0): = "00000000"; - Rida andmed sõltuvalt veerust: ROHELINE

Järgnev väike katkend LED -ekraanimaatriksit juhtivast protsessist.

- Protsess, mis juhib LED -ekraani maatriksi kuva: protsess (ColCLK) - 0 - 16, et värskendada nii 8X8 RED kui ka 8x8 GREEn maatriksi muutujat RowCount: täisarvude vahemik 0 kuni 16: = 0; alusta kui (tõusev serv (ColCLK)), siis kui (RowCount = 0), siis DORow <= RedA; - rea andmed vastava veeru DOCol <= "1000000000000000" kohta; - Veeru käivitaja- korrake seda koodi lõpuni "0000000000000001"- Muutke RedB, RedC… GreenA, GreenB… GreenH

GreenH lõpus, vahetult enne protsessi lõppu, lisatakse see jupp RowCount'i nullimiseks.

kui (RowCount = 15), siis - taaskäivitage värskendus veerust A RowCount: = 0; else RowCount: = RowCount + 1; - Tõsta veerud läbi, kui;

Nüüd selgitame kella, mis on kuvamisprotsessi tundlikkuse loendis. Basys3 plaadil on sisemine kell, mis töötab sagedusel 100 MHz. Meie jaoks on see liiga kiire kell, nii et peame selle kella jagama 960 Hz kellaks, kasutades järgmist protsessi.

- Kellaprotsess töötab sagedusel 960 Hz. CLKDivider: protsessi (CLK) muutuja clkcount: täisarvude vahemik 0 kuni 52083: = 0; alusta kui (tõusev serv (CLK)), siis clkcount: = clkcount + 1; kui (clkcount = 52083), siis ColCLK <= ei (ColCLK); clkcount: = 0; lõpetada, kui; lõpetada, kui; protsessi lõpetamine;

4. samm: tehniline selgitus: kuvatava teabe muutmine

Tehniline selgitus: kuvatava teabe muutmine
Tehniline selgitus: kuvatava teabe muutmine

VHDL -koodis juhib ekraanile kuvatavat teavet või andmeid kursoriprotsess, mille tundlikkuse loendis on erinev kell. Seda koodi nimetati BtnCLK -ks, kellaks, mille eesmärk on minimeerida nuppude eemaldamist nende vajutamisel. See on lisatud nii, et kui nuppu vajutada, ei liigu ülemise rea kursor väga kiiresti veergude vahel.

- Kellaprotsess töötab sagedusel 5 Hz. NuppCLK: protsessi (CLK) muutuja btnclkcount: täisarvude vahemik 0 kuni 10000001: = 0; start if (tõusev serv (CLK)), siis kui (btnclkcount = 10000000), siis btnclkcount: = 0; BtnCLK <= ei (BtnCLK); else btnclkcount: = btnclkcount + 1; lõpetada, kui; lõpetada, kui; protsessi lõpetamine;

Selle protsessi BtnCLK signaali väljundiga saame nüüd kursoriprotsessi selgitada. Kursoriprotsessi tundlikkuse loendis on ainult BtnCLK, kuid koodiplokis kontrollitakse nuppude olekut ja see muudab RedA, RedB … GreenH andmed. Siin on kursori koodilõik, mis sisaldab lähtestamise plokki ja esimese veeru plokki.

kursor: protsess (BtnCLK) muutuja OCursorCol: STD_LOGIC_VECTOR (2 kuni 0): = "000"; - OCursorCol jälgib eelmise veeru muutujat NCursorCol: STD_LOGIC_VECTOR (2 kuni 0): = "000"; -NCursorCol määrab uue kursori veeru alguse-RESET tingimus (ülesnupp)-tahvel tühjendatakse mängu taaskäivitamiseks, kui (tõusev serv (BtnCLK)), siis kui (RST = '1'), siis RedA <= "00000000"; PunaneB <= "00000000"; PunaneC <= "00000000"; PunaneD <= "00000000"; Punane <= "00000000"; PunaneF <= "00000000"; PunaneG <= "00000000"; Punane H <= "00000000"; RohelineA <= "00000000"; RohelineB <= "00000000"; RohelineC <= "00000000"; RohelineD <= "00000000"; RohelineE <= "00000000"; RohelineF <= "00000000"; RohelineG <= "00000000"; GreenH kui (Lbtn = '1'), siis NCursorCol: = "111"; - veerg H elsif (Rbtn = '1'), seejärel NCursorCol: = "001"; - veerg B elsif (Cbtn = '1'), seejärel NCursorCol: = OCursorCol; - Veerg jääb samaks NTurnState <= ei (TurnState); - Käivitab järgmise mängija käigu- kontrollib praegust veergu alt üles ja lülitab sisse esimese LED-i, mis ei põle. Värv sõltub praeguse mängija kursori värvist. ck jaoks 7 kuni 1 silmus, kui (RedA (0) = '1') ja (RedA (ck) = '0') ja (GreenA (ck) = '0'), siis RedA (Ck) <= '1'; Punane A (0) <= '0'; EXIT; lõpetada, kui;

kui (GreenA (0) = '1') ja (RedA (ck) = '0') ja (GreenA (ck) = '0') siis

GreenA (Ck) <= '1'; GreenA (0) - punane mängija GreenA (0) <= '0'; if (NCursorCol = OCursorCol) siis - Kui midagi ei vajutatud RedA (0) <= '1'; elsif (NCursorCol = "111") siis - Kui Lbtn vajutati RedH (0) <= '1'; Punane A (0) <= '0'; elsif (NCursorCol = "001") siis - Iff Rbtn vajutati RedB (0) <= '1'; RedA (0) - roheline mängija RedA (0) <= '0'; kui (NCursorCol = OCursorCol), siis GreenA (0) <= '1'; elsif (NCursorCol = "111"), siis GreenH (0) <= '1'; RohelineA (0) <= '0'; elsif (NCursorCol = "001"), siis GreenB (0) <= '1'; RohelineA (0) <= '0'; lõpetada, kui; lõppjuhtum;

Pange tähele, esimene juhtumilause nimega: OCursorCol (mis tähistab vana kursori veergu) on lõpliku oleku masina algus. Iga kuvari veergu käsitletakse Mikroneesia Liiduriikides oma olekuna. Seal on 8 veergu, nii et iga veeru oleku tuvastamiseks kasutati 3-bitist binaararvude komplekti. See, kuidas FSM olekute vahel liigub, sõltub vajutatud nupust. Kui ülaltoodud katkendis vasakpoolset nuppu vajutatakse, liigub Mikroneesia Liit „111“, mis oleks ekraani viimane veerg. Kui vajutate paremat nuppu, liigub FSM "001", mis oleks ekraani teine veerg.

Kui vajutada keskmist nuppu, EI liigu FSM uude olekusse, vaid käivitab selle asemel TurnState signaali muutuse, mis on ühe bitine signaal, et märkida, millise mängija kord see on. Lisaks käivitab keskmine nupp koodiploki, mis kontrollib, kas allosas on tühi rida kuni ülaosani. See proovib paigutada tähise madalaimale täitmata reale. Pidage meeles, et see on Connect Four mäng.

Pesastatud juhtumilauses nimega TurnState muudame kursori värvi ja esimese veeru veeru, mille andmeid me muuta tahame, et kuvamisprotsess kajastaks muudatust.

Kordame seda põhikoodi ülejäänud seitsmel juhul. Mikroneesia skeem võib aidata mõista olekute muutumist.

Samm: kood

Kood
Kood

See on Connect 4 funktsionaalne kood, mille saab Vivado tarkvara abil VHDL -is kompileerida.

Samuti on ette nähtud piirang, mis võimaldab teil mängu käivitada.

Esitasime plokkskeemi, mis selgitab, kuidas iga protsessi sisendid ja väljundid on omavahel ühendatud.

Soovitan: