Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki ĆWICZENIE Nr 8 (3h) Implementacja pamięci ROM w FPGA Instrukcja pomocnicza do laboratorium z przedmiotu Programowalne Struktury Logiczne studiów stacjonarnych I stopnia kierunku: Elektronika i Telekomunikacja specjalność: Aparatura elektroniczna Kod przedmiotu: TS1C420301 Instrukcję opracował: dr inż. Marian Gilewski Białystok 2014
1. Cel ćwiczenia Celem ćwiczenia jest nauka implementacji i inicjacji bloków pamięci ROM w strukturach programowalnych. 2. Część pierwsza synteza wewnętrznej pamięci ROM Z poziomu edytora graficznego z lewego menu wybieramy opcję nowego elementu (symbol bramki) a następnie w dolnej części aktywujemy MegaWizard Plug-In Manager. Następnie wybieramy Create a new custom megafunction variation i zatwierdzamy opcją Next
Następnie wybieramy grupę funkcji Memory Compiler a w niej ROM: 1 PORT, język opisu komponentu (VHDL) oraz wpisujemy nazwę pliku wynikowego. Syntezowana pamięć jest typu synchronicznego, oprócz szyny adresowej oraz wyjściowej szyny danych zawiera wejście sygnału zegarowego synchronizującego operację odczytu. Przy czym w zależności od konfiguracji synchronizacja szyn adresowej i danych może odbywać się za pomocą tego samego sygnału zegarowego lub dwóch niezależnych. Zawartość pamięci jest wpisywana do pliku heksadecymalnego lub pliku o wewnętrznym formacie typu.mif. Plik ten jest pobierany przez system projektowy podczas kompilacji a jego zawartość włączana do struktury. Plik konfigurujący należy przygotować przed rozpoczęciem procesu kompilacji. Sposób jego przygotowania został opisany w następnym rozdziale. Lokalizacja pamięci ROM w strukturze FPGA może zachodzić w dwóch obszarach: w wydzielonych blokach pamięci (np. M4K) lub w tablicach LUT struktury programowalnej wówczas mówimy o pamięci rozproszonej. Pamięć rozproszoną o niewielkiej pojemności wygodniej jest przygotować pisząc komponent bezpośrednio w kodzie VHDL. Kolejne okna konfiguracyjne MegaWizard służą do parametryzacji projektowanej pamięci ROM. W pierwszym z nich (przedstawionym na następnym rysunku) definiowana jest: - szerokość słowa (liczba bitów) danych w pamięci, - miejsce lokalizacji domyślne/m4k/lcs/... itp., - głębokość pamięci liczba słów danych (32, 64,...), - liczba sygnałów zegarowych pojedyńczy (danych), oddzielny (danych i adresu).
Kolejne okno umożliwia wybór opcji: rejestrowego bufurowania danych wyjściowych/adresowych, utworzenia wejścia zezwolenia sygnału zegarowego, utworzenia asynchronicznego wejścia zerowania rejestrów buforowych. Piąte okno konfiguracyjne służy do podania nazwy i lokalizacji pliku zawartości pamięci (.hex lub.mif).
Kolejne okna zawierają bilans konfiguracji
Ostatnim etapem jest przeniesienie symbolu ROM w pole rysunkowe edytora graficznego Proszę zinterpretować strukturę wygenerowanego przez MegaWizard pliku VHDL opisującego ROM. 3. Część druga przygotowanie pliku inicjującego zawartość pamięci ROM Plik inicjujący jest tworzony z poziomu menu głównego systemu projektowego, w tym celu wybieramy funkcję Nowy plik a w nim Memory Files oraz w zależności preferencji: Memory Initialization File (.mif) lub Hexadecimal File (.hex).
Następnie należy określić głębokość pamięci (liczbę słów) i długość słowa danych (liczbę bitów komórki pamięci) - identyczne jak zarezerwowano to wcześniej w MegaWizard, a następnie wypełnić zawartość poszczególnych komórek i plik zapisać. Zawartość tak przygotowanego pliku zostanie wpisana do wewnętrznej struktura FPGA podczas programowania. Pliki konfigurujące są typu tekstowego, co oznacza, że ich edycję można przeprowadzać z użyciem dowolnego edytora tekstowego typu ASCII (nie dodającego znaków specjalnych). Należy przy tym zwracać uwagę na układ pliku tekstowego i użytych znaków separujących spacji i tabulacji. Wartości (adres i dane) w pliku konfiguracyjnym.mif mogą być wprowadzane w kodzie NKB, heksadecymalnym bądź dziesiętnie. Duże pliki konfiguracyjne jest wygodniej edytować inicjując je w wewnętrznym edytorze.mif a następnie obrabiając za pomocą edytora zewnętrznego i arkusza kalkulacyjnego. Zwłaszcza w arkuszu kalkulacyjnym wygodniej jest wprowadzić powtarzające się bloki danych lub stabelaryzowane wartości funkcji analitycznych, a następnie arkusz wyeksportować do edytora tekstowego.
4. Zadanie projektowe 1 Proszę przygotować i zainicjować z użyciem modułu MegaWizard pamięć ROM, której zawartość będzie konwertować wejściową 6-bitową liczbę binarną (szyna adresowa) na dwie wyjściowe liczby 7-bitowe (14-bitowa = 2 x 7 szyna danych) obsługujące dwie cyfry wyświetlacza siedmiosegmentowego. Plik konfigurujący zawartość pamięci proszę przygotować w formacie.mif. 5. Zadanie projektowe 2 synteza pamięci rozproszonej Rozproszoną pamięć ROM o niewielkiej pojemności można definiować w postaci tablicowej bezpośrednio w kodzie VHDL, wówczas do jej syntezy kompilator użyje przerzutników tablicy logicznej FPGA. Małą pamięć można zrealizować również używając np. instrukcji selektywnego przypisania do sygnału:... with Moj_adres select Moje_slowa <= "00100110 when 0000, 10101010 when 0001, 11001101 when 0010, 10101010 when 0011, 11001101 when 0100, 10001010 when 0101, 11101101 when 0110, 10111010 when 0111, 11111101 when 1000, 10101010 when 1001, 11101101 when 1010, 10111010 when 1011, 11011101 when 1100, 10001010 when 1101, 11111101 when 1110, 11111111 when others; Proszę zaprojektować, dokonać syntezy z zbadać pamięć rozproszoną ROM, która będzie dokonywać konwersji 4 bitowej liczby binarnej w kodzie dwójkowym znak moduł na 4 bitową liczbę binarną w kodzie znak uzupełnienie do 2. 6. Zadanie dodatkowe dla chętnych. Korzystając z dokumentacji technicznej DE2 proszę zaimplementować obsługę zewnętrznej pamięci Flash dostępnej w module prototypowym. Literatura: 1. Barski M., Jędruch W.: Układy cyfrowe, podstawy projektowania i opisu w języku VHDL, Wydawnictwo Politechniki Gdańskiej, 2007. 3. Łuba T.: Synteza układów cyfrowych, WKiŁ, Warszawa, 2004. 4. Mano M.M., Kime Ch.R.: Podstawy projektowania układów logicznych i komputerów, NT, Warszawa 2007. 5. Skahill K.: Język VHDL Projektowanie programowalnych układów logicznych, WNT, Warszawa, 2001.