LABORATORIUM TECHNIKA CYFROWA Pamięci Rev.1.35
1. Cel ćwiczenia Praktyczna weryfikacja wiedzy teoretycznej z projektowania modułów sterowania oraz kontroli pamięci 2. Kolokwium Kolokwium wstępne sprawdzające przygotowanie studentów do zajęć laboratoryjnych. Zakres materiału obejmuje wykład i dokumenty wymienione w rozdziale Literatura. 3. Projekty Ocena: 3.0 1. Zaprojektować układ zapełniający po kolei wszystkie komórki pamięci: a) pamięci RAM16x?S, 2. Z pamięci o szerokości danych N-bitowej skonstruować pamięć o większej szerokości magistrali danych 2N-bitowej, 4N-bitowej. Użyj pamięci: a) RAM16x?S, 3. Z pamięci o mniejszej pojemności zaprojektuj pamięć o a) 2, b) 4 razy większej pojemności, przy tej samej szerokości magistrali danych. Użyj pamięci: a) RAM16x?S, 4. Zasymuluj zapis i później odczyt trzech lub więcej konkretnych wartości pod konkretne lokację adresową. Użyj pamięci: a) RAM16x?S, 5. Używając pamięci dwuportowej RAMB16_S?_S? zasymuluj zapis i później odczyt konkretnych wartości pod konkretne lokację adresową na dwóch portach. Zaobserwuj co się stanie w przypadku zapisu i odczytu spod tego samego adresu równocześnie na dwóch portach. Ocena: 4.0 1. Moduł realizujący inwersję kolejności danych w pamięci (dane pod adresem 0 zamienienie są z danymi umieszczonymi pod adresem n-1, gdzie n jest to ilość lokacji adresowych pamięci). Wykorzystać pamięć dwuportową RAMB16_S?_S?. 2. Zaprojektuj pamięć asynchroniczną przy odczycie i synchroniczną przy zapisie używając przerzutników typu D i multiplekserów, głębokość i rozmiar słowa jest wybrany przez prowadzącego. 3. Zaprojektować pamięć quasi-dwuportową: odczyt asynchroniczny na dwóch portach, zapis synchroniczny tylko na jednym porcie. Użyj przerzutników typu D oraz multiplekserów, głębokość i rozmiar słowa wybrany przez prowadzącego. 4. Zaprojektować układ odczytujący dane z dwóch pamięci, porównujący je oraz zapisujący a) większą b) mniejszą z nich do trzeciej pamięci. Wykorzystać pamięci RAM16X4S. KATEDRA ELEKTRONIKI AGH 2
5. Sprawdzić działanie modułu SRL16: jest to rejestr przesuwny z szeregowym wpisem, wejście adresowe A służy do wyboru (przy użyciu multipleksera) stan którego przerzutnika rejestru przesuwnego będzie wyprowadzany na wyjście Q. 6. Zaprojektuj bufor opóźniający o stałą liczbę taktów zegara N=2-16 (N- wybrane przez prowadzącego) przy użyciu modułu SRL16. Ocena: 5.0 1. Zaprojektować moduł histogramu, zbudowanego na pamięci dwuportowej RAMB16_S4_S4, dla której drugi port służy do odczytu i zerowania histogramu. 2. Zaprojektować pamięć synchroniczną dwuportową 2x1 z użyciem przerzutników i multiplekserów (sygnał zegarowy wspólny dla obu portów). Zapis może następować na dwóch portach równocześnie. Zaprojektować również układ sterujący sygnałem 'konflikt', który jest aktywny w momencie kiedy następuje równoczesny zapis pod ten sam adres. 3. Zaprojektować układ FIFO (First-In First Out) z użyciem pamięci dwuportowej RAMB16_S1_S1 i maksymalnej długości 8-32. 4. Zaprojektować układ FIFO (First-In First Out) z użyciem rejestru przesuwnego SRL16 i maksymalnej długości 8-16. 5. Zaprojektować układ FIFO z użyciem pamięci dwuportowej RAMB16_S1_S1 i maksymalnej długości 8-16 z dodatkowymi sygnałami FULL i EMPTY. 6. Zaprojektować pamięć stosu, tj. układ (LIFO) Last-In First-Out z sygnałami FULL i EMPTY o długości 8-16. 7. Zaprojektować moduł histogramu z użyciem pamięci RAMB4_S8_S8, dla której czas potrzebny do obliczenia pojedynczego punktu wynosi 1 cykl zegara. Podczas obliczania histogramu jeden port służy do odczytu a drugi do zapisu należy uwzględnić sytuację konfliktową, podczas której dwa (lub więcej) następujące po sobie punkty mają taką sama wartość. 4. Literatura Wykłady http://www.fpga.agh.edu.pl/tc/tc_pliki/pamieci.ppt Teoria pamięci http://galaxy.uci.agh.edu.pl/~jamro/tc/pam_teoria.zip Opisy projektów pamięci http://galaxy.uci.agh.edu.pl/~jamro/tc/pamieci_projekty.zip 5. Przykładowe elementy biblioteczne w VHDL Przy projektowaniu można korzystać z języka VHDL (i pamięci zapisanych w tym języku: np. użyj ISE menu Edit /Language Templates/ VHDL/ Synthesis Constructs/ Coding Examples/ RAM) lub pamięci będących elementami biblioteki, np. unisim (użyj edytora schematu lub opisu biblioteki unisim): KATEDRA ELEKTRONIKI AGH 3
Pamięć roproszona (Distributed RAM) - podobna do RAM16x8S library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity rams_01 is port (CLK : in std_logic; WE : in std_logic; ADDR : in std_logic_vector(3 downto 0); DI : in std_logic_vector(7 downto 0); DO : out std_logic_vector(7 downto 0)); end rams_01; architecture syn of rams_01 is type ram_type is array (15 downto 0) of std_logic_vector (7 downto 0); signal RAM: ram_type; process (CLK) if CLK'event and CLK = '1' then if WE = '1' then RAM(conv_integer(ADDR)) <= DI; DO <= RAM(conv_integer(ADDR)) ; end syn; Pamięć Blokowa BRAM (podobna do RAMB16_S16) library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity brams_01 is port (CLK : in std_logic; WE : in std_logic; ADDR : in std_logic_vector(9 downto 0); DI : in std_logic_vector(15 downto 0); DO : out std_logic_vector(15 downto 0)); end brams_01; architecture syn of brams_01 is type ram_type is array (1023 downto 0) of std_logic_vector (15 downto 0); signal RAM: ram_type; process (CLK) if CLK'event and CLK = '1' then if WE = '1' then KATEDRA ELEKTRONIKI AGH 4
RAM(conv_integer(ADDR)) <= DI; DO <= RAM(conv_integer(ADDR)) ; end syn; Pamięć dwuportowa Blokowa BRAM (podobna do RAMB16_S8_S8) library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity brams_02 is port ( -- porta CLKA : in std_logic; WEA : in std_logic; ADDRA : in std_logic_vector(10 downto 0); DIA : in std_logic_vector(7 downto 0); DOA : out std_logic_vector(7 downto 0); -- portb CLKB : in std_logic; WEB : in std_logic; ADDRB : in std_logic_vector(10 downto 0); DIB : in std_logic_vector(7 downto 0); DOB : out std_logic_vector(7 downto 0)); end brams_02; architecture syn of brams_02 is type ram_type is array (2047 downto 0) of std_logic_vector (7 downto 0); shared variable RAM: ram_type; process (clka) if (clka'event and clka = '1') then if (WEA = '1') then RAM(conv_integer(ADDRA)) := DIA; DOA <= RAM(conv_integer(ADDRA)); process (clkb) if (clkb'event and clkb = '1') then if (WEB = '1') then RAM(conv_integer(ADDRB)) := DIB; DOB <= RAM(conv_integer(ADDRB)); KATEDRA ELEKTRONIKI AGH 5
end syn; 6. Przykładowe elementy biblioteczne w schemacie RAM16x1S, RAM16x2S, RAM16x4S... - pamięć rozproszona (Distibuted RAM) z synchronicznym zapisem (opóźnienie 1clk) i asynchronicznym odczytem. RAM16 - głębokość pamięci wynosi 16 bitów (4 linie adresowe). Szerokość magistrali danych jest zgodna z liczbą występującą przed S. Sygnały: WE Write Enable, D* Data (dane do zapisu), WCLK Write clk (sygnał zegarowy do zapisu), A* Adres, O Output (odczytywane dane). RAMB16_S1, RAMB16_S2, RAMB16_S4... pamięć blokowa (Block RAM) synchroniczna (synchroniczny zapis i odczyt). RAMB16 - oznacza że wielkość pamięci wynosi 16kb. _S1, _S2,... oznacza szerokość magistrali danych w bitach. Sygnały: WE Write Enable, EN Enable (sygnał Clock Enable), SSR Synchronous Set / Reset (najlepiej nie używać i podłączyć do zera), DI Data Input, DO Data Output, DIP Data Input Parity (dodatkowy bit parzystości dla RAMB16_S9, RAMB16_S18 nie używać tego wyprowadzenia), DOP Data Output Parity. RAMB16_S1_S1, RAMB16_S2_S8, RAMB16_S4_S1... podobnie jak RAMB16_S1 ale pamięć dwuportowa dwa niezależne porty, szerokość bitowa magistrali danych każdego portu może być niezależnie określona. Wykorzystanie wspomnianych elementów zależy od sformułowania konkretnego zadania projektowego (wymagana jest konsultacja z prowadzącym). KATEDRA ELEKTRONIKI AGH 6