Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki Instrukcja do ćwiczeń laboratoryjnych z przedmiotu: PROGRAMOWALNE STRUKTURY LOGICZNE ES1C420 300 Ćwiczenie Nr 8 KONFIGUROWALNE BLOKI PAMIĘCI CYFROWYCH W STRUKTURACH CPLD/FPGA Opracowali: dr inż. Wojciech Wojtkowski dr inż. Walenty Owieczko BIAŁYSTOK 2014
Spis treści instrukcji: 1. Cel i zakres ćwiczenia laboratoryjnego 2 2. Pamięci cyfrowe... 2 3. Pamięci cyfrowe w strukturach programowalnych.. 6 4. Opis pamięci lpm_ram_io 8 5. Zagadnienia do przygotowania... 11 6. Wymagania BHP.. 11 7. Sprawozdanie studenckie. 11 8. Przykładowe zadania 12 9. Literatura.. 13 1. CEL I ZAKRES ĆWICZENIA LABORATORYJNEGO Celem ćwiczenia laboratoryjnego jest poznanie zasad funkcjonowania bloków funkcjonalnych należących do grupy pamięci cyfrowych. W ramach ćwiczenia studenci poznają podstawowe zastosowania pamięci cyfrowych, rodzaje bloków pamięciowych z biblioteki LPM (Library of Parameterized Modules), zasady wykorzystania bloków pamięciowych w strukturach programowalnych. W celu utrwalenia wiadomości i praktycznego wykorzystania poznanych bloków funkcjonalnych studenci projektują wybrane układy z wykorzystaniem bloków pamięciowych z biblioteki LPM. Zakres ćwiczenia obejmuje: Uruchomienie i testowanie znaczenia poszczególnych parametrów i wejść sterujących wybranych bloków pamięciowych z biblioteki LPM, Projektowanie układów kombinacyjnych z wykorzystaniem pamięci ROM. Projektowanie układów sekwencyjnych z wykorzystaniem pamięci ROM. Projektowanie układów arytmetycznych wykorzystujących pamięć RAM. Poznanie funkcjonowania pamięci FIFO. Szczegółowy zakres ćwiczenia ustala prowadzący. 2. PAMIĘCI CYFROWE Pamięci RAM (Random Access Memory) umożliwiają zarówno odczyt jak i zapis informacji w trakcie działania układu. Ilość cykli zapisu i odczytu jest w tym przypadku praktycznie nieograniczona. Pamięci te nadają się więc do przechowywania wszelkich informacji tymczasowych, podlegających ciągłym modyfikacjom, np. wyników obliczeń cząstkowych. Cechą charakterystyczną pamięci RAM jest ulotność zgromadzonych 2
informacji po odłączeniu zasilania. W pamięciach typu RAM możliwy jest zapis informacji w postaci słów binarnych o ustalonej długości (szerokości). Występują różne rozwiązania organizacji pamięci związane z różnymi obszarami zastosowań, np. oddzielna szyna wejściowa i wyjściowa, wspólna szyna wejściowa i wyjściowa, wspólne taktowanie operacji zapisu i odczytu, może być także oddzielne taktowanie magistrali wejściowej i wyjściowej. Zastosowanie oddzielnego taktowania buforów wejściowych i wyjściowych umożliwia operacje zapisu i odczytu z różnymi prędkościami. Schemat blokowy pamięci RAM ze wspólną szyną we/wy jest przedstawiony na rysunku 1. Rys. 1. Schemat ogólny pamięci typu RAM ze wspólną szyną we/wy Funkcją zapisu i odczytu steruje wejście w/r (write/read). Wyjście Y jest jednocześnie wejściem danych zapisywanych do pamięci. Zmianę kierunku przepływu danych umożliwia dwukierunkowy bufor trójstanowy, sterowany wejściem w/r. Podczas operacji odczytu, pamięć RAM działa podobnie jak pamięć ROM. Pamięci stałe typu ROM (Read Only Memory) są układami kombinacyjnymi, w których jest możliwe wyłącznie odczytanie informacji zawartej w strukturze matrycy pamięci. Zapisanie tej informacji odbywa się zazwyczaj w procesie technologicznym. W przypadku układów programowalnych do konfiguracji pamięci ROM wykorzystuje się plik konfiguracyjny o formacie.mif (Memory Initialization File) lub.hex (format HEX Intela). 3
Jeżeli część zasobów EAB (Embedded Array Block) układu FLEX10K ma pracować jako pamięć ROM, to po każdym uruchomieniu układu zawartość ROM musi zostać przesłana z pamięci szeregowej EEPROM służącej do konfiguracji układu (układy FELX10K nie są wyposażone w pamięć nieulotną). Schemat ogólny pamięci ROM jest przedstawiony na rysunku 2. Pamięć ROM często posiada wejście sterujące cs (chip select), umożliwiającym wprowadzenie wyjść pamięci w stan wysokiej impedancji. Umożliwia to z kolei łączenie pamięci w bloki o większej pojemności (zazwyczaj w przypadku zewnętrznych bloków pamięci z dodatkowym zewnętrznym dekoderem adresu). W praktyce, jeżeli pamięć ma wektor adresowy o długości p, a wektor wyjściowy o długości n, to pojemność pamięci wynosi m x n bitów (inaczej m słów n bitowych), przy czym m=2 p. W prostych systemach pamięć jest często organizowana w słowa 8 bitowe (inaczej bajty). Wówczas pojemność pamięci wynosi m bajtów (m=2 p ). 1kB oznacza 1024 bajty = 8192 bitów. Rys. 2. Schemat ogólny pamięci ROM Dostępność nowoczesnych układów programowalnych pociągnęła za sobą realizacje układów sekwencyjnych (automatów) wykorzystujących pamięci ROM. Ogólna struktura takiego automatu jest przedstawiona na rysunku 3. W poszczególnych komórkach (słowach) pamięci ROM przechowuje się zakodowany stan automatu Q oraz stan wyjścia Y. W najprostszym przypadku (automaty generujące sekwencję słów) układ można sprowadzić do przypadku, gdy przechowywane są wyłącznie kolejne stany wyjść. Stan następny automatu jest określany na podstawie wartości wektora wejściowego X oraz informacji Q o stanie bieżącym automatu, pobranej z pamięci ROM. Tego typu rozwiązanie ogólnie dobrze nadaje się do zastosowania jako generator słów wielobitowych, np.: wyświetlenie napisu na dowolnym rodzaju wyświetlacza. Komórki pamięci ROM przechowują wówczas numery poszczególnych 4
znaków napisu (gdy wykorzystywany jest dodatkowy generator znaków) bądź matryce tych znaków (w wersji bez dodatkowego generatora). W przypadku układów programowalnych firmy ALTERA, użytkownik ma do dyspozycji bloki EAB (Embedded Array Block), w których mogą być konfigurowane pamięci RAM/ROM. Bloki EAB są dostępne w seriach układów FLEX10K i APEX oraz wyższych. Rys. 3. Realizacja układu sekwencyjnego (automatu) przy użyciu pamięci ROM Pamięci FIFO (First In First Out pierwszy wchodzi pierwszy wychodzi) są wykorzystywane w ogólnym przypadku do buforowania informacji (danych) przy komunikacji pomiędzy systemami o różnej bądź takiej samej częstotliwości taktowania (lub prędkości zapisu/odczytu). Wykorzystywane są również przy realizacji systemów transmisji szeregowych. Pamięci o organizacji FIFO są szczególnie użyteczne dla synchronizacji danych pomiędzy blokami taktowanymi z różną częstotliwością w projektach typu SOPC (system on a programmable chip). Pamięci FIFO zawierają rejestry adresu zapisu i odczytu, pamięć RAM do magazynowania informacji oraz układ logiczny generujący sygnały sterujące przepływem informacji. 5
3. PAMIĘCI CYFROWE W STRUKTURACH PROGRAMOWALNYCH Nowoczesne struktury FPGA (Field Programmable Gate Array) zawierają wbudowane matryce pamięci EAB (Embedded Array Block). Każdy blok EAB może zostać użyty niezależnie lub w powiązaniu z innymi dostępnymi blokami w celu skonfigurowania pamięci o odpowiedniej pojemności. Ponieważ bloki te często pozostają niewykorzystane, ich użycie może zmniejszyć zapotrzebowanie na komórki logiczne, które mogą wówczas zostać wykorzystane do realizacji innych funkcji. Można np. skonfigurować niewykorzystane bloki EAB jako pamięć ROM realizującą nawet złożony układ kombinacyjny. Jedyną przeszkodą może być ograniczona wielkość bloków pamięci występujących w układach programowalnych. W układach programowalnych istnieje możliwość konfigurowania części struktury jako pamięci RAM, ROM lub FIFO. W przypadku układów firmy ALTERA, producent zaleca stosowanie gotowych bloków parametryzowanych z bezpłatnej biblioteki LPM. Biblioteka LPM standardowo jest dołączona do środowiska projektowego. W przypadku projektowania bloków pamięci jako fragmentu struktury programowalnej, zazwyczaj nie występuje potrzeba jawnego łączenia kilku bloków pamięciowych biblioteki LPM o mniejszej pojemności w jedną pamięć o większej pojemności lub o większej długości słowa danych. Zamiast operacji łączenia pamięci ustawia się odpowiednie parametry bloku parametryzowanego, co umożliwia uzyskanie pamięci o maksymalnych dostępnych w danej strukturze programowalnej parametrach. Ponieważ kompilator automatycznie przydziela zasoby EAB dla bloków pamięciowych znajdujących się w projekcie, użytkownik nie musi się martwić o połączenia wewnętrzne zasobów EAB. W przypadku zapotrzebowania na pamięci o dużej pojemności, wykorzystuje się pamięci zewnętrzne i wówczas może być konieczne łączenie mniejszych pojemności (długości słowa) w większe. Gdy nie jest wymagany bardzo szybki dostęp do pamięci, wygodnym rozwiązaniem mogą się okazać pamięci o dostępie szeregowym np. za pomocą magistrali I 2 C. Cechą charakterystyczną tego rodzaju pamięci są niewielkie rozmiary obudowy i minimalna ilość połączeń, co upraszcza znacząco konstrukcję płytki drukowanej PCB. W bibliotece LPM programu, do dyspozycji projektanta są różne parametryzowane bloki pamięciowe, wśród których najbardziej istotne są: csfifo, lpm_fifo, csdpram, lpm_fifo_dc, lpm_ram_dp, lpm_ram_dq, lpm_ram_io oraz lpm_rom. Altera zaleca zastosowanie pamięci RAM wyłącznie w trybie synchronicznym. 6
Rodzina FLEX10K posiada wbudowane bloki matrycowe EAB, czyli zmienne bloki RAM z rejestrem portów wejściowych i wyjściowych. EAB stosować można nie tylko jako pamięć, ale również jako układ mnożący bądź układ korekcji błędów. Każdy EAB ma 2048 bitów, które można konfigurować na szerokości 1, 2, 4 lub 8 bitów. Blok EAB zawiera magistralę lokalną i 8 elementów logicznych (LE), z których każdy posiada tablicę look-up (LUT), programowany wybór zegara i specjalne linie dla sygnałów carry i kaskadowych. Pomiędzy blokami a I/O, magistrala globalna złożona z rzędów i kolumn. Wszystkie końcówki I/O sterowane są przez IOE z 2-kierunkowym buforem o programowanej szybkości narastania sygnału, którego można używać jako rejestru portów wejściowych lub wyjściowych. Schemat blokowy wewnętrznej organizacji układów rodziny FLEX10K jest przedstawiony na rysunku 4. Przykłady konfiguracji bloków EAB są przedstawione na rysunku 5. Z kolei przykłady łączenia bloków EAB dla uzyskania pamięci o większej długości słowa lub o większej ilości słów przedstawiono na rysunku 6. Rys. 4. Schemat wewnętrzny struktury układów rodziny FLEX10K 7
Rys. 5. Przykłady konfiguracji bloków EAB Rys. 6. Przykłady łączenia bloków EAB dla uzyskania pamięci o: A) większej długości słowa B) większej liczbie słów Bloki funkcjonalne scfifo (single clock) oraz dcfifo (dual clock) (dostępne w bibliotece LPM programu QUARTUS) implementują funkcje pamięci FIFO (First In First Out) w strukturach układów programowalnych. W bibliotece LPM programu MAXII+ znajduja się odpowiedniki pamięci FIFO zarówno z pojedynczym jak i podwójnym sygnałem taktującym. 4. OPIS PAMIĘCI lpm_ram_io Ponieważ opis poszczególnych wejść, wyjść i parametrów jest podobny przy innych blokach pamięciowych, zamieszczono jedynie opis bloku lpm_ram_io 8
Tabela 1. Wejścia Nazwa portu Wymagany Opis Komentarz address[] Tak Wejście adresowe Port wejściowy o szerokości LPM_WIDTHAD. W przypadku gdy jest użyty memenab, powinien być on nieaktywny gdy address[] jest zmieniany. we Tak Wejście Write Enable Zezwolenie na zapis do pamięci gdy jest w stanie wysokim inclock Nie Synchronizuje zapis pamięci. outclock Nie Taktowanie portu dio[] (wyjście z pamięci). memenab Nie Przełączenie wyjścia pamięci w stan wysokiej impedancji outenab Nie Wejście Output Enable. W stanie wysokim (1): na wyjściu dio pojawia się zawartość pamięci o adresie [address], w stanie niskim (0): zapis danych do pamięci z portu dio pod adres [address]. Jeśli nie są używane wejścia zegarowe, dane na porcie address[] nie mogą się zmieniać podczas gdy na we jest wysoki poziom logiczny. Wejście to jest wymagane gdy nie wykorzystuje się sygnału taktującego. W przypadku, gdy port inclock jest używany, port we funkcjonuje jako zezwolenie dla operacji zapisu synchronicznego, z synchronizacją do zbocza narastającego sygnału inclock. Gdy inclock nie jest podłączony, port we funkcjonuje jako zezwolenie dla asynchronicznej operacji zapisu. Odpowiedź zaadresowanej pamięci na wyjściu pojawia się synchronicznie z sygnałem podawanym na outclock gdy jest on podłączony oraz asynchronicznie gdy nie jest podłączony. Jeden z sygnałów memenab lub outenab musi być podłączony. Jeśli jest podłączony memenab, powinien być w stanie nieaktywnym podczas zmiany portu address[]. Jeden z sygnałów memenab lub outenab musi być podłączony. 9
Tabela 2. Parametry Parametr Typ Wymagany Opis LPM_WIDTH Integer Tak Szerokość magistrali dio[], wewnętrznych danych I portu q LPM_WIDTHAD Integer Tak LPM_NUMWORDS Integer Nie Szerokość adresu. Parametr LPM_WIDTHAD powinien być (chociaż nie musi) równy LOG2(LPM_NUMWORDS). Jeśli parametr LPM_WIDTHAD ma zbyt małą wartość, część komórek pamięci będzie niedostępna. Jeśli parametr LPM_WIDTHAD będzie zbyt duży, adresy spoza dostępnej przestrzeni adresowej spowodują niezdefiniowaną (nieokreśloną) odpowiedź. Liczba słów zapisanych w pamięci. Ta wartość powinna być (choć nie musi) równa 2 ^ LPM_WIDTHAD-1 < LPM_NUMWORDS <= 2 ^ LPM_WIDTHAD. Jeśli jest pomijana, domyślna wartość wynosi 2 ^ LPM_WIDTHAD. LPM_FILE String Nie LPM_INDATA String Nie LPM_ADDRESS_ CONTROL String Nie LPM_OUTDATA String Nie Nazwa pliku inicjalizującego pamięć (.mif) lub (.hex). Jeśli zostanie pominięty, cała pamięć będzie zainicjowana wartością 0. Dopuszczalne wartości: "REGISTERED", "UNREGISTERED", and "UNUSED". Parametr ustala, czy port data[] pracuje w trybie synchronicznym. Jeśli parametr ten zostanie pominięty, domyślną wartością jest "REGISTERED" (synchroniczny). Dopuszczalne wartości: "REGISTERED", "UNREGISTERED", and "UNUSED". Parametr ustala, czy porty address[], memenab i we pracują w trybie synchronicznym. Domyślna wartość: "REGISTERED" (synchroniczny). Dopuszczalne wartości: "REGISTERED", "UNREGISTERED", and "UNUSED". Ustala, czy port dio[] pracuje w trybie synchronicznym. Domyślną wartością jest "REGISTERED" (synchroniczny). LPM_HINT String Nie Pozwala na użycie parametrów specyficznych dla układów firmy Altera w projekcie VHDL. Domyślnie nie jest aktywny: "UNUSED". LPM_TYPE String Nie Nazwa entity name w projekcie VHDL. 10
USE_EAB String Nie Jest to parametr specyficzny dla układów firmy ALTERA. Dostępne wartości: "ON", "OFF", "UNUSED". Ustawienie OFF zapobiega użyciu bloków EAB w układach ACEX 1K i FLEX 10K. Wówczas istnieje wyłącznie możliwość użycia przerzutników lub zatrzasków. (Ustawienie "ON" nie jest właściwie użyteczne w implementacji pamięci, gdyż : MAX+PLUS II domyślnie i automatycznie implementuje funkcje pamięci w blokach EAB.) 5. ZAGADNIENIA DO PRZYGOTOWANIA Przed przystąpieniem do wykonania ćwiczenia, student powinien: - zapoznać się z instrukcją, - powtórzyć teorię pamięci cyfrowych - powtórzyć teorię układów kombinacyjnych wykorzystujących pamięci ROM, - powtórzyć teorię układów sekwencyjnych wykorzystujących pamięci ROM, - opracować rozwiązanie co najmniej dwóch z zadań podanych na końcu instrukcji z wykorzystaniem parametryzowanych bloków pamięci z biblioteki LPM. 6. WYMAGANIA BHP Warunkiem przystąpienia do praktycznej realizacji ćwiczenia jest zapoznanie się z obowiązującą w laboratorium instrukcją BHP oraz przestrzeganie zasad w niej zawartych. Konieczne jest także zapoznanie z ogólnymi zasadami pracy przy stanowisku komputerowym. Instrukcje BHP powinny być podane studentom podczas pierwszych zajęć laboratoryjnych i dostępne do wglądu w Laboratorium. 7. SPRAWOZDANIE STUDENCKIE Sprawozdanie z ćwiczenia powinno zawierać: stronę tytułowa zgodnie z obowiązującym wzorem, cel i zakres ćwiczenia, opis stanowiska badawczego, opis przebiegu ćwiczenia z wyszczególnieniem wykonywanych czynności, algorytm rozwiązania danego problemu, 11
schematy układów, programy AHDL bądź VHDL z komentarzami, rysunki przedstawiające wyniki symulacji, komentarze i wnioski Na ocenę sprawozdania będą miały wpływ następujące elementy: zgodność zawartości z instrukcją, algorytm rozwiązania problemu, wnioski i uwagi, terminowość i ogólna estetyka Sprawozdanie powinno być wykonane i oddane na zakończenie ćwiczenia, najpóźniej na zajęciach następnych. Sprawozdania oddane później będą oceniane niżej. 8. PRZYKŁADOWE ZADANIA: Z1. Zapoznać się z konfigurowalnymi parametrami, wejściami sterującymi i wyjściami układu lpm_rom. Uruchomić w symulacji pamięć w dwóch różnych konfiguracjach. Utworzyć w edytorze tekstowym przykładowy plik.mif i skonfigurować za pomocą tego pliku pamięć ROM. Z2. Zapoznać się z konfigurowalnymi parametrami, wejściami sterującymi i wyjściami układu lpm_ram_io. Uruchomić w symulacji pamięć w dwóch różnych konfiguracjach. Utworzyć w edytorze tekstowym przykładowy plik.mif i skonfigurować za pomocą tego pliku pamięć RAM. Z3. Zapoznać się z konfigurowalnymi parametrami, wejściami sterującymi i wyjściami układu lpm_fifo. Uruchomić w symulacji pamięć w dwóch różnych konfiguracjach. Z4. Zaprojektować układ obliczający 8 kolejnych wartości ciągu arytmetycznego o A o =100 i r=7, który umieszcza wyniki w pamięci FIFO z częstotliwością taktującą f c1 =10kHz, natomiast wyprowadzenie danych do rejestru wyjściowego (np. lpm_ff) powinno się odbywać z częstotliwością f c2 =100kHz, po zakończeniu obliczeń wszystkich elementów ciągu. Z5. Realizacja układu kombinacyjnego za pomocą pamięci ROM, np. dekoder BCD-7seg (kodu BCD na kod wyświetlacza siedmiosegmentowego LED). Należy wykorzystać blok parametryzowany lpm_rom. 12
Z6. Realizacja układu sekwencyjnego za pomocą pamięci ROM, np.: generator ciągu słów 8 bitowych o następującej sekwencji: 0, 23, 45, 123, 212, 45, 45. Należy wykorzystać blok parametryzowany lpm_rom. Z7. Wypełnić komórki pamięci RAM 16x8 (16 bajtów) kolejnymi adresami komórek, zaczynając od zera za pomocą pliku konfiguracyjnego.mif. Z8. Wypełnić 20 kolejnych komórek pamięci RAM 24x8 (24 bajty) ciągiem arytmetycznym o A o =128, r=5 od adresu 03h. Wartości ciągu powinny być wyliczone i wprowadzone do pamięci w zaprojektowanym układzie (nie poprzez plik.mif). Z9. Wypełnić 20 kolejnych komórek pamięci RAM 24x8 (24 bajty) ciągiem arytmetycznym o A o =128, r=-5 od adresu 03h. Wartości ciągu powinny być wyliczone i wprowadzone do pamięci w zaprojektowanym układzie (nie poprzez plik.mif). Z10. Wypełnić 8 kolejnych komórek pamięci RAM 24x8 (24bajty) ciągiem geometrycznym o A o =1 i q=2. Nie można używać w zadaniu bloków mnożącego i dzielącego (LPM_DIVIDE, LPM_MULT). Z11. Wypełnić 8 kolejnych komórek pamięci RAM 24x8 (24bajty) ciągiem geometrycznym o A o =128 i q=1/2. Nie można używać w zadaniu bloków mnożącego i dzielącego (LPM_DIVIDE, LPM_MULT). 9. Literatura: L1. WWW.altera.com - dsf10k.pdf opis układów rodziny FLEX10K L2. Łuba T.: Syntez układów cyfrowych, WKŁ, 2003r. L3. Skorupski A.: Podstawy techniki cyfrowej, WKŁ, 2004 L4. Małysiak H.: Teoria automatów cyfrowych, laboratorium, Wydawnictwo Politechniki Śląskiej, 2003. L5. Pasierbiński, J., Zbysiński P.: Układy programowalne w praktyce, WKŁ, 2002r. 13