Sisällysluettelo:

VHDL Basys3: Connect 4 Peli: 5 vaihetta
VHDL Basys3: Connect 4 Peli: 5 vaihetta

Video: VHDL Basys3: Connect 4 Peli: 5 vaihetta

Video: VHDL Basys3: Connect 4 Peli: 5 vaihetta
Video: Концепции синхронизации и синхронизации FPGA объясняются просто для новичков с использованием двух аналогий! 2024, Marraskuu
Anonim
VHDL Basys3: Yhdistä 4 -peli
VHDL Basys3: Yhdistä 4 -peli

Johdanto:

Tämä on Connect 4 Digital Logic Game, joka on suunniteltu VHDL: ssä Vivado -ohjelmiston avulla ja ohjelmoitu Basys3 Boardille. Tämän projektin rakenne ja suunnittelu ovat välituotteita, mutta uudet tulokkaat voivat kopioida vaiheet ja rakentaa digitaalisen pelin.

Peli toimii kuten Connect 4 -peli. Pelaajat voivat siirtää kohdistinta ruudulla käyttämällä taululla olevia vasenta ja oikeaa painiketta. Taulun keskipainikkeen painaminen saa pelaajan asettamaan merkin kyseiselle sarakkeelle ja siitä tulee seuraavan pelaajan vuoro. Kun pelaaja voittaa, peli voidaan nollata painamalla taululla olevaa ylös -painiketta.

Vaihe 1: Nopeat tiedot ja materiaalit

Nopeat tekniset tiedot:

  • Hyödyntää kolmea kortin PMOD -liitäntää (JA, JB, JC)

    • 8 nastaa (pois lukien Vcc- ja GND -nastat), joita käytetään jokaiseen PMOD -liittimeen
    • JA - Rivien hallinta
    • JB - Vihreiden sarakkeiden hallinta
    • JC - punaisten sarakkeiden hallinta
  • Näytön kello toimii 960 Hz: n taajuudella

    Vain 8 LEDiä palaa kerrallaan. Näyttö päivittyy riittävän nopealla kellonopeudella, jotta voidaan kuvitella, että yli 8 LEDiä palaa tiettynä aikana

  • Näppäinkello toimii 5 Hz: llä; Valinnaisesti voidaan hienosäätää muokkaamalla VHDL -koodia.
  • Darlington Arraysin sisäinen vastus riittää estämään LED-valojen palamisen

Peli on rakennettu seuraavien komponenttien ja työkalujen avulla:

  • (1) Basys3 Board
  • (2) LED-matriisi kaksivärinen 8x5:
  • (2) ULN2803 - Darlingtonin transistorijärjestelmät - tietolomake
  • Lankakelat
  • Hyppyjohdot
  • Johtosuojus
  • Leipälaudat (suuren neliön pitäisi riittää)
  • Yleismittari ja virtalähde (vianmääritys)

Vaihe 2: Laitteiston liittäminen

Laitteiston liittäminen
Laitteiston liittäminen
Laitteiston liittäminen
Laitteiston liittäminen

Ohjeet:

Projektin johdotus voi olla erittäin sekavaa, ota aikaa ja tarkista, että kaikki liitännät ovat oikein kerrallaan.

Projektissa käytetään kahta LED -näyttöä, mutta ne yhdistetään yhdeksi suureksi näytöksi. Tämä voidaan tehdä yhdistämällä kaikki rivit samaan pisteeseen. Koska jokainen näyttö on kaksivärinen, yhden näytön punainen ja vihreä rivi on myös sidottava toisen näytön punaiseen ja vihreään riviin. Näin voimme hallita kaikkia rivejä vain 8 nastaa. Muita 16 nastaa käytetään näytön sarakkeiden ohjaamiseen. Purkin 8 nastaa voidaan liittää suoraan hyppyjohtojen kautta pmod -liittimiin. Pmod -yhteydet menevät ensin ULN2083A: n tuloon ja ULN2083A: n lähtö on kytketty suoraan näytön sarakkeeseen. Koska malli on 8x8, jotkin sarakkeet eivät ole fyysisesti yhteydessä.

  • JA: Riviliitännät: Rivi 1 - JA: 1 - rivi 8 JA: 10: lle.
  • JA: Red Column -yhteydet:
  • JC: Vihreän pylvään liitännät

Katso lähetetyistä kuvista, mitkä nastat vastaavat mitäkin rivejä/sarakkeita.

Huomautus: Transistoreissa on sisäänrakennetut vastukset, joten LEDit eivät vaadi lisävastusta sarjaan kytkemiseen.

Vaihe 3: Tekninen selitys: Näyttö

Näyttö toimii näkökyvyn mukaan. Näyttö virkistyy niin nopeasti, että ihmissilmä ei voi havaita näkyvästi, että jotkin LED -valot sammuvat nopeasti ja syttyvät. Itse asiassa hidastamalla näytön kelloa voidaan huomata vilkkuminen.

Näyttö kytkee päälle kaikki kahdeksan riviä kyseisille riveille tallennettujen tietojen mukaan, ja näyttöön tulee yksi sarake. Sitten se siirtyy nopeasti seuraavaan kahdeksan rivin tietojen syöttöön ja kytkee seuraavan sarakkeen päälle - samalla kun kaikki muut sarakkeet poistetaan käytöstä. Tämä prosessi jatkuu riittävän nopealla kellonopeudella, jotta LED -valon välkkyminen tulee huomaamatta.

Näytön tietojen tallennus alustetaan heti arkkitehtuurin jälkeen VHDL -tiedostossa seuraavasti:

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

signaali GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 downto 0): = "00000000"; - Rivitiedot sarakkeesta riippuen: VIHREÄ

Seuraava pieni katkelma LED -näyttömatriisia ohjaavasta prosessista.

- Prosessi, joka ohjaa LED -näytön matriisinäyttöä: prosessi (ColCLK) - 0-16 päivittää sekä 8X8 RED- että 8x8 GREEn -matriisimuuttujan RowCount: kokonaislukualue 0-16: = 0; aloita jos (nouseva reuna (ColCLK)) sitten jos (RowCount = 0) sitten DORow <= RedA; - Rivitiedot vastaavalle sarakkeelle DOCol <= "1000000000000000"; - Sarakkeen liipaisin- Toista tämä koodi aina "0000000000000001"- Vaihda RedB, RedC… GreenA, GreenB… GreenH

GreenH: n lopussa, juuri ennen prosessin päättymistä, tämä katkelma sisältyy RowCountin nollaamiseen.

jos (RowCount = 15) niin - Käynnistä päivitys uudelleen sarakkeesta A RowCount: = 0; else RowCount: = RowCount + 1; - Vaihda sarakkeiden läpi, jos;

Selitä nyt kello, joka on näyttöprosessin herkkyysluettelossa. Basys3 -kortissa on sisäinen kello, joka toimii 100 MHz: n taajuudella. Tämä on liian nopea kello, joten meidän on jaettava tämä kello 960 Hz: n kelloon käyttämällä seuraavaa prosessia.

- Kelloprosessi, joka toimii 960 Hz: lläCLKDivider: prosessi (CLK) muuttuja clkcount: kokonaislukualue 0-52083: = 0; aloita jos (nouseva reuna (CLK)) sitten clkcount: = clkcount + 1; jos (clkcount = 52083), niin ColCLK <= ei (ColCLK); clkcount: = 0; loppu Jos; loppu Jos; lopeta prosessi;

Vaihe 4: Tekninen selitys: Näytettyjen tietojen muuttaminen

Tekninen selitys: Näytettyjen tietojen muuttaminen
Tekninen selitys: Näytettyjen tietojen muuttaminen

VHDL -koodissa ruudulle näytettäviä tietoja ohjataan kohdistinprosessilla, jonka herkkyysluettelossa on eri kello. Tätä koodia kutsuttiin BtnCLK -kelloksi, joka on suunniteltu minimoimaan painikkeiden poistaminen, kun niitä painetaan. Tämä sisältyy niin, että jos painiketta painetaan, ylärivin kohdistin ei liiku kovin nopeasti sarakkeiden poikki.

- Kelloprosessi, joka toimii 5 Hz: llä. ButtonCLK: prosessi (CLK) muuttuja btnclkcount: kokonaislukualue 0- 10000001: = 0; aloita jos (nouseva reuna (CLK)) sitten jos (btnclkcount = 10000000) sitten btnclkcount: = 0; BtnCLK <= ei (BtnCLK); else btnclkcount: = btnclkcount + 1; loppu Jos; loppu Jos; lopeta prosessi;

Tämän prosessin BtnCLK -signaalilähdön avulla voimme nyt selittää kohdistinprosessin. Kohdistinprosessin herkkyysluettelossa on vain BtnCLK, mutta koodilohkossa painikkeiden tila tarkistetaan ja RedA-, RedB… GreenH -tiedot muuttuvat. Tässä on katkelma kohdistinkoodista, joka sisältää nollauslohkon ja ensimmäisen sarakkeen lohkon.

kohdistin: prosessi (BtnCLK) muuttuja OCursorCol: STD_LOGIC_VECTOR (2 alas 0): = "000"; - OCursorCol seuraa edellisen sarakkeen muuttujaa NCursorCol: STD_LOGIC_VECTOR (2- 0): = "000"; -NCursorCol asettaa uuden kohdistinsarakkeen alkuun-PALAUTA ehto (YLÖS-painike)-Taulu tyhjennetään, jotta peli voidaan käynnistää uudelleen, jos (nouseva reuna (BtnCLK)) sitten jos (RST = '1') sitten RedA <= "00000000"; PunainenB <= "00000000"; PunainenC <= "00000000"; PunainenD <= "00000000"; Punainen <= "00000000"; PunainenF <= "00000000"; PunainenG <= "00000000"; Punainen H <= "00000000"; VihreäA <= "00000000"; VihreäB <= "00000000"; VihreäC <= "00000000"; VihreäD <= "00000000"; VihreäE <= "00000000"; VihreäF <= "00000000"; Vihreä G <= "00000000"; VihreäH jos (Lbtn = '1') sitten NCursorCol: = "111"; - Sarake H elsif (Rbtn = '1') ja sitten NCursorCol: = "001"; - Sarake B elsif (Cbtn = '1') ja sitten NCursorCol: = OCursorCol; - Sarake pysyy samana NTurnState <= ei (TurnState); - Käynnistää seuraavan pelaajan vuoron- Tarkistaa nykyisen sarakkeen alhaalta ylös ja sytyttää ensimmäisen merkkivalon, joka ei pala. Väri riippuu pelaajan kohdistimen väristä. ck 7: stä 1 silmukkaan, jos (RedA (0) = '1') ja (RedA (ck) = '0') ja (GreenA (ck) = '0') sitten RedA (Ck) <= '1'; Punainen (0) <= '0'; EXIT; loppu Jos;

jos (GreenA (0) = '1') ja (RedA (ck) = '0') ja (GreenA (ck) = '0') niin

VihreäA (Ck) <= '1'; GreenA (0) - Punainen pelaaja GreenA (0) <= '0'; jos (NCursorCol = OCursorCol) niin - Jos mitään ei painettu RedA (0) <= '1'; elsif (NCursorCol = "111") sitten - Jos Lbtn painettiin PunainenH (0) <= '1'; Punainen (0) <= '0'; elsif (NCursorCol = "001") sitten - Iff Rbtn painettiin RedB (0) <= '1'; RedA (0) - Vihreä pelaaja RedA (0) <= '0'; jos (NCursorCol = OCursorCol), niin GreenA (0) <= '1'; elsif (NCursorCol = "111") sitten GreenH (0) <= '1'; VihreäA (0) <= '0'; elsif (NCursorCol = "001") sitten GreenB (0) <= '1'; VihreäA (0) <= '0'; loppu Jos; päätykotelo;

Huomaa, että ensimmäinen tapauslausuma nimeltä: OCursorCol (joka tarkoittaa vanhaa kursorisaraketta) on äärellisen tilan koneen alku. Näytön jokaista saraketta käsitellään omassa tilassaan Mikronesiassa. Sarakkeita on 8, joten 3-bittistä binäärilukujoukkoa käytettiin jokaisen sarakkeen tunnistamiseen tilana. Se, miten FSM liikkuu tilojen välillä, riippuu painetusta painikkeesta. Jos yllä olevassa katkelmassa vasenta painiketta painetaan, FSM siirtyy kohtaan "111", joka olisi näytön viimeinen sarake. Jos oikeaa painiketta painetaan, FSM siirtyy kohtaan "001", joka on näytön toinen sarake.

Jos keskipainiketta painetaan, FSM EI siirry uuteen tilaan, vaan laukaisee sen sijaan muutoksen TurnState-signaaliin, joka on yhden bitin signaali, jonka avulla voidaan huomata, minkä pelaajan vuoro on. Lisäksi keskimmäinen painike suorittaa koodilohkon, joka tarkistaa, onko alareunassa tyhjä rivi aina yläreunaan asti. Se yrittää sijoittaa merkin alimmalle täyttämättömälle riville. Muista, että tämä on connect four -peli.

Sisäkkäisessä tapauslausunnossa nimeltä: TurnState, muutamme kohdistimen väriä ja mitä ensimmäisen rivin saraketta haluamme muuttaa, jotta näyttöprosessi voi heijastaa muutosta.

Toistamme tämän peruskoodin jäljellä oleville seitsemälle tapaukselle. FSM -kaavio voi auttaa ymmärtämään, miten tilat muuttuvat.

Vaihe 5: Koodi

Koodi
Koodi

Tämä on Connect 4: n toiminnallinen koodi, joka voidaan koota VHDL -muotoon Vivado -ohjelmiston avulla.

Pelissä on myös rajoituksia, joiden avulla voit käynnistää pelin.

Annoimme lohkokaavion, joka selittää kuinka kunkin prosessin tulot ja lähdöt on kytketty toisiinsa.

Suositeltava: