Spisu treści:

Gra reakcji FPGA: 10 kroków
Gra reakcji FPGA: 10 kroków

Wideo: Gra reakcji FPGA: 10 kroków

Wideo: Gra reakcji FPGA: 10 kroków
Wideo: ZROBIĘ 100,000 KROKÓW w 24H - FRIZ DA MI NIESPODZIANKĘ 2024, Lipiec
Anonim
Gra reakcji FPGA
Gra reakcji FPGA

Przez Summer Rutherford i Regita Soetandar

Krok 1: Wprowadzenie

Dla naszego ostatniego projektu dla CPE 133 zaprojektowaliśmy grę reakcji w VHDL dla płyty Basys3. Tę grę można najdokładniej porównać do gry zręcznościowej „Układacz”, w której gracz musi upuszczać klocki we właściwym czasie. Płytka Basys3 jest połączona z płytką stykową, na której znajdują się naprzemienne diody LED. Te diody LED będą się zmieniać z określoną częstotliwością, w zależności od poziomu. Ta gra wykorzystuje dzielnik zegara i 4-cyfrowy 7-segmentowy wyświetlacz, a także automat skończony. Gdy gracz aktywuje odpowiedni przełącznik, gdy zapali się środkowa dioda LED, gracz przejdzie do następnego poziomu gry, zwiększając częstotliwość naprzemiennych diod LED. To sprawia, że każdy kolejny poziom jest trudniejszy niż poprzedni. Gdy gracz pomyślnie pokona poziom 7, najwyższy, na wyświetlaczu segmentowym zostanie wyświetlony komunikat, a wszystkie diody LED będą jednocześnie migać i świecić.

Krok 2: Materiały

Materiały
Materiały
Materiały
Materiały
Materiały
Materiały

Materiały, których będziesz potrzebować to:

  • Płyta Digilent Basys3 z kablem micro USB
  • Deska do krojenia chleba
  • 5 diod LED
  • 5 rezystorów (użyliśmy 220 omów)
  • 11 przewodów połączeniowych
  • Komputer z Vivado

Krok 3: Projekt czarnej skrzynki na diagramie najwyższego poziomu

Schemat najwyższego poziomu w czarnej skrzynce
Schemat najwyższego poziomu w czarnej skrzynce
Schemat najwyższego poziomu w czarnej skrzynce
Schemat najwyższego poziomu w czarnej skrzynce

Jak widać, nasz schemat blokowy najwyższego poziomu zaczyna się od pobrania wymaganych zegarów z naszego modułu podrzędnego ClkDivide. Te zegary są wejściami do różnych bloków procesowych. Zasadniczo gra musi rozpoznać, że gdy użytkownik prawidłowo włączy przełącznik, diody LED muszą zacząć się szybciej zmieniać, a wyświetlacz musi wzrosnąć o jeden poziom. Schemat blokowy może wyglądać trochę szalenie, ale dzieje się tak dlatego, że istnieje wiele sygnałów, które są ustanowione w pewnym procesie, a następnie ten sygnał definiuje inny sygnał w innym bloku procesu.

Ostatecznie jedynymi danymi wejściowymi, jakie pobiera gra, są zegar wejściowy na płycie Basys3, który działa z częstotliwością 100 MHz, siedem przełączników na płycie Basys3 i przycisk resetowania. To, co jest wyprowadzane, to anoda dla siedmiosegmentowego wyświetlacza, siedmiosegmentowy wyświetlacz i diody LED.

Krok 4: CLKDPodziel

CLKDPodziel
CLKDPodziel
CLKDPodziel
CLKDPodziel
CLKDPodziel
CLKDPodziel

Ten podmoduł dzielnika zegara utworzył wolniejszy zegar w zależności od wartości, którą zmapowaliśmy do niego w naszym głównym pliku. Użyliśmy tego podmodułu do określenia Clk400, PushClk i newlck. Ten podmoduł przyjmuje jako wejścia zegar i 32-bitowy dzielnik. Wyprowadzany jest spowolniony zegar. Jest blok procesowy dla dzielnika i spowolnionego zegara. W tym procesie jest zmienna tymczasowa, którą nazwaliśmy count, która zlicza jeden za każdym razem, gdy uderzy się w zbocze narastające wprowadzonego zegara. Gdy osiągnie liczbę dzielnika, spowolniony zegar przełączy się, a licznik zostanie zresetowany do zera.

Krok 5: Przesuń blok procesu

Przesunięcie bloku procesu
Przesunięcie bloku procesu

Blok procesu Shift kontroluje naprzemienny ruch i prędkość diod LED. Na liście czułości znajdują się sygnały newclk i stop. Stop powoduje krótkie opóźnienie, gdy użytkownik przekroczy poziom. Jeśli Stop nie jest wysoki, diody LED zmieniają się normalnie, w zależności od prędkości newclk. Ten naprzemienny wzór jest kontrolowany przez dwie zmienne: Śledzenie i liczenie. Count określa, która dioda LED powinna być włączona, podczas gdy Track określa, czy liczba ma odliczać w górę, czy w dół. Jest inny sygnał, Finał, który ma zastosowanie tylko wtedy, gdy Poziom wynosi „111,” wskazujący, że gracz wygrał grę. Final zmienia się od 0 do 1 na każdej krawędzi zegara, aby stale włączać i wyłączać diody LED. To tylko wizualny element końcowego pokazu.

Ten proces zmianowy jest idealnym miejscem do rozpoczęcia tego projektu. Jeśli możesz sprawić, że diody LED będą się prawidłowo i konsekwentnie zmieniać, to od tego momentu musisz tylko dodać zachowanie podczas zdobywania poziomów!

Krok 6: Maszyna skończona

Maszyna skończona
Maszyna skończona

Stworzyliśmy maszynę skończoną, aby dyktować zachowanie po naciśnięciu przełącznika wejściowego lub przycisku resetowania. Każdy stan jest „poziomem”, a jeśli przełącznik zostanie włączony w niewłaściwym czasie lub zostanie naciśnięty reset, poziom powraca do „000”. W przeciwnym razie, jeśli przełącznik jest prawidłowo włączony, poziom podnosi się, aż osiągnie stan końcowy „111” i pojawi się ekran końcowy. FSM opiera się na dwóch blokach procesowych sync_proc i comb_proc. Sync_proc używa zegara, który nazwaliśmy PushClk. Ten zegar kontroluje, jak szybko następny stan staje się stanem obecnym. Ten zegar powinien być dość szybki; wybraliśmy prędkość, która była około dwa razy większa niż nasza najszybsza prędkość LED.

Zaimplementowaliśmy ten kod przy użyciu FSM dla poziomów; jednak po tym projekcie zdaliśmy sobie sprawę, że bardziej wydajnym wykorzystaniem FSM może być posiadanie stanu odliczania, stanu resetowania lub stanu wstrzymania. Jeśli nic nie jest naciskane, jest w stanie podtrzymania. Jeśli reset jest wciśnięty lub gracz zawiódł, jest w stanie resetowania. Prawidłowo naciśnięty jest w stanie odliczania. Istnieje wiele innych sposobów wykorzystania FSM w tej grze!

Krok 7: Kontrolowanie bloku procesu wyświetlania za pomocą poziomu

Sterowanie blokiem procesu wyświetlania za pomocą poziomu
Sterowanie blokiem procesu wyświetlania za pomocą poziomu

Poziom kontroluje blok procesu wyświetlania. Zmienne na liście czułości to Level, Reset i Clk400. 7-segmentowy wyświetlacz zaczyna się od wyświetlenia „1” dla pierwszego poziomu. Liczy do 7 za każdym razem, gdy użytkownik przechodzi poziom, aby pokazać użytkownikowi, na jakim poziomie się znajduje. Gdy użytkownik przejdzie poziom 7, wyświetla się „COOL”, co oznacza, że gracz ukończył grę. Ten „COOL” wyświetlacz działa na zegarze 400 Hz, który nazwaliśmy Clk400. Jeśli zostanie naciśnięty przycisk Reset, wyświetlacz powróci do „1”.

Krok 8: Kontrolowanie prędkości LED za pomocą poziomu

Kontrolowanie prędkości LED za pomocą poziomu
Kontrolowanie prędkości LED za pomocą poziomu

Na koniec Level kontroluje prędkość diod LED. Jedynym sygnałem na liście czułości jest poziom. D1 to sygnał, który przechodzi do procesu dzielnika zegara, aby uzyskać nowy zegar. Za każdym razem, gdy zmienia się poziom lub zmienia się stan, blok procesu „Prędkość”. Ten proces określa wartość D1. Istnieje 8 zdefiniowanych wartości D1, które wybraliśmy na podstawie tego, jak szybko chcieliśmy uruchomić każdy poziom. D1 zmniejsza się za każdym razem, gdy zwiększa się poziom, dzięki czemu nowicjusz biega szybciej.

Krok 9: Montaż sprzętu

Montaż sprzętu
Montaż sprzętu

Płytkę stykową podłączyliśmy do Basys3 za pomocą jednego ze złącz pmod. Sześć portów pmod zostało użytych do podłączenia złącza męskiego do męskiego, jeden do masy, a pozostałe pięć do 5 diod LED. Do każdej diody umieściliśmy również rezystor. Rezystory te mają 220 Ω i zapobiegają zwarciu i przepaleniu diod LED. Chociaż każda dioda LED ma pewną rezystancję, rezystancja nie jest wystarczająca, aby zakłócić napięcie ze źródła.

Krok 10: Baw się dobrze

Ta gra jest bardzo łatwa do grania. Gracz zaczyna na skrajnym prawym przełączniku 1 na planszy, V17. Muszą przestawić przełącznik wysoko, gdy środkowa dioda LED jest włączona. Następnie przesuwają jeden przełącznik w lewo i robią to samo! Jeśli gracz dotrze do końca, trafi na siódmy przełącznik, W14. Jeśli pokonają grę, zobaczą naprawdę zabawne zakończenie!

Należy zauważyć, że podczas tworzenia tej gry prędkość zależy wyłącznie od Ciebie! Jeśli wybrane przez nas prędkości są zbyt wolne, możesz je przyspieszyć i uczynić je jeszcze większym wyzwaniem! Nie ma też ustalonej liczby poziomów. Jeśli chcesz, aby miał jeszcze więcej poziomów, musisz wprowadzić modyfikacje w FSM i blokach procesu określonych przez poziom, ale są to bardzo proste zmiany.

Zdecydowaliśmy się również użyć przełączników na płycie jako danych wejściowych użytkownika, ale jest to również możliwe za pomocą przycisku na płycie Basys3; przycisk wyeliminuje konieczność resetowania przełączników za każdym razem, gdy użytkownik zaczyna od nowa. Początkowo używaliśmy przycisku, jednak powodowało to błędy w definiowaniu poziomu, ponieważ przeskakiwałby o wiele poziomów, gdyby dwie narastające krawędzie PushClk zostały trafione, gdy przycisk był przytrzymywany.

Poniżej znajduje się film pokazujący, jak grać, przechodząc przez pierwsze 4 poziomy i końcowy ekran zakończenia.

Główny plik tego projektu znajduje się poniżej.

Źródła

Instrukcja obsługi Basys3

Inspiracja do projektu - gra Arduino Stop It

Zalecana: