Čeština / English
Login

Firmware / Řadič SDRAM

Autor: Ladislav Čapka
Update: 20.3.2009

1. Úvod

Název RAM vychází ze zkratky random access memory. Narozdíl od pamětí typu ROM lze do pamětí typu RAM (např.: SDRAM, SRAM, DRAM apod.) i průběžně zapisovat. Takovou paměť můžeme nalézt i na FITkitu. Je to paměť typu SDRAM s označením GM72V66841ET7K.

Rozdíl mezi pamětí DRAM a SRAM je v konstrukci. Paměti SRAM, jejichž zkratka vychází ze spojení static random access memory, jsou statické a jejich obsluha je poměrně jednoduchá. Paměti typu DRAM, jejichž zkratka vychází ze slovního spojení dynamic random access memory, je dynamická. Paměti, které jsou dynamické, jsou složeny z kondenzátorů. S touto konstrukcí ovšem přichází malý problém, že kondenzátory neudrží informaci po dlouhou dobu. U pamětí DRAM je tedy nutné prováděť obnovu uložených informací pomocí operace nazývané refresh (dále jen refresh). Paměť SDRAM, která je na FITkitu, je podkategorií dynamické paměti DRAM. Písmeno S v označení typu uvádá, že je narozdíl od běžných DRAM, synchronní.

Pro řízení paměti SDRAM, která vyžaduje složitější obsluhu, je tedy dobré uvažovat o různých optimalizacích, které mohou být specifické pro danou aplikaci a umožní efektivně rozložit řežii SDRAM dle požadavků aplikace.

1.1. Popis použité SDRAM paměti

Paměť SDRAM na FITkitu má označení GM72V66841ET7K. Toto označení informuje o základních vlastnostech osazené SDRAM.

  • GM - paměť

  • 72 - SDRAM

  • V - 3,3V

  • 66 - 64 Mbit

  • 8 - 8-bitová organizace

  • 4 - 4 banky

  • 1 - LVTTL

  • E - revize

  • T - pouzdro TSOP (Normal)

  • 7K - časování PC100, 2-2-2 (tCK=10ns, tAC=6ns, tCL=2, tRCD=2, tRP=2)

Z označení lze tedy vyčíst základní informace týkající se možností paměti. Uvedená paměť má kapacitu 8MB rozdělenou do 4 banků. Nejvyšší možná frekvence paměti je 100MHz. Informace 2-2-2 informuje o detailním časování určitých stavů obsluhy SDRAM. Celou paměť je nutné obnovit v čase 64ms. K obnovení celého obsahu je nutné provést 4096 refresh stavů.

1.2. Organizace paměti SDRAM

Paměť SDRAM je rozdělena do bloků. Těmto blokům se říká banky. Jejich funkce je nezávislá, sdílí ovšem všechny signály fyzické paměti SDRAM. Organizace SDRAM paměti FITkitu je následující: Paměť obsahuje 4 banky, každý bank tvoří adresovatelný blok o velikosti 512 sloupců x 4096 řádků. Celková kapacita paměti je tedy 8kB. Z počtu řádků (4096) vychází také počet nutných příkazů refresh tj. 4096 s maximální délkou intervalu 64ms na řádek, aby nedošlo ke ztrátě dat uložených v paměti.

1.3. Obsluha SDRAM

Paměť SDRAM se obsluhuje pomocí příkazů. Délky příkazů jsou rozdílné - některé trvají 1 takt hodin, některé více. Všechny příkazy lze rozlišit pomocí hodnot signálů RAS, CAS, CS a CKE, které jsou uvedeny v tabulce (tabulka příkazů). Některé příkazy (například čtení/zápis) vyžadují navíc další signály, kterými mohou být sběrnice dat DQ a sběrnice adresy/banku A/BA. Synchonní paměť SDRAM přijímá všechny příkazy na náběžné hraně hodinového signálu. Platnost signálů příkazu musí být platná nejen určitou dobu před, ale i po této náběžné hraně. Tyto dva časy lze běžně nalézt pod označením tCMS (čas před) a tCMH (čas za). U pamětí přibližně stejných jako je paměť FITkitu je to minimálně doba 2/1 ns před/za náběžnou hranou. Konkrétní časy lze najít v datasheetu konkrétní paměti.

Posloupnost přechodů mezi jejímy stavy (příkazy) lze nakreslit konečným automatem, který je zobrazen na obrázku 1.1.

sdram_fsm.png

Obrázek 1.1: Automat příkazů SDRAM.

Příkaz (funkce)

CS#

RAS#

CAS#

WE#

DQM

A/BA

DQ

INH (command inhibit)

H

x

x

x

x

x

x

NOP

L

H

H

H

x

x

x

ACTIVE

L

L

H

H

x

Bank/row

x

READ

L

H

L

H

L/H

Bank/col

x

WRITE

L

H

L

L

L/H

Bank/col

Data to write

BURST TERMINATE

L

H

H

L

x

x

Active

PRECHARGE

L

L

H

L

x

Code

x

REFRESH (auto/manual)

L

L

L

H

x

x

x

LMR

L

L

L

L

x

Op-code

x

Write enable, output enable

x

x

x

x

L

x

Active

Write inhibit/Output High-Z

x

x

x

x

H

x

High-Z

Tabulka : Tabulka signálů příkazů paměti SDRAM

1.3.1. Inicializace

V automatu je vidět, že obsluha paměti SDRAM by měla začínat inicializací. Inicializaci se zkládá z několika postupně nastavených stavů. Po ustálení napětí a hodinového signálu následuje doba, po kterou by měl být nastaven příkaz NOP nebo INH. Po uplynutí této doby následuje příkaz PRECHARGE, který musí proběhnout u všech banků paměti a všechny banky paměti uvede do stavu IDLE. Následuje několik příkazů AUTO REFRESH. Počet těchto stavů se liší dle datasheetu paměti a pohybuje se přibližně v rozmezí počtu 2 až 8. Po sledu těchto příkazů následuje poslední a tím je nastavení režimu paměti příkazem load mode register (dále jen LMR). Jakmile je dokončen příkaz LMR, je paměť ve stavu IDLE, žádný bank není aktivní a s pamětí lze začít pracovat.

1.3.2. Refresh

Refresh paměti slouží k obnově uložených dat. Refresh pamětí SDRAM lze rozdělit na dva typy. Automatický refresh a manualní refresh. Rozdíl mezi těmito dvěma sledy příkazů je ten, že manual refresh obnoví určitý řádek definovaný příkazem, kdežto auto refresh využívá počítadlo řádků uvnitř paměti a každý příkaz auto refresh obnoví řádek daný počítadlem a posune počítadlo o 1 dál.

Před každým příkazem refresh musí být nabitý hlavní kondenzátor. Nabití provádí pouze příkazy PRECHARGE a REFRESH. Příkaz REFRESH provádí nabití jen pro následující příkaz, nikoliv pro aktuální příkaz. Pokud tedy mezi dvěma příkazy REFRESH není jiný příkaz než NOP, není třeba před druhým příkazem REFRESH volat příkaz PRECHARGE. Jakmile je toto pravidlo porušeno, musí být před příkazem REFRESH nastaven příkaz PRECHARGE a teprve po jeho dokončení může být nastaven příkaz REFRESH.

Příkaz PRECHARGE kromě přednabití kondenzátoru deaktivuje banky, nad kterými je volán, což může být jeden libovolný bank a nebo všechny. Tyto banky určují sběrnice signálů BA a signál A(10).

1.3.3. Aktivace banku

Každý bank musí být před možností čtení či zápisu aktivní. Aktivace banku probíhá příkazem ACTIVE a probíhá na úrovni aktivace řádku určitého banku. Bank určuje sběrnice výběru banku BA a sběrnice A určuje řádek paměti, který se má nastavit jako aktivní. Aktivace probíhá u každého banku paměti zvlášť. Je tedy možné aktivovat v rozdílných bancích zároveň libovolný řádek.

1.3.4. Čtení

Paměti SDRAM musí mít aktivní bank, ze kterého chceme číst. Režim čtení je definován registrem nastavení paměti (příkaz LMR), kde je definovaná délka burst režimu. Po příkazu čtení jsou tedy vystavena určitá posloupnost bytů od adresy uvedené u příkazu READ s frekvencí hlavních hodin CLK. Počet těchto bytů může být typicky 1,2,4,8 a nebo celý sloupec paměti. Další podkategorie lze najít v datasheetu paměti.

1.3.5. Zápis

Stejně jako u čtení musí být bank, do kterého chceme zapisovat, aktivní. Režim zápisu může být buď burst - tedy blokový a nebo sigle location adress. Tento režim je dán nastavením v registru režimu paměti a nastavený příkazem LMR.

2. Nízkoúrovňový řadič SDRAM

Řadič paměti SDRAM musí splňovat výše uvedené příkazové podmínky a musí být schopen pracovat v souladu s výše uvedeným automatem. Implementovaný řadič částečně kopíruje automat obsluhy paměti. Je navržen pro frekvenci 100 MHz, která není podmínkou, ale při generování automatického refresh, je v řadiči čítač vypočítaný dle periody hodinového signálu 10 ns odpovídajících 100 MHz vstupnímu hodinovému signálu. Implementace umožňuje nastavit dvě generické proměnné.

  • GEN_AUTO_REFRESH - umožňuje nastavit, zda-li se má řadič starat o obsluhu refreshů automaticky. Při hodnotě TRUE tohoto parametru je generován refresh s intervalem 15 us a refresh celé SDRAM tzn., že 4096 příkazů refresh proběhne za 61,44 ms lineárně rozložených v čase. Pokud je hodnota FALSE, je nutné obsloužit refresh pomocí příkazu fRefresh odeslaného řadiči SDRAM, tak aby byla splněna podmínka 4096 refresh příkazů do 64 ms.

  • OPTIMIZE_REFRESH - je-li refresh paměti obsloužen manuálně a tedy generický parametr GEN_AUTO_REFRESH je nastaven na hodnotu FALSE, je možné optimalizovat přístup k uživatelským příkazům refresh. Pokud je generický parametr GEN_AUTO_REFRESH nastaven na hodnotu TRUE, je hodnota tohotu parametru ignorována. Je-li tento parametr nastaven na hodnotu oAlone, znamená to, že příkazy refresh budou prováděny samostatně a řadič SDRAM provede na konci každého příkazu REFRESH automaticky aktivaci banku, který byl aktivní před tímto příkazem, což urychlí následně příkaz pro čtení či zápis, když se nezmění bank či řádek. Pokud je hodnota parametru nastavena na hodnotu oMultiple znamená to, že příkazy REFRESH budou volány blokově - vícekrát za sebou a není tedy vhodné za každým provádět aktivaci banku a vynucovat tím navíc i příkaz PRECHARGE na deaktivaci banků. Aktivace banku se provádí následně až při prvním příkazu čtení/zápisu a nebo pokud se změní bank či aktivní řádek.

Řadič po zapojení provede inicializaci připojené paměti SDRAM, přičemž drží signál BUSY ve stavu H. Příkazem nastavení režimu LMR při inicializaci následující nastavení: latence=2, metoda zápisu=single location address, délka burst=1. Při sekvenčním čtení dat se využívá možností překrývání příkazů. Lze tedy sekvenčně číst na každý takt jednu hodnotu z SDRAM. Podobně lze sekvenčně zapisovat, samotný příkaz zápisu ovšem trvá 1 takt a k překryvům nedochází. Toto pravidlo platí pouze, pokud nedochází ke změně aktivního řádku v daném banku, jinak je nutné provést aktivaci banku, ke kterému může dojít až po dokončení příkazu čtení/zápisu. Pro příkazy read-after-write lze začít čtení bezprostředně za taktem příkazu WRITE. Jedná-li se o sled příkazů write-after-read, je nutné příkaz WRITE pozdržet až do dokončení příkazu READ včetně latence pro vystavení čtených dat, jelikož by mohlo dojít ke konfliktu přečtených dat vystavených příkazem čtení a dat vystavených pro zápis do paměti SDRAM.

Do řadiče lze poslat 3 typy příkazů. Těmi jsou čtení, zápis a refresh (jen pokud je generickým parametrem nastaven na manuální). V případě, že řadič může obsloužit další příkaz, stav BUSY zůstavá v L. Pokud po přijetí aktuálního příkazu není schopen s tímto příkazem okamžitě začít pracovat, znamená to, že stále probíhá předchozí příkaz nebo auto refresh a nastaví signál BUSY na H. Přijatý příkaz je pozdržen a se všemy hodnotami načten uvnitř řadiče. Všechny příkazy jsou po dobu, kdy je signál BUSY v logickém stavu H, ignorovány.

Vyvolání příkazu probíhá nastavením signálu CMD na hodnotu fRead, fWrite případně fRefresh a potvrzení, že má být příkaz proveden signálem CMD_WE. Příkaz je řadičem načten na nejbližší nástupné hraně hodinového signálu CLK.

  • fRead - Příkaz fRead vyžaduje nastavení adresovacích signálů ADDR_ROW, ADDR_COL a BANK. Tyto signály musí být platné v době načítání příkazu, tj. na nejbližší nástupné hraně hodinového signálu CLK od nastavení CMD_WE na logickou hodnotu H. Po dokončení příkazu čtení jsou vystana vyčtená data na sběrnici signálů DATA_OUT a tento stav je signalizován signálem DATA_VLD, který je vždy na začátku platnosti nových dat přesně 1 takt ve stavu H. Sběrnice DATA_OUT obsahuje 8-bitový registr a data na ní tedy zůstavají platná, čehož lze využít pro eliminaci dynamické latence zpracování dané kolizí s automatickým refresh nebo případně aktivací jiného řádku v banku.

  • fWrite - Příkaz fWrite vyžaduje nastavení adresovacích signálů ADDR_ROW, ADDR_COL, BANK a navíc platná data na sběrnici signálů DATA_IN. Tyto signály musí být platné v době načítání příkazu, tj. na nejbližší nástupné hraně hodinového signálu CLK od nastavení CMD_WE na logickou hodnotu H. Dokončení příkazu není signalizováno. Doba zápisu je 1 takt, pokud nedojde ke kolizi s požadavkem o automatický refresh nebo aktivací jiného řádku banku. Taková kolize je ošetřena výše popsaným signálem BUSY.

  • fRefresh - Příkaz fRefresh slouží k manuálnímu vyvolání sledu příkazů potřebných pro refresh. Tento příkaz je ignorován, je-li řadič nastaven na automatické generování refresh. K nastavení obsluhy tohoto příkazu slouží generický parametr OPTIMIZE_REFRESH popsaný výše. Implementace řadiče využívá příkaz auto-refresh a interního počítadla řádků. Nelze tedy pro příkaz REFRESH specifikovat konkrétní řádek.

Rozhraní implementovaného SDRAM řadiče je zobrazeno na obrázku 2.1.

sdram_raw_ctrl.png

Obrázek 2.1: Rozhraní řadiče SDRAM nižší úrovně.

Popis generických parametrů entity řadiče:

  • GEN_AUTO_REFRESH - automatické/manuální generování refresh

  • OPTIMIZE_REFRESH - režim manuální obsluhy refresh

Popis vstupních a výstupních signálů entity řadiče:

  • CLK - vstupní hodinový signál řadiče (řadič optimalizován pro frekvenci 100 MHz)

  • RST - asynchronní reset řadiče

  • ENABLE - synchronní aktivace řadiče

  • BUSY - signalizace řadiče, že není schopen přijmou další příkaz

  • ADDR_ROW, ADDR_COLUMN, BANK - adresa v paměti

  • DATA_OUT - 8-bitová sběrnice datových signálů (čtení z paměti)

  • DATA_VLD - signalizace validity hodnot na sběrnici signálů DATA_OUT

  • DATA_IN - 8-bitová sběrnice datových signálů (zápis do paměti)

  • CMD - příkaz pro řadič

  • CMD_WE - potvrzení příkazu pro řadič

  • RAM_A, RAM_D, RAM_DQM, RAM_CS, RAM_CAS, RAM_RAS, RAM_WE, R`signal:AM_CLK`, RAM_CKE - signály pro připojení paměti SDRAM.

3. Vysokoúrovňový řadič SDRAM

Nízkoúrovňový řadič tvoří základní abstrakci nad řízením SDRAM pamětí. Je nutné jej ovšem obsluhovat pomocí příkazů, což nemusí být vždy vhodné. Pro jednodušší aplikace, byl vytvořen řadič vyšší úrovně, který do jisté míry zjednodušuje použití základního řadiče SDRAM. Tento řadič již nemá signály CMD a CMD_WE a neumožňuje generovat manuální refresh pro paměť.

Řadič umožňuje číst a zapisovat 8-bitová data s využitím signálů READ_EN, WRITE_EN. U zápisu musí být platná data na sběrnici DATA_IN, která se poté zapíší a adresa v paměti daná sběrnicí signálů ADDR a to po dobu dvou taktů hodinového signálu CLK, kterým je taktován tento řadič SDRAM od náběžné hrany signálu WRITE_EN detekované synchronně. Podobně je tomu u čtení, kde po dobu dvou taktů od náběžné hrany READ_EN musí být platná data adresy na sběrnici ADDR. Platnost vyčtených dat je signalizována signálem DATA_VLD.

sdram_ctrl.png

Obrázek 3.1: Rozhraní řadiče SDRAM vyšší úrovně.

Popis vstupních a výstupních signálů entity řadiče:

  • CLK - vstupní hodinový signál řadiče (řadič optimalizován pro frekvenci 100MHz)

  • RST - asynchronní reset řadiče

  • ENABLE - synchronní aktivace řadiče

  • BUSY - signalizace řadiče, že není schopen vykonat další požadavek (čtení/zápis)

  • ADDR - adresa v paměti

  • DATA_OUT - 8-bitová sběrnice datových signálů (čtení z paměti)

  • DATA_VLD - signalizace validity hodnot na sběrnici signálů DATA_OUT

  • DATA_IN - 8-bitová sběrnice datových signálů (zápis do paměti)

  • READ_EN - ve stavu H vyvolá čtení dat z nastavené adresy, má vyšší prioritu než signál WRITE_EN

  • WRITE_EN - ve stavu H vyvolá čtení dat z nastavené adresy, má nižžší prioritu než signál READ_EN

  • RAM_A, RAM_D, RAM_DQM, RAM_CS, RAM_CAS, RAM_RAS, RAM_WE, RAM_CLK, RAM_CKE - signály pro připojení paměti SDRAM.

Zobrazeno: 1234x Naposledy: 15.11.2017 06:41:12