Jak mogę wdrożyć bardzo prosty asynchroniczny kontroler DRAM?


9

Chciałbym wiedzieć, jak zbudować asynchroniczny kontroler pamięci DRAM bez kości. Mam jakieś 30-stykowe moduły DRAM 1 MB SIMM 70ns (1Mx9 z parzystością), których chciałbym użyć w projekcie komputerowym w stylu retro. Niestety nie ma dla nich arkusza danych, więc wybrałem Siemens HYM 91000S-70 i „Zrozumienie działania pamięci DRAM” IBM.

Podstawowym interfejsem, z którym chciałbym skończyć, jest

  • / CS: in, wybór chipa
  • O / Z: wejście, odczyt / brak zapisu
  • RDY: brak, WYSOKI, gdy dane są gotowe
  • D: wejście / wyjście, 8-bitowa magistrala danych
  • Odp .: 20-bitowa magistrala adresowa

Odświeżanie wydaje się dość proste z kilkoma sposobami na poprawne wykonanie. Powinienem być w stanie wykonać rozproszone (przeplecione) odświeżanie tylko RAS (ROR) podczas NISKIEGO taktowania procesora (gdzie nie ma dostępu do pamięci w tym konkretnym układzie) przy użyciu dowolnego starego licznika do śledzenia adresu wiersza. Wierzę, że wszystkie wiersze muszą być odświeżane co najmniej co 64 ms zgodnie z JEDEC (512 na 8 ms zgodnie z arkuszem danych Seimens, tj. Standardowe odświeżanie cyklu / 15.6us), więc powinno to działać dobrze, a jeśli utknę, po prostu opublikuję inne pytanie. Bardziej interesuje mnie proste, poprawne czytanie i pisanie oraz określanie, czego mogę się spodziewać w zakresie szybkości.

Najpierw opiszę, jak to działa, i potencjalne rozwiązania, które do tej pory wymyśliłem.

Zasadniczo podzieliłeś 20-bitowy adres na pół, używając jednej połowy dla kolumny, a drugiej dla wiersza. Strobujesz adres wiersza, a następnie adres kolumny, jeśli / W jest WYSOKI, gdy / CAS spada NISKI, to jest to odczyt, w przeciwnym razie jest to zapis. Jeśli jest to zapis, do tego momentu dane muszą już znajdować się na szynie danych. Po pewnym czasie, jeśli jest to odczyt, to dane są dostępne lub jeśli jest to zapis, dane na pewno zostały zapisane. Następnie / RAS i / CAS muszą zostać ponownie WYSOKIE WYSOKIE w okresie intuicyjnie nazwanym „ładowaniem wstępnym”. To kończy cykl.

Zasadniczo jest to przejście przez kilka stanów z niejednorodnymi specyficznymi opóźnieniami między poszczególnymi przejściami. Wymieniłem to jako „tabelę” indeksowaną według czasu trwania każdej fazy transakcji w kolejności:

  1. t (ASR) = 0ns
    • /WYSYPKA
    • / CAS: H
    • A0-9: RA
    • / W: H
  2. t (RAH) = 10ns
    • / RAS: L
    • / CAS: H
    • A0-9: RA
    • / W: H
  3. t (ASC) = 0ns
    • / RAS: L
    • / CAS: H
    • A0-9: CA
    • / W: H
  4. t (CAH) = 15ns
    • / RAS: L
    • / CAS: L
    • A0-9: CA
    • / W: H
  5. t (CAC) - t (CAH) =?
    • / RAS: L
    • / CAS: L
    • A0-9: X
    • / W: H (dane dostępne)
  6. t (RP) = 40ns
    • /WYSYPKA
    • / CAS: L
    • A0-9: X
    • / W: X
  7. t (CP) = 10ns
    • /WYSYPKA
    • / CAS: H
    • A0-9: X
    • / W: X

Czasy, o których mówię, są na poniższym schemacie.

schemat czasowy

(CA = adres kolumny, RA = adres wiersza, X = nie przejmuj się)

Nawet jeśli nie jest dokładnie tak, jest coś takiego i myślę, że to samo rozwiązanie zadziała. Do tej pory wpadłem na kilka pomysłów, ale myślę, że tylko ta ostatnia ma potencjał i szukam lepszych pomysłów. Ignoruję tutaj odświeżanie, szybkie sprawdzanie i generowanie parzystości.

Najprostszym rozwiązaniem jest użycie licznika i pamięci ROM, gdzie wyjściem licznika jest wejście adresu ROM, a każdy bajt ma odpowiedni stan wyjściowy dla okresu czasu, któremu odpowiada adres. To nie zadziała, ponieważ ROM są wolne. Nawet wstępnie załadowana pamięć SRAM wydaje się być zbyt wolna, aby była tego warta.

Drugim pomysłem było użycie GAL16V8 lub czegoś takiego, ale nie sądzę, że rozumiem je wystarczająco dobrze, programiści są bardzo kosztowni, a oprogramowanie programistyczne jest zamknięte, a tylko o ile wiem, tylko dla systemu Windows.

Mój ostatni pomysł jest jedynym, który moim zdaniem może zadziałać. Rodzina układów logicznych 74ACT ma małe opóźnienia propagacji i akceptuje wysokie częstotliwości taktowania. Zastanawiam się czytać i pisać można zrobić z jakimś CD74ACT164E rejestru przesuwnego i SN74ACT573N .

Zasadniczo, każdy unikalny stan ma swoją własną zapadkę programowaną statycznie za pomocą szyn 5V i GND. Każde wyjście rejestru przesuwnego trafia do jednego bolca zapadki / OE. Jeśli dobrze rozumiem arkusze danych, opóźnienie między każdym stanem może wynosić tylko 1 / SCLK, ale jest to znacznie lepsze niż rozwiązanie PROM lub 74HC.

Czy więc może się przydać ostatnie podejście? Czy istnieje szybszy, mniejszy lub ogólnie lepszy sposób na zrobienie tego? Wydaje mi się, że widziałem, że IBM PC / XT użył 7400 układów do czegoś związanego z DRAM, ale widziałem tylko zdjęcia z najwyższej półki, więc nie jestem pewien, jak to działało.

ps Chciałbym, aby było to wykonalne w DIP, a nie „oszukiwać” za pomocą FPGA lub nowoczesnego interfejsu użytkownika.

pps Być może lepszym pomysłem jest użycie opóźnienia bramki bezpośrednio przy takim samym podejściu zatrzaskowym. Zdaję sobie sprawę, że zarówno rejestr przesuwny, jak i bezpośrednie opóźnienie bramki / propagacji będą się różnić w zależności od temperatury, ale akceptuję to.

Dla każdego, kto znajdzie to w przyszłości, ta dyskusja między Bil Herd i André Fachat obejmuje kilka projektów wymienionych w tym wątku i omawia inne problemy, w tym testowanie pamięci DRAM.


1
Z którego procesora będzie korzystać Twój komputer retro?
Anonimowy

6502, pamięć zostanie oczywiście zapisana w banku.
Anthony

Czy można nie wymyślić dla ciebie roweru, czy są już dostępne projekty wykorzystujące pamięci DRAM? Nie znam tej rodziny maszyn, ale C64 musi dobrze pasować. Jednak pierwotnie używa układu 6567 „VIC” ​​do sterowania pamięcią RAM. Ale znowu jestem pewien, że od tego czasu były projekty związane z tym, co chciałeś zrobić.
Anonimowy

3
Lekko wypaczona sugestia: Z80 miał dość wbudowanego kontrolera DRAM, aby obsłużyć logikę odświeżania. (Nadal jednak potrzebujesz multipleksera adresów)
Brian Drummond

3
@BrianDrummond Proszę, nie zalecamy przechodzenia na ciemną stronę. Nic dobrego z tego nie wynika.
rura

Odpowiedzi:


6

Kompletne schematy dla IBM PC / XT znajdują się w instrukcji obsługi technicznej komputera osobistego IBM XT (Załącznik D), którą można znaleźć w Internecie.

Problem polega na tym, że biorąc pod uwagę linię stroboskopową, która jest aktywowana podczas odczytu lub zapisu w pamięci, chcesz wygenerować RAS, CAS i linię kontrolną (nazywaną MUX) dla multipleksera adresu. Dla uproszczenia założę nierealistycznie, że stroboskop, RAS i CAS są aktywne wysoko.

Patrząc na schemat PC / XT i schematy z innych komputerów w tym czasie, widzę trzy podstawowe strategie, które są z grubsza następujące:

  • Użyj stroboskopu dla RAS. Użyj linii opóźniającej (część, której wyjście jest opóźnioną czasowo wersją jego wejścia) na RAS, aby wygenerować MUX, i użyj innej linii opóźniającej, aby wygenerować jeszcze późniejszą wersję RAS, która jest używana dla CAS. Ta strategia jest używana przez PC / XT i TRS-80 Model II.

    Przykładową (nowoczesną) częścią linii opóźniającej jest Maxim DS1100.

  • Użyj stroboskopu dla RAS i opóźnij go dla MUX i CAS, ale zrób to przy użyciu szybkiego rejestru przesuwnego zamiast linii opóźniającej. Strategia ta jest używana przez TRS-80 Model I i Apple II.

  • Użyj niestandardowych układów scalonych. Taka jest strategia Commodore 64.


Najwyraźniej wczoraj znalazłem XT TR bez dodatku D. Mam to teraz, to jest świetne. Nie wiedziałem, że te układy linii opóźniającej istnieją i zastanawiałem się, jak sobie radzą z temperaturą. Dziękujemy za podanie nowoczesnego przykładu. +1 za wiele rozwiązań.
Anthony

5

Twoje pytanie jest na tyle skomplikowane, że nie jestem nawet pewien, jaki jest twój rzeczywisty problem, ale spróbuję!

„Najczystszy” układ DRAM oparty na 6502, jaki mogłem znaleźć, pochodzi z Commodore PET 2001-N . Ma 6502 pracujący z częstotliwością 1 MHz, ale logika pamięci DRAM jest taktowana z częstotliwością 16 MHz, prawdopodobnie generując wszystkie taktowania.

Nie analizowałem szczegółów, ale wydaje się, że główna akcja dzieje się z 4-bitowym licznikiem 74191 podłączonym do rejestru przesuwnego 74164. Daje to 8 oddzielnych linii wchodzących w 74157 MUX, który jest kontrolowany przez linię R / W. Wyjście z MUX przechodzi w przerzutnik 7474 i pewną dyskretną logikę do generowania końcowych sygnałów RAS / CAS. Oto fragment, który prowadzi do odpowiedniej strony na schemacie odniesienia.

PET 2001-N strona referencyjna 6

Odświeżanie jest obsługiwane za pomocą osobnego licznika, a każda linia adresu jest podłączona do multipleksera, który wybiera „rzeczywisty” adres lub adres odświeżania.

Części tej logiki również wydają się generować czasy dla podsystemu wideo. Jestem pewien, że można to uprościć dla konkretnych potrzeb, ale myślę, że coś podobnego może być przydatne: licznik wysokiej częstotliwości, rejestr przesuwny i multipleksery.


Właśnie o tym myślałem, ale byłem na tyle głupi, by burzy mózgów kilka zamków zamiast MUX lub dwóch. Zegar 16MHz mnie jednak wyśmiewa, ponieważ a) jest znacznie wyższy niż zegar procesora, który właśnie uznałem za dziwny, ale ma sens ib) Fazy mogą wynosić co najmniej ~ 62ns plus opóźnienia propagacji, które, jak myślałem, były powolne, ale teraz ja zobacz, że jest w tej samej kolejności co IBM PC / XT.
Anthony

Apple II jest bardzo podobny, wykorzystując zegar wideo 14.318 MHz do synchronizacji i współdzielenia pamięci między procesorem a wideo w naprzemiennych półcyklach bez rywalizacji. Nie potrzebuje nawet osobnego licznika odświeżania, ponieważ aktywność odświeżania wideo służy również do odświeżania pamięci.
Dave Tweed

-2

ps Chciałbym, aby było to wykonalne w DIP, a nie „oszukiwać” za pomocą FPGA lub nowoczesnego interfejsu użytkownika.

Chociaż całkowicie rozumiem ducha twojego projektu i chęć korzystania z nietypowych części, zdecydowanie wybrałbym FPGA , gdybym był tobą .

Kilka powodów:

  1. To idealna okazja do nauki. Zaprojektowanie kontrolera DRAM nie jest projektem „hello-world”, a następnie można śmiało powiedzieć, że „da się” FPGA;
  2. Możesz wycisnąć każdą wydajność z tej pamięci, zwłaszcza jeśli jest to starszy układ DRAM. Nie tylko będziesz mieć swój własny komputer PC oparty na 6502, ale możliwe, że będziesz mieć najszybszy komputer oparty na 6502;
  3. Debugowanie problemów lub tworzenie statystyk operacji pamięciowych generowanych przez procesor może być znacznie łatwiejsze. Możesz używać analizatorów logicznych w równoległych magistralach, ale to nigdy nie jest zabawne (mój przyjaciel robi coś w tym kierunku - chce napisać symulację cyklu dokładnie 8088 iz tego powodu musi zebrać te statystyki dotyczące dostępu do pamięci i synchronizacji wzorce. Używa oryginalnego zestawu układów (8288, 8280, 8237) i korzysta z analizatora logicznego z wieloma kanałami, ale z jego doświadczenia mogę powiedzieć, że jest to problem .

2
Nie jestem pewien, jak to jest odpowiedź zamiast komentarza. 1) Nie mówi, że chce się uczyć FPGA. 2) DRAM z lat 80. są już wystarczająco wolne, aby uzyskać dyskretną logikę. 3) Debugowanie może być trudne. Dlaczego nie zaimplementować wszystkiego w FPGA, a nawet tylko w oprogramowaniu? Po co w ogóle korzystać z pamięci RAM ... :)
rura

1
@pipe: Tak, dokładnie. Nie chcę w tej chwili poświęcać czasu na naukę układów FPGA. Mam już dość na swoim drugim niepowiązanym projekcie analogowym. Ogólnie FPGA i PLD wydają się przeszkadzać w tym momencie, chociaż kiedyś nauczę się z nich korzystać.
Anthony

1
@pipe: Ulepszanie tablic jest często trudne, czasochłonne i frustrujące, szczególnie jeśli ktoś nie jest w tym szczególnie wykwalifikowany. Użycie dość prostych PLD (np. 22V10) w niektórych częściach projektu ułatwi modyfikację.
supercat
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.