Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki ĆWICZENIE Nr 8 (3h) Implementacja pamięci RAM w FPGA. Instrukcja pomocnicza do laboratorium z przedmiotu Synteza układów cyfrowych ES2C100005 studiów stacjonarnych II stopnia kierunku: Elektrotechnika Opracował: dr inż. Walenty Owieczko dr inż. Marian Gilewski Białystok 2013
1. Cel ćwiczenia. Celem ćwiczenia jest implementacja w strukturach programowalnych lub obsługa zewnętrznych pamięci RAM. Ogólny schemat modułu pamięci RAM przedstawiono rysunku 1a. Rys. 1. Moduł pamięci RAM o organizacji 32 komórek 8 bitowych. Zawiera on 32 słowa 8 bitowe, adresowane 5 bitową szyną adresową (Address ) oraz 8 bitową szynę danych (Data) i wejściowy sygnał sterujący (Write). Rozważymy dwa różne sposoby implementacji pamięci: wykorzystując dedykowane bloki pamięci w układzie FPGA, używając zewnętrznego układu pamięci. Układ Cyclone II 2C35 FPGA zamontowany na płycie DE2 zawiera dedykowane zasoby pamięciowe, zwane blokami M4K. Każdy taki blok zawiera pamięć 4096 bitową, która może być konfigurowalna w bloki o różnej organizacji. Stałym parametrem jest współczynnik kształtu, określony iloczynem liczby słów (komórek) i długością słowa, wyrażony w bitach. Przykładowo, blok M4K może być organizowany w struktury: 4k x 1, 2k x 2, 1k x 4 oraz 512 x 8. W ćwiczeniu będziemy użytkować blok 512 x 8, wykorzystując pierwsze 32 słowa pamięci. Istnieją dwie ważne cechy M4K o których należałoby wspomnieć. Po pierwsze, zawiera on rejestry, które mogą zsynchronizować wszystkie sygnały wejściowe i wyjściowe z sygnałem zegarowym. Po drugie M4K posiada oddzielne wejściowe i wyjściowe szyny danych. Wymagania synchronizacji M4K dotyczą portów wejściowych, portu wyjściowego lub wszystkich jednocześnie. Wymagania te będziemy implementować modyfikując moduł RAM 32 x 8 pokazany na rysunku 1b. Zawiera on rejestry: szyny adresowej, wejściowej szyny danych, sygnału sterującego zapisem i nie buforowanej wyjściowej szyny danych.
2. Część pierwsza. Stosowanie w systemie Quartus II struktur logicznych takich jak: sumatory, rejestry, liczniki i pamięci może odbywać się z zastosowaniem biblioteki elementów parametryzowalnych LPM. W przypadku syntezy pamięci RAM w wydzielonych blokach pamięci FPGA postępujemy podobnie jak w poprzednim ćwiczeniu używając modułu MegaWizard. Przy czym istnieje możliwość syntezy pamięci RAM: 1 portowej, 2 portowej, 3 portowej lub typu FIFO. W ćwiczeniu ograniczymy się do badania pamięci jednoportowej. 1. Utwórz nowy projekt w systemie Quartus II przypisując odpowiedni chip Cyclone II. 2. Za pomocą MegaWizard wybierz element RAM: 1 PORT. Kolejne menu służy do zadawania podstawowych parametrów pamięci: - długości słowa danych, - liczby słów pamięci głębokości pamięci, - miejsce lokalizacji w struktutrze FPGA (LCs, M4K, Auto), - sposób synchronizacji operacji zapisu i odczytu.
Kolejny krok jest podobny jak w przypadku syntezy pamięci ROM
Dość istotne ustawienie znajduje się na kolejnym ekranie konfiguracyjnym. Dotyczą one zachowania pamięci po starcie układu FPGA. Istnieje możliwość wskazania pliku konfigurującego wartość początkową pamięci. Pozostałe okna podsumowujące proces syntezy są podobne jak w przypadku pamięci ROM. 3. Na schemacie dołącz odpowiednie porty, układ skompiluj, zasymuluj, zaprogramuj i przetestuj. układ. Obejrzyj w raporcie kompilacji użycie 256 bitów w jednym z bloków 3. Część druga. Zamiast bezpośredniego konkretyzacji modułu LPM, możemy implementować pamięć poprzez specyfikację jej struktury w kodzie VHDL. Jest możliwe definiowanie pamięci jako wielowymiarowej macierzy. Macierz 32 x 8, zawierająca 32 słowa 8 bitowe deklarowana jest za pomocą instrukcji: TYPE mem IS ARRAY(0 TO 31) OF STD LOGIC VECTOR(7 DOWNTO 0); SIGNAL memory array : mem; W układzie Cyclone II FPGA taka pamięć może być implementowana poprzez zastosowanie zarówno przerzutników elementów logicznych jak i bardziej efektywnie z zastosowanie bloków M4K. Dwie drogi prowadzą do stosowania bloków M4K. Jedną z nich było użycie elementu parametryzowalnego w części pierwszej. Drugą jest stosowanie właściwego stylu kodowania w VHDL, z którego kompilator mógłby wnioskować, że powinien być użyty blok pamięci. Help programu Quartus II pokazuje jak to można zrobić na wybranych przykładach (Help for Inferred memory ). Wykonaj następujące kroki:
1. Utwórz nowy projekt. 2. Napisz kod programu zawierający niezbędne funkcje, pozwalające na implemetację RAM, dodaj niezbędne elementy opisane w części 2. 3. Podłącz piny, przełączniki i wyświetlacze. 4. Przetestuj układ jak poprzednio. 5. Skomentuj różnice jakie zaobserwowałeś w stosunku do części 2. 4. Część trzecia. Płyta DE2 zawiera SRAM chip IS61LV25616AL-10, który jest statyczną RAM zawierającą 256k 16 bitowych słów. SRAM zawiera 18 bitową szynę adresową A 17-0 i 16 bitową dwukierunkową magistralę danych I/O 15-0. Posiada również kilka wejściowych sygnałów sterujących:,,, i, opisanych w tabeli 1: Nazwa Znaczenie Chip enable zezwolenie dostępu, wymagane 0 w czasie pracy RAM Output enable zezwolenie odczytu, wymagane 0 podczas cyklu odczytu Write enable zezwolenie zapisu, wymagane 0 podczas cyklu zapisu Upper byte żądanie starszego bajtu, 0 przy zapisie i odczycie Lower byte - żądanie młodszego bajtu, 0 przy zapisie i odczycie Tab. 1. Sygnały sterujące SRAM. Opis operacji IS61LV25616AL opisano w danych katalogowych, dołączonych do pakietu DE2 na płycie CD. Dane katalogowe można również znaleźć za pomocą wyszukiwarki internetowej. Dane katalogowe opisują szereg operacji pamięci wraz obszerną listą ich charakterystyk czasowych. Na potrzeby niniejszego ćwiczenia należy zapewnić stan niski na wejściach,, i oraz kontrolować odczyt i zapis do pamięci sygnałem. Uproszczoną charakterystykę czasową odpowiadającą temu trybowi pokazano na rysunku 4. Część a pokazuje cykl odczytu pamięci, który rozpoczyna się gdy sygnał na szynie adresowej jest stabilny, zaś sygnał nie jest aktywny (jest równy 1). Pamięć wystawia stabilne dane na szynie danych I/O 15-0 po upływie czasu dostępu szyny adresowej (address access delay) t AA. Cykl odczytu kończy zmiana sygnału na szynie adresowej, stabilne dane wyjściowe pozostają jeszcze przez czas podtrzymywania (output hold time) t OHA. Rysunek poniżej przedstawia charakterystyki czasowe cyklu zapisu do pamięci. Cykl zapisu rozpoczyna się wystawieniem niskiego sygnału na linii i kończy się gdy sygnał ten wraca do poziomu wysokiego. Stabilny sygnał adresowy powinien w tym czasie utrzymywać się przez czas ustawiania (address setup time) t AW. Stabilne dane do zapisu na szynie danych powinny utrzymywać się przez czas ustawiania danych (data setup time) t SD, zanim sygnał powróci do stanu wysokiego.
Tabela 2 zawiera minimalne i maksymalne wartości parametrów czasowych z rysunku 4 pamięci SRAM. Wartość Parametr min maks t AA - 10 ns t OHA 3 ns - t AW 8 ns - t SD 6 ns - t HA - - t SA - - t HD - - Tab. 2. Parametry czasowe SRAM. Zrealizuj pamięć z pierwszej części wykorzystując zewnętrzną pamięć SRAM. Zachowuj ostrożność w implementacji poprawnej dwukierunkowej szyny danych. 1. Utwórz nowy projekt. Utwórz stosowny plik VHDL, umożliwiający ładowanie i odczyt pamięci. Zastosuj te same przełączniki, diody LED i wyświetlacze jak w częściach 2 i 3 oraz nazwy pinów podane w tabeli 3 do obsługi pamięci IS61LV25616AL. Zauważ, że nie będą wykorzystane wszystkie linie szyny adresowej oraz szyny danych IS61LV25616AL podczas organizacji pamięci 32 x 8. Niewykorzystane piny należy spolaryzować niskim poziomem.
Nazwa portu SRAM Nazwy pinówde2 A 17-0 SRAM_ADDR 17-0 I/O 15-0 SRAM_DQ 15-0 SRAM_CE_N SRAM_OE_N SRAM_WE_N SRAM_UB_N SRAM_LB_N Tab. 3. Nazwy pinów SRAM w DE2. 2. Skompiluj układ i załaduj FPGA. 3. Przetestuj układ zapisując i odczytując wartości wybranych, różnych komórek pamięci. 5. Część czwarta. Blok pamięci z poprzedniej części posiada tę samą szynę adresową dla operacji odczytu I zapisu. W tej części utwórz inny typ pamięci zawierający dwie szyny adresowe: jedną dla operacji odczytu i drugą dla operacji zapisu czyli dokonaj syntezy pamięci dwuportowej. Wykonaj następujące kroki: 1. Utwórz nowy projekt. Użyj ponownie MegaWizard Plug-in Manager do konkretyzacji RAM. 2. Dołącz wytworzony komponent do projektu. W celu obejrzenia zawartości RAM dodaj do projektu możliwość wyświetlania poszczególnych bajtów na wyświetlaczach HEX1 i HEX0. Przewiń adresy pamięci w celu wyświetlenia bajtów danych z 1 sekundowymi interwałami czasowymi. Adresy przeglądanych komórek wyświetl na HEX3 i HEX2. Użyj 50 MHz zegar, CLOCK_50 oraz KEY 0 jako wejścia zerującego. Użyj do obsługi szyny adresowej oraz szyny danych tych samych przełączników, diod LED i wyświetlaczy siedmiosegmentowych jak w pierwszej części ćwiczenia. Upewnij się, iż wejścia przełączników są zsynchronizowane z sygnałem zegarowym. 3. Przetestuj swój układ oraz zweryfikuj zawartość początkową pamięci. Upewnij się, iż możesz niezależnie zapisywać dane pod dowolny adres używając przełączników.. Literatura: 1. Barski M., Jędruch W.: Układy cyfrowe, podstawy projektowania i opisu w języku VHDL, Wydawnictwo Politechniki Gdańskiej, 2007. 2. IEEE-SA Standars Board: IEEE Standard VHDL Language reference manual, ieeexplore.ieee.org/iel5/7180/19335/00893288.pdf, USA, 2000. 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.