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, Novembar
Anonim
VHDL Basys3: Povežite 4 igre
VHDL Basys3: Povežite 4 igre

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 koristeći lijevo i desno dugme na ploči. Pritiskom na srednje dugme na tabli igrač će postaviti svoj marker na tu kolonu 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 konektor
    • JA - Kontrola redova
    • JB - Kontrola zelenih kolona
    • JC - Kontrola crvenih kolona
  • Sat ekrana radi na 960Hz

    Samo 8 LED dioda je uključeno u određenom trenutku. Ekran 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

  • Dugmad rade na 5Hz; Opcionalno se može novčano kazniti ako se uredi VHDL kôd.
  • Unutrašnji otpor Darlington Arrays je dovoljan da spriječi izgaranje LED dioda

Igra je konstruirana pomoću sljedećih komponenti i alata:

  • (1) Basys3 ploča
  • (2) LED matrica dvobojna 8x5:
  • (2) ULN2803 - Darlingtonski tranzistorski nizovi - Tehnički list
  • Špule od žice
  • Džemper žice
  • Skidač žice
  • Oglasne ploče (veliki kvadrat bi trebao 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 ekrana, ali su kombinirani u jedan veliki ekran. To se može postići povezivanjem svih redova na istu točku. Budući da je svaki ekran dvobojan, crveni i zeleni redovi na jednom ekranu takođe moraju biti vezani za crvene i zelene redove drugog ekrana. Na taj način možemo kontrolirati sve redove sa samo 8 pinova. Ostalih 16 pinova koristi se za kontrolu stupaca 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 direktno na stupac na ekranu. Budući da je dizajn 8x8, neke kolone fizički neće biti povezane.

  • JA: Redne veze: Red 1 do JA: 1 do Red 8 za JA: 10.
  • JA: Veze sa crvenim stupom:
  • JC: Veze sa zelenom kolonom

Pogledajte objavljene slike da biste saznali koji pinovi odgovaraju kojim redovima/kolonama.

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

Korak 3: Tehničko objašnjenje: Zaslon

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

Ekran uključuje svih osam redova prema podacima pohranjenim za te redove, a zaslon uključuje jednu kolonu. Zatim brzo prelazi na sljedeći unos podataka za osam redova i uključuje sljedeću kolonu - dok su sve ostale kolone isključene. Ovaj proces nastavlja se dovoljno velikom brzinom takta da treperenje LED -a postaje neprimjetno.

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

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

signal GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 dole 0): = "00000000"; - Podaci o redu u zavisnosti od kolone: ZELENI

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

- Proces koji kontrolira matrični prikaz LED zaslona: proces (ColCLK) - 0 - 16 za osvježavanje 8X8 RED i 8x8 GREEn matrične varijable RowCount: cijeli broj raspona 0 do 16: = 0; započeti if (rastući_rub (ColCLK)) tada if (RowCount = 0) tada DORow <= RedA; - Podaci o redu za odgovarajuću kolonu DOCol <= "100000000000000000"; - Okidač kolone- Ponovite ovaj kod 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 kolone A RowCount: = 0; else RowCount: = RowCount + 1; - Pomak kroz kraj stupaca ako;

Sada, da objasnim sat koji se nalazi na listi osjetljivosti procesa prikaza. Basys3 ploča ima interni 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čnite if (rastući_rub (CLK)) tada clkcount: = clkcount + 1; if (clkcount = 52083) onda je ColCLK <= not (ColCLK); clkcount: = 0; end if; end if; završni proces;

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 biti prikazani na ekranu kontroliraju se kursorom, koji ima drugačiji sat u svojoj listi osjetljivosti. Ovaj kôd se zvao BtnCLK, sat dizajniran da smanji otklanjanje dugmadi kada se pritisnu. Ovo je uključeno tako da se, ako se pritisne dugme, kursor u gornjem redu ne kreće vrlo brzo po kolonama.

- Proces takta radi na 5 Hz. ButtonCLK: procesna (CLK) varijabla btnclkcount: cijeli broj od 0 do 10000001: = 0; start if (rise_edge (CLK)) then if (btnclkcount = 10000000) then btnclkcount: = 0; BtnCLK <= nije (BtnCLK); else btnclkcount: = btnclkcount + 1; end if; end if; završni proces;

Sa izlaznim signalom BtnCLK ovog procesa, sada možemo objasniti proces kursora. Proces kursora ima samo BtnCLK na svojoj listi osjetljivosti, ali u kodnom bloku se provjerava stanje gumba i to će uzrokovati promjenu podataka za RedA, RedB … GreenH. Evo isječka koda kursora, koji uključuje reset blok i blok za prvu kolonu.

pokazivač: proces (BtnCLK) varijabla 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)-Daska je izbrisana za ponovno pokretanje igre ako (rastući_rub (BtnCLK)) tada ako (RST = '1') onda je 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') onda NCursorCol: = "111"; - Kolona H elsif (Rbtn = '1') zatim NCursorCol: = "001"; - Kolona B elsif (Cbtn = '1') zatim NCursorCol: = OCursorCol; - Kolona ostaje ista NTurnState <= not (TurnState); - Pokreće red sljedećeg igrača- Provjerava trenutnu kolonu odozdo prema gore i uključuje prvu LED lampicu koja nije uključena. Boja zavisi od boje 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'; RedA (0) <= '0'; IZLAZ; end if;

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 pritisnut Lbtn RedH (0) <= '1'; RedA (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'; end if; završni slučaj;

Primjetite, prvi izraz slučaja pod nazivom: OCursorCol (što znači stupac starog kursora) početak je stroja konačnih stanja. Svaka kolona ekrana se u FSM -u tretira kao svoje stanje. Postoji 8 stupaca pa je 3-bitni skup binarnih brojeva korišten za identifikaciju svake kolone kao stanja. Način na koji se FSM kreće između stanja ovisi o pritisnutom gumbu. U gornjem isječku, ako se pritisne lijevo dugme, FSM će se pomaknuti na "111" što bi bila posljednja kolona prikaza. Ako se pritisne desno dugme, FSM će se pomaknuti na "001" što bi bila druga kolona prikaza.

Ako se pritisne srednje dugme, FSM se NEĆE prebaciti u novo stanje, već će umjesto toga pokrenuti promjenu signala TurnState, koji je jednobitni signal da se zabilježi koji je red igrača na redu. Dodatno, srednje dugme će pokrenuti kodni blok koji provjerava postoji li prazan red pri samom dnu sve do vrha. Pokušat će postaviti marker u najniži, nepopunjeni red. Zapamtite, ovo je igra povezivanja četiri.

U ugniježđenom iskazu slučaja pod nazivom: TurnState, mijenjamo boju kursora i za koji stupac u prvom redu ž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

Kod
Kod

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čuje se: