Talaan ng mga Nilalaman:

VHDL Basys3: Ikonekta ang 4 Laro: 5 Mga Hakbang
VHDL Basys3: Ikonekta ang 4 Laro: 5 Mga Hakbang

Video: VHDL Basys3: Ikonekta ang 4 Laro: 5 Mga Hakbang

Video: VHDL Basys3: Ikonekta ang 4 Laro: 5 Mga Hakbang
Video: CONTADOR BINARIO ASCEDENTE VHDL (4 DE 4 SIMULACIÓN) 2024, Nobyembre
Anonim
VHDL Basys3: Ikonekta ang 4 Laro
VHDL Basys3: Ikonekta ang 4 Laro

Panimula:

Ito ay isang Connect 4 Digital Logic Game na dinisenyo sa VHDL gamit ang Vivado Software at na-program sa Basys3 Board. Ang konstruksyon at disenyo ng proyektong ito ay intermediate, ngunit ang mga bagong dating ay maaaring kopyahin ang mga hakbang at buuin ang digital na laro.

Nagpapatakbo ang laro tulad ng larong Connect 4. Maaaring ilipat ng mga manlalaro ang kanilang cursor sa screen gamit ang kaliwa at kanang mga pindutan na matatagpuan sa pisara. Ang pagpindot sa gitnang pindutan sa pisara ay magiging sanhi ng paglalagay ng manlalaro ng kanilang marker sa haligi na iyon at pagkatapos ay magiging turn ng susunod na manlalaro. Kapag nanalo ang isang manlalaro, ang laro ay maaaring i-reset sa pamamagitan ng pagpindot sa pindutan ng up sa board.

Hakbang 1: Mabilis na Mga Detalye at Materyales

Mabilis na Mga Detalye ng Teknikal:

  • Gumagamit ng tatlong hanay ng mga koneksyon sa PMOD sa board (JA, JB, JC)

    • 8 Pins (Hindi kasama ang Vcc & GND Pins) na ginamit para sa bawat konektor ng PMOD
    • JA - Pagkontrol ng Mga Rows
    • JB - Pagkontrol ng Mga Green Column
    • JC - Pagkontrol sa Mga Pulang Haligi
  • Nagpapatakbo ang orasan ng screen sa 960Hz

    8 LEDs lamang ang nakabukas sa isang naibigay na oras. Ang pag-refresh ng screen sa isang mabilis na bilis ng orasan na ang ilusyon ay ibinigay na higit sa 8 LEDs ay nasa sa isang naibigay na oras

  • Ang orasan ng butones ay nagpapatakbo ng 5Hz; Opsyonal na maaaring pagmultahin sa pamamagitan ng pag-edit ng VHDL code.
  • Ang panloob na pagtutol ng Darlington Arrays ay sapat upang maiwasan ang LED burn-out

Ang laro ay itinayo gamit ang mga sumusunod na sangkap at tool:

  • (1) Lupon ng Basys3
  • (2) LED Matrix Bi-color 8x5:
  • (2) ULN2803 - Darlington Transistor Arrays - Datasheet
  • Mga Spool ng Wire
  • Jumper Wires
  • Wire Stripper
  • Mga Breadboard (Dapat ay sapat ang Malaking Parisukat)
  • Multimeter at Power Supply (Pag-troubleshoot)

Hakbang 2: Pagkonekta sa Hardware

Pagkonekta sa Hardware
Pagkonekta sa Hardware
Pagkonekta sa Hardware
Pagkonekta sa Hardware

Mga Alituntunin:

Ang mga kable ng proyekto ay maaaring maging labis na magkakalikot, mangyaring maglaan ng iyong oras at i-verify na ang lahat ng mga koneksyon ay tama isang set sa bawat oras.

Ang proyekto ay nagsasangkot ng paggamit ng dalawang mga LED screen ngunit pinagsama upang makabuo ng isang malaking screen. Maaari itong magawa sa pamamagitan ng pagkonekta sa lahat ng mga hilera sa parehong punto. Dahil ang bawat screen ay may dalawang kulay, ang pula at berde na mga hilera ng isang screen ay dapat ding itali sa pula at berdeng mga hilera ng iba pang screen. Sa pamamagitan nito, makokontrol natin ang lahat ng mga hilera na mayroon lamang 8 mga pin. Ang iba pang 16 na mga pin ay ginagamit upang makontrol ang mga haligi ng pagpapakita. Ang 8 mga pin para sa ay maaaring konektado direkta sa pamamagitan ng mga jumper cables sa mga konektor ng pmod. Ang mga koneksyon ng Pmod ay unang pumunta sa pag-input ng ULN2083A at ang output ng ULN2083A ay konektado direkta sa haligi sa screen. Dahil ang disenyo ay isang 8x8, ang ilang mga haligi ay pisikal na hindi makakonekta.

  • JA: Mga koneksyon sa hilera: Hilera 1 hanggang JA: 1 hanggang Hilera 8 para sa JA: 10.
  • JA: Mga koneksyon sa Red Column:
  • JC: Mga koneksyon ng Green Column

Mangyaring mag-refer sa mga imaheng nai-post upang malaman kung aling mga pin ang tumutugma sa aling mga hilera / haligi.

Tandaan: Ang mga transistor ay nakabuo ng mga resistensya, kaya't ang mga LED ay hindi nangangailangan ng karagdagang pagtutol upang maiugnay sa kanila sa serye.

Hakbang 3: Teknikal na Paliwanag: Screen

Ang screen ay tumatakbo sa pagtitiyaga ng paningin. Napakabilis ng pagre-refresh ng screen, na hindi nakikita ng mata ng tao na ang ilang mga LED ay mabilis na naka-off at naka-on. Sa katunayan, sa pamamagitan ng pagbagal ng display relo, mapapansin ng isa ang flashing.

Ang display ay lumiliko sa lahat ng walong mga hilera ayon sa data na nakaimbak para sa mga hilera na iyon, at ang display ay lumiliko sa isang haligi. Pagkatapos ay mabilis itong lumipat sa susunod na pagpasok ng data para sa walong mga hilera at lumiliko sa susunod na haligi - habang pinapatay ang lahat ng iba pang mga haligi. Ang prosesong ito ay nagpatuloy sa isang mabilis na sapat na bilis ng orasan na ang pagkutitap ng LED ay hindi napapansin.

Ang imbakan ng data para sa display ay naisasimulan kaagad pagkatapos ng arkitektura sa VHDL file sa sumusunod na pamamaraan:

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

signal GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 hanggang 0): = "00000000"; - Row Data depende sa haligi: GREEN

Ang sumusunod na isang maliit na snippet ng proseso na kumokontrol sa LED display matrix.

- Proseso na Kinokontrol ang LED display matrixdisplay: proseso (ColCLK) - 0 - 16 upang i-refresh ang parehong 8X8 RED at 8x8 GREEn matrix variable RowCount: saklaw ng integer 0 hanggang 16: = 0; simulan kung (tumataas_edge (ColCLK)) pagkatapos kung (RowCount = 0) pagkatapos DORow <= RedA; - Data ng Hilera para sa kaukulang Column DOCol <= "1000000000000000"; - Trigger ng Column - Ulitin ang code na ito para sa lahat hanggang sa "0000000000000001" - Palitan sa RedB, RedC… GreenA, GreenB… GreenH

Sa pagtatapos ng GreenH, bago pa man wakasan ng proseso ang snippet na ito ay isinama upang i-reset ang RowCount pabalik sa zero.

kung (RowCount = 15) pagkatapos - I-restart ang pag-refresh mula sa haligi Isang RowCount: = 0; iba pa RowCount: = RowCount + 1; - Ang paglilipat sa mga haligi ay nagtatapos kung;

Ngayon, upang ipaliwanag ang orasan na nasa listahan ng pagiging sensitibo ng proseso ng pagpapakita. Ang board ng Basys3 ay may panloob na orasan na tumatakbo sa 100MHz. Para sa aming mga layunin, ito ay masyadong mabilis ng isang orasan kaya kakailanganin naming hatiin ang orasan na ito sa isang 960Hz na orasan gamit ang sumusunod na proseso.

- Ang proseso ng orasan na tumatakbo sa 960HzCLKDivider: proseso (CLK) variable clkcount: saklaw ng integer 0 hanggang 52083: = 0; simulan kung (tumataas_edge (CLK)) pagkatapos clkcount: = clkcount + 1; kung (clkcount = 52083) pagkatapos ColCLK <= hindi (ColCLK); clkcount: = 0; tapusin kung; tapusin kung; proseso ng pagtatapos;

Hakbang 4: Teknikal na Paliwanag: Pagbabago ng Naipakita na Impormasyon

Teknikal na Paliwanag: Pagbabago ng Naipakita na Impormasyon
Teknikal na Paliwanag: Pagbabago ng Naipakita na Impormasyon

Sa VHDL code, ang impormasyon o data na ipapakita sa screen ay kinokontrol ng proseso ng cursor, na may iba't ibang orasan sa listahan ng pagiging sensitibo nito. Ang code na ito ay tinawag na BtnCLK, isang orasan na dinisenyo upang i-minimize ang pag-debouch ng mga pindutan kapag pinindot ang mga ito. Kasama ito upang kung ang isang pindutan ay pinindot, ang cursor sa tuktok na hilera ay hindi gumagalaw nang napakabilis sa mga haligi.

- Ang proseso ng orasan na tumatakbo sa 5 Hz. ButtonCLK: proseso (CLK) variable btnclkcount: saklaw ng integer 0 hanggang 10000001: = 0; simulan kung (tumataas_edge (CLK)) pagkatapos kung (btnclkcount = 10000000) pagkatapos btnclkcount: = 0; BtnCLK <= hindi (BtnCLK); iba btnclkcount: = btnclkcount + 1; tapusin kung; tapusin kung; proseso ng pagtatapos;

Sa output ng signal ng BtnCLK ng prosesong ito, maaari na naming ipaliwanag ang proseso ng cursor. Ang proseso ng cursor ay mayroon lamang BtnCLK sa listahan ng pagiging sensitibo nito ngunit sa block ng code, ang estado ng mga pindutan ay naka-check at magiging sanhi ito ng data para sa RedA, RedB… GreenH upang mabago. Narito ang isang snippet ng cursor code, na kasama ang reset block at ang block para sa unang haligi.

cursor: process (BtnCLK) variable OCursorCol: STD_LOGIC_VECTOR (2 hanggang 0): = "000"; - Sinusubaybayan ng OCursorCol ang nakaraang variable ng haligi NCursorCol: STD_LOGIC_VECTOR (2 hanggang 0): = "000"; - Nagtatakda ang NCursorCol ng bagong pagsisimula ng haligi ng cursor --Kundisyon ng REESET (UP Button) - Ang board ay na-clear para sa laro upang i-restart kung (tumataas_edge (BtnCLK)) pagkatapos kung (RST = '1') pagkatapos 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 kung (Lbtn = '1') kung gayon ang NCursorCol: = "111"; - Column H elsif (Rbtn = '1') pagkatapos ay NCursorCol: = "001"; - Column B elsif (Cbtn = '1') pagkatapos ay NCursorCol: = OCursorCol; - Ang haligi ay mananatili sa parehong NTurnState <= not (TurnState); - Pag-trigger ng pagliko ng susunod na manlalaro - Sinusuri ang kasalukuyang haligi mula sa ibaba hanggang sa itaas at binubuksan ang unang LED na wala sa. Ang kulay ay nakasalalay sa kulay ng cursor ng kasalukuyang manlalaro. para sa ck sa 7 hanggang sa 1 loop kung (RedA (0) = '1') at (RedA (ck) = '0') at (GreenA (ck) = '0') pagkatapos ang RedA (Ck) <= '1'; RedA (0) <= '0'; LABASAN; tapusin kung;

kung (GreenA (0) = '1') at (RedA (ck) = '0') at (GreenA (ck) = '0') kung gayon

GreenA (Ck) <= '1'; GreenA (0) - Red Player GreenA (0) <= '0'; kung (NCursorCol = OCursorCol) pagkatapos - Kung walang pinindot RedA (0) <= '1'; elsif (NCursorCol = "111") pagkatapos - Kung ang Lbtn ay pinindot RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = "001") pagkatapos - pinindot si Iff Rbtn sa RedB (0) <= '1'; RedA (0) - Green Player RedA (0) <= '0'; kung (NCursorCol = OCursorCol) kung gayon ang GreenA (0) <= '1'; elsif (NCursorCol = "111") pagkatapos GreenH (0) <= '1'; GreenA (0) <= '0'; elsif (NCursorCol = "001") pagkatapos GreenB (0) <= '1'; GreenA (0) <= '0'; tapusin kung; kaso ng pagtatapos;

Tandaan, ang unang pahayag ng kaso na tinawag na: OCursorCol (na nangangahulugang Old Cursor Column) ay ang simula ng makina ng estado na may hangganan. Ang bawat haligi ng display ay ginagamot bilang sarili nitong estado sa FSM. Mayroong 8 haligi kaya isang 3-bit na itinakdang numero ng binary ang ginamit upang makilala ang bawat haligi bilang isang estado. Kung paano gumagalaw ang FSM sa pagitan ng estado ay nakasalalay sa pindutan na pinindot. Sa snippet sa itaas, kung ang kaliwang pindutan ay pinindot, ang FSM ay lilipat sa "111" na kung saan ay ang huling haligi ng display. Kung ang kanang pindutan ay pinindot, ang FSM ay lilipat sa "001" na kung saan ay ang pangalawang haligi ng display.

Kung ang gitnang pindutan ay pinindot, ang FSM ay HINDI lilipat sa isang bagong estado ngunit sa halip ay magpapalitaw ng isang pagbabago sa signal ng TurnState, na isang isang bit na signal upang tandaan kung aling turn ng manlalaro ito. Bilang karagdagan, ang gitnang pindutan ay magpapatakbo ng isang bloke ng code na suriin kung mayroong isang walang laman na hilera sa pinakailalim hanggang sa itaas. Susubukan nitong maglagay ng isang marker sa pinakamababang, walang laman na hilera. Tandaan, ito ay isang ikonekta ang apat na laro.

Sa naka-pugad na pahayag ng kaso na tinawag: TurnState, binabago namin kung ano ang kulay ng cursor at kung aling haligi sa unang hilera na nais naming baguhin ang data para maipakita sa proseso ng pagpapakita ang pagbabago.

Inuulit namin ang pangunahing code na ito para sa natitirang pitong kaso. Ang diagram ng FSM ay maaaring maging kapaki-pakinabang upang maunawaan kung paano nagbabago ang mga estado.

Hakbang 5: Code

Code
Code

Ito ang functional code para sa Connect 4 na maaaring maiipon sa VHDL gamit ang Vivado Software.

Nagbibigay din ng isang pagpigil upang payagan kang maitaas ang laro at tumakbo.

Nagbigay kami ng isang diagram ng block na nagpapaliwanag kung paano magkakaugnay ang mga input at output ng bawat proseso.

Inirerekumendang: