česky english Vítejte, dnes je čtvrtek 25. duben 2024

Pohled na NAND FLASH paměti

DPS 2/2010 | Články
Autor: Ing. Jan Weinbrenner

Cílem tohoto článku je podělit se o zkušenosti s ukládáním většího množství dat v námi konstruovaných zařízeních. Zhodnotíme jak spolehlivost řešení, tak cenové relace. V našem článku nastíníme řešení, kde spolehlivost bude hrát velkou roli. Pokud člověk přijde o fotografie z dovolené, je to věc nemilá, ale dá se to přenést. Horší je případ, kdy určitou dobu sbíráme data z velmi drahého pokusu, a přijdeme o výsledek.

Pokud se jedná řádově o MB, není potřeba pro uložení velká rychlost, a tak lze použít sériovou nebo paralelní paměť typu NOR. Ty jsou používány např. pro uložení Biosu v počítači. Pokud se jedná o desítky MB až jednotky GB, je nutné použít paměti typu NAND FLASH.

Vlastnosti paměti NAND FLASH

Paměti NAND FLASH jsou moderní součástky pro uložení velkého množství dat. Jedná se o paměti typu „nonvolatile“, což znamená, že si svá data udrží i po odpojení napájecího napětí. Dnes se vyrábí typy schopné uložit 512 Mbit až 128 Gbit.

Pohled na NAND FLASH paměti 1 Pohled na NAND FLASH paměti 2

Obr. 1 Graf pro SLC

Obr. 2 Graf pro MLC

Paměť obsahuje velké množství buněk, které lze elektricky nabít a také smazat. Zde se dostáváme k základnímu dělení těchto pamětí na SLC a MLC. Liší se v tom, kolik bitů lze uložit do jedné buňky. U SLC je to pouze 1 bit, zatímco u paměti MLC jsou dnes používány 2 bity v jedné buňce. To znamená, že u SLC paměti se buňka nabije pro stav 1 na 20 % a pro stav 0 se nabije na 80 %. Při čtení jsou hodnoty od sebe dostatečně vzdáleny a pravděpodobnost chyby čtení je malá. Naproti tomu se u MLC paměti nabíjí buňka na hodnoty 25 %, 45 %, 65 %, 85 % pro uložení následných kombinací 2 bitů (11, 10, 01, 00). Zde jsou již hodnoty blíž u sebe a možnost chyby při čtení je mnohem vyšší.

Každá paměť proto obsahuje pro každou stránku paměti záložní místo, kde se ukládají pomocné informace tak, aby bylo možné v případě chyby vadná místa dopočítat. K tomu se používají samoopravné kódy. Již z výroby má každá paměť určitý počet vadných stránek. Tyto stránky jsou poškozeny natolik, že ani samoopravné kódy by nestačily pro správné uložení informace. Tyto stránky jsou od výrobce označeny v prvním bajtu záložního místa každého bloku. Blok je určitý počet stránek a jejich počet je dán v katalogovém listu. Během používání paměti se další vadné stránky mohou vyskytnout a s tím je potřeba počítat. Proto má např. 1GB klíč pouze 970 MB. Každá stránka u SLC paměti má životnost asi 100 000 přepisů, zatímco u MLC paměti to je desetkrát méně.

Vnitřní organizace paměti

Pro názornost si popíšeme vnitřní organizaci paměti firmy Samsung K9F- 8G08U0M.

Kapacita této paměti je 1 GB. Nejmenší jednotkou paměti, kterou lze zapisovat, je jedna stránka. Stránka obsahuje 4 KB dat, čili 4 096 B. Stránka ještě navíc obsahuje 128 B záložního místa, do kterého se ukládají informace pro opravu dat pomocí samoopravných kódů a další informace, jako např. kolikrát byla tato stránka zapisována. Bajty v záložním místě nemají přesnou definici, protože to je věcí implementace každého řadiče. Stránka paměti je také základní jednotkou, se kterou se u paměti pracuje. Pokud tedy potřebujeme zapsat 1 bajt, tak je potřeba zapsat celou stránku, podobně jako u sektoru na pevném disku.

Ze stránky jdou přečíst jednotlivé bajty, ale to se obvykle nepoužívá. Přečtení jedné stránky trvá asi 25 mikrosekund a jednotlivé bajty lze potom číst po 25 nanosekundách. Z toho lze jednoduchým výpočtem zjistit, že z jednoho čipu lze číst data rychlostí 30 MB/sec, zatímco stránku lze zapsat za 200 mikrosekund. Data lze tedy zapisovat do jednoho čipu rychlostí asi 20 MB/sec.

Je tu ale jedna věc, která celou záležitost komplikuje. Aby šla stránka zapsat, musí být vymazána, ale mazat lze pouze celý blok. U výše uvedené paměti tvoří blok 64 stránek, tedy 256 KB. Pokud tedy chceme přepsat jediný bajt, musíme přečíst celý blok, smazat jej, změnit 1 bajt a zapsat celý blok znovu. Druhou možností by bylo příslušnou stránku v nějaké mapovací tabulce zneplatnit a zapsat na jiné místo, což se v praxi také používá. Ovládání je na inteligenci externího řadiče. Paměť K9F8G08U0M obsahuje 4 096 bloků.

Požadavky na řadič NAND FLASH pamětí

Asi nejnáročnější částí řadiče je jednotka samoopravných kódů. Je požadováno, aby jednotka uměla opravit 1 vadný bit na 512 bajtů u SLC paměti a 4 bity na 512 bajtů u MLC paměti. Při zmenšujících se rozměrech buňky jsou požadavky u nejnovějších pamětí ještě náročnější. Pro opravu chybných dat se používá ECC kód, který dokáže opravit 1 bit na 512 bajtů. Potřebuje k tomu 22 bitů pomocné informace. Pro větší možnosti opravy se používají Reed-Solomonovy kódy (RS) a BCH kódy. Ty dokáží pomocí 2 bajtů pomocné informace opravit 1 bajt datové informace. Jenom pro zajímavost: bez těchto kódů bychom nepřečetli ani jediné CD a digitální televize by nefungovala správně.

Co kdyby byla chyba v pomocné informaci? U ECC kódu se používá další samoopravný kód pro samoopravný kód hlavní informace. U RS a BCH kódu je to trošku jednodušší. Tam lze opravit i chybu v samoopravném kódu z hlavní informace. Tím se ale dostáváme na 4 bajty opravného kódu. Tak může být např. 1 bajt špatně v hlavní informaci a 1 bajt v samoopravném kódu v místě pomocných informací. Může také být situace se 2 bajty v datech nebo pomocné informaci. Samoopravné kódy lze počítat softwarově, nebo se kvůli nim často používá hradlové pole. Nejnovější procesory mívají již takovou jednotku zabudovanou. RS a BCH kódy jsou poměrně výpočetně náročné. A náročnost roste se stupněm zabezpečení. Softwarový výpočet pro opravu 3 bajtů na 512 bajtů informace probíhá rychlostí 1,5 MB/sec na 600 MHz signálovém procesoru. U hradlových polí nebo jednotky integrované v procesoru je úzkým hrdlem paměť.

Další důležitou funkcí řadiče je logické uspořádání dat v paměti. Pokud má blok životnost 100 000 přepisů a byla by v něm například FAT tabulka, tak by operační systém ještě neskončil bootování a bylo by po bloku. Tímto způsobem to samozřejmě nejde použít, a proto se používá tzv. wear leveling, který bývá statický i dynamický. Řadič zkrátka ví, kolikrát byl každý blok přepsán. Sleduje se, který blok byl přepsán nejčastěji a který naopak nejméněkrát. Pokud rozdíl dosáhne určitého čísla, tak se vymění. To je také důvod, proč třeba FAT tabulka cestuje po disku. Životnost paměti je dána také inteligencí řadiče.

Pro zajímavost můžeme provést jednoduchý výpočet. Máme-li 100GB disk a každou sekundu zapíšeme 1 MB, to znamená 100 GB × 100 000 přepisů na 1 MB, potom životnost disku vychází na 116 let u SLC paměti. To platí také pro ideální řadič, ale v běžném provozu bude životnost o trochu nižší. U MLC paměti bude životnost desetkrát nižší. Zatímco u SLC disku bude životnost třeba 30 let, u MLC disku to budou pouze 3 roky!

Uplatnění NAND FLASH pamětí

NAND FLASH paměti jsou dnes použity u moderních disků, USB klíčenky, „compact flash“ pamětí a u všech karet do fotografických přístrojů. My je nyní zhodnotíme z hlediska použití v námi vyvíjených zapojeních.

Compact flash používá pro připojení mód karty, která se přepne do funkce IDE. Potom jsou všechny vývody shodné s běžným pevným IDE diskem. Karta většinou umí všechny PIO módy a také DMA. Rychlost je dostatečná, obsahuje vlastní řadič, musíme však doprogramovat FAT. Vyrábí se v SLC i MLC provedení.

USB klíčenka vyžaduje řadič USB. Běžně dostupný řadič Vinculum umí FAT, ale je pomalý. Pokud použijeme jiný, tak nás čeká spousta práce s USB protokolem. Vyrábí se v MLC i SLC provedení.

SD karta vyžaduje zaplatit 2 500 USD organizaci spravující standard a naprogramovat FAT. Pro komunikaci se používá nejčastěji SPI mód. Profesionální zařízení a čtečky většinou používají SD 4bitový mód, který zrychlí komunikaci čtyřikrát. Karta již obsahuje řadič. Vyrábí se většinou jako MLC, existují však i speciální průmyslové verze SLC paměti.

Samotný čip si vyžaduje starost o řadič a věci s ním související. Přesto si myslíme na základě vlastních zkušeností, že toto je nejoptimálnější řešení.

Proč použít samotné NAND FLASH čipy

Pokud potřebujeme paměť pro běh operačního systému, tak musíme aplikovat vše výše popsané. Pokud však potřebujeme paměť použít například pro ukládání naměřených dat, sejmutých obrázků apod., potom stačí pouze naprogramovat správu vadných bloků a samoopravné kódy. Záleží na druhu aplikace.

Ve svých konstrukcích jsme vyzkoušeli všechny výše uvedené možnosti a zůstali u použití NAND FLASH čipů z dále uvedených důvodů. Při testování Compact FLASH a SD karty se nám při vývoji mnohokrát stalo, že jsme nakonec přečetli něco jiného, než co jsme na kartu zapsali. Zpočátku jsme tomu nevěřili, a tak jsme kartu vložili do čtečky u počítače. Výsledek byl stejný. Problém byl pravděpodobně v tom, že když kartu vyjmeme během zápisového cyklu, může se blok poškodit. Je tedy možné, že se poškodilo příliš mnoho bloků a vnitřní řadič již neměl bloky pro přemapování. Co je ale horší, řadič to nedal nijak najevo a nechal nás zapisovat dál. To je hlavní důvod, proč jsme ve svých aplikacích od karty ustoupili. Dalším důvodem je fakt, že platíme obal, konektor a řadič. Tam kde je cena rozhodující, je výběr nasnadě. Problém ale může být i s použitým řadičem karty. Může se stát, že jedna karta funguje bez problémů a s jinou jsou problémy, třeba kvůli kapacitě vstupů interního řadiče. Také se nám stalo, že byl špatný dotek v konektoru u SD karty. Většinu zdrojových kódů pro inspiraci si lze prohlédnout v různých distribucích Linuxu.

Zhodnocení

Výše uvedené informaci měly přinést základní pohled na NAND FLASH paměti a jejich použití. Výběr řešení je na každém z nás. Moderní řadiče NAND FLASH pamětí v SSD discích pracují současně s vyšším počtem pamětí. Výsledná rychlost je pak dána násobkem současně pracujících pamětí, ale ani tak s tím výrobci moc nepospíchají. Existují řadiče, které umí pracovat s 32 pamětmi současně.

Po všech zkušenostech, které máme s těmito pamětmi, dáváme při výběru pamětí zásadní přednost pamětem SLC, které jsou mnohem rychlejší a spolehlivější. A data jsou v technice to nejcennější, co máme.