Sterowanie pamięcią

Początek przygody z elektroniką. Teoria, sprawozdania, proste projekty.
helios
Piszący użytkownik 1
Piszący użytkownik 1
Posty: 33
Rejestracja: sob 27 sie 2005, 14:29

Sterowanie pamięcią

Postautor: helios » pn 30 paź 2006, 17:20

Wie ktoś jak sterować pamięciami SDRAM, tak żebym mógł je podłączyć we własnym urządzeniu... może macie jakiś opis [najlepiej w j. polskim]. Na necie szukałem ale nic sensownego nie ma, a już szczegółów elektronicznych w ogóle nie znalazłem. Jedynie wiem co to RAS, CAS, DQM i kilka innych wyprowadzeń. Natomiast nie kapuje np. inicjalizacji, jak to jest z tym odświeżaniem, jak jest z zamykaniem czegoś tam, czym się różnią te operacje robione ręcznie od automatycznych [tzn. kiedy robić je ręcznie a kiedy robione są automatycznie i jak to się ma do czasów]. Czy można zegar spowolnić i do jakich wartości. Czy zegar można użyć np. generujac odpowiednie sygnały z procka, czyli synchronizacja nie z zegara procesora a z nóżki procesora... itd... itd... macie coś co mogłoby mi pomóc?

Przykład takiego scalaka:
HY57V658020B
http://www.alldatasheet.com/datasheet-p ... 8020B.html

MT48LC2M8A1
http://www.alldatasheet.com/datasheet-p ... 2M8A1.html

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » pn 30 paź 2006, 20:47

Jesli chodzi o modul DIMM/SDRAM (168pin) to wyprowadzenia sa tu http://pinouts.ru/Memory/DimmSdram168Unbuf_pinout.shtml
Jak znajde cos wiecej to dorzuce.
Jesli sie uda to uruchomic to licze na szczegoly, bo sam nosze sie z mysla uzycia dimm-ow do czegos...
Pozdr.

helios
Piszący użytkownik 1
Piszący użytkownik 1
Posty: 33
Rejestracja: sob 27 sie 2005, 14:29

Postautor: helios » pn 30 paź 2006, 21:47

Z rozmieszczeniem pinów nie ma problemów... też się do tego dokopałem, jednak jest to temat idący zbyt daleko a zarazem nic nie znaczący, bo z samych pinów wiele nie wyciągnę.

Podłączenie całej kości to nie problem pod warunkiem że potrafi się podłączyć pojedynczy układ... dlatego postanowiłem na początek pobawić się pojedynczym układem [jednym z wymienionych na początku], bo to jest najlepsze na start.

Jeśli coś znajdziesz to napisz tutaj lub na PRV. Jak uda mi się uruchmić pojedynczy układ na podstawie wiadomości które ktoś podeślesz, to dam znać z czym miałem problem itd.

Jedyne co mi się nie podoba na początek to zasilanie układów 3.3V :P ale gdybym tylko takie problemy miał to byłbym bardzo zadowolony :)

Pozdro

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » śr 01 lis 2006, 19:54

Schemat modulu DIMM, i troche uzytecznego info:
http://pj.wroclaw.pl/ftp/SD8_16C8_16x64AG.pdf
Pozdr.

helios
Piszący użytkownik 1
Piszący użytkownik 1
Posty: 33
Rejestracja: sob 27 sie 2005, 14:29

Postautor: helios » czw 02 lis 2006, 2:28

no to już lepsze... coś podobnego udało mi się dostać, ale to nadal mało... żeby to działało z AVRem to muszę wiedzieć czy można użyć zegara poniżej 20MHz dla pamięci, a jeszcze lepiej jakby pamięć była synchronizowana z jednego z wyprowadzeń a częstotliwość była różna [zmieniająca się w zależności od potrzeb, a czasami nawet bardzo mała kiedy ram byłby rzadziej wykorzystywany]...
w AVRach będzie mały problem, żeby pamięć synchronizować z zegarem procka, bo to ograniczy jej funkcjonalność. Z tego co widziałem na innych kartach to dane utrzymują się przez jeden cykl a to trochę mało. Dlatego zastanawiam się czy dałoby się zastosować jedno z wyprowadzeń do sterowania zegarem. Przeszedłbym do praktyki, ale wykonanie takiej płytki, gdzie pewność wszystkiego jest zerowa, jest trochę ryzokowne... movzx spróbuj znaleźć jakieś info o zegarze i czy zegar może zostać zatrzymany bez utraty danych, bo jeśli nie może być zatrzymany to będzie znaczyło że trzeba cały czas taktować, a co za tym idzie pewnie 20MHz będzie zbyt mało :/...
Myślałem już nawet o pracy dwóch zegarów 100MHz i podzielonego na 5 lub więcej. Jeden dla pamięci drugi dla AVR. Nie byłoby to głupie rozwiązanie, ale pojawia się problem, bo dane utrzymują się przez jeden cykl a to już jest źle... gdyby utrzymywały się dłużej to według mojej skromnej wiedzy w tym temacie na adresowanie i odczyt z pamięci w asemblerze potrzebne byłyby 3 cykle. Niestety nie mam pewności czy dane utrzymają się dłużej niż jeden cykl... żeby dało się przekazać informację pamięci, żeby czekała przez 4 cykle to byłoby super, bo odczyt sekwencyjny pozwalałby na odczytanie 8 bajtów [dla jednego scalaka] w 10 cykli. To byłoby lepiej niż w SRAMach! Jednak nie widzialem żeby była taka opcja... to dałoby się rozegrać gdyby spowolnić zegar, ale czy tak można?

heh, trochę długi wyszedł ten wywód... movzx napisz jak coś znajdziesz... obiecuję podzielić się informacjami jak to rozegram, ale muszę mieć info co z tym zegarem itd, bo sporo zachodu jest z przetestowaniem czegoś takiego ze względu na precyzję z jaką trzeba wykonać płytkę

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » czw 02 lis 2006, 13:45

Wykonywanie plytki w tym momencie nie ma wiekszego sensu.
Proponuje wypruc z jakiejs plyty glownej zlacze DIMM, i podlaczyc wszystko "na drutach" do zwyklej plytki uniwersalnej.
Bedzie szybciej, taniej, i latwiej cos poprawic.
Co do podtrzymania danych to widze ze te pamieci maja cos takiego jak "self-refresh" co chyba rozwiazuje sprawe.
Faktem jest ze zegar 100MHz (jesli taki jest potrzebny, jeszcze nie wiem) nie bedzie do osiagniecia z AVR.
Ale tutaj moze pomoc zrobienie szybkiego interfejsu np. na jakims GAL-u, (chodzi w koncu tylko o podanie prostej sekwencji stanow do pamieci, i zapamietanie 64bit) i podawanie mu odpowiednich rozkazow z AVR.
A w czasie kiedy nie "rozmawiamy" z pamiecia, wprowadza sie ja w tryb "self-refresh", i problem z glowy.
Pozdr.

helios
Piszący użytkownik 1
Piszący użytkownik 1
Posty: 33
Rejestracja: sob 27 sie 2005, 14:29

Postautor: helios » czw 28 gru 2006, 4:12

No cóż. Jak widać zainteresowanie tematem jest dość skromne, jakby nikt nigdy tego nie robił lub była to jakaś wielka tajemnica. Poradziłem sobie sam.
Podziękowania dla movzx za to, że w ogóle podjął jakąkolwiek próbę i dyskusję.

Postanowilem zamieścić na forum kilka uwag w tym temacie. Nie będę tutaj wszystkiego dokładnie opisywał bo nie ma to najmniejszego sensu skoro nie ma większego zainteresowania, a pisać jest o czym.

Moim celem było podłączenie pojedynczego układu pamięci SDRAM do mikrokontrolera z rodziny AVR. Układ pamięci został wylutowany z całej kości pamięci do PC'ta [jeśli ktoś ma zdolności to powiem że idzie wylutować zwykłą transformatorówką bez uszkadzania układu i wlutować we własną elektronikę tym samym sposobem, ale to tak na marginesie dla tych którzy sądzą że do tego potrzeba stacji na gorące powietrze, którą nie każdy ma].
Układ pamięci to: HY57V658020B
Procesor: Atmega128

Układ pamięci powinien być łatwo dostępny bo był jednym z najczęsciej powtarzających się układów na kościach które posiadam. Procesor został wybrany nie przypadkowo, pojemność pamięci również. Są one obecnie częścią wiekszej płyty i to na tej większej płycie przy okazji SDRAM został wypróbowany.

Warto również zapoznać się z opisem układów tej serii MT48LC4M4A1. Opisy są dość dokładne z wykresami czasowymi i opis ten jest dość zgodny z układem, który ja użyłem.

Jeśli chodzi o moje uwagi to po pierwsze proces inicjalizacji pamięci powinien przebiegać według określonych regul i nie powinien od nich odbiegać, bo potem rozmowa z pamięcią będzie nie możliwa [proces inicjalizacji widoczny na wykresach w opisie powyższego układu].

Ważne jest odpowiednie skonfigurowanie rejestru pamięci bo od tego będzie zależało w jaki sposób dogadamy się z pamięcią.

Taktowanie. Wyjście clk można traktować jako wyjście synchronizacyjne, czyli nie jest konieczny nieustanny i stabilny cykl zegarowy na tym wyjściu.

Odświeżanie. Pamięć SDRAM niestety wymaga odświeżania, ale są też dobre wiadomości. Dostępne są dwa tryby AUTO-REFRESH i SELF-REFRESH. Rozsądne wydawanie tych komend zapewnia odpowiednie odświeżanie. Jeśli mamy pamięć taką jak moja to musimy odświeżyć 4096 wierszy w 64ms czyli średnio jeden wiersz co 15.625us. Nie jest to takie staszne :), ponieważ mamy tryb SELF-REFRESH. Jeśli pracujemy z pamięcią np. odczytujemy i zapisujemy itp i cykl tych działań nie trwa dłużej niż 15.625us to po zakończonej pracy spokojnie możemy wydać komende SELF-REFRESH i przestać się martwić o odświeżanie. Jeśli zaś działania trwają dłużej, bo np. odczytywaliśmy cały wiersz to wtedy musimy wydać odpowiednią ilość komend AUTO-REFRESH. Czyli jeśli działania trwały 10us to wydajemy SELF-REFRESH i po sprawie. Jeśli trwały 300us to wydajemy komende AUTO-REFRESH min ok 20-22 (300us/15us). Wydawanie tych komend wbrew pozorom nie zajmuje nam wiele cykli procesora, gdyż przy wolnym zegarze do 16MHz nie musimy się martwić zbyt mocno o opóźnienia wynikające z działania samej pamięci. Oznacza to, że raz ustawiamy komende AUTO-REFRESH a potem generujemy 20-22 cykle zegara dla pamięci i problem z głowy. Potem wydajemy komende SELF-REFRESH i przestajemy się martwić o cokolwiek.

Czas odczytu i zapisu. Niestety SDRAM z tego co się orientuje nie jest obsługiwany przez AVRy, bo i po co miałby być skoro taki Atmega przewiduje zaledwie 64kB... więc taki sterownik musi być sterownikiem programowym lub sprzętowym jeśli takowy zrobimy. W moim przypadku sterownik jest programowy. Podłączenie pamięci i procesora niestety nie jest zbyt logiczne :P więc niektóre operacje są dłuższe niż w normalnie być powinny [np. linie A0-A11 wiszą na 3 portach i jeszcze w dodatku porozrzucane]. Prawidłowe i LOGICZNE rozmieszczenie SDRAMu może przyspieszyć troszkę czasy odczytu i zapisu. Niewątpliwie jednak najkorzystniej wypada odczyt większymi porcjami danych [podobnie zapis]. W moim przypadku [tym przypadku gdzie porty są porozwalane :P] odczyt i zapis porcji 8 bajtów był na poziomie ok 26 cykli zegara na bajt, czyli dość sporo. Jednak w urządzeniu, który składam najlepiej dane wczytywać większymi partiami, a nawet całymi wierszami. W takim przypadku odczyt i zapis jest znacznie szybszy wychodzi średnio zaledwie 7.8 cykla na bajt. Jest to wynik nienajgorszy i mnie osobiście zadawala. Podsumowując: najbardziej opłaca się wczytywać dane większymi porcjami i od razu lepiej przemyśleć architekturę urządzenia, które składamy, pod względem samej pamięci.

Inne moje uwagi to:
Przerywania. Ważne żeby nie zapomnieć o WYŁĄCZENIU przerwań podczas odczytu i zapisu do pamięci. Nie może być tak, że program odczytuje z pamięci i nagle dostaje przerywanie które również zamierza korzystać z pamięci lub nie będzie korzystać ale np. będzie się wykonywało 200us. Na czas odczytu i zapisu przerywania powinny być wyłączone, chyba że ktoś odważny napisze przerywanie w taki sposób że będzie potrafiło przywrócić aktualny stan procesu odczytu/zapisu co może być nieco skomplikowane.

Napięcie zasilania. Niestety SDRAM raczej nie pójdzie chętnie ze zbyt wysokiego napięcia. Mój ma przedział 3.3V - 4.6V. Jeśli procesor będzie szedł z tym samym napięciem co pamięć i napięcie będzie w tych granicach to nie ma problemu. Niestety w moim przypadku pamięć biegnie z napięciem 3.8V a procesor 5V. W takim przypadku zalecam stosowanie oporników nie mniejszych niż 42 Ohm [tak gdzieś podali]. Przy niższych napięciach pamięci rzędu 3.3V i 5V procek może być konieczne zastosowanie bufora, bo może być problem z rozróżnianiem stanów przez procesor. W moim przypadku zapobiegawczo znalazł się bufor [nie chciałem dwukrotnie trawić płytki :)]




Cóż jeszcze można dodać? Chyba warto jeszcze wziąć pod uwagę plusy i minusy takiego rozwiązania.
Do minusów niewątpliwie należy:
- Konieczność napisania własnego sterownika [w moim przypadku kod powstawał w C ale operacje na pamięci to wstawki asm]
- Trochę zabawy z testowaniem
- Nie zbyt szybkie odczyty przy małych porcjach danych i średnie [jak dla mnie] odczyty dla dużych porcji danych, czyli coś za coś, mało i długo kontra szybko i dużo
- Nie zbyt przyjemny sposób adresowania, który nie pozwala na traktowanie pamięci jako ciągłości bajtów
- Konieczność dbania o prawidłowe odświeżanie podczas pisania funkcji współpracujących z pamięcią
- Mało literatury w tej sprawie, a po polsku w sumie w ogóle nie ma nic sensownego

Do plusów można zaliczyć:
- Cena... w wielu przypadkach to 0zł za całe kość
- Duża pojemność
- W zależności od zastosowania warto się pobawić. W moim przypadku SDRAM służy jako bufor dla większej ilości danych [rzędu nawet kilku GB], które mogą napływać w różnych odstępach czasu a przetwarzane muszą być w równych odstępach... i co najważniejsze mogę bez problemu posługiwać się całymi wierszami :) i większą ilością na raz, więc będę miał te krótsze czasy odczytu.

No cóż... plusów wydaje się mniej, niemniej jednak pobawić się zawsze można. Łącząc SDRAM i SRAM [nawet głupie 4KB wewnątrz Atmega128] można uzyskać więcej pamięci niskim kosztem i o wystarczająco wysokiej wydajności, bo przecież czasami taki większy bufor może się przydać kiedy robimy sterownik do jakiejś maszyny. Wówczas w buforze możemy przechowywać dane z komputera itd itd itd...

W moim przypadku był to dobry wybór.

Pozdrawiam.

PS. tylko nie krytykujcie, bo chętnych do wypowiedzienia się w tej sprawie było wieeeeeeeeeeelu... trzy dni liczyć można... ale ludzi, którzy skrytykują pewnie nie zabraknie hehe

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » czw 28 gru 2006, 11:59

Ja tam nie krytykuje, tylko ciesze sie ze ktos sie pozmagal z tematem, bo ostatnio szukalem wlasnie pamieci, w ktorej mozna by schowac glupie paredziesiat kB danych, i okazuje sie ze ceny sa.... dziwne :| Tak jakby w dzisiejszych czasach zrobienie megabajta pamieci bylo niewiadomo jakim problemem... W kazdym razie obsluga ramu moze sie przydac :)
Pozdr.

helios
Piszący użytkownik 1
Piszący użytkownik 1
Posty: 33
Rejestracja: sob 27 sie 2005, 14:29

Postautor: helios » czw 28 gru 2006, 14:30

movzx ciebie na myśli nie mialem :P byłbyś dziwny gdybyś krytykował skoro się udzielałeś w temacie hehe

helios
Piszący użytkownik 1
Piszący użytkownik 1
Posty: 33
Rejestracja: sob 27 sie 2005, 14:29

Postautor: helios » czw 28 gru 2006, 14:36

PS. to już masz odpowiedź gdzie upchać te dane :) SDRAM nie jest najgorszy... poza tym widziałem w kościach 32MB fajne mniejsze układy SDRAMu, a w jednej drukarce jeszcze ładniejszego scalaczka -> nie dość że małego to jeszcze z większym rozstawem nóżek :)
Idzie również dostać pojedyncze układy po 512kB ale w 16 bitach więc przepustowości można jeszcze bardziej powiększyć.

Co do cen to tak jak napisałem praktycznie gratis :) Wystarczy sprawdzić chociażby na allegro. Pamięć 64MB czyli 8 scalaków po 8MB kosztuje zaledwie 7zł :) czyli poniżej 1zł za scalaczka :). To praktycznie darmo.


Pozdrawiam i życzę powodzenia


Wróć do „Początkujący”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika. i 57 gości

cron