Përmbajtje:
- Hapi 1: Detajet dhe materialet e shpejta
- Hapi 2: Lidhja e harduerit
- Hapi 3: Shpjegimi teknik: Ekrani
- Hapi 4: Shpjegimi teknik: Ndryshimi i informacionit të shfaqur
- Hapi 5: Kodi
Video: VHDL Basys3: Connect 4 Lojë: 5 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:20
Prezantimi:
Kjo është një lojë Logjike Logjistike Connect 4 e krijuar në VHDL duke përdorur Softuerin Vivado dhe e programuar në Bordin Basys3. Ndërtimi dhe dizajni i këtij projekti është i ndërmjetëm, por të sapoardhurit mund të kopjojnë hapat dhe të ndërtojnë lojën dixhitale.
Loja funksionon si loja Connect 4. Lojtarët mund të lëvizin kursorin e tyre nëpër ekran duke përdorur butonat e majtë dhe të djathtë që gjenden në tabelë. Shtypja e butonit të mesëm në tabelë do të bëjë që lojtari të vendosë shënuesin e tij në atë kolonë dhe pastaj do të bëhet radha e lojtarit tjetër. Pasi një lojtar të fitojë, loja mund të rivendoset duke shtypur butonin lart në tabelë.
Hapi 1: Detajet dhe materialet e shpejta
Detajet e Shpejta Teknike:
-
Përdor tre grupe të lidhjeve PMOD në tabelë (JA, JB, JC)
- 8 kunja (Duke përjashtuar kunjat Vcc & GND) të përdorura për çdo lidhës PMOD
- JA - Kontrolli i Rreshtave
- JB - Kontrolli i Kolonave të Gjelbërta
- JC - Kontrolli i Kolonave të Kuqe
-
Ora e ekranit funksionon në 960Hz
Vetëm 8 LED janë ndezur në një kohë të caktuar. Ekrani rifreskon me një shpejtësi sa më të shpejtë të orës saqë iluzioni jepet se më shumë se 8 LED janë ndezur në një kohë të caktuar
- Ora e butonit funksionon në 5Hz; Opsionale mund të gjobitet i akorduar duke redaktuar kodin VHDL.
- Rezistenca e brendshme e vargjeve Darlington është e mjaftueshme për të parandaluar djegien e LED
Loja është ndërtuar duke përdorur përbërësit dhe mjetet e mëposhtme:
- (1) Bordi Basys3
- (2) LED Matrica Bi-ngjyra 8x5:
- (2) ULN2803 - Vargjet e transistorëve Darlington - Fletë të dhënash
- Spinalet e telave
- Telat Jumper
- Zhveshës me tela
- Tabelat e bukës (Sheshi i madh duhet të jetë i mjaftueshëm)
- Multimetri dhe Furnizimi me energji (Zgjidhja e problemeve)
Hapi 2: Lidhja e harduerit
Udhëzimet:
Instalimet e projektit mund të jenë jashtëzakonisht të ndërlikuara, ju lutemi merrni kohën tuaj dhe verifikoni që të gjitha lidhjet janë të sakta, të vendosura një nga një.
Projekti përfshin përdorimin e dy ekraneve LED por janë të kombinuara për të formuar një ekran të madh. Kjo mund të arrihet duke i lidhur të gjitha rreshtat në të njëjtën pikë. Për shkak se çdo ekran është me dy ngjyra, rreshtat e kuq dhe të gjelbër të njërit ekran duhet gjithashtu të lidhen me rreshtat e kuq dhe jeshil të ekranit tjetër. Duke bërë këtë, ne mund të kontrollojmë të gjitha rreshtat me vetëm 8 kunja. 16 kunjat e tjerë përdoren për të kontrolluar kolonat e ekranit. 8 kunjat për kanaçen mund të lidhen drejtpërdrejt përmes kabllove kërcyes në lidhësit pmod. Lidhjet Pmod së pari shkojnë në hyrjen e ULN2083A dhe dalja e ULN2083A lidhet drejtpërdrejt me kolonën në ekran. Për shkak se dizajni është një 8x8, disa kolona nuk do të lidhen fizikisht.
- JA: Lidhjet e rreshtit: Rreshti 1 në JA: 1 në Rreshtin 8 për JA: 10.
- JA: Lidhjet e Kolonës së Kuqe:
- JC: Lidhjet e Kolonës së Gjelbër
Ju lutemi referojuni imazheve të postuara për të ditur se cilat kunja korrespondojnë me cilat rreshta/kolona.
Shënim: Transistorët kanë ndërtuar rezistenca, kështu që LED -të nuk kërkojnë rezistencë shtesë për t'u lidhur me to në seri.
Hapi 3: Shpjegimi teknik: Ekrani
Ekrani funksionon në qëndrueshmërinë e shikimit. Ekrani po freskon aq shpejt, sa syri i njeriut nuk mund të dallojë në mënyrë të dukshme që disa LED po fiken dhe ndizen me shpejtësi. Në fakt, duke ngadalësuar orën e ekranit, mund të vëreni ndezjen.
Ekrani ndez të tetë rreshtat sipas të dhënave të ruajtura për ato rreshta dhe ekrani ndizet në një kolonë. Pastaj kalon shpejt në hyrjen tjetër të të dhënave për tetë rreshtat dhe ndizet në kolonën tjetër - ndërsa ka të gjitha kolonat e tjera të fikura. Ky proces vazhdon me një shpejtësi sa më të shpejtë të orës sa që ndezja e LED -it bëhet e padukshme.
Ruajtja e të dhënave për ekranin inicializohet menjëherë pas arkitekturës në skedarin VHDL në mënyrën e mëposhtme:
sinjali RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 poshtë 0): = "00000000";
sinjal GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 poshtë 0): = "00000000"; - Të dhënat e rreshtit në varësi të kolonës: GREEN
Në vijim një fragment i vogël i procesit që kontrollon matricën e ekranit LED.
- Procesi që kontrollon matricën e ekranit LEDdisplay: procesi (ColCLK) - 0 - 16 për të rifreskuar ndryshoren e matricës 8X8 RED dhe 8x8 GREEn RowCount: diapazoni i plotë 0 deri në 16: = 0; filloni nëse (edge_ising (ColCLK)) pastaj nëse (RowCount = 0) pastaj DORow <= RedA; - Të dhënat e rreshtit për kolonën përkatëse DOCol <= "1000000000000000"; - Nxitësi i Kolonave- Përsëriteni këtë kod deri në "0000000000000001"- Ndryshoni në RedB, RedC… GreenA, GreenB… GreenH
Në fund të GreenH, menjëherë para përfundimit të procesit ky fragment përfshihet për të rivendosur RowCount përsëri në zero.
nëse (RowCount = 15) atëherë - Rinisni rifreskimin nga kolona A RowCount: = 0; tjetër RowCount: = RowCount + 1; - Zhvendosja nëpër kolona përfundon nëse;
Tani, për të shpjeguar orën e cila është në listën e ndjeshmërisë së procesit të shfaqjes. Bordi Basys3 ka një orë të brendshme që funksionon në 100MHz. Për qëllimet tona, kjo është shumë e shpejtë e një ore, kështu që ne do të duhet ta ndajmë këtë orë në një orë 960Hz duke përdorur procesin e mëposhtëm.
- Procesi i orës që funksionon në 960HzCLKDivider: procesi (CLK) variabël clkcount: diapazoni i plotë 0 deri në 52083: = 0; filloni nëse (buza_ ngritëse (CLK)) atëherë clkcount: = clkcount + 1; nëse (clkcount = 52083) atëherë ColCLK <= jo (ColCLK); clkcount: = 0; mbaron nëse; mbaron nëse; përfundimi i procesit;
Hapi 4: Shpjegimi teknik: Ndryshimi i informacionit të shfaqur
Në kodin VHDL, informacioni ose të dhënat që do të shfaqen në ekran kontrollohen nga procesi i kursorit, i cili ka një orë të ndryshme në listën e tij të ndjeshmërisë. Ky kod u quajt BtnCLK, një orë e krijuar për të minimizuar heqjen e butonave kur ato shtypen. Kjo përfshihet në mënyrë që nëse shtypet një buton, kursori në rreshtin e sipërm nuk lëviz shumë shpejt nëpër kolona.
- Procesi i orës që funksionon në 5 Hz. ButtonCLK: variabli i procesit (CLK) btnclkcount: diapazoni i plotë 0 deri në 10000001: = 0; filloni nëse (skaji i ngritjes (CLK)) pastaj nëse (btnclkcount = 10000000) atëherë btnclkcount: = 0; BtnCLK <= jo (BtnCLK); tjetër btnclkcount: = btnclkcount + 1; mbaron nëse; mbaron nëse; përfundimi i procesit;
Me daljen e sinjalit BtnCLK të këtij procesi, tani mund të shpjegojmë procesin e kursorit. Procesi i kursorit ka vetëm BtnCLK në listën e tij të ndjeshmërisë, por në bllokun e kodit, gjendja e butonave kontrollohet dhe kjo do të bëjë që të dhënat për RedA, RedB… GreenH të ndryshojnë. Këtu është një fragment i kodit të kursorit, i cili përfshin bllokun e rivendosjes dhe bllokun për kolonën e parë.
kursori: procesi (BtnCLK) variabla OCursorCol: STD_LOGIC_VECTOR (2 poshtë 0): = "000"; - OCursorCol mban gjurmën e ndryshores së mëparshme të kolonës NCursorCol: STD_LOGIC_VECTOR (2 poshtë 0): = "000"; -NCursorCol vendos fillimin e kolonës së re të kursorit-Kushti RESET (UP Button)-Bordi pastrohet që loja të rifillojë nëse (rritje_edge (BtnCLK)) pastaj nëse (RST = '1') pastaj 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') atëherë NCursorCol: = "111"; - Kolona H elsif (Rbtn = '1') pastaj NCursorCol: = "001"; - Kolona B elsif (Cbtn = '1') pastaj NCursorCol: = OCursorCol; - Kolona mbetet e njëjtë NTurnState <= jo (TurnState); - Nxit radhen e lojtarit tjetër- Kontrollon kolonën aktuale nga poshtë lart dhe ndez LED-in e parë që nuk është ndezur. Ngjyra varet nga ngjyra e kursorit të luajtësit aktual. për ck në 7 në 1 lak nëse (RedA (0) = '1') dhe (RedA (ck) = '0') dhe (GreenA (ck) = '0') pastaj RedA (Ck) <= '1'; RedA (0) <= '0'; EXIT; mbaron nëse;
nëse (GreenA (0) = '1') dhe (RedA (ck) = '0') dhe (GreenA (ck) = '0') atëherë
GreenA (Ck) <= '1'; GreenA (0) - Lojtari i Kuq GreenA (0) <= '0'; nëse (NCursorCol = OCursorCol) atëherë - Nëse asgjë nuk është shtypur RedA (0) <= '1'; elsif (NCursorCol = "111") atëherë - Nëse Lbtn shtypet RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = "001") atëherë - Iff Rbtn u shtyp RedB (0) <= '1'; RedA (0) - Lojtari i Gjelbër RedA (0) <= '0'; nëse (NCursorCol = OCursorCol) atëherë GreenA (0) <= '1'; elsif (NCursorCol = "111") pastaj GreenH (0) <= '1'; GreenA (0) <= '0'; elsif (NCursorCol = "001") pastaj GreenB (0) <= '1'; GreenA (0) <= '0'; mbaron nëse; rasti përfundimtar;
Shënim, deklarata e parë e rastit e quajtur: OCursorCol (që do të thotë kolona e kursorit të vjetër) është fillimi i makinës me gjendje të fundme. Çdo kolonë e ekranit trajtohet si gjendja e vet në FSM. Ka 8 kolona, kështu që një grup binar 3-bitësh u përdor për të identifikuar secilën kolonë si gjendje. Si lëviz FSM midis gjendjes varet nga butoni i cili shtypet. Në fragmentin e mësipërm, nëse shtypet butoni i majtë, FSM do të kalojë në "111" që do të ishte kolona e fundit e ekranit. Nëse shtypet butoni i djathtë, FSM do të kalojë në "001" që do të ishte kolona e dytë e ekranit.
Nëse shtypet butoni i mesëm, FSM NUK do të kalojë në një gjendje të re, por në vend të kësaj do të shkaktojë një ndryshim në sinjalin TurnState, i cili është një sinjal një bit për të shënuar se cili lojtar është radha. Për më tepër, butoni i mesëm do të ekzekutojë një bllok kodesh që kontrollon nëse ka një rresht bosh në pjesën e poshtme deri në krye. Do të përpiqet të vendosë një shënues në rreshtin më të ulët, të paplotësuar. Mos harroni, kjo është një lojë e lidhjes katër.
Në deklaratën e rastit të futur të quajtur: TurnState, ne ndryshojmë se cila është ngjyra e kursorit dhe për cilën kolonë në rreshtin e parë duam të ndryshojmë të dhënat, në mënyrë që procesi i shfaqjes të reflektojë ndryshimin.
Ne e përsërisim këtë kod bazë për shtatë rastet e mbetura. Diagrami FSM mund të jetë i dobishëm për të kuptuar se si po ndryshojnë gjendjet.
Hapi 5: Kodi
Ky është kodi funksional për Connect 4 që mund të përpilohet në VHDL duke përdorur Softuerin Vivado.
Ofrohet gjithashtu një kufizim për t'ju lejuar të filloni lojën.
Ne siguruam një diagram bllok i cili shpjegon se si hyrjet dhe daljet e secilit proces janë të ndërlidhura.
Recommended:
DIY 37 Leds Arduino Roulette Lojë: 3 hapa (me fotografi)
DIY 37 Leds Arduino Ruletë Lojë: Ruleta është një lojë kazino e quajtur sipas fjalës frënge që do të thotë rrotë e vogël
Mini lojë "Guess the Number" Lojë me mikro: bit: 10 hapa
Mini Makina e lojës "Guess the Number" me Micro: bit: A keni luajtur ndonjëherë " Guess the Number "? Kjo është një makinë lojërash shumë e thjeshtë për t’u ndërtuar që luan " Guess the Number " me ty Ne e projektuam këtë projekt DIY për të inkurajuar lojën fizike dhe për t'i ndihmuar fëmijët të mësojnë programim. Ai përdor një MU
Lojë Microbit Tic Tac Toe Lojë: 4 hapa (me fotografi)
Microbit Tic Tac Toe Lojë: Për këtë projekt, bashkëpunëtori im - @descartez dhe unë krijuam një lojë të mrekullueshme tic tac toe duke përdorur radio funksionalitetin e mikrobitëve. Nëse nuk keni dëgjuar më parë për mikrobit, ata janë një mikrokontrollues i mrekullueshëm i krijuar për t'u mësuar fëmijëve programimin. Ata
Kronometri bazë duke përdorur VHDL dhe Basys3 Board: 9 hapa
Kronometri bazë duke përdorur VHDL dhe Basys3 Board: Mirë se vini në udhëzuesin se si të ndërtoni një kronometër duke përdorur bordin bazë VHDL dhe Basys 3. Ne jemi të ngazëllyer për të ndarë projektin tonë me ju! Ky ishte një projekt përfundimtar për kursin CPE 133 (Dizajn Digjital) në Cal Poly, SLO në Vjeshtë 2016. Projekti që ne ndërtojmë
Lojë kryesore në VHDL: 3 hapa
Lojë mendjemadh në VHDL: Për projektin tonë, ne krijuam “ mendjemprehtës ” lojë në VHDL që do të luhet në tabelën Basys3. Mastermind është një lojë për thyerjen e kodit e luajtur tradicionalisht me kunja dhe një tabelë lojërash. Lojtari një vendos kunjat e ngjyrave të ndryshme në një rresht prej 4