Sadržaj:

VHDL Basys3: Povežite 4 igre: 5 koraka
VHDL Basys3: Povežite 4 igre: 5 koraka

Video: VHDL Basys3: Povežite 4 igre: 5 koraka

Video: VHDL Basys3: Povežite 4 igre: 5 koraka
Video: VHDL code of 4 bit DOWN counter | FPGA #shortsvideo #youtubeshorts #maker #fpga #vhdl #shorts 2024, Studeni
Anonim
VHDL Basys3: Povežite 4 igru
VHDL Basys3: Povežite 4 igru

Uvod:

Ovo je Connect 4 digitalna logička igra dizajnirana u VHDL -u pomoću softvera Vivado i programirana na Basys3 ploči. Konstrukcija i dizajn ovog projekta su srednji, ali pridošlice mogu kopirati korake i izgraditi digitalnu igru.

Igra funkcionira poput igre Connect 4. Igrači mogu pomicati kursor po ekranu pomoću lijevog i desnog gumba na ploči. Pritiskom na srednju tipku na ploči igrač će postaviti svoj marker na taj stupac i tada će doći na red sljedeći igrač. Nakon što igrač pobijedi, igra se može resetirati pritiskom na tipku gore na ploči.

Korak 1: Brzi detalji i materijali

Brzi tehnički detalji:

  • Koristi tri seta PMOD veza na ploči (JA, JB, JC)

    • 8 pinova (isključujući Vcc i GND pinove) koji se koriste za svaki PMOD priključak
    • JA - Kontrola redova
    • JB - Kontrola zelenih stupaca
    • JC - Kontrola crvenih stupaca
  • Sat ekrana radi na 960Hz

    Samo 8 LED dioda je uključeno u određenom trenutku. Zaslon se osvježava dovoljno velikom brzinom takta da se stvara iluzija da je u određenom trenutku uključeno više od 8 LED dioda

  • Tipkalo radi na 5Hz; Izborno se može kazniti i prilagoditi uređivanjem VHDL koda.
  • Unutarnji otpor Darlingtonovih nizova dovoljan je za sprječavanje izgaranja LED dioda

Igra je izgrađena pomoću sljedećih komponenti i alata:

  • (1) Odbor Basys3
  • (2) LED matrica dvobojna 8x5:
  • (2) ULN2803 - Darlingtonski tranzistorski nizovi - Tehnički list
  • Špule od žice
  • Žice za kratkospojnike
  • Skidač žice
  • Oglasne ploče (veliki kvadrat trebao bi biti dovoljan)
  • Multimetar i napajanje (rješavanje problema)

Korak 2: Povezivanje hardvera

Povezivanje hardvera
Povezivanje hardvera
Povezivanje hardvera
Povezivanje hardvera

Smjernice:

Ožičenje projekta može biti izuzetno zamršeno, odvojite vrijeme i provjerite jesu li sve veze ispravne, jedna po jedna.

Projekt uključuje korištenje dva LED zaslona, ali su kombinirani u jedan veliki zaslon. To se može postići povezivanjem svih redaka na istu točku. Budući da je svaki zaslon dvobojan, crveni i zeleni redovi jednog zaslona također moraju biti povezani s crvenim i zelenim redovima drugog zaslona. Na taj način možemo kontrolirati sve retke sa samo 8 pinova. Ostalih 16 pinova koristi se za upravljanje stupcima prikaza. 8 pinova za utičnicu mogu se spojiti izravno preko kratkospojnih kabela na pmod konektore. Pmod veze prvo idu na ulaz ULN2083A, a izlaz ULN2083A je spojen izravno na stupac na ekranu. Budući da je dizajn 8x8, neki stupci fizički neće biti povezani.

  • JA: Redne veze: Red 1 do JA: 1 do Red 8 za JA: 10.
  • JA: Veze crvenog stupca:
  • JC: Priključci zelenog stupca

Pogledajte objavljene slike da biste saznali koje iglice odgovaraju kojim redovima/stupcima.

Napomena: Tranzistori imaju ugrađene otpore, pa LED diode ne zahtijevaju dodatni otpor za njihovo serijsko spajanje.

Korak 3: Tehničko objašnjenje: Zaslon

Zaslon radi na postojanosti vida. Zaslon se osvježava tako brzo da ljudsko oko ne može vidljivo otkriti da se neke LED diode brzo isključuju i pale. Zapravo, usporavanjem sata na zaslonu može se primijetiti treptanje.

Zaslon uključuje svih osam redaka prema podacima pohranjenim za te retke, a zaslon uključuje jedan stupac. Zatim brzo prelazi na sljedeći unos podataka za osam redaka i uključuje sljedeći stupac - dok su svi ostali stupci isključeni. Ovaj proces nastavlja se dovoljno velikom brzinom takta da treperenje LED -a postaje neprimjetno.

Pohrana podataka za prikaz pokreće se odmah nakon arhitekture u VHDL datoteci na sljedeći način:

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

signal GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 downto 0): = "00000000"; - Podaci o retku ovisno o stupcu: ZELENO

Slijedi mali isječak procesa koji kontrolira matricu LED zaslona.

- Postupak koji kontrolira matrični prikaz LED zaslona: proces (ColCLK) - 0 - 16 za osvježavanje 8X8 CRVENE i 8x8 GREEn matrične varijable RowCount: cijeli broj raspona 0 do 16: = 0; start if (rise_edge (ColCLK)) then if ((RowCount = 0) then DORow <= RedA; - Podaci o redu za odgovarajući stupac DOCol <= "100000000000000000"; - Okidač stupca- Ponovite ovaj kôd sve do "0000000000000001"- Promijenite u RedB, RedC … GreenA, GreenB … GreenH

Na kraju GreenH -a, neposredno prije završetka procesa, ovaj isječak je uključen kako bi se RowCount vratio na nulu.

if (RowCount = 15) then - Ponovno pokrenite osvježavanje iz stupca A RowCount: = 0; else RowCount: = RowCount + 1; - Pomicanje kroz kraj stupaca ako;

Sada, da objasnim sat koji se nalazi na popisu osjetljivosti procesa prikaza. Basys3 ploča ima unutarnji sat koji radi na 100MHz. Za naše potrebe, ovo je prebrz sat, pa ćemo morati podijeliti ovaj sat na 960Hz koristeći sljedeći postupak.

- Proces takta radi na 960HzCLKDivider: varijabla procesa (CLK) clkcount: cjelobrojni raspon 0 do 52083: = 0; započeti if (rastući_rub (CLK)) tada clkcount: = clkcount + 1; if (clkcount = 52083) tada ColCLK <= nije (ColCLK); clkcount: = 0; završi ako; završi ako; završetak procesa;

Korak 4: Tehničko objašnjenje: Promjena prikazanih informacija

Tehničko objašnjenje: Promjena prikazanih informacija
Tehničko objašnjenje: Promjena prikazanih informacija

U VHDL kodu, informacije ili podaci koji će se prikazati na zaslonu kontroliraju se kursorom koji ima drugačiji sat na popisu osjetljivosti. Ovaj kôd se zvao BtnCLK, sat dizajniran da smanji otklanjanje gumba pri njihovom pritisku. To je uključeno tako da se, ako se pritisne gumb, pokazivač u gornjem retku ne kreće jako brzo po stupcima.

- Sat proces radi na 5 Hz. ButtonCLK: varijabla procesa (CLK) btnclkcount: cijeli broj raspona 0 do 10000001: = 0; start if (rise_edge (CLK)) then if (btnclkcount = 10000000) then btnclkcount: = 0; BtnCLK <= nije (BtnCLK); else btnclkcount: = btnclkcount + 1; završi ako; završi ako; završetak procesa;

S izlaznim signalom BtnCLK ovog procesa, sada možemo objasniti proces kursora. Pokazivač ima samo BtnCLK na popisu osjetljivosti, ali u bloku koda provjerava se stanje gumba i to će uzrokovati promjenu podataka za RedA, RedB … GreenH. Ovdje je isječak koda kursora, koji uključuje blok za poništavanje i blok za prvi stupac.

pokazivač: varijabla procesa (BtnCLK) OCursorCol: STD_LOGIC_VECTOR (2 do 0): = "000"; - OCursorCol prati prethodnu varijablu stupca NCursorCol: STD_LOGIC_VECTOR (2 prema dolje 0): = "000"; -NCursorCol postavlja novi stupac kursora start --RESET uvjet (tipka GORE)-Tabla se briše za ponovno pokretanje igre ako (rise_edge (BtnCLK)) onda if (RST = '1') onda RedA <= "00000000"; 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') tada NCursorCol: = "111"; - stupac H elsif (Rbtn = '1') zatim NCursorCol: = "001"; - Stupac B elsif (Cbtn = '1') zatim NCursorCol: = OCursorCol; - Stupac ostaje isti NTurnState <= not (TurnState); - Pokreće sljedeći red igrača- Provjerava trenutni stupac odozdo prema gore i uključuje prvu LED lampicu koja nije uključena. Boja ovisi o boji kursora trenutnog igrača. za ck u 7 downto 1 petlji ako je (RedA (0) = '1') i (RedA (ck) = '0') i (GreenA (ck) = '0') tada je RedA (Ck) <= '1'; CrvenaA (0) <= '0'; IZLAZ; završi ako;

ako je (GreenA (0) = '1') i (RedA (ck) = '0') i (GreenA (ck) = '0') tada

GreenA (Ck) <= '1'; GreenA (0) - Crveni igrač GreenA (0) <= '0'; if (NCursorCol = OCursorCol) then - Ako ništa nije pritisnuto RedA (0) <= '1'; elsif (NCursorCol = "111") tada - Ako je Lbtn pritisnut RedH (0) <= '1'; CrvenaA (0) <= '0'; elsif (NCursorCol = "001") zatim - ako je pritisnut Rbtn RedB (0) <= '1'; RedA (0) - Zeleni igrač RedA (0) <= '0'; if (NCursorCol = OCursorCol) tada je GreenA (0) <= '1'; elsif (NCursorCol = "111") zatim GreenH (0) <= '1'; GreenA (0) <= '0'; elsif (NCursorCol = "001") zatim GreenB (0) <= '1'; GreenA (0) <= '0'; završi ako; završni slučaj;

Imajte na umu da je prva izjava slučaja pod nazivom: OCursorCol (što znači stupac starog kursora) početak konačnog stroja stanja. Svaki stupac zaslona tretira se kao vlastito stanje u FSM -u. Postoji 8 stupaca pa je 3-bitni skup binarnih brojeva korišten za identifikaciju svakog stupca kao stanja. Način na koji se FSM kreće između stanja ovisi o pritisnutom gumbu. U gornjem isječku, ako se pritisne lijevi gumb, FSM će se pomaknuti na "111" što bi bio zadnji stupac prikaza. Ako se pritisne desna tipka, FSM će se pomaknuti na "001" što bi bio drugi stupac zaslona.

Ako se pritisne srednja tipka, FSM se NEĆE pomaknuti u novo stanje, već će umjesto toga pokrenuti promjenu signala TurnState, što je jednobitni signal kojim se bilježi koji je red igrača na redu. Dodatno, srednji gumb pokrenut će blok koda koji provjerava postoji li prazan redak pri samom dnu sve do vrha. Pokušat će postaviti marker u najniži, nepopunjeni red. Upamtite, ovo je igra povezivanja četiri.

U ugniježđenom iskazu slučaja pod nazivom: TurnState mijenjamo boju pokazivača i za koji stupac u prvom retku želimo promijeniti podatke kako bi proces prikaza mogao odražavati promjenu.

Ponavljamo ovaj osnovni kôd za preostalih sedam slučajeva. FSM dijagram može biti od pomoći pri razumijevanju kako se stanja mijenjaju.

Korak 5: Kodirajte

Kodirati
Kodirati

Ovo je funkcionalni kod za Connect 4 koji se može sastaviti u VHDL -u pomoću softvera Vivado.

Ograničenje je također omogućeno kako biste mogli pokrenuti igru.

Pružili smo blok dijagram koji objašnjava kako su ulazi i izlazi svakog procesa međusobno povezani.

Preporučeni: