UKŁADY Z WYKORZYSTANIEM PAMIĘCI.doc

(222 KB) Pobierz
Układ zerujący komórki pamięci

UKŁADY Z WYKORZYSTANIEM PAMIĘCI

 

Układ zerujący po kolei wszystkie komórki pamięci.

 

Zerowanie pamięci najłatwiej jest zrealizować w układzie przedstawionym poniżej, w którym czyszczone są wszystkie komórki pamięci 2n   bitowej. Układ składa się z dwóch podstawowych elementów: pamięci (z wykorzystaniem typów wbudowanych lub złożonej z przerzutników), oraz z licznika. Wejście taktujące  jest wspólne. Zasada działania jest bardzo prosta i opiera się na normalnej operacji zapisu do pamięci (WE (Write Enable)=1) - do jej wszystkich komórek wartości  z wejścia danych D, której wartość w całym cyklu licznika jest równa zeru (D=0). W przypadku pamięci z asynchronicznym zapisem - sygnał zegarowy doprowadzony jest tylko do licznika. Drugi sposób zerowania opiera się na tej samej zasadzie, z wyjątkiem tego tylko, że układ zawiera tylko pamięć. Ustawianie adresów dokonywane jest natomiast w fazie symulacji-w skrypcie.

 

 

 

 

 

 

 

 

 

 

 

 

Projekt pamięci 128x1 z użyciem pamięci RAM32x1; symulacja zapisu i odczytu tej pamięci.

 

Podstawowym  zadaniem tego projektu jest zapoznanie z umiejętnością łączenia pamięci w większe układy tzn. w pamięci o większych  pojemnościach. Układ składa się z: bloku pamięci (4*elementy biblioteczne RAM32x1), dekodera wejściowego oraz multipleksera na wyjściu (rysunek poniżej). Szyna danych jest oznaczona przez D (słowo jednobitowe). Wejścia WE każdego z czterech elementów pamięci RAM32x1 są sterowane z wyjść dekodera 2 - na - 4. Przy podanym adresie zapis następuje więc tylko do jednej z czterech części pamięci. Natomiast wejściem zapis/odczyt (WE) całej pamięci - 128x1 - jest wejście dekodera, oznaczone jako E (Enable). Ustawienie jedynki na E/WE powoduje więc wpis do pamięci pod adres podany w magistrali A (w jej części adresowej tzn. A[4:0]) i jednoczesny odczyt. Pojawienie się zera na WE/E powoduje przesłanie adresu A[6:5] do multipleksera oraz blokadę licznika (tylko odczyt). Multiplekser w zależności od podanego adresu powoduje odczyt z odpowiedniego wejścia D0-D3 zawartości i przesłanie jej (asynchroniczne) na wyjście  O. Wejścia magistrali adresowej A o najstarszych dwóch bitach (A[6:5] - sygnały wejściowe dekodera) są sterowaniem (wyborem) do którego bloku RAM32x1 następuje zapis informacji wejściowej. Jednocześnie ten sam adres podawany jest do multipleksera. W zależności od prowadzącego - w projekcie można użyć gotowych dekoderów i multiplekserów z biblioteki lub złożyć je z bramek. Kwestie symulacji pozostawiamy wykonującemu; można to zrobić przy zastosowaniu licznika w celu generacji adresów A[6:0] oraz zapis w jednym cyklu zliczania  a następnie odczyt w następnym, prościej – podanie konkretnych wartości adresów w skrypcie.

 

Sprawdzić i pokazać podczas symulacji ewentualne konflikty (zapisu i odczytu pod ten sam adres) dla pamięci dwuportowej a) RAM16x4D b) np. RAMB4_S4_S8.

 

Sytuacje konfliktowe:

1)     Jednoczesny zapis z dwóch portów pod ten sam adres.

2)     Jednoczesny zapis i odczyt pod ten sam adres.

Do sytuacji konfliktowych raczej nie można zaliczyć jednoczesnego odczytu spod tego samego adresu na dwa porty wyjściowe, taka sytuacja jest z reguły dozwolona.

 

Istnieją trzy możliwe zachowania pamięć w sytuacjach konfliktowych zarówno dla punktu 1 jak i 2.

Punkt 1 - Jednoczesny zapis z dwóch portów pod ten sam adres:

A)    ostateczną wartością jest wartość zapisana spod portu A (A port nadrzędny)

B)    ostateczną wartością jest wartość zapisana spod portu B.

C)    wartość zapisana jest nieokreślona.

Punkt A i B może ale nie musi powodować błędnego działania systemu (zależy od budowy systemu) natomiast punkt C z reguły powoduje błędną pracę układu i dlatego należy zbudować specjalny układ arbitrażowy eliminujący taką sytuację.

 

Punkt 2- Jednoczesny zapis i odczyt pod ten sam adres:

A)    odczytana wartość jest poprawna ale nie uwzględnia aktualnego wpisu

B)    odczytana wartość jest poprawna i uwzględnia aktualnego wpis

C)    odczytana wartość jest nieokreślona (błędna).

 

RAM16´4 – pamięć jednoportowa ale z dwoma niezależnymi magistralami danych: do odczytu i do zapisu. Możliwa jest więc praca pseudo dwuportowa dla tej pamięci (równoczesny zapis i odczyt – adres jest zawsze taki sam) i dlatego może występować konflikt określony w punkcie 2. Należy więc zasymulować jak zachowuje się pamięć podczas równoczesnego wpisu i odczytu.

RAM16´4D – pamięć dwuportowa, przy czym pierwsze wejście (A) służy do odczytu i zapisu, drugie (DPRA) służy jedynie do odczytu. W związku możliwy jest konflikt określony w punkcie 2 gdy następuje równoczesny odczyt i odczyt spod tego samego adresu. Należy więc sprawdzić jak zachowuje się pamięć.

RAMB4_S4_S8 – pamięć dwuportowa z możliwością zapisu i odczytu na obydwu wejściach. Strukturę tej pamięci przedstawia poniższy rysunek:

             

 

 

ADRES „B”                            ADRES „A”                           



                            0000000000

000000000

                                          0000000001



                                          0000000010

000000001

                                          0000000011







                                                                                    .

                                                                                    .

                                                                                    .

 

 

 

 

 

 

 

Magistrala wejściowa DIB dokonuje zapisu na ośmiu bitach w wierszu adresowym podanym na magistrali B. Magistrala DIA zapisuje na pola czterech bitów w wierszu adresowym podanym na magistrali A. Obszar pamięci jednego obszaru „B” zawiera dwa obszary „A” (wiersz B= 8 = 4 + 4).  Konflikt zapisu występuje wtedy, gdy oba wejścia chcą zapisać ten sam obszar pamięci. Dla adresu B ośmiobitowego przyporządkowane są dwa adresy „A” wskazujące na cztery najmłodsze lub cztery najstarsze bity ośmiobitowego słowa „B”.

Np. jeżeli spróbujemy zapisać równocześnie pod adres A=001100111 i B=00110011, to na czterech najstarszych bitach magistrali DOB może (sprawdzić!) wystąpi stan nieustalony (X) – efekt konfliktu. Należy również sprawdzić co się stanie na pozostałych czterech bitach.

Sytuacja konfliktowa występuje również przy jednoczesnym zapisie i odczycie na jednym wejściu i odczycie na drugim.

 

Zaprojektować pamięć synchroniczną jednoportową 4x1 z użyciem przerzutników i multiplekserów.

 

Do skonstruowania synchronicznej pamięci 4x1 użyjemy przerzutników typu D. Jeden przerzutnik odpowiada jednej komórce pamięci. Do wyboru komórki pamięci służy dekoder 2/4 (transkoder naturalnego kodu binarnego na "1 z 4"). Na wejście dekodera podawany jest adres komórki pamięci, na której ma odbyć się odczyt lub zapis danych. Dekoder odblokowuje tylko jeden przerzutnik w danej chwili, dlatego ich wejścia zegarowe oraz danych mogą być wspólne. Wyboru zapis/odczyt danych dokonujemy poprzez blokowanie lub odblokowanie dekodera, podając odpowiednio "0" lub "1" na jego wejście E. Zapis następuje w momencie podania narastającego zbocza sygnału zegarowego na wejścia C przerzutników przy sygnale dekodera E=1. Ponieważ wejścia adresowe podane są bezpośrednio na multiplekser na wyjściu, tryb pracy dekodera nie ma wpływu na asynchroniczną pracę wyjścia. Poprzez podanie 2-bitowego adresu na multiplekser dokonujemy wyboru przerzutnika, z którego chcemy odczytać dane. Schemat przedstawiono poniżej.



 

 

 

Zaprojektować pamięć synchroniczną dwuportową 4x1 z użyciem przerzutników i multiplekserów (sygnał zegarowy wspólny dla obu portów). Zapis tylko na jednym porcie.

 

Pamięć dwuportowa wyposażona jest w dwa porty, z których jeden umożliwia zapis i odczyt danych, a drugi wyłącznie ich odczyt. Oba porty działają niezależnie od siebie. Budowa układu jest podobna do budowy pamięci jednoportowej. Na wyjściu znajduje się tylko dodatkowy multiplekser, który odpowiada drugiemu portowi, służącemu wyłącznie do odczytu. Na jego wejścia adresowe podane są wejścia DPRA pamięci. Schemat przedstawiono poniżej.

 

.             

 



Mając pamięć SRAM 16x1 skonstruować interface, który emulowałby pamięć DRAM (dodatkowe sygnały RASN (not RAS) i CASN, wspólna magistrala do odczytu i zapisu danych).

 

Pamięć DRAM ma zupełnie inną budowę niż pamięć SRAM, którą mamy do dyspozycji, używając elementów bibliotecznych układu Virtex. Dlatego nie da się dokładnie zasymulować jej działania. Chodzi m.in. o dostępność dwukierunkowej magistrali danych (układy DRAM mają tą samą magistralę do odczytu i do zapisu). Bufor wiersza pamięci DRAM symulują dwa przerzutniki D, taktowane sygnałem /RAS. Dzięki jego zastosowaniu można o połowę zmniejszyć ilość wejść adresowych. Zbocze opadające sygnału /RAS powoduje zatrzaśnięcie bardziej znaczącej połowy adresu w przerzutnikach, natomiast zbocze opadające sygnału /CAS powoduje odczytanie lub zapisanie (w zależności od stanu wejścia /WE) danych. Przebiegi sygnałów /RAS i /CAS potrzebne do zasymulowania układu przedstawione są we wstępie teoretycznym.

 

Realizacja funkcji: a) y=x2 y= LUT(x) (x= 0-7) b) y= 100/x y= LUT(x) (x= 1-7, zaokrąglanie w dół) z użyciem pamięci LUT (Look Up Table). Nadawanie wartości poszczególnym komórkom pamięci odbywa się podczas symulacji.

 

 

 

 

 

 

 

 

 

 

 

 

 

Pamięci LUT (Look Up Table) są typowymi pamięciami wyłącznie do odczytu (tzn. ROM), które realizują z góry określone operacje. Jest więc to jednostka całkowicie z góry zaprogramowana, tak że nie mamy dostępu do zapisu danych w takiej pamięci, a jedynie jej odczyt. Jest to więc tablica, z której pobierane są wartości komórek o podanym adresie oraz po określeniu rodzaju wykonywanego działania. Typowymi działaniami są oczywiście dodawanie, odejmowanie, dzielenie i mnożenie. Spotyka się również inne rodzaje operacji, lecz zawsze są one z góry określone. Operacje te wykonywane są na komórkach o podanym adresie. W naszym przypadku najpierw będziemy musieli uzupełnić wykorzystywane komórki (dokonać wpisu w fazie symulacji), a następnie będzie dokonywana operacja odczytu. W rzeczywistości zawsze jednak LUT jest elementem tylko do odczytu.

Do budowy pamięci zastosowano pamięć  RAM16x8, gdyż liczba siedem podniesiona do kwadratu jest zapisywana na sześciu bitach; dodatkowo dochodzi do tego jeden bit w przypadku zapisu liczby 100. Wykorzystujemy wiec w sumie siedem bitów do zapisu wyników dokonywanych operacji. Zapis następuje dla WE=1 pod adres podany na A[2:0] poprzez wejścia D0-D7. Każdemu adresowi 0-7 odpowiada komórka o wartości adresu podniesionego do potęgi w przypadku, gdy OPERACJA=0, oraz każdemu adresowi 1-7 odpowiada wynik funkcji 100/adres, w przypadku, gdy OPERACJA=1. Rodzaj wykonywanej operacji jest podawany na najwyższy bit adresu A3.

Po wprowadzeniu do pamięci danych, ustawiamy WE=0 i wówczas możemy tylko dokonywać odczytu z pamięci (rys. powyżej). Dopiero teraz możemy powiedzieć, że mamy gotową pamięć LUT. W zależności od podanego na magistralę A adresu (liczby 0-7) oraz od operacji, na wyjściu O dostaniemy liczbę będącą realizacja określonej funkcji na podanym adresie. Dzięki temu otrzymujemy realizację funkcji  wynik = F (liczba).

Pojemność pamięci potrzebnej do zrealizowania LUT jest funkcją wykładniczą ilości danych, na jakich chcemy wykonywać operacje (szerokości szyny adresowej).

 

 

Używając RAM16x4 oraz dodatkowych buforów trójstanowych, rejestrów i dodatkowego sygnału Adr/NoData zaprojektuj pamięć w której dane i adres nadawane i odbierane są na tej samej magistrali. Zatrzaskiwanie informacji odbywałby się przy narastającym sygnale zegarowym. W celu dokonania odczytu w pierwszym cyklu zegara przesyłany jest adres a w następnym cyklu zegara odbierane dane na tej samej magistrali.

 

Układ zbudowany jest w oparciu o dwa podstawowe bloczki: pamięć RAM16x4, oraz rejestr PIPO (schemat). Dane i adresy są odbierane z jednej magistrali D/A. Adres komórki podawany jest poprzez magistralę D/A na rejestr, który wartość tę przepisuje na wyjście rejestru (będące równocześnie wejściem adresowym pamięci) przy narastającym zboczu zegara i przy odpowiedniej wartości sygnału Adr/noData. Sygnał Adr/noData wpływa także na stan buforu trójstanowego, dzięki czemu w trakcie przesyłania adresu, wyjście danych pamięci nie jest podawane na magistralę Adr/noData. Sygnał zapis pamięci WE kontroluje zapis pamięci ale również steruje bufor trójstanowy – podczas przesyłania danych do zapisu bufor jest w stanie wysokiej impedancji. Natomiast podczas odczytu bufor trójstanowy wystawia dane z wyjścia pamięci na magistralę D/A.

















ADR/NODATA





CLK





WE

D/A























REJESTR

D [3:0]     

  

   Q [3:0]

CE        

C    

 



A [3:0]

Q[3:0]

WCLK

D [3:0]

WE



RAM 16 x 4S

Zaprojektuj bufor opóźniający o stałą wartość n = 3-32 cykli zegara przy użyciu pamięci dwuportowej 16x1.

 

Zasada działania bufora jest oparta głównie na działaniu pamięci dwuportowej - jako wyjście opóźniające wykorzystujemy wyjście drugie pamięci oznaczone jako DPO, dane wejściowe są wpisywane pod port pierwszy. Dane z licznika modulo 2n są podawane na wejście adresowe portu drugiego DPRA. Wejście adresowe portu pierwszego A jest sterowane poprzez układ dodający, przez co adres tej jest zawsze większy o określone z góry opóźnienie DELAY, (A= DPRA + Delay). Dzięki temu ta sama wartość pojawi się na wyjściu DPO po opóźnieniu Delay liczonym w cyklach zegara.

 

                                                                     

 

 

 

                                                                      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Istnieje również możliwość innej specyfikacji układu, tzn. poprzez wprowadzenie licznika na A, oraz układu odejmującego na DPRA. Trzeci sposób polega na wykorzystaniu dwóch niezależnych  liczników, z których jeden podaje adresy na wejście A, drugi opóźniony o DELAY podaje adresy na DPRA. Szerokość adresowa jest uzależniona od opóźnienia, tzn. SzerAdr = élog2 DELAYù.

Warto zwrócić uwagę, że przy opóźnieniu równym 2n układ dodający nie jest używany - adres portu pierwszego i drugiego jest taki sam. Dlatego istnieje również alternatywna metoda budowy bufora opóźniającego polegająca na kaskadowym łączeniu układów opóźniających, np. aby opóźnić sygnał o 24 należy połączyć kaskadowo układ opóźniający o 16 cykli zegara oraz o 8 cykli zegara, dzięki czemu sumaryczne opóźnienie będzie równe sumie poszczególnych opóźnień. Metoda kaskadowa może być stosowana również w celu zwiększenia całkowitego opóźnienia w przypadku gdy dysponujemy mniejszymi pamięciami, np. aby opóźnić sygnał o 32 cykle zegara mając do dyspozycji pamięci 16´1 należy połączyć kaskadowo 2 układy opóźniające o 16 cykli zegara.

                                                             

Mając pamięć SRAM 16x1 skonstruować interface, który emulowałby pamięć DRAM (dodatkowe sygnały RASN i CASN, wspólna magistrala do odczytu i zapisu danych) pracującą w trybie Fast Page Mode (nie jest konieczne powtórne nadawanie adresu wiersza).

 

Pamięć DRAM pracująca w trybie "Fast Page Mode" różni się od zwykłej DRAM tym, że po podaniu adresu wiersza, wystarczy zmieniać adres kolumny, aby odczytywać kolejne dane. W tym celu adres kolumny musi być przetrzymywany w rejestrze do czasu jego zmiany. Ponieważ w układzie z punktu 5 da się to zrealizować, projekty będą się różnić jedynie sposobem symulacji. Inne będą przebiegi sygnałów /RAS i /CAS. Również można je znaleźć we wstępie teoretycznym.

 

 

Moduł obliczający histogram - zaprojektować układ inkrementujący o jeden w każdym cyklu zegara zawartość danej komórki pamięci (adres komórki jest podawany podczas symulacji). Układ składa się z układu pamięci, układu inkrementatora o 1 (wyjście inkrementatora jest podawane na wejście pamięci danych do zapisu).

 

      Histogram  jest to układ, który zwraca nam częstość występowania pewnych zdarzeń w określonym przedziale czasu. Dzięki temu otrzymujemy praktyczny wykres zależności zdarzeń od częstości ich pojawiania się. W naszym przypadku zdarzeniem jest pojawiająca się dana, która jest podawana na wejściu adresowym A. Histogram zwraca nam więc częstość pojawiania się konkretnej danej (adresu). Najprościej zliczanie pojawiających się adresów jest wykonać poprzez zwiększanie  zawartości danej komórki (o tym właśnie adresie). Stanem początkowym jest oczywiście zerowa zawartość komórek pamięci. 

      Histogram zbudowany jest w oparciu o inkrementator oraz o układ pamięci z zapisem synchronicznym. Adres komórek podawany jest na wejście A, dzięki czemu pojawia się asynchronicznie na wyjściu Q, skąd ponownie poprzez układ inkrementujący wprowadzony jest na wejście D. W celu ponownego zapisu WE jest ustawione jako jedynka logiczna. Zwiększanie komórek następuje automatycznie, za każdym przejściem przez inkrementator, dopóki adres komórki nie ulegnie zmianie.

 



 

 

Zaprojektować moduł histogramu, który dodatkowo umożliwia odczyt histogramu i jego zerowanie z użyciem pamięci i multipleksera.

             

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

...

Zgłoś jeśli naruszono regulamin