天天看點

NandFlash詳述NandFlash詳述

NandFlash詳述

文章目錄

  • NandFlash詳述
      • 1. Nand Flash 是什麼
          • 1.1 閃存存儲單元
      • 2. Nand Flash 内部原理
          • 2.1 硬體實作機制
          • 2.2 資料存儲單元的整體架構
          • 2.3 實體存儲單元的陣列組織結構
          • 2.4 引腳(Pin)的說明
          • 2.5 特殊硬體結構
      • 3. Nand Flash 怎麼用
          • 3.1 常見操作
          • 3.2 讀取操作的時序圖
          • 3.3 計算傳入的行位址和列位址
      • **4. Nand Flash 的優缺點**
          • 4.1 NOR Flash與NAND Flash的比較
      • 5. 相關技術和知識
          • 5.1 片選無關(CE don’t-care)技術
          • 5.2 Wear-Leveling 負載平衡
          • 5.3 ECC錯誤校驗碼
          • 5.4 Copy-Back(Copy-Back Operation with EDC & Sector Definition for EDC)
          • 5.5 交錯頁程式設計(Interleave Page Program)

1. Nand Flash 是什麼

一種非易失性儲存設備(Non-volatile Memory Device),就是斷電了也不會丢失資料的裝置。常見裝置:U盤、MP3等。由東芝公司雇員富士雄于1986年發明。

1.1 閃存存儲單元

Nand Flash按照内部存儲資料單元的電壓的不同層次,也就是單個記憶體單元中,是存儲1位資料,還是多位資料,可以分為SLC、MLC和TLC。

  • SLC(single-level cell):單階存儲單元,高端SSD
  • MLC(Multi-level cell):二階存儲單元,高端SSD
  • TLC(Triple-Level Cell):三階存儲單元 ,SD卡、低端SSD
    NandFlash詳述NandFlash詳述
    規律:單個存儲單元存儲的比特位越多,讀寫性能會越差,壽命也越短,但是成本會更低。

2. Nand Flash 内部原理

2.1 硬體實作機制
NandFlash詳述NandFlash詳述

資料的表示,以所存儲的電荷的電壓是否超過一個特定的門檻值Vth來表示,是以,Flash的存儲單元的預設值,不是0,而是1。充電表示擦除,放電表示寫入。

2.2 資料存儲單元的整體架構
NandFlash詳述NandFlash詳述

1 Nand Flash = n Chip

1 Chip = n Plane

1 Plane = n Block

1 Block = 64 Page 擦除的基本機關

1 Page = (2k + 64)B 讀/寫的基本機關

拿型号為K9K8G08U0A這塊晶片舉例:

1 Nand Flash = 2 × K9F4G08U0A(K9F4G08U0A是chip,1 K9F4G08U0A = 2 Plane)

= 2 × 2個Plane

= 4 Plane(1 Plane = 2048 Block)

= 4 × 2048個Block(1 Block = 64 Page)

= 4 × 2048 × 64Page(1 Page = 2KB)

= 4 × 2048 × 64Page × 2KB

= 1GB

1 Page = 2KB

1 Block = 64 Page =128KB

1 Plane =2048 Block = 256MB

1 K9F4G08U0A = 2 Plane = 512MB

1 Nand Flash = 2 K9F4G08U0A = 1GB

總結:讀/寫是一頁一頁讀/寫的,擦除是一塊一塊擦除的。

2.3 實體存儲單元的陣列組織結構
NandFlash詳述NandFlash詳述
  • 塊 (Block)
    • 擦除的基本機關
  • 頁(Page)
    • 讀寫操作的基本機關。
  • oob (Out Of Band)

    每一個頁,對應還有一塊區域,叫做空閑區域(spare area)/備援區域(redundant area),而Linux系統中,一般叫做OOB(Out Of Band),這個區域,是最初基于Nand Flash的硬體特性:資料在讀寫時候相對容易錯誤,是以為了保證資料的正确性,必須要有對應的檢測和糾錯機制,此機制被叫做ECC(Error Code Correction 或者 Error Checking and Correcting),是以設計了多餘的區域,用于放置資料的校驗值。

    Oob的讀寫操作,一般是随着頁的操作一起完成的,即讀寫頁的時候,對應地就讀寫了oob。

    關于oob具體用途,總結起來有:

    1. 标記是否是壞塊
    2. 存儲ECC資料
    3. 存儲一些和檔案系統相關的資料。如jffs2就會用到這些空間存儲一些特定資訊,而yaffs2檔案系統,會在oob中,存放很多和自己檔案系統相關的資訊。
2.4 引腳(Pin)的說明
引腳名稱 引腳功能
I/O0 ~ I/O7 用于輸入位址/資料/指令,輸出資料
CLE Command Latch Enable,指令鎖存使能,在輸入指令之前,要先在模式寄存器中,設定CLE使能
ALE Address Latch Enable,位址鎖存使能,在輸入位址之前,要先在模式寄存器中,設定ALE使能
CE# Chip Enable,晶片使能,在操作Nand Flash之前,要先選中此晶片,才能操作
RE# Read Enable,讀使能,在讀取資料之前,要先使CE#有效。
WE# Write Enable,寫使能, 在寫取資料之前,要先使WE#有效
WP# Write Protect,寫保護
R/B# Ready/Busy Output,就緒/忙,主要用于在發送完程式設計/擦除指令後,檢測這些操作是否完成,忙,表示程式設計/擦除操作仍在進行中,就緒表示操作完成
Vcc Power,電源
Vss Ground,接地
N.C Non-Connection,未定義,未連接配接
在資料手冊中,你常會看到,對于一個引腳定義,有些字母上面帶一橫杠的,那是說明此引腳/信号是低電平有效,比如你上面看到的RE頭上有個橫線,就是說明,此RE是低電平有效,此外,為了書寫友善,在字母後面加“#”,也是表示低電平有效,比如我上面寫的CE#;如果字母頭上啥都沒有,就是預設的高電平有效,比如上面的CLE,就是高電平有效。
2.5 特殊硬體結構

頁寄存器(Page Register):

由于Nand Flash讀取和程式設計操作來說,一般最小機關是頁,是以Nand Flash在硬體設計時候,就考慮到這一特性,對于每一片(Plane),都有一個對應的區域專門用于存放,将要寫入到實體存儲單元中去的或者剛從存儲單元中讀取出來的,一頁的資料,這個資料緩存區,本質上就是一個緩存buffer,但是隻是此處datasheet裡面把其叫做頁寄存器page register而已,實際将其了解為頁緩存,更貼切原意。

而正是因為有些人不了解此内部結構,才容易産生之前遇到的某人的誤解,以為記憶體裡面的資料,通過Nand Flash的FIFO,寫入到Nand Flash裡面去,就以為立刻實作了實際資料寫入到實體存儲單元中了,而實際上隻是寫到了這個頁緩存中,隻有當你再發送了對應的程式設計第二階段的确認指令,即0x10,之後,實際的程式設計動作才開始,才開始把頁緩存中的資料,一點點寫到實體存儲單元中去。

Nand Flash讀寫時的資料流向:

NandFlash詳述NandFlash詳述

3. Nand Flash 怎麼用

3.1 常見操作

指令集合:

NandFlash詳述NandFlash詳述
  • 寫一個頁的資料(Page Program),就是先發送0x80h,然後發送要寫入的位址,再發送0x10h。
  • 讀一個頁的資料(Page Program),先發送0x00h,然後發送你所要讀取的頁的位址,再發送0x30h。
  • 擦除(Block Erase),開始的指令0x60是擦除設定指令(erase setup comman),然後傳入要擦除的塊位址,然後再傳入擦除确認指令(erase confirm command)0xD0。

這種完成單個操作要分兩步發送指令的設計,即先開始設定,再最後确認的指令方式,是為了避免由于外部意外的/未預料因素而産生的噪音。比如,由于某種噪音,而産生了0x60指令,此時,即使被Nand Flash誤認為是擦除操作,但是沒有之後的确認操作0xD0,Nand Flash就不會去擦除資料,這樣使得資料更安全,不會由于噪音而誤操作。

3.2 讀取操作的時序圖
NandFlash詳述NandFlash詳述

黃色豎線所處的時刻,是在發送讀操作的第一個周期的指令0x00之前的那一刻。

讓我們看看,在那一刻,其所穿過好幾行都對應什麼值,以及進一步了解,為何要那個值。

  1. 黃色豎線穿過的第一行,是CLE。CLE置1,就說明你将要通過I/O複用端口發送進入Nand Flash的,是指令,而不是位址或者其他類型的資料。隻有這樣将CLE置1,使其有效,才能去通知了内部硬體邏輯,你接下來将收到的是指令,内部硬體邏輯,才會将受到的指令,放到指令寄存器中,才能實作後面正确的操作,否則,不去将CLE置1使其有效,硬體會無所适從,不知道你傳入的到底是資料還是指令了。
  2. 而第二行,是CE#,那一刻的值是0。這個道理很簡單,你既然要向Nand Flash發指令,那麼先要選中它,是以,要保證CE#為低電平,使其有效,也就是片選有效。
  3. 第三行是WE#,意思是寫使能。因為接下來是往Nand Flash裡面寫指令,是以,要使得WE#有效,是以設為低電平。
  4. 第四行,是ALE是低電平,而ALE是高電平有效,此時意思就是使其無效。而對應地,前面介紹的,使CLE有效,因為将要資料的是指令(此時是發送圖示所示的讀指令第二周期的0x30),而不是位址。如果在其他某些場合,比如接下來的要輸入位址的時候,就要使其有效,而使CLE無效了。
  5. 第五行,RE#,此時是高電平,無效。可以看到,知道後面低6階段,才變成低電平,才有效,因為那時候,要發生讀取指令,去讀取資料。
  6. 第六行,就是我們重點要介紹的,複用的輸入輸出I/O端口了,此刻,還沒有輸入資料,接下來,在不同的階段,會輸入或輸出不同的資料/位址。
  7. 第七行,R/B#,高電平,表示R(Ready)/就緒,因為到了後面的第5階段,硬體内部,在第四階段,接受了外界的讀取指令後,把該頁的資料一點點送到頁寄存器中,這段時間,屬于系統在忙着幹活,屬于忙的階段,是以,R/B#才變成低,表示Busy忙的狀态的。

對于上面的從1到6,每個階段所表示的含義,再簡單解釋一下:

  1. 此階段,是讀指令第一個周期,發送的指令為0x00。
  2. 此階段,依次發送列位址,關于這些行位址,列位址等是如何計算出來的,後面的内容會有詳細解釋。
  3. 此階段是發送對應的行位址
  4. 此階段是發送讀指令第二周期2nd cycle所對應的指令,0x30
  5. 此階段是等待時間,等待Nand Flash硬體上準備好對應的資料,以便後續讀出。
  6. 此階段,就是一點點地把所需要的資料讀出來。
3.3 計算傳入的行位址和列位址

Nand Flash的位址周期組成:

NandFlash詳述NandFlash詳述
*L,意思是地電平,由于未用到那些位,datasheet中強制要求設為0,是以,才有上面的2nd周期中的高4位是0000.其他的A30之後的位也是類似原理,都是0。

結合操作的時序圖中的2,3階段,我們可以看出,此Nand Flash位址周期共有5個,2個列(Column)周期,3個行(Row)周期。

  1. 對應地,列位址A0~A10,就是頁内位址,位址範圍是從0到2047。

    細心的讀者可能注意到了,為何此處多出來個A11呢?

    這樣從A0到A11,一共就是12位,可以表示的範圍就是02^12,即04096了。

    實際上,由于我們通路頁内位址,可能會通路到oob的位置,即2048-2111這64個位元組的範圍内,是以,此處實際上隻用到了2048~2111,用于表示頁内的oob區域,其大小是64位元組。

  2. 對應地,A12~A30,稱作頁号,頁的号碼,可以定位到具體是哪一個頁。

    A18~A30,表示對應的塊号,即屬于哪個塊。

例子:還是拿K9K8G08U0A來說,它一共有8192個塊,每個塊内有64頁,每個頁是2K+64 Bytes。假設,我們要通路其中的第7000個塊中的第64頁中的1208位元組處的位址,此時,我們就要先把具體的位址算出來:

實體位址 = 塊大小×塊号 + 頁大小×頁号 + 頁内位址

=128K×7000 + 2K×64 + 1208

=0x36B204B8 = 11 0110 1011 0010 0000 ***0***100 1011 1000

分别配置設定到5個位址周期就是:

周期 位置 位址
1st周期 A7 ~ A0 1011 1000 = 0xB8
2nd周期 A11~ A8 0100 = 0x04
3rd周期 A19~A12 0010 0000 = 0x20
4th周期 A27~A20 0110 1011 = 0x6B
5th周期 A29~A28 11 = 0x03

上述計算方法為何是錯誤的呢?那是因為上面計算過程中,把第11位的值,本來是屬于頁号的位A11,給算成頁内位址裡面的值了。

應該是這樣計算,才是對的:

0x36B204B8 = 11 0110 1011 0010 0000 ***0***100 1011 1000

周期 位置 位址
1st周期 A7 ~ A0 1011 1000 = 0xB8
2nd周期 A10~ A8 100 = 0x04
3rd周期 A18~A11 010 0000 0 = 0x40
4th周期 A26~A19 110 1011 0 = 0xD6
5th周期 A29~A27 11 0 = 0x06

那有人會問了,上面表中,不是明明寫的A0到A30,其中包括A11,不是正好對應着此處位址中的bit0到bit30嗎?

其實,我開始也是犯了同樣的錯誤,誤以為我們要傳入的位址的每一位,就是對應着表11中的A0到A30呢,實際上,表11中的A11,是比較特殊的,隻有當我們通路頁内位址處于oob的位置,即屬于20482111的時候,A11才會其效果,才會用A0-A11用來表示對應的某個屬于20482111的某個值,屬于oob的某個位置。

而我們此處的頁内位址為1208,還沒有超過2047呢,是以A11肯定是0。

11 0110 1011 0010 0000 0 = 448064

2^18 = 262144

2^19 =524288

說白了,我們就是要通路第7000個塊中的第64頁中的1208位元組處,對應着

頁内位址

=1208

=0x4B8

頁号 = 塊數×頁數/塊 + 塊内的頁号

= 7000×(128K/2K) + 64

= 7000×64 + 64

= 448064

=0x6D640

也就是,我們要通路0x6D640頁内的0x4B8位址

然後對應的:

頁内位址=0x4B8

分成兩個對應的列位址,就變成

0x4B8 :列位址1=0xB8,列位址2=0x04

頁号=0x6D640,分成三個行号就是:

0x6D640:行号1=0x40,行号2=0xD6,行号3=0x06。

4. Nand Flash 的優缺點

4.1 NOR Flash與NAND Flash的比較
NandFlash詳述NandFlash詳述
左邊是NAND,右邊是NOR
屬性 NOR NAND
容量 較小 很大
XIP(可執行Code) 可以 不行
讀取速度 很快
寫入速度
擦除速度 很慢(5s) 快(4ms)
可擦除次數 10K-100K 10K-100K
可靠性 較低
通路方式 可随機通路 塊方式
價格

NAND Flash的單元尺寸幾乎是NOR器件的一半,生産過程更為簡單,NAND結構可 以在給定的模具尺寸内提供更高的容量,也就 相應地降低了價格。

NOR flash占據了容量為1~16MB閃存市場的大部分,而NAND flash隻是用在8~128MB的産品當中,這也說明NOR主要應用在代碼存儲媒體中,NAND适合于資料存儲,NAND在CompactFlash、Secure Digital、PC Cards和MMC存儲卡市場上所占份額最大。

5. 相關技術和知識

5.1 片選無關(CE don’t-care)技術

很多Nand flash支援一個叫做CE don’t-care的技術,字面意思就是,不關心是否片選。

對此也許有人會問了,如果不片選,那還能對其操作嗎?答案就是,這個技術,主要用在當時是不需要選中晶片,但是晶片内部卻仍可以繼續操作的這些情況:在某些應用,比如錄音,音頻播放等應用中,外部使用的微秒(us)級的時鐘周期,此處假設是比較少的2us,在進行讀取一頁或者對頁程式設計時,是對Nand Flash操作,這樣的串行(Serial Access)通路的周期都是20/30/50ns,都是納秒(ns)級的,此處假設是50ns,當你已經發了對應的讀或寫的指令之後,接下來隻是需要Nand Flash内部去自己操作,将資料讀取除了或寫入進去到内部的資料寄存器中而已,此處,如果可以把片選取消,CE#是低電平有效,取消片選就是拉高電平,這樣會在下一個外部指令發送過來之前,即微秒量級的時間裡面,即2us-50ns≈2us,這段時間的取消片選,可以降低很少的系統功耗,但是多次的操作,就可以在很大程度上降低整體的功耗了。

總的來說就是:由于某些外部應用所需要的通路Nand Flash的頻率比較低,而Nand Flash内部操作速度比較快,是以在針對Nand Flash的讀或寫操作的大部分時間裡面,都是在等待外部指令的輸入,同時卻選中晶片,産生了多餘的功耗,此“不關心片選”技術,就是在Nand Flash的内部的相對快速的操作(讀或寫)完成之後,就取消片選,以節省系統功耗。待下次外部指令/資料/位址輸入來的時候,再選中晶片,即可正常繼續操作了。這樣,整體上,就可以大大降低系統功耗了。

如果想要操作硬體Nand Flash晶片,先要将對應的CE#(低有效)片選信号拉低,選中該晶片,然後才能做接下來的讀寫操作所要做的發指令,發資料等動作。Nand Flash的片選與否,功耗差别會有很大。如果資料沒有記錯的話,我之前遇到我們系統裡面的Nand Flash的片選,大概有5個mA的電流輸出呢,也許你對5mA沒太多概念,給你說個資料你就知道了:當時為了針對MP3播放功耗進行優化,整個系統優化之後的待機功耗,也才10個mA左右的,是以節省5mA已經算是很不錯的功耗優化了。
5.2 Wear-Leveling 負載平衡

Nand Flash的block的管理,還包括負載平衡。

正是由于Nand Flash的block,都是有一定壽命限制的,是以如果你每次都往同一個block擦除然後寫入資料,那麼那個block就很容易被用壞了,是以我們要去管理一下,将這麼多次的對同一個block的操作,平均分布到其他一些block上面,使得在block的使用上,相對較平均,這樣相對來說,可以更能充分利用Nand Flash。

關于wear-leveling這個詞,再簡單解釋一下,wear就是穿(衣服)等,用(東西)導緻磨損,而leveling就是使得均衡,是以放在一起就是,使得對于Nand Flash的那麼多的block的使用磨損,相對均衡一些,以此延長Nand Flash的使用壽命或者說更加充分利用Nand Flash。

5.3 ECC錯誤校驗碼

Nand Flash實體特性上使得其資料讀寫過程中會發生一定幾率的錯誤,是以要有個對應的錯誤檢測和糾正的機制,于是才有此ECC,用于資料錯誤的檢測與糾正。Nand Flash的ECC,常見的算法有海明碼和BCH,這類算法的實作,可以是軟體也可以是硬體。不同系統,根據自己的需求,采用對應的軟體或者是硬體。

相對來說,硬體實作這類ECC算法,肯定要比軟體速度要快,但是多加了對應的硬體部分,是以成本相對要高些。如果系統對于性能要求不是很高,那麼可以采用軟體實作這類ECC算法,但是由于增加了資料讀取和寫入前後要做的資料錯誤檢測和糾錯,是以性能相對要降低一些,即Nand Flash的讀取和寫入速度相對會有所影響。

其中,Linux中的軟體實作ECC算法,即NAND_ECC_SOFT模式,就是用的對應的海明碼。

而對于目前常見的MLC的Nand Flash來說,由于容量比較大,動辄2GB,4GB,8GB等,常用BCH算法。BCH算法,相對來說,算法比較複雜。

筆者由于水準有限,目前仍未完全搞懂BCH算法的原理。

BCH算法,通常是由對應的Nand Flash的Controller中,包含對應的硬體BCH ECC子產品,實作了BCH算法,而作為軟體方面,需要在讀取資料後,寫入資料之前,分别操作對應BCH相關的寄存器,設定成BCH模式,然後讀取對應的BCH狀态寄存器,得知是否有錯誤,和生成的BCH校驗碼,用于寫入。

5.4 Copy-Back(Copy-Back Operation with EDC & Sector Definition for EDC)

Copy-Back功能,簡單的說就是,将一個頁的資料,拷貝到另一個頁。

如果沒有Copy-Back功能,那麼正常的做法就是,先要将那個頁的資料拷貝出來放到記憶體的資料buffer中,讀出來之後,再用寫指令将這頁的資料,寫到新的頁裡面。

而Copy-Back功能的好處在于,不需要用到外部的存儲空間,不需要讀出來放到外部的buffer裡面,而是可以直接讀取資料到内部的頁寄存器(page register)然後寫到新的頁裡面去。

而且,為了保證資料的正确,要硬體支援EDC(Error Detection Code)的,否則,在資料的拷貝過程中,可能會出現錯誤,并且拷貝次數多了,可能會累積更多錯誤。

而對于錯誤檢測來說,硬體一般支援的是512位元組資料,對應有16位元組用來存放校驗産生的ECC數值,而這512位元組一般叫做一個扇區。對于2K+64位元組大小的頁來說,按照512位元組分,分别叫做A,B,C,D區,而後面的64位元組的oob區域,按照16位元組一個區,分别叫做E,F,G,H區,對應存放A,B,C,D資料區的ECC的值。

Copy-Back程式設計的主要作用在于,去掉了資料串行讀取出來,再串行寫入進去的時間,是以,而這部分操作,是比較耗時的,是以此技術可以提高程式設計效率,提高系統整體性能。

5.5 交錯頁程式設計(Interleave Page Program)

多片同時程式設計,是針對一個chip裡面的多個Plane來說的,

而此處的交錯頁程式設計,是指對多個chip而言的。

可以先對一個chip,假設叫chip1,裡面的一頁進行程式設計,然後此時,chip1内部就開始将資料一點點寫到頁裡面,就出于忙的狀态了,而此時可以利用這個時間,對出于就緒狀态的chip2,也進行頁程式設計,發送對應的指令後,chip2内部也就開始慢慢的寫資料到存儲單元裡面去了,也出于忙的狀态了。此時,再去檢查chip1,如果程式設計完成了,就可以開始下一頁的程式設計了,然後發完指令後,就讓其内部慢慢的程式設計吧,再去檢查chip2,如果也是程式設計完了,也就可以進行接下來的其他頁的程式設計了。如此,互動操作chip1和chip2,就可以有效地利用時間,使得整體程式設計效率提高近2倍,大大提高Nand Flash的程式設計/擦寫速度了。

參考連結:https://blog.csdn.net/swj9099/article/details/80620001

繼續閱讀