Obsah:

VHDL Basys3: Connect 4 Game: 5 kroků
VHDL Basys3: Connect 4 Game: 5 kroků

Video: VHDL Basys3: Connect 4 Game: 5 kroků

Video: VHDL Basys3: Connect 4 Game: 5 kroků
Video: AMD Xilinx Arty A7, Artix 7 FPGA Evaluation Board - Getting Started 2024, Listopad
Anonim
Hra VHDL Basys3: Connect 4
Hra VHDL Basys3: Connect 4

Úvod:

Toto je digitální logická hra Connect 4 navržená ve VHDL pomocí softwaru Vivado a naprogramovaná na desce Basys3. Konstrukce a design tohoto projektu je střední, ale nováčci mohou kopírovat kroky a vytvořit digitální hru.

Tato hra funguje jako hra Connect 4. Hráči mohou přesouvat kurzor po obrazovce pomocí levého a pravého tlačítka na desce. Stisknutím prostředního tlačítka na hrací ploše hráč umístí značku na tento sloupec a poté se stane tahem dalšího hráče. Jakmile hráč vyhraje, lze hru resetovat stisknutím tlačítka nahoru na hrací ploše.

Krok 1: Rychlé detaily a materiály

Rychlé technické detaily:

  • Využívá tři sady připojení PMOD na desce (JA, JB, JC)

    • Pro každý konektor PMOD je použito 8 pinů (kromě pinů Vcc a GND)
    • JA - Řízení řádků
    • JB - Ovládání zelených sloupců
    • JC - Ovládání červených sloupců
  • Hodiny na obrazovce pracují na 960 Hz

    V daném čase svítí pouze 8 LED diod. Obrazovka se obnovuje dostatečně rychlou hodinovou rychlostí, takže vzniká iluze, že v daném čase svítí více než 8 LED diod

  • Tlačítko pracuje na frekvenci 5 Hz; Volitelně lze pokutu vyladit úpravou kódu VHDL.
  • Vnitřní odpor Darlington Arrays je dostatečný, aby se zabránilo vyhoření LED

Hra je vytvořena pomocí následujících komponent a nástrojů:

  • (1) Deska Basys3
  • (2) LED Matrix Bi-color 8x5:
  • (2) ULN2803 - Darlingtonova tranzistorová pole - Datový list
  • Cívky z drátu
  • Propojovací dráty
  • Odizolovávač drátu
  • Breadboards (Velký čtverec by měl stačit)
  • Multimetr a napájecí zdroj (řešení problémů)

Krok 2: Připojení hardwaru

Připojení hardwaru
Připojení hardwaru
Připojení hardwaru
Připojení hardwaru

Pokyny:

Zapojení projektu může být extrémně spletité. Udělejte si čas a ověřte, zda jsou všechna připojení správná.

Projekt zahrnuje použití dvou LED obrazovek, ale jsou kombinovány do jedné velké obrazovky. Toho lze dosáhnout spojením všech řádků do stejného bodu. Protože je každá obrazovka dvoubarevná, musí být červená a zelená řada jedné obrazovky svázána také s červenou a zelenou řadou druhé obrazovky. Tímto způsobem můžeme ovládat všechny řádky pouze s 8 piny. Dalších 16 pinů slouží k ovládání sloupců zobrazení. 8 pinů pro může být připojeno přímo přes propojovací kabely ke konektorům pmod. Připojení Pmod nejprve přejděte na vstup ULN2083A a výstup ULN2083A je připojen přímo ke sloupci na obrazovce. Protože je konstrukce 8x8, některé sloupce nebudou fyzicky propojeny.

  • JA: Řádková spojení: Řádek 1 až JA: 1 až řádek 8 pro JA: 10.
  • JA: Připojení červeného sloupce:
  • JC: Připojení zeleného sloupce

Chcete -li vědět, které piny odpovídají kterým řádkům/sloupcům, podívejte se prosím na zveřejněné obrázky.

Poznámka: Tranzistory mají zabudované odpory, takže LED diody nevyžadují dodatečný odpor, který by k nim byl zapojen do série.

Krok 3: Technické vysvětlení: Obrazovka

Obrazovka funguje na zachování zraku. Obrazovka se obnovuje tak rychle, že lidské oko nemůže viditelně detekovat, že některé diody LED se rychle vypínají a zapínají. Ve skutečnosti si zpomalením hodin na displeji můžete všimnout blikání.

Displej zapne všech osm řádků podle dat uložených pro tyto řádky a displej zapne jeden sloupec. Poté se rychle přepne na další zadávání dat pro osm řádků a zapne další sloupec - přičemž všechny ostatní sloupce budou vypnuty. Tento proces pokračuje dostatečně rychlou hodinovou rychlostí, že blikání diody LED se stane nepozorovatelným.

Úložiště dat pro displej je inicializováno bezprostředně po architektuře v souboru VHDL následujícím způsobem:

signál RedA, RedB, RedC, RedD, RedE, RedF, RedG, RedH: std_logic_vector (7 až 0): = "00000000";

signál GreenA, GreenB, GreenC, GreenD, GreenE, GreenF, GreenG, GreenH: std_logic_vector (7 až 0): = "00000000"; - Údaje řádků v závislosti na sloupci: ZELENÉ

Následující malý úryvek z procesu, který řídí matici LED displeje.

- Proces, který řídí zobrazení matice LED displeje: proces (ColCLK) - 0 - 16 pro aktualizaci maticové proměnné 8X8 RED a 8x8 GREEn RowCount: celočíselný rozsah 0 až 16: = 0; begin if (rise_edge (ColCLK)) then if (RowCount = 0) then DORow <= RedA; - Data řádků pro odpovídající sloupec DOCol <= "100000000000000000"; - Spouštění sloupců- Opakujte tento kód až do „0000000000000001“- Změňte na RedB, RedC… GreenA, GreenB… GreenH

Na konci GreenH, těsně před ukončením procesu, je zahrnut tento úryvek k resetování RowCount zpět na nulu.

if (RowCount = 15) then - Restart refresh from column A RowCount: = 0; else RowCount: = RowCount + 1; - Shift through column ends if;

Nyní vysvětlíme hodiny, které jsou v seznamu citlivosti procesu zobrazení. Deska Basys3 má vnitřní hodiny pracující na 100 MHz. Pro naše účely je to příliš rychlé hodiny, takže budeme muset rozdělit tyto hodiny na hodiny 960 Hz pomocí následujícího postupu.

- Proces hodin pracující na 960 HzCLKDivider: proměnná clkcount procesu (CLK): celočíselný rozsah 0 až 52083: = 0; begin if (rise_edge (CLK)) then clkcount: = clkcount + 1; if (clkcount = 52083) then ColCLK <= not (ColCLK); clkcount: = 0; konec pokud; konec pokud; konečný proces;

Krok 4: Technické vysvětlení: Změna zobrazených informací

Technické vysvětlení: Změna zobrazovaných informací
Technické vysvětlení: Změna zobrazovaných informací

V kódu VHDL jsou informace nebo data, která se zobrazí na obrazovce, řízena kurzorovým procesem, který má v seznamu citlivosti jiné hodiny. Tento kód se nazýval BtnCLK, hodiny navržené tak, aby minimalizovaly debouchování tlačítek při jejich stisknutí. To je zahrnuto v tom, že po stisknutí tlačítka se kurzor v horním řádku nepohybuje po sloupcích příliš rychle.

- Hodinový proces pracující na 5 Hz. Tlačítko CLK: proměnná procesu (CLK) btnclkcount: celočíselný rozsah 0 až 10000001: = 0; begin if (rise_edge (CLK)) then if (btnclkcount = 10000000) then btnclkcount: = 0; BtnCLK <= not (BtnCLK); else btnclkcount: = btnclkcount + 1; konec pokud; konec pokud; konečný proces;

S výstupem signálu BtnCLK tohoto procesu nyní můžeme vysvětlit proces kurzoru. Proces kurzoru má v seznamu citlivosti pouze BtnCLK, ale v bloku kódu je stav tlačítek zkontrolován a to způsobí změnu dat pro RedA, RedB… GreenH. Zde je úryvek kódu kurzoru, který obsahuje resetovací blok a blok pro první sloupec.

kurzor: proměnná procesu (BtnCLK) OCursorCol: STD_LOGIC_VECTOR (2 až 0): = "000"; - OCursorCol sleduje předchozí proměnnou sloupce NCursorCol: STD_LOGIC_VECTOR (2 až 0): = "000"; -NCursorCol nastaví začátek nového sloupce kurzoru-podmínka RESET (tlačítko NAHORU)-deska se vymaže, aby se hra restartovala if (rise_edge (BtnCLK)) then if (RST = '1') then 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') then NCursorCol: = "111"; - Sloupec H elsif (Rbtn = '1') pak NCursorCol: = "001"; - Sloupec B elsif (Cbtn = '1') pak NCursorCol: = OCursorCol; - Sloupec zůstává stejný NTurnState <= not (TurnState); - Spustí tah dalšího hráče- Zkontroluje aktuální sloupec zdola nahoru a rozsvítí první LED, která nesvítí. Barva závisí na barvě kurzoru aktuálního hráče. pro ck in 7 až 1 smyčku, pokud (RedA (0) = '1') a (RedA (ck) = '0') a (GreenA (ck) = '0') pak RedA (Ck) <= '1'; RedA (0) <= '0'; VÝSTUP; konec pokud;

if (GreenA (0) = '1') and (RedA (ck) = '0') and (GreenA (ck) = '0') then

GreenA (Ck) <= '1'; GreenA (0) - Red Player GreenA (0) <= '0'; if (NCursorCol = OCursorCol) then - Pokud nebylo stisknuto nic RedA (0) <= '1'; elsif (NCursorCol = "111") pak - Pokud byl stisknut Lbtn RedH (0) <= '1'; RedA (0) <= '0'; elsif (NCursorCol = "001") pak - Iff Rbtn bylo stisknuto RedB (0) <= '1'; RedA (0) - Zelený hráč RedA (0) <= '0'; if (NCursorCol = OCursorCol) then GreenA (0) <= '1'; elsif (NCursorCol = "111") pak GreenH (0) <= '1'; GreenA (0) <= '0'; elsif (NCursorCol = "001") pak GreenB (0) <= '1'; GreenA (0) <= '0'; konec pokud; koncový případ;

Všimněte si, že první příkaz case s názvem: OCursorCol (což znamená Old Cursor Column) je začátek stroje konečného stavu. Každý sloupec displeje je v FSM považován za svůj vlastní stav. Existuje 8 sloupců, takže pro identifikaci každého sloupce jako stavu byla použita 3bitová sada binárních čísel. Jak se FSM pohybuje mezi stavy, závisí na stisknutém tlačítku. Pokud je ve výše uvedeném úryvku stisknuto levé tlačítko, FSM se přesune na „111“, což by byl poslední sloupec displeje. Pokud stisknete pravé tlačítko, FSM se přesune na „001“, což by byl druhý sloupec displeje.

Pokud je stisknuto prostřední tlačítko, FSM se NEPŘESUNE do nového stavu, ale místo toho spustí změnu signálu TurnState, což je jednobitový signál pro zjištění, o kterého hráče jde. Prostřední tlačítko navíc spustí blok kódu, který zkontroluje, zda je úplně dole prázdný řádek úplně nahoru. Pokusí se umístit značku do nejnižší nevyplněné řady. Pamatujte, že se jedná o hru typu connect four.

V příkazu vnořeného případu s názvem: TurnState změníme, jaká je barva kurzoru a pro který sloupec v prvním řádku chceme data změnit, aby proces zobrazení mohl změnu odrážet.

Tento základní kód opakujeme pro zbývajících sedm případů. Diagram FSM může pomoci pochopit, jak se stavy mění.

Krok 5: Kód

Kód
Kód

Toto je funkční kód pro Connect 4, který lze kompilovat ve VHDL pomocí softwaru Vivado.

K dispozici je také omezení, které vám umožní spustit hru.

Poskytli jsme blokové schéma, které vysvětluje, jak jsou propojeny vstupy a výstupy každého procesu.

Doporučuje: