FlyingDutch Napisano Luty 11, 2018 Udostępnij Napisano Luty 11, 2018 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 Cytuj Link do komentarza Share on other sites More sharing options...
JTyburski Luty 13, 2018 Udostępnij Luty 13, 2018 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ć 🙂) Cytuj Link do komentarza Share on other sites More sharing options...
FlyingDutch Luty 13, 2018 Autor tematu Udostępnij Luty 13, 2018 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 Cytuj Link do komentarza Share on other sites More sharing options...
JTyburski Luty 13, 2018 Udostępnij Luty 13, 2018 Pewnie na Alibabie czy Aliexpress znajdziesz takowe gniazdko 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
FlyingDutch Luty 16, 2018 Autor tematu Udostępnij Luty 16, 2018 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 Cytuj Link do komentarza Share on other sites More sharing options...
FlyingDutch Luty 18, 2018 Autor tematu Udostępnij Luty 18, 2018 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 1 Cytuj Link do komentarza Share on other sites More sharing options...
FlyingDutch Luty 25, 2018 Autor tematu Udostępnij Luty 25, 2018 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 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!