UKŁADY Z WYKORZYSTANIEM PAMIĘCI, NAUKA, WIEDZA


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.

0x08 graphic

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.

0x08 graphic

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:

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

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

  3. 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:

  1. odczytana wartość jest poprawna ale nie uwzględnia aktualnego wpisu

  2. odczytana wartość jest poprawna i uwzględnia aktualnego wpis

  3. 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”

0x08 graphic
0x08 graphic

0000000000

000000000

0000000001

0x08 graphic

0000000010

000000001

0000000011

0x08 graphic
0x08 graphic
0x08 graphic
.

.

.

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.

0x08 graphic
0x08 graphic
0x01 graphic

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.

.

0x08 graphic
0x08 graphic
0x01 graphic

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.

0x08 graphic
0x01 graphic

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.

0x08 graphic

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.

0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x08 graphic
0x01 graphic

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.

0x08 graphic

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.

0x08 graphic
0x08 graphic
0x01 graphic

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

0x08 graphic

Schemat tego projektu jest rozbudowanym układem zwykłego histogramu. Umożliwia on nie tylko odczyt pamięci histogramu, ale również jego zerowanie. Wejście Z/I decyduje o tym, czy układ ma dokonywać inkrementacji, czy też ma zerować komórki pamięci. Wejścia podawane na multiplekser są adresami pod który następuje wpis, i tak ZEROWANIE odpowiada adresowi komórki, która ma być wyzerowana, INKREMENTACJA - adresowi komórki zwiększanej o wartość 1. Write Enable jest równe 1. Pojedyncza bramka AND symbolizuje układ tychże dwuwejściowych bramek, z których jedno wejście to Z/I.

Zaprojektować moduł histogramu, zbudowanego na pamięci dwuportowej RAMB4_S8_S8, dla której drugi port służy do odczytu i zerowania histogramu.

Schemat połączeń

0x08 graphic
RAMB4_S8_S80x08 graphic

0x08 graphic
0x08 graphic
OBLICZ

0x08 graphic
0x08 graphic

0x08 graphic
0x08 graphic

ADDRA

0x08 graphic
0x08 graphic
ODCZYT

ZEROWANIE

ADDRB 0x08 graphic

0x08 graphic

0x08 graphic
0x08 graphic

0x08 graphic

0x08 graphic

0x08 graphic
0x08 graphic

KONFLIKT

Port A pamięci służy do obliczania histogramu, natomiast port B służy do odczytu i zerowania histogramu. Na wejście WEA (Write Enable A) podajemy sygnał „OBLICZ” uruchamiający i stopujący proces obliczania histogramu. Wejście DIA służy do inkrementowania liczby wystąpień zdarzenia odpowiadającego komórce pamięci, której adres jest podawany na wejście adresowe ADDRA.

Moduł obliczający histogram działa następująco: Po podaniu odpowiedniego adresu ADDRA w następnym cyklu zegara (jest to pamięć synchroniczna) pojawiają się poprawne dane na magistrali DOA, które po inkrementacji są podawane na wejście DIA, które jest następnie zapisane w przy narastającym cyklu zegara. Proces obliczania histogramu wymaga więc 2 cykli zegara na punkt (w pierwszym cyklu następuje odczyt a w drugim zapis - do tego służy licznik mod 2 który wystawia `1' tylko podczas zapisu).

Port B służy do zerowania lub odczytu histogramu o adresie podanym na wejście ADDRB. Na wejście ENB podajemy sygnał „ODCZYT” uruchamiający odczyt histogramu, natomiast na wejście WEB podajemy sygnał „ZEROWANIE” pozwalający wyzerować daną komórkę pamięci. Należy przy tym pamiętać, że możemy dokonać wyzerowania jedynie przy aktywnym stanie sygnału „ODCZYT”.

Jeżeli możliwy jest równoczesne obliczanie histogramu (oblicz='1') oraz odczyt/zerowanie histogramu (sytuacja raczej nie stosowana dlatego nie wymagane przez prowadzącego) to może wystąpić konflikt zapisu i odczytu pod ten sam adres co powinno być zasygnalizowane przez sygnał „KONFLIKT”. Sygnał ten stanowi wyjście układu komparatora, który porównuje adresy ADDRA i ADDRB oraz osobno sygnały „OBLICZ” i „ODCZYT”. Stanie się on zatem aktywny, gdy sygnały obliczania i odczytu histogramu będą równocześnie aktywne lub gdy będziemy chcieli równocześnie obliczać i wyzerować histogram podając na oba wejścia adresowe ten sam adres komórki pamięci.

Należy pamiętać o wyzerowaniu początkowym całej pamięci.

Zaprojektować pamięć synchroniczną dwuportową 4x1 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.

Element biblioteczny - pamięć synchroniczna dwuportowa - umożliwia zapis i odczyt komórki spod adresu A, oraz tylko odczyt komórki o adresie DPRA. Celem tego projektu jest więc zbudowanie pamięci, która oprócz opisanych powyżej zalet, będzie dodatkowo umożliwiała także zapis pod drugi podany adres. Zapis może odbywać się równolegle, pod warunkiem, że nie następuje on równocześnie do komórki o tym samym adresie. W tym przypadku sygnalizowany jest konflikt, natomiast do komórki nie zostaje dokonany wpis - jej wartość pozostaje bez zmian. Wpis jest oczywiście synchroniczny - sygnał zegarowy jest wspólny dla obu portów. Dodatkowo układ wymaga odpowiedniego sterowania danymi z magistrali D[1:0]. Pamięć będzie składać się z czterech przerzutników typy D. Dodatkowo, jak pokazuje poniższy schemat, w skład układu wchodzą : dekodery, multipleksery oraz układ kombinacyjny. Zadaniem tego ostatniego jest realizacja funkcji konfliktu oraz wybór przerzutnika D, do którego następuje wpis. Oprócz tego dokonuje on przesłania odpowiednich danych do odpowiedniego przerzutnika, tzn. dane D0 pod adres A, D1 pod adres B. Jednocześnie te same adresy doprowadzane są do multiplekserów. Odczyt komórek dokonywany jest z wyjść SPO oraz DPO. Sterowanie pamięcią zbudowaną z przerzutników polega na wybraniu określonego przerzutnika pod który następuje wpis danych (wejście CE). Wybranie tego jednocześnie tego samego przerzutnika powoduje ustawienie jedynki na wyjściu KONFLIKT. Sterowanie pomiędzy zapisem / odczytem obu portów jest dokonywany poprzez wykorzystanie wejścia E dekoderów. Jak łatwo się domyślić, funkcje sterujące wejściami CE najprościej wykonać przy wykorzystaniu bramek XOR dla wszystkich wyjść X/Y dekodera (x - wymiar magistral X/Y). Jak wynika z tabeli - zapis następuje tylko w przypadku wybrania jednego z przerzutników. Na podstawie tablicy widać także, że pojedynczy konflikt jest określony bramką AND, całkowity zaś jest równy : KONFLIKT = OR (konflikt0,konflikt1,konflikt2,konflikt3).

Xx

Yx

CE x

KONFLIKT x

0

0

0

0

0

1

1

0

1

0

1

0

1

1

0

1

Pozostaje zatem jeszcze kwestia - wprowadzania właściwych danych pod właściwy adres. Oznacza to, że przy pojawieniu się 1 na X x oraz jednocześnie 0 na Y x następuje wpis z magistrali danych D0 i na odwrót. Najłatwiej zrealizować to w oparciu o dwie bramki AND (wejścia D0 i X x oraz D1 i Y x ), których wyjścia z kolei podajemy na OR. Wyjście tej bramki jest jednocześnie wejściem D x.

0x08 graphic

Zaprojektować układ FIFO (First-In First Out) z użyciem pamięci dwuportowej ram16x1D i maksymalnej długości 8- 32.

FIFO (First In First Out) jest pamięcią, z której dane mogą być odczytywane wyłącznie w takiej samej kolejności w jakiej były zapisywane. Układ taki można zrealizować przy pomocy pamięci synchronicznej RAM oraz dwóch liczników. Jeden licznik odpowiedzialny jest za zapis danych, a drugi za ich odczyt. Podanie 1 na wejście WRITE powoduje odblokowanie licznika WR oraz zapis danej do pamięci przy najbliższym zboczu narastającym sygnału zegarowego. Podanie 1 na READ powoduje odblokowanie licznika RD i odczyt kolejnej danej przy najbliższym zboczu narastającym sygnału zegarowego. Zapis następuje poprzez port A pamięci, natomiast odczyt przez asynchroniczny port DPRA. Ponieważ zapis dokonywany jest do pamięci zanim licznik się zwiększy swój stan, konieczne jest opóźnienie o jeden cykl licznika RD. Jest to realizowane przy pomocy przerzutnika D.

0x08 graphic

Zaprojektować układ FIFO z użyciem pamięci dwuportowej ram16x1D i maksymalnej długości 8- 16 z dodatkowymi sygnałami FULL i EMPTY.

Układ podobny jak w przypadku zwykłego FIFO. Dochodzą jedynie bloki sterowania wejściami liczników, przedstawione poniżej. Wykorzystywane są w nich sygnały EMPTY i FULL. Oba sygnały generowane są, kiedy liczniki wskazują tą samą wartość. Różnica polega na tym, że sygnał EMPTY wystąpi, kiedy licznik odczytu "goni" licznik zapisu, a FULL - kiedy licznik zapisu "goni" licznik odczytu.

0x08 graphic

Pamięć stosu (LIFO---Last-In Firt-Out) z sygnałem FULL i EMPTY o długości 8-16.

LIFO (Last In First Out) jest pamięcią, z której dane mogą być odczytywane wyłącznie w kolejności odwrotnej do kolejności zapisu. W układzie wykorzystywany jest licznik z możliwością liczenia w dół i w górę. Zapisanie danej powoduje zwiększenie licznika, odczyt - zmniejszenie. Logika sygnałów FULL i EMPTY jest w tym przypadku prosta, gdyż wystarczy wykryć stany Fh oraz 0h. Sterowanie licznikiem polega na zablokowaniu zapisu, gdy pamięć jest pełna i zablokowaniu odczytu, gdy pamięć jest pusta.

0x08 graphic

Aby zapewnić poprawne działanie układu należy spełnić następujące warunki:

RD

WR

UP

CE

1

0

0

1

0

1

1

1

1

1

-

0

0

0

-

0

1

A[n:0]

LICZNIK

DIN

RAM 2nx1

WE O

WE

Licznik

n -bitowy

Clk

„0”

E

S[1:0]

D3

D2

D1

D0

O

Multiplekser

O

O

O

O

Bloki pamięci RAM32x1

D

D

D

D

WE

WE

WE

WE

D

A0:A4

A0:A4

A0:A4

A0:A4

dekoder

2-na-4

A[6:5]

A[4:0]

A[6:0]

CE

D

C

Q

CE

D

C

Q

CE

D

C

Q

CE

D

C

Q

P0

P1

P2

P0

S0

S1

DEKODER

2 na 4

A0

A1

D0

D1

D3

D2

E

0

D

A0

A1

WE

C

MULTIPLEKSER

D

A0

A1

WE

C

CE

D

C

Q

CE

D

C

Q

CE

D

C

Q

CE

D

C

Q

P0

P1

P2

P0

S0

S1

DEKODER

2 na 4

A0

A1

D0

D1

D3

D2

E

DP0

P0

P1

P2

P0

S0

S1

SP0

DPRA0

DPRA1

MULTIPLEKSER

MULTIPLEKSER

CE

WE

WE

D

WCLK

A [3:0]

DPRA [3:0]

RAM 16 x 1D

DPO

Wyjście

B[3:0]

A[3:0]

„1”

D

DP0

SP0

DELAY

Clock

„1”

INKREMENTATOR

WE

WCLK

A [3:0]

D [3:0]

Q [3:0]

„1”

C

A [3:0]

„1”

Q [3:0]

CLK

D [3:0]

Q [3:0]

C

CE

Q [3:0]

C

CE

A [3:0]

WCLK

WE

Licznik RD

RAM16x8

WE

A[2:0]

wynik

A3

O[7:0]

A3[3:0]

Liczba

Operacja

D

WE

WCLK

A

DPRA

Licznik

Licznik

Sterowanie

wejściem

Sterowanie

wyjściem

Q

Q

C

C

D

WRITE

CLK

licznik mod 2

INKREMENTATOR

D

WE

WCLK

A

O

INKREMENTATOR

O

RAM16x1S

Licznik

up/down

UP

CE Q

C

D

Sterowanie

WR

CLK

EMPTY

FULL

RD

D

WRITE

DPO

Licznik WR

A [3:0]

DPRA [3:0]

WCLK

D

WE

Q [3:0]

C

RAM 16 x 1S

Q

A1

A2

A3

CAS

REJESTR

D0

Q0

Q1

D1

C

DATA IN/OUT

D

WE

A0

A1

RAS

RAM 16 x 4S

WE

D [3:0]

WCLK

Q[3:0]

A [3:0]

REJESTR

D [3:0]

Q [3:0]

CE

C

ADR/NODATA

D/A

WE

wejście taktujące

CLK

WCLK

READ

A0

A B

KOMPARATOR

WEA

DIA DOA

ADDRA

ENB

WEB

ADDRB

DOB

CE

CE

READ

D Q

C

ADRES

ADRES

DEKODER 2 : 4

DEKODER 2 : 4

zapis / odczyt

<I port>

zapis / odczyt

<II port>

MULTIPLEKSERY

CLOCK

Konflikt

Dane do zapisu

DP0

SP0

PAMIĘĆ 4 x 1

D Q

4 x

Przerzutniki FDCE

CE

C

Układ komb.

<wybór przerzutnika

+

funkcja konfliktu>

B [1:0]

y

[3:0]

E

A [1:0]

x

[3:0]

E

Sumator

ZEROWANIE

INKREMENTACJA

Z / I



Wyszukiwarka