Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki ĆWICZENIE Nr 7 (2h) Obsługa urządzenia peryferyjnego z użyciem pamięci w VHDL. Instrukcja do zajęć laboratoryjnych z przedmiotu Synteza układów cyfrowych studia niestacjonarne, II stopnia, semestr 2 EZ2B200013 Opracował: dr inż. Łukasz Sajewski Białystok 2012 1
1. Cel i zakres ćwiczenia Celem ćwiczenia jest implementacja i inicjacja bloków pamięci w strukturach programowalnych stosowanych do obsługi urządzeń peryferyjnych. 2. Wyświetlacz matrycowy Jako urządzenie peryferyjne posłuży wyświetlacz matrycowy (64 punktowy) wraz z płytką połączeniową i zasilaczem oraz zestaw przełączników dostępny na płycie DE1. Rys. 1. Widok ogólny oraz schemat elektryczny wyświetlacza matrycowego 2
Wspomniany wyświetlacz podłączany jest do układu DE1 poprzez jeden z dwóch 40- pinowych portów rozszerzających oznaczonych jako GPIO_0 lub GPIO_1. Wyświetlacz posiada dwa zestawy diod LED czerwone oraz zielone, w związku z tym do pełnego sterowania wymagane jest użycie 32 pinów. Do sterowania diodami LED zielonymi wykorzystywane są piny GPIO[0..15], natomiast do sterowania diodami LED czerwonymi wykorzystywane są piny GPIO[16..31]. Liczba pinów wynika z budowy wyświetlacza, który posiada 8 kolumn (C1 C8) i 8 wierszy (R1 R8), przy czym wiersze odpowiadają nieparzystym numerom pinów portu GPIO, natomiast kolumny odpowiadają parzystym numerom pinów portu GPIO. Do zaświecenia wszystkich diod czerwonych (diody zielone zgaszone) wystarczy proste połączenie pinów do zasilania oraz do masy. Rys. 2. Schemat prostego połączenia wyświetlacza matrycowego W ramach zadania obsługi statycznej wyświetlacza należy przygotować program który w dwóch przeciwnych rogach wyświetlacza zapala jedną diodę czerwoną i jedną diodę zieloną. W tym celu: 1. Utwórz nowy projekt. 2. Napisz program w VHDL opisujący projektowany układ. 3. Przypisz połączenia portu GPIO. 4. Dokonaj kompilacji projektu. 5. Zaprogramuj FPGA. 6. Podłącz wyświetlacz do płyty DE1 oraz do zasilania 3.3V i przetestuj pracę układu obserwując wyświetlacz. 3. Pamięć w środowisku Quartus II W systemach cyfrowych często konieczne jest zapewnienie pewnej ilości pamięci niezbędnej do wykonania założonego zadania. Jeżeli system jest implementowany w technologii FPGA to istnieje możliwość implementacji pamięci (ROM lub RAM) używając zasobów pamięciowych zawartych w układzie FPGA. Rys. 3. Schemat ogólny bloku asynchronicznej pamięci RAM 3
Rys. 4. Schemat ogólny bloku synchronicznej pamięci RAM Pamięć (ROM lub RAM) w układach FPGA, można zainicjalizować na różne sposoby. Poprzez użycie biblioteki LPM bloków programowalnych, bądź też przez użycie własnego kodu opisującego blok pamięci w środowisku VHDL. LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY memory_1 IS PORT(clk: IN STD_LOGIC; adres: IN INTEGER RANGE 0 TO 7; dane: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END ENTITY; ARCHITECTURE Prosta OF memory_1 IS TYPE blok_pamieci IS ARRAY(0 TO 7) OF STD_LOGIC_VECTOR(7 DOWNTO 0); CONSTANT rom: blok_pamieci := ("00000001", "00000010", "00000100", "00001000", "00010000", "00100000", "01000000", "10000000"); dane <= rom(adres); END; List. 1. Listing odpowiadający pamięci asynchronicznej ROM 8 x 8 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY memory_2 IS PORT(clk, oe, we: IN STD_LOGIC; adres: IN INTEGER RANGE 0 TO 15; dane: INOUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END ENTITY; ARCHITECTURE Prosta OF memory_2 IS 4
TYPE blok_pamieci IS ARRAY(0 TO 15) OF STD_LOGIC_VECTOR(7 DOWNTO 0); PROCESS(clk) VARIABLE ram: blok_pamieci; dane <= (OTHERS => 'Z'); IF oe = '0' THEN dane <= ram(adres); ELSIF we = '0' THEN ram(adres) := dane; END IF; END PROCESS; END; List. 2. Listing odpowiadający pamięci synchronicznej RAM 16 x 8 W ramach zadania treningowego zaimplementować dowolny blok pamięci i przetestować jego działanie podłączając odpowiednie sygnały wejściowe (z wykorzystaniem przełączników dostępnych na płycie DE1) i wyjściowych (diody LED). W tym celu: 1. Utwórz nowy projekt. 2. Napisz program w VHDL opisujący projektowany układ. 3. Przypisz połączenia. 4. Dokonaj kompilacji projektu. 5. Zaprogramuj FPGA. 6. Przetestuj pracę układu. 4. Obsługa wyświetlacza matrycowego z wykorzystaniem pamięci ROM Obsługa wyświetlacza matrycowego w sposób dynamiczny sprowadza się do cyklicznego odczytu pamięci i przekazywaniu danych w niej zapisanych (w postaci zer i jedynek) na port do którego dołączone jest urządzenie. Schemat poglądowy układu obsługi dynamicznej wyświetlacza matrycowego dany jest poniżej. Zegar INPUT inst3 lpm_counter1 modulus 50000000 q[25..0] cout inst2 lpm_counter0 modulus 8 q[3..0] memory clk adres[3..0] dane1[7..0] dane2[7..0] OUTPUT OUTPUT Wiersze_wy swietlacza Kolumny _wy swietlacza inst Rys. 5. Schemat układu obsługi wyświetlacza na bazie pamięci ROM Sygnał Zegar jest sygnałem prostokątnym generowanym przez jeden z trzech kwarców dostępnych na płycie DE1 (24MHz, 27MHz, 50MHz). Licznik lpm_counter1 spełnia rolę 5
dzielnika częstotliwości. Licznik lpm_countr0 spełnia rolę układu adresującego pamięć. Częstotliwość odczytu pamięci wyznacza sygnał cout z licznika lpm_counter1. Do poprawnego wyświetlania (bez efektu mrugania wyświetlanego znaku lub niewyraźnego wyświetlania) konieczne jest uzyskanie częstotliwości odczytu około 500Hz. Blok pamięci memory zawiera predefiniowane dane związane z wyświetlanym znakiem jaki mamy zaobserwować na wyświetlaczu. Blok pamięci posiada dwa wyjścia sterujące odpowiednio wierszami i kolumnami wyświetlacza. W jednym takcie zegara na wyjściu pamięci pojawia się 8-bitowe słowo sterujące wierszem i 8-bitowe słowo sterujące kolumną. Stan niski na jednym z bitów słowa sterującego wybiera które pole wyświetlacza matrycowego zostanie zaświecone. Powtarzanie operacji z częstotliwością około 500Hz da w efekcie możliwość wyświetlenia dowolnego znaku złożonego z 64 punktów wyświetlacza matrycowego. W ramach zadania zaimplementować układ, który na wyświetlaczu matrycowym wyświetla zdefiniowany znak (np. ). W tym celu: 1. Utwórz nowy projekt. 2. Posługując się schematem z Rys.5. napisz program w VHDL z użyciem pamięci opisujący projektowany układ. 3. Przypisz połączenia portu GPIO. 4. Dokonaj kompilacji projektu. 5. Zaprogramuj FPGA. 6. Przetestuj pracę układu. ENTITY memory IS PORT(clk: IN STD_LOGIC; adres: IN INTEGER RANGE 0 TO 7; wyj: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)); END ENTITY; ARCHITECTURE Behaviour OF memory IS TYPE blok_pamieci IS ARRAY(0 TO 7) OF STD_LOGIC_VECTOR(7 DOWNTO 0); CONSTANT rom1: blok_pamieci := ("00000001", "00000010", "00000100", "00001000", "00010000", "00100000", "01000000", "10000000"); --wybiera kolejne wiersze wyświetlacza CONSTANT rom2: blok_pamieci := ( --litera H "11111110", "11111110", "11000110"); --sekwencja do wyświetlenia SIGNAL in1, in2: STD_LOGIC_VECTOR(7 DOWNTO 0); PROCESS(clk) in2 <= NOT rom1(adres); in1 <= NOT rom2(adres); END PROCESS; 6
wyj<=in1(7)&in2(7)&in1(6)&in2(6)&in1(5)&in2(5)&in1(4)&in2(4)&in1(3)&in2(3) &in1(2)&in2(2)&in1(1)&in2(1)&in1(0)&in2(0); END; List. 3. Listing realizujący wyświetlanie litery H z użyciem dwóch bloków pamięci ROM 8 x 8 5. Rozbudowana obsługa wyświetlacza matrycowego Punkt 4 przewiduje wyświetlanie jednego znaku na wyświetlaczu matrycowym. W zadaniu tym należy rozbudować program z wcześniejszego punktu w taki sposób, by można było na wyświetlaczu uzyskać kolejne litery napisu HELLO przełączane przyciskiem KEY. _50 INPUT inst key [0] lpm_counter0 modulus 100000 q[17..0] cout INPUT inst1 inst8 lpm_counter1 lpm_counter2 modulus 8 q[2..0] q[1..0] memory _e clk st[1..0] adres[2..0] inst7 dane1[7..0] dane2[7..0] obw_wy j in1[7..0] in2[7..0] inst3 output[15..0] gpio_1[15..0] OUTPUT gpio_1[31..16] OUTPUT Rys. 6. Schemat przykładowego rozwiązania 6. Sprawozdanie Sprawozdanie z zajęć laboratoryjnych powiano zawierać: 1. Opis słowny zadania do realizacji 2. Założenia realizowanego zadania 3. Procedurę projektową 4. Listingi gotowych programów 5. Weryfikację działania układu 6. Uwagi i wnioski Literatura: 1. Barski M., Jędruch W.: Układy cyfrowe, podstawy projektowania i opisu w języku VHDL, Wydawnictwo Politechniki Gdańskiej, 2007. 2. Łuba T.: Synteza układów cyfrowych, WKiŁ, Warszawa, 2004. 3. Mano M.M., Kime Ch.R.: Podstawy projektowania układów logicznych i komputerów, NT, Warszawa 2007. 4. Skahill K.: Język VHDL Projektowanie programowalnych układów logicznych, WNT, Warszawa, 2001. Zamieszczone w instrukcji zrzuty ekranowe oraz zdjęcia pochodzą z materiałów firmowych dostarczonych przez firmę Altera. 7