INHOUDSOPGAWE:
- Stap 1: Vinnige besonderhede en materiaal
- Stap 2: Koppel die hardeware aan
- Stap 3: Tegniese verduideliking: skerm
- Stap 4: Tegniese verduideliking: Verandering van die vertoonde inligting
- Stap 5: Kode
Video: VHDL Basys3: Verbind 4 speletjies: 5 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:26
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
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
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
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:
Verbind ESP 32 met ultrasoniese sensor: 3 stappe
Koppel ESP 32 met ultrasoniese sensor: Ultrasoniese sensors werk deur klankgolwe uit te stuur met 'n frekwensie wat te hoog is vir mense om te hoor. Hulle wag dan tot die geluid weerkaats word, en bereken die afstand op grond van die benodigde tyd. Dit is soortgelyk aan hoe radar die tyd meet wat dit neem
Verbind MPU6050 met ESP32: 4 stappe
MPU6050 verbind met ESP32: In hierdie projek gaan ek 'n MPU6050 -sensor koppel met die ESP32 DEVKIT V1 -kaart. MPU6050 staan ook bekend as 'n 6 -as sensor of 'n 6 graad van vryheid (DOF) sensor. Beide versnellingsmeter en gyrometersensors word in hierdie enkele module aangetref. Versnellingsmeter
Basiese stophorlosie met behulp van VHDL en Basys3 Board: 9 stappe
Basiese stophorlosie met behulp van VHDL en Basys3 Board: Welkom by die instruksies oor hoe om 'n stophorlosie te bou met basiese VHDL en Basys 3 bord. Ons is opgewonde om ons projek met u te deel! Dit was 'n finale projek vir die kursus CPE 133 (Digital Design) by Cal Poly, SLO in die herfs van 2016. Die projek wat ons bou
Hoe om speletjies op te laai na Arduboy en 500 speletjies na 'n flitswa: 8 stappe
Hoe om speletjies op te laai na Arduboy en 500 speletjies na 'n flitskar: ek het 'n paar tuisgemaakte Arduboy gemaak met 'n Serial Flash-geheue wat maks 500 speletjies kan stoor om op die pad te speel. Ek hoop om te deel hoe om speletjies daarheen te laai, insluitend hoe om speletjies in die flitsgeheue op te slaan en u eie gekonsolideerde spelpakket te skep
Verbind 4 speletjies met behulp van Arduino en Neopixel: 7 stappe (met foto's)
Connect 4 Game met Arduino en Neopixel: Eerder as om net 'n geskenkgeskenkie te gee, wou ek my nefies 'n unieke geskenk gee wat hulle kon saamstel en (hopelik) geniet. Alhoewel die Arduino -kode vir hierdie projek te moeilik is om te verstaan, is die basiese konsepte