INHOUDSOPGAWE:

VHDL Basys3: Verbind 4 speletjies: 5 stappe
VHDL Basys3: Verbind 4 speletjies: 5 stappe

Video: VHDL Basys3: Verbind 4 speletjies: 5 stappe

Video: VHDL Basys3: Verbind 4 speletjies: 5 stappe
Video: NLUUG 2021 NJ Conference: Rudi van Drunen -- What are FPGAs anyway 2024, November
Anonim
VHDL Basys3: Connect 4 Game
VHDL Basys3: Connect 4 Game

Inleiding:

Dit is 'n Connect 4 Digital Logic Game ontwerp in VHDL met behulp van die Vivado -sagteware en geprogrammeer op die Basys3 Board. Die konstruksie en ontwerp van hierdie projek is intermediêr, maar nuwelinge kan die stappe kopieer en die digitale spel bou.

Die spel werk soos die Connect 4 -spel. Spelers kan hul wyser oor die skerm beweeg met die linker- en regterknoppies op die bord. Deur op die middelste knoppie op die bord te druk, sal die speler sy merker op die kolom plaas, en dan word dit die volgende speler se beurt. Sodra 'n speler wen, kan die spel herstel word deur op die op -knoppie op die bord te druk.

Stap 1: Vinnige besonderhede en materiaal

Vinnige tegniese besonderhede:

  • Gebruik drie stelle PMOD -verbindings op die bord (JA, JB, JC)

    • 8 penne (uitgesluit Vcc en GND -penne) wat vir elke PMOD -aansluiting gebruik word
    • JA - Beheer van rye
    • JB - Beheer van groen kolomme
    • JC - Beheer van rooi kolomme
  • Die skermklok werk op 960Hz

    Slegs 8 LED's brand op 'n gegewe tydstip. Skerm verfris vinnig genoeg om die illusie te gee dat meer as 8 LED's op 'n gegewe tydstip aan is

  • Knoppiehorlosie werk op 5Hz; U kan ook 'n boete opgelê word deur die VHDL -kode te wysig.
  • Die interne weerstand van Darlington Arrays is voldoende om LED-uitbranding te voorkom

Die spel is saamgestel met behulp van die volgende komponente en gereedskap:

  • (1) Basys3 -raad
  • (2) LED Matrix Bi-color 8x5:
  • (2) ULN2803 - Darlington Transistor Arrays - Gegevensblad
  • Spools of Wire
  • Jumper Wires
  • Draadstropper
  • Broodborde (groot vierkant behoort genoeg te wees)
  • Multimeter en kragtoevoer (probleemoplossing)

Stap 2: Koppel die hardeware aan

Koppel die hardeware
Koppel die hardeware
Koppel die hardeware
Koppel die hardeware

Riglyne:

Die bedrading van die projek kan baie ingewikkeld wees. Neem u tyd en verifieer dat al die verbindings een stel op 'n slag korrek is.

Die projek behels die gebruik van twee LED -skerms, maar word saamgevoeg om een groot skerm te vorm. Dit kan bereik word deur al die rye aan dieselfde punt te koppel. Omdat elke skerm tweekleurig is, moet die rooi en groen rye van die een skerm ook aan die rooi en groen rye van die ander skerm vasgemaak word. Deur dit te doen, kan ons al die rye met slegs 8 penne beheer. Die ander 16 penne word gebruik om die vertoonkolomme te beheer. Die 8 penne vir die kan direk via springkabels aan die pmod -verbindings gekoppel word. Pmod -verbindings gaan eers na die invoer van die ULN2083A en die uitset van die ULN2083A word direk aan die kolom op die skerm gekoppel. Omdat die ontwerp 'n 8x8 is, sal sommige kolomme fisies nie verbind word nie.

  • JA: Ryverbindings: Ry 1 tot JA: 1 na Ry 8 vir JA: 10.
  • JA: Rooi kolom verbindings:
  • JC: Groenskolomverbindings

Verwys na die prentjies wat geplaas is om te weet watter penne ooreenstem met watter rye/kolomme.

Opmerking: die transistors het ingeboude weerstande, sodat die LED's nie ekstra weerstand benodig om in serie daaraan gekoppel te word nie.

Stap 3: Tegniese verduideliking: skerm

Die skerm werk voortdurend op sig. Die skerm verfris so vinnig dat die menslike oog nie sigbaar kan agterkom dat sommige LED's vinnig aan- en uitskakel nie. Deur die vertoningsklok te vertraag, kan u die flits sien.

Die skerm skakel al agt rye aan volgens die data wat vir die rye gestoor is, en die skerm vertoon een kolom. Dan gaan dit vinnig oor na die volgende data -invoer vir die agt rye en skakel die volgende kolom aan - terwyl alle ander kolomme af is. Hierdie proses gaan voort met 'n vinnig genoeg kloksnelheid sodat die flikkering van die LED ongemerk word.

Die stoor van data vir die skerm word onmiddellik na argitektuur in die VHDL -lêer geïnisialiseer op die volgende manier:

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

sein GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 downto 0): = "00000000"; - Rydata afhangende van kolom: GROEN

Die volgende 'n klein greep uit die proses wat die LED -skermmatriks beheer.

- Proses wat LED -skermmatriks vertoon: proses (ColCLK) - 0 - 16 om beide die 8X8 ROOI en 8x8 GROEN matriksveranderlike RowCount: heelgetal reeks 0 tot 16: = 0 te verfris; begin as (rising_edge (ColCLK)) dan as (RowCount = 0) dan DORow <= RedA; - Rydata vir ooreenstemmende kolom DOCol <= "1000000000000000"; - Column Trigger- Herhaal hierdie kode tot in "0000000000000001"- Verander na RedB, RedC … GreenA, GreenB … GreenH

Aan die einde van die GreenH, net voor die proses beëindig word, is hierdie brokkie ingesluit om die RowCount terug te stel op nul.

as (RowCount = 15) dan - Herlaai herlaai vanaf kolom A RowCount: = 0; anders RowCount: = RowCount + 1; - Skuif deur kolomme eindig as;

Om die horlosie in die sensitiwiteitslys van die vertoonproses te verduidelik. Die Basys3 -bord het 'n interne klok wat op 100MHz werk. Vir ons doeleindes is dit 'n te vinnige klok, dus moet ons die horlosie verdeel in 'n 960Hz -klok deur die volgende proses te gebruik.

- Klokproses wat werk by 960HzCLKDivider: proses (CLK) veranderlike clkcount: heelgetal reeks 0 tot 52083: = 0; begin as (rising_edge (CLK)) dan clkcount: = clkcount + 1; as (clkcount = 52083) dan ColCLK <= nie (ColCLK); clkcount: = 0; eindig as; eindig as; einde proses;

Stap 4: Tegniese verduideliking: Verandering van die vertoonde inligting

Tegniese verduideliking: Verandering van die inligting wat vertoon word
Tegniese verduideliking: Verandering van die inligting wat vertoon word

In die VHDL -kode word die inligting of data wat op die skerm vertoon word, beheer deur die wyserproses, wat 'n ander klok in sy sensitiwiteitslys het. Hierdie kode is BtnCLK genoem, 'n horlosie wat ontwerp is om die ontbinding van die knoppies te verminder as dit ingedruk word. Dit is ingesluit sodat die wyser in die boonste ry nie vinnig deur die kolomme beweeg as 'n knoppie ingedruk word nie.

- Klokproses werk by 5 Hz. ButtonCLK: proses (CLK) veranderlike btnclkcount: heelgetal reeks 0 tot 10000001: = 0; begin as (rising_edge (CLK)) dan as (btnclkcount = 10000000) dan btnclkcount: = 0; BtnCLK <= nie (BtnCLK); anders btnclkcount: = btnclkcount + 1; eindig as; eindig as; einde proses;

Met die BtnCLK -seinuitset van hierdie proses, kan ons nou die wyserproses verduidelik. Die wyserproses het slegs BtnCLK in die sensitiwiteitslys, maar in die kodeblok word die toestand van die knoppies nagegaan en dit sal veroorsaak dat die data vir die RedA, RedB … GreenH verander. Hier is 'n uittreksel van die wyserkode, wat die herstelblok en die blok vir die eerste kolom insluit.

wyser: proses (BtnCLK) veranderlike OCursorCol: STD_LOGIC_VECTOR (2 tot 0): = "000"; - OCursorCol hou rekord van die vorige kolomveranderlike NCursorCol: STD_LOGIC_VECTOR (2 tot 0): = "000"; -NCursorCol stel 'n nuwe aanwyser-kolom begin-RESET-toestand (UP-knoppie)-Bord word skoongemaak sodat die spel weer kan begin as (rising_edge (BtnCLK)) dan as (RST = '1') dan 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 as (Lbtn = '1') dan NCursorCol: = "111"; - Kolom H elsif (Rbtn = '1') dan NCursorCol: = "001"; - Kolom B elsif (Cbtn = '1') dan NCursorCol: = OCursorCol; - Kolom bly dieselfde NTurnState <= not (TurnState); - Skakel die beurt van die volgende speler na- Kontroleer die huidige kolom van onder na bo en skakel die eerste LED aan wat nie aan is nie. Kleur hang af van die huidige speler se wyser kleur. vir ck in 7 tot 1 lus as (RedA (0) = '1') en (RedA (ck) = '0') en (GreenA (ck) = '0') dan RedA (Ck) <= '1'; RedA (0) <= '0'; UITGANG; eindig as;

as (GreenA (0) = '1') en (RedA (ck) = '0') en (GreenA (ck) = '0') dan

GreenA (Ck) <= '1'; GreenA (0) - Rooi speler GreenA (0) <= '0'; if (NCursorCol = OCursorCol) dan - As niks ingedruk is nie RedA (0) <= '1'; elsif (NCursorCol = "111") dan - As Lbtn ingedruk is RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = "001") toe - Iff Rbtn is gedruk RedB (0) <= '1'; RedA (0) - Groen speler RedA (0) <= '0'; as (NCursorCol = OCursorCol) dan GreenA (0) <= '1'; elsif (NCursorCol = "111") dan GreenH (0) <= '1'; GroenA (0) <= '0'; elsif (NCursorCol = "001") dan GreenB (0) <= '1'; GroenA (0) <= '0'; eindig as; eindsaak;

Let op: die eerste saakverklaring genaamd: OCursorCol (wat staan vir Old Cursor Column) is die begin van die eindige toestand masjien. Elke kolom van die skerm word behandel as sy eie toestand in die FSM. Daar is 8 kolomme, dus is 'n 3-bis binêre getallestel gebruik om elke kolom as 'n toestand te identifiseer. Hoe die FSM tussen toestand beweeg, hang af van die knoppie wat ingedruk word. In die brokkie hierbo, as die linkerknoppie ingedruk word, sal die FSM na "111" beweeg, wat die laaste kolom van die skerm sal wees. As die regte knoppie ingedruk word, skuif die FSM na "001", wat die tweede kolom van die skerm sou wees.

As die middelste knoppie ingedruk word, sal die FSM NIE na 'n nuwe toestand beweeg nie, maar dit sal 'n verandering in die TurnState-sein veroorsaak, 'n een-bis-sein om aan te dui watter speler aan die beurt is. Boonop sal die middelste knoppie 'n kodeblok laat loop wat kontroleer of daar 'n leë ry heel onder is tot bo. Dit sal probeer om 'n merker in die laagste, ongevulde ry te plaas. Onthou, dit is 'n connect four -speletjie.

In die genoteerde saakverklaring genaamd: TurnState verander ons wat die wyserkleur is en in watter kolom in die eerste ry ons die data wil verander, sodat die vertoonproses die verandering kan weerspieël.

Ons herhaal hierdie basiese kode vir die oorblywende sewe gevalle. Die FSM -diagram kan nuttig wees om te verstaan hoe die state verander.

Stap 5: Kode

Kode
Kode

Dit is die funksionele kode vir die Connect 4 wat met behulp van die Vivado -sagteware in VHDL saamgestel kan word.

Daar is ook 'n beperking om die spel aan die gang te kry.

Ons het 'n blokdiagram verskaf wat verduidelik hoe die insette en uitsette van elke proses met mekaar verbind is.

Aanbeveel: