Showing posts with label Flash. Show all posts
Showing posts with label Flash. Show all posts

Sunday, July 13, 2008

Commands of the NAND

Applications of NAND

到電子商場逛一圈就會發現一堆產品都有 NAND flash 的身影(例如大拇哥,記憶卡,MP3 player,數位相框,甚至 PC 等)。前陣子和 simayi 閒聊時,他就提到:既然大家都愛用 NAND flash ,要是有人為它搞個 IP 或函式庫之類的,勢必可大幅節省開發時間。

相信處理過 NAND flash 的 firmware 人員,在啃讀 datasheet 的過程,難免得謹慎地交叉比對,好好推敲那也佔了不少篇幅的時序圖,以免自己還是不夠小心,誤解文意……

不知道大家看了那一疊 waveform 後,有什麼感想?我的看法是,那疊圖雖補足了許多重要細節,卻沒能好好強調重點,抽象度不夠。這根本是在折磨 firmware 人員,使我們構思演算法時綁手綁腳。

因此,在 K 完文件後,我為這疊 command waveforms 作的第一件事就是--提昇抽象度,強調重點,用 Computer Science 學生都看得懂的語言重新詮釋過:

Command Sequences (2k)

Command Sequences (2k, cont.)

基本的正規表示法就捕捉到 NAND flash commands 的內涵,充分表現出蘊藏其中的模式 :)

適當的表示法可以流暢表達所思所想,幫助我們釐清思緒、避免錯誤;好的表示法更可以提供新的洞見,讓我們解決乍看之下非常困難的問題,甚至進一步導致新的發現。

將來要實現自動化,或 Workflow 軟體時,正規、簡明的表示法更是一個必要的基礎設施。

後記:就 NAND flash 而言,僅僅是 command 的正規化還不夠方便;為 NAND flash 設計演算法時,最好再架上另層一抽象,以幫助思考。

Monday, June 30, 2008

NAND Flash 簡介

The insides of a SD Card

撬開一張 SD 卡,裡面最顯眼的,當然就是那大大一顆的 NAND flash ,我們餵給 SD 卡的資料都儲存在裡面;在 NAND flash 旁邊,還可看到一顆小一號的,那就是 controller IC , 要確保資料的儲存是安全可靠的,有九成的責任都要算在 controller 身上。

在硬體介面方面, NAND Flash 雖有 bus 結構,卻沒去區分 address bus 及 data bus 。在 NAND Flash 上進行任何操作(如 read, write, erase 等),都要透過 command ,且無論 address, data, 或 command,都以同一組 I/O bus 傳輸。

此外, NAND flash 在資料 program 或保存過程,還會隨機出錯,所以廠商才會建議搭配 ECC (Error Correcting Coding) ,以資料冗餘來偵測及更正這種隨機的錯誤。

Compare to NOR Flash

就算不考慮上述這些, NAND flash 還是非常難纏,對 firmware 人員來說更是如此:它無法像 RAM 或 ROM 那樣,隨插隨用;也不像 serial NOR flash 那樣,照著 spec. 下下 command 就能了事。我就以 Samsung K9F1G08U0B 這顆 NAND flash 為例,摘要如下:

Samsung K9F1G08U0B

相較於其他 floating gate 製品,NAND Flash 最讓人詬病的是壞塊(bad blocks),不但一出廠就允許壞塊存在,在保固的使用壽命內好塊還會陸續變成壞塊,更慘的是壞塊的發生還是隨機的。也因如此, NAND flash 的 firmware 或專用的檔案系統都得好好管理壞塊(Bad Block Management),讓用戶察覺不到壞塊存在。

再者,同樣是 floating gate 組出來的, NAND Flash 當然也有明顯的寫入次數限制,再加上它常用於頻繁、不均勻的寫入場合,所以要有一個叫作 wear leveling 的抽象層,讓針對單一邏輯位址的多次寫入,分散到不同的實體位址,以避免太快壽終。

The Algorithm

Tags: [] [] []

Monday, June 16, 2008

The Floating Gate

Floating-gate transistor

浮動閘(floating gate)一詞會讓我銘記於心,是因為閱讀了《矽眼》,該書提到以浮動閘紀錄類神經元突觸加權值,這是「類比」儲存的一個應用。

然而,對多數內嵌系統設計人員來說,浮動閘是用在「數位」儲存的,諸如 EPROM, EEPROM, NOR flash, NAND flash 等。

無論是 EPROM, EEPROM 或 NOR flash ,早先都是設計來在上面直接跑程式的(不用 copy 到 RAM 上跑,術語叫做 execute in place, XIP),所以有獨立的 data bus 及 address bus 。

為了省空間,後來很多 MCU 都把 EPROM, EEPROM 或 NOR flash 包進同一棵 chip 了,這造成外部的 EEPROM 或 Flash 開始走 serial 路線。 serial EEPROM 或 serial Flash 對外的 pin 腳雖然大幅精簡了,卻失去了 XIP 的特性,因此主要被拿來儲存程式之外的東西。

由於 EEPROM 是 byte-wise writable 的,用起來超方便,所以資料量不大時我們都會用它。例如一些儀表類的內嵌系統,諸如血壓計之類的,其內部的關鍵零件是感測器,這些感測器的元件特性會隨溫度等外在因素漂移,所以需要在事後作校正,這些校正用的參數就很適合用 serial EEPROM 儲存。

有時候我們要存的不僅僅是簡短的幾筆,而是長時間累積下來的一大串 log 。例如未來的病患可能會長時間配戴血壓計血糖計之類的,隨時紀錄血壓血糖變化,然後隔固定時間,自動將這些資料傳到醫院的監控中心。這種場合因為要存的資料量較大,也許該考慮採用 serial Flash 。

操作 serial (NOR) Flash 跟操作 serial EEPROM 類似,都有 OP-Code Phase, Address Phase, Data Phase 等三個階段。偏偏 (NOR) flash 只能 block-wise writable ,這意味著就算只想改變一個 block 的某幾個 bytes 的內容,還是得先把整個 block 的值都讀出來,在 RAM 中修改後,再寫回去。

這幾年正火熱的 NAND Flash 一開始就是設計來替代硬碟這類大容量的儲存媒體。它雖價廉、肚大,卻是個極不穩定的傢伙,不但允許出廠就有壞塊(bad block),使用過程壞塊還會隨機增加,更扯的是廠商還信誓旦旦說這是良品,要大家看著辦。良品都這副德行了,真不敢想像一些 down grade 的會長成什麼樣子 :p

文末,再附上簡短的比較:

  • (parallel) EEPROM
    • Byte-writable, i.e. byte-erasable and byte-programmable
    • Execute in place
    • Write special commands to unlock, erase or write
  • (parallel) NOR Flash
    • Erasing and writing must be on block-by-block basis
    • Execute in place
    • Write special commands to unlock, erase or write
  • serial EEPROM
    • EEPROM with serial interface
    • 3 phase commands for operations, e.g. read, write, and erase
    • Wear leveling is required
  • serial (NOR) Flash
    • NOR Flash with serial interface
    • 3 phase commands for operations, e.g. read, write, and erase
    • Page for programming; block for erasure
    • Wear leveling is required
  • NAND Flash
    • As a hard disk replacer
    • Use a NAND flash specific interface
    • Page for programming; block for erasure
    • Wear leveling is required
    • Bad block management is must
Tags: [] [] [] []