Përmbajtje:

VHDL Basys3: Connect 4 Lojë: 5 hapa
VHDL Basys3: Connect 4 Lojë: 5 hapa

Video: VHDL Basys3: Connect 4 Lojë: 5 hapa

Video: VHDL Basys3: Connect 4 Lojë: 5 hapa
Video: 4.FPGA FOR BEGINNERS- Combining logic gates in VHDL (DIGILENT Basys3) 2024, Nëntor
Anonim
VHDL Basys3: Lidhu 4 lojë
VHDL Basys3: Lidhu 4 lojë

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

Lidhja e harduerit
Lidhja e harduerit
Lidhja e harduerit
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

Shpjegimi teknik: Ndryshimi i informacionit të shfaqur
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

Kodi
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: