Skocz do zawartości

Gra VGA - prosta platformówka ze starych Nintendo (na ElbertV2)


Pomocna odpowiedź

Napisano

Cześć,

zabrałem się tym razem za prze-portowanie bardzo prostej platformówki (w stylu Nintendo) na FPGA ElbertV2.

Chodzi o grę z tego linku:

https://www.circuitben.net/node/24

Było kilka błędów, ale udało się je wyeliminować (były to bardzo proste błędy).

Po syntezie na Spartan3A z Elbert'a gra zajmuje około 486 LUT (34%) i jeden blok pamięci oraz trochę pinów I/O. Znów trzeba było użyć pętli PLL - 25 MHz, dla odmiany źródła tej gry są w VHDL.

Patrz obrazek:

Pozostało do przerobienia sterowanie postacią z NES controller na przyciski na płytce ElbertV2. Gra jest dużo ciekawsza niż PONG 😉

Jak będę miał to działające to umieszczę źródła projektu ISE dla Elberta na tej stronie (spakowany projekt).

BTW: właśnie próbuję podłączyć i obsłużyć "nunchuk" z Nintendo Wii do Elberta - jeśli coś z tego wyjdzie to zrobię dwie wersje tej platformówki:

1) Ruch postaci za pomocą klawiszy Elberta

2) Ruch postaci za pomocą "nunchuk'a" do Nintendo Wii

Pozdrawiam

A już myślałem, że ty robiłeś konwersję z innego języka czy platformy, skoro mówisz "przeportowanie" (bo tak to się u nas inżynierów nawet programistów to pojęcie się rozumie) - no ale nieistotne (po prostu dokonałeś pomyślnej implementacji projektu z podanego linka już tak uściślając).

Sam projekt nawet git - bym powiedział najprościej zrobiony jak się da (właśnie ja tak swoją pracę inżynierską zrobiłem). Niemniej tu ważny niuans, na który warto zwrócić uwagę - otóż tutaj facet stosuje moduły które mają pełnić rolę pamięci ROM, zawierającej obiekty mapy itd. To co zrobił jest oczywiście na logikę poprawne, ale czasem środowiska nie rozpoznają tego, że to chodzi o pamięć ROM i wymuszają na układzie (a właściwie jego tablicach LUT), aby sam się zachowywał jak takowa pamięć (czyli powstaje absurd - masz bloki pamięciowe, a nie są stosowane, bo układ próbuje się zachować jak te bloki). Z czego to wynika? Po prostu z niedoskonałości środowisk i założeń jakie przyjęli jego twórcy (ot wymyślili, że do opisu pamięci ROM starczy taki, a siaki kod i bez namysłu na sztywno go dorzucili do kompilatora, że tak ma być i koniec, bez uwzględniania innych możliwych wariancji - ot taki "tępy" kompilator zrobiony na łatwiznę - szczególnie to widać w Quartusie, który jest "tępy" okropnie w tym względzie i trzeba używać "template-a" który oferuje i dopiero po nim się orientuje, że należy to przekształcić na bloki pamięciowe). To tak na boku - taka dobra wskazówka projektancka, żeby zwracać uwagę na to, że tam gdzie się da to tam należy spychać funkcjonalność na pamięć (u ciebie widzę jednak, że prawdopodobnie tak się stało, bo coś mało LUT-ów użytych zostało - no ale mogę się mylić 🙂)

A już myślałem, że ty robiłeś konwersję z innego języka czy platformy, skoro mówisz "przeportowanie" (bo tak to się u nas inżynierów nawet programistów to pojęcie się rozumie) - no ale nieistotne (po prostu dokonałeś pomyślnej implementacji projektu z podanego linka już tak uściślając).

To tak na boku - taka dobra wskazówka projektancka, żeby zwracać uwagę na to, że tam gdzie się da to tam należy spychać funkcjonalność na pamięć (u ciebie widzę jednak, że prawdopodobnie tak się stało, bo coś mało LUT-ów użytych zostało - no ale mogę się mylić 🙂)

Cześć Jakub,

miło Cię usłyszeć. Raczej został użyty jeden z bloków pamięci. Na razie utknałem z obsługą "Nunchuka" od Nintendo WII - nie dlatego, że nie wiem jak on działa, ale z powodu braku gniazdka takiego jak jest w konsoli Nintendo (mam tylko oryginalne nunchuki od konsoli i nie chcę ich niszczyć - pewnie gdzieś w chińskim sklepie znajdę podróbkę Nunchuka).

Pozdrawiam

Pewnie na Alibabie czy Aliexpress znajdziesz takowe gniazdko 🙂

Cześć,

właśnie znalazłem "Wii nunchuk" za około 21 PLN w chińskim sklepie i zamówiłem:

https://www.banggood.com/Classic-Nunchuck-Controller-for-Wii-Wii-U-Black-and-White-Color-p-908998.html?rmmds=search&cur_warehouse=CN

, tak, że postaram się go użyć w tej grze (i może jakichś innych w przyszłości - Utnę mu złącze i podlutuję kable do takiego gniazdka, że da się bezpośrednio podłączyć do ElbertaV2) 😉

Pozdrawiam

Cześć,

platformówka VGA poprawnie wyświetla się na monitorze VGA. Zamieszczam cały działający projekt (nie musicie się obawiać przed wgraniem na Elberta plik ucf jest poprawny - wgrałem u siebie grę).

Nie działa jeszcze ruch postaci (w tym wypadku czerwonego klocka), trzeba przerobić kod na obsługę przycisków w Elbercie, lub jakiś inny kontroler. Czekam, aż przyjdzie zamówiony w chińskim sklepi "nunchuk" od Nintendo Wii - jak przyjdzie postaram się dodać jego obsługę w grze. W międzyczasie pewnie dodam też obsługę ruchu postaci za pomocą przycisków Elberta.

Pilk bin do wgrania do FPGA to "ss.bin" (w zamieszczonym projekcie ISE).

A tak gra wygląda na ekranie monitora VGA:

W załączniku spakowany plik projektu gry "ISE" dla Elberta.

Podłączyłem shield firmy Keyestudio z joystickiem i czterema przyciskami do Elberta (bo na przyciskach z Elberta słabo by się grało ). Niestety joystic jest analogowy, więc potrzebny byłby przetwornik analogowo-cyfrowy. Na razie użyję przycisków z tego shieldu do sterowania grą (dopóki nie będę miał nunchuka).

Tak to wygląda:

Biorę się teraz za przeróbkę gry, aby działała z tymi przyciskami.

Pozdrawiam

ARCADE01.zip

  • Lubię! 1

Cześć,

platformówka działa już w pełni (ruch "postaci" za pomocą 4 switchy z Elberta).

Nie jest to ładnie zrobione (przeróbka) - raczej polega na "chamskim" hacku w entity read_pad.vhd. Kod tego entity wygląda teraz tak:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.STD_LOGIC_UNSIGNED.all;

ENTITY read_pad IS PORT (
   clock:              IN STD_LOGIC;
   pad_data:           IN STD_LOGIC;
   pad_clock:          OUT STD_LOGIC;
   pad_load:           OUT STD_LOGIC;
   pad_state:          OUT STD_LOGIC_VECTOR(7 downto 0);
 jumpBtn:            IN STD_LOGIC;
   leftBtn:            IN STD_LOGIC; 
 rightBtn:           IN STD_LOGIC; 
 resetBtn:           IN STD_LOGIC 
);
END;

ARCHITECTURE read_pad OF read_pad IS

 component debounce is
      port (  clk    : IN  STD_LOGIC;  --input clock
				button  : IN  STD_LOGIC;  --input signal to be debounced
				result  : OUT STD_LOGIC); --debounced signal
   end component;	

   SIGNAL ser_clock: STD_LOGIC;
   SIGNAL div_count: STD_LOGIC_VECTOR(3 downto 0);
   SIGNAL data: STD_LOGIC_VECTOR(7 downto 0);
   SIGNAL bit_num: STD_LOGIC_VECTOR(2 downto 0);
   SIGNAL done: STD_LOGIC;
 SIGNAL jumpBtnDeb: STD_LOGIC;
 SIGNAL leftBtnDeb: STD_LOGIC;
 SIGNAL rightBtnDeb: STD_LOGIC;
 SIGNAL resetBtnDeb: STD_LOGIC;

BEGIN

D1: debounce port map (clock, jumpBtn, jumpBtnDeb);
D2: debounce port map (clock, leftBtn, leftBtnDeb);
D3: debounce port map (clock, rightBtn, rightBtnDeb);
D4: debounce port map (clock, resetBtn, resetBtnDeb);

   PROCESS (clock)
   BEGIN
     IF clock'Event AND clock = '1' THEN
	   pad_state <= "00000000";

	   if leftBtnDeb = '0' then 
	     pad_state(1) <= '1';
	   end if;
	   if rightBtnDeb = '0' then
	     pad_state(0) <= '1';
	   end if;
	   if jumpBtnDeb = '0' then
          pad_state(7) <= '1';
	     pad_state(6) <= '1';
	   end if;
		if resetBtnDeb = '0' then
          pad_state(4) <= '1';
	     pad_state(5) <= '1';
	   end if;

	END IF;
   END PROCESS;


--    pad_state <= "00000000";
END read_pad;

Ruch jest obsługiwany przez 4-ry switche Elberta (dolny romb):

SW3 - Jump

SW6 - Left

SW4 - Right

SW5 - Reset gry

W załączniku cały projekt ISE działającej w pełni gry (plik do wgrania ss.bin).

Niestey "nunchuk" jeszcze nie przyszedł.

BTW: gra "sama w sobie" jest bardzo prosta i nudna - traktuję jej uruchomienie jako "wprawkę", aby nauczyć się jak generować bardzo prosty "Świat" gry 😉

Pozdrawiam

ARCADE01.zip

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...