徐 磊,王保成
(1.中國(guó)科學(xué)院 空天信息創(chuàng)新研究院,北京 100094;2.中國(guó)科學(xué)院大學(xué) 航空宇航學(xué)院,北京 100049)
NAND Flash是一種具有存儲(chǔ)密度高、功耗低、讀寫(xiě)速度快等優(yōu)點(diǎn)的非易失性存儲(chǔ)器,被廣泛應(yīng)用于消費(fèi)類(lèi)電子、汽車(chē)、航空航天等領(lǐng)域[1-3]。NAND Flash 具有以下特點(diǎn):1)讀、寫(xiě)、擦除過(guò)程中可能會(huì)因?yàn)楸忍匚环D(zhuǎn)出現(xiàn)壞塊[4];2)每個(gè)存儲(chǔ)單元塊的擦除、寫(xiě)入次數(shù)達(dá)到上限后單元塊會(huì)失效[5],因此需要有效的數(shù)據(jù)管理方法實(shí)現(xiàn)對(duì)NAND Flash的讀寫(xiě)控制。
NAND Flash的控制方法通??梢苑譃榛谖募到y(tǒng)控制法和直接控制法[6]。第一種方法通過(guò)移植文件系統(tǒng)實(shí)現(xiàn)對(duì)NAND Flash的讀寫(xiě)控制,如文獻(xiàn)[7]使用FAT 文件系統(tǒng)+FAST 閃存轉(zhuǎn)換層算法構(gòu)建了NAND FALSH 存儲(chǔ)系統(tǒng);文獻(xiàn)[8]則通過(guò)YAFFS文件系統(tǒng)實(shí)現(xiàn)了星載固態(tài)存儲(chǔ)器的數(shù)據(jù)管理。這種方法的優(yōu)點(diǎn)可以實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù)的高效統(tǒng)一管理,具備完整的數(shù)據(jù)分區(qū)、壞塊管理、磨損均衡功能;缺點(diǎn)是需要移植嵌入式操作系統(tǒng),對(duì)硬件資源要求較高。第二種方法通過(guò)直接給出控制指令和地址對(duì)NAND Flash進(jìn)行讀寫(xiě)控制,如文獻(xiàn)[9 -10]基于FPGA使用直接控制的方法實(shí)現(xiàn)了NAND Flash 控制器;文獻(xiàn)[1]、[11]同樣采用直接控制的方式,將待存儲(chǔ)數(shù)據(jù)按順序?qū)懭隖lash存儲(chǔ)塊,實(shí)現(xiàn)了一種雙Flash數(shù)據(jù)存儲(chǔ)系器。直接控制法的優(yōu)點(diǎn)是操作簡(jiǎn)單,無(wú)需使用操作系統(tǒng);缺點(diǎn)是遇到壞塊通常采用直接跳過(guò)的方式,缺乏壞塊管理機(jī)制,且每次上電復(fù)位后均從原始地址塊進(jìn)行擦寫(xiě)[6],容易造成存儲(chǔ)塊磨損失衡。
由以上分析可知,基于文件系統(tǒng)控制法和直接控制法各有優(yōu)劣??紤]到傳統(tǒng)的嵌入式數(shù)據(jù)采集系統(tǒng),如文獻(xiàn)[12]設(shè)計(jì)的氣象數(shù)據(jù)采集系統(tǒng),文獻(xiàn)[13]設(shè)計(jì)的星載數(shù)據(jù)采集中系統(tǒng)中,對(duì)NAND Flash采用直接控制法,缺乏有效的數(shù)據(jù)管理方式,而采用基于文件系統(tǒng)控制法會(huì)帶來(lái)硬件要求的提高和軟件設(shè)計(jì)復(fù)雜度的提升。因此本文提出一種兩層地址映射的方式對(duì)NAND Flash 進(jìn)行讀寫(xiě)控制,第一層地址映射將邏輯地址按順序映射到中間邏輯地址,實(shí)現(xiàn)存儲(chǔ)塊的均衡使用,第二層映射通過(guò)壞塊監(jiān)測(cè)和好塊替換壞塊的方式建立壞塊映射表,將中間邏輯地址映射到物理地址,實(shí)現(xiàn)壞塊管理。使用地址映射方法,設(shè)計(jì)了一款NAND Flash控制器?;诘刂酚成浞绞降腘AND Flash控制器不需要移植文件系統(tǒng),操作過(guò)程簡(jiǎn)單,解決了嵌入式數(shù)據(jù)采集系統(tǒng)中NAND Flash的壞塊管理問(wèn)題以及存儲(chǔ)塊均衡使用問(wèn)題,提升了系統(tǒng)的可靠性。
閃存轉(zhuǎn)換層(FTL)是固態(tài)硬盤(pán)的核心部件,F(xiàn)TL 的存在讓用戶可以像磁盤(pán)一樣使用固態(tài)硬盤(pán)[14]。FTL 的一大功能是實(shí)現(xiàn)邏輯地址到物理地址的映射,根據(jù)映射尺度,F(xiàn)TL 映射方式又分為塊映、頁(yè)映射、混合映射等。當(dāng)NAND Flash運(yùn)用于嵌入式數(shù)據(jù)采集系統(tǒng)中,由于采集的數(shù)據(jù)具有數(shù)量大、連續(xù)性高的特點(diǎn),因此本文借鑒FTL 塊映射方式,通過(guò)特定的算法將存儲(chǔ)塊邏輯地址映射到物理地址,解決NAND FLASH 壞塊問(wèn)題和磨損失衡問(wèn)題;并且通過(guò)地址映射的方式,使得NAND FLASH 存儲(chǔ)塊地址對(duì)于上層驅(qū)動(dòng)和應(yīng)用完全透明,也方便了嵌入式軟件設(shè)計(jì)。考慮到壞塊管理和磨損均衡對(duì)于地址轉(zhuǎn)換需求的差異性,因此將地址映射過(guò)程分為兩個(gè)層次,第一層映射用于均衡存儲(chǔ)塊的磨損,第二層映射用于處理壞塊問(wèn)題,其過(guò)程如圖1所示。其中中間邏輯地址為串聯(lián)一、二層映射關(guān)系的中介地址,當(dāng)沒(méi)有出現(xiàn)壞塊時(shí),中間邏輯地址等于物理地址。Table_WL(tableofwear leveling)和Table_BM(tableof badblock management)分別為兩層映射的地址關(guān)系表,這兩張地址映射信息表的建立與維護(hù)是地址映射的方法的核心。
圖1 地址映射方法過(guò)程
Table_WL 是第一層地址映射信息表,用于將邏輯地址映射到中間邏輯地址,實(shí)現(xiàn)磨損均衡。
考慮到數(shù)據(jù)采集系統(tǒng)中,采用直接控制法進(jìn)行NAND FLASH 讀寫(xiě)控制時(shí),數(shù)據(jù)存儲(chǔ)過(guò)程具有以下特點(diǎn):
1)不同類(lèi)型的數(shù)據(jù)存儲(chǔ)在初始地址不同的連續(xù)存儲(chǔ)塊中,每次上電時(shí)均從初始地址進(jìn)行數(shù)據(jù)擦寫(xiě)操作,且每次寫(xiě)入數(shù)據(jù)的大小不確定,因此會(huì)出現(xiàn)頻繁被擦寫(xiě)的 “熱塊”和很少被擦寫(xiě)的“冷塊”,不同存儲(chǔ)塊擦寫(xiě)次數(shù)差異的增大可能會(huì)導(dǎo)致NAND Flash壽命的減?。?5]。
2)數(shù)據(jù)采集系統(tǒng)單次上電操作不會(huì)對(duì)已寫(xiě)入數(shù)據(jù)的存儲(chǔ)塊進(jìn)行重復(fù)的擦寫(xiě)操作。
基于以上特點(diǎn),讓系統(tǒng)按照第1 號(hào)存儲(chǔ)塊—第N(N表示存儲(chǔ)塊最大地址)號(hào)存儲(chǔ)塊的順序循環(huán)向NAND FLASH 寫(xiě)入數(shù)據(jù),可以使每一個(gè)存儲(chǔ)塊具有相同的機(jī)會(huì)被使用,由此建立第一層地址映射關(guān)系。
記邏輯地址的范圍為1~N,邏輯地址n(1≤n≤N)對(duì)應(yīng)的中間邏輯地址為T(mén)emp_Addr(n)。記一次數(shù)據(jù)采集存儲(chǔ)過(guò)程中,邏輯地址最后一次映射得到的中間邏輯地址為L(zhǎng)ast_Temp_Addr,初次上電啟動(dòng)時(shí)Last_Temp_Addr賦值為N。記初次上電啟動(dòng)標(biāo)志為Flag,當(dāng)Flag為1時(shí)表示系統(tǒng)是第一次上電啟動(dòng)。Table_WL的建立和維護(hù)過(guò)程如下:
1)上電啟動(dòng),讀取啟動(dòng)標(biāo)志Flag,進(jìn)行Table_WL初始化:
其中:Read_Table_WL(n)表示通過(guò)讀取前一次上電結(jié)束時(shí)保存的Table_WL地址映射信息,得地址到的邏輯地址n對(duì)應(yīng)的中間邏輯地址。
2)控制器對(duì)邏輯地址為n的存儲(chǔ)塊發(fā)出擦:
除指令時(shí)更新邏輯地址和中間邏輯地址的映射關(guān)系:
3)完成數(shù)據(jù)存儲(chǔ)后,將反映第一層地址映射信息關(guān)系的Table_WL、Last_Temp_Addr以及啟動(dòng)標(biāo)志Flag記錄到非易失性存儲(chǔ)器中。
Table_BM 是第二層地址映射信息表,用于將中間邏輯地址映射到物理地址,實(shí)現(xiàn)壞塊管理功能。針對(duì)NAND Flash使用過(guò)程中出現(xiàn)的壞塊,常用的壞塊管理方法有直接跳過(guò)法和壞塊替換法,前一種方法會(huì)使得邏輯地址和物理地址的映射關(guān)系變得混亂[16],因此使用好塊替換壞塊,該方法可以分為壞塊識(shí)別以及壞塊替換兩個(gè)步驟。
NAND Flash壞塊分為出廠時(shí)自帶的壞塊和使用過(guò)程中產(chǎn)生的壞塊,前者可以通過(guò)讀取每一個(gè)存儲(chǔ)塊的壞塊標(biāo)記位進(jìn)行區(qū)分,后者需要使用ECC(error checkingand correction)碼對(duì)存儲(chǔ)數(shù)據(jù)進(jìn)行校驗(yàn)。常用的ECC 碼有漢明碼、BCH(Bose-Chaudhuri-Hocquenghem)碼、LDPC(low density parity check)碼等,不同校驗(yàn)碼有著不同的校驗(yàn)和糾錯(cuò)能力,當(dāng)錯(cuò)誤超出ECC 糾錯(cuò)能力范圍時(shí)判定出現(xiàn)壞塊[17]。壞塊替換需要預(yù)留一定數(shù)量的好塊,當(dāng)正在使用的存儲(chǔ)塊被判定為壞塊時(shí),采用預(yù)留的好塊替換掉壞塊,并記錄壞塊與好塊的地址映射關(guān)系,實(shí)現(xiàn)壞塊管理功能。預(yù)留好塊的數(shù)量需要根據(jù)芯片實(shí)際參數(shù)進(jìn)行設(shè)置,通常NAND Flash 使用過(guò)程中可能出現(xiàn)的壞塊數(shù)量不超過(guò)2%[16]。第二層地址映射關(guān)系本質(zhì)就是使用好塊地址替換壞塊地址。
記中間邏輯地址為m(1≤m≤N),中間邏輯地址對(duì)應(yīng)的物理地址為Phy_Addr(m),物理地址的范圍為1~P。預(yù)留一定數(shù)量的存儲(chǔ)塊用于替換使用過(guò)程中可能出現(xiàn)的壞塊,預(yù)留存儲(chǔ)塊的地址范圍為(N+1)~P,占總存儲(chǔ)塊數(shù)量的2%。記一次數(shù)據(jù)采集存儲(chǔ)過(guò)程中,最后用于替換壞塊的保留塊地址為L(zhǎng)ast_Res_Addr,初次上電啟動(dòng)時(shí)設(shè)置Last_Res_Addr為N;Table_BM 的建立以及維護(hù)過(guò)程如下:
1)上電啟動(dòng),讀取啟動(dòng)標(biāo)志Flag,進(jìn)行Table_BM初始化,若Flag為1,代表初次啟動(dòng),則遍歷前N個(gè)存儲(chǔ)塊的壞塊標(biāo)記位;若Flag為0,則直接讀取上次上電結(jié)束時(shí)保存的Table_BM 信息:
其中:Read_Table_BM(m)表示通過(guò)讀取前一次上電結(jié)束時(shí)保存的Table_BM 地址映射信息,得到的中間邏輯地址m對(duì)應(yīng)的物理地址。Bad_Block(m)表示初始化讀取第m個(gè)存儲(chǔ)塊的壞塊標(biāo)記位的結(jié)果,為1表示壞塊,為0表示好塊。
2)當(dāng)控制器對(duì)中間邏輯地址為n的存儲(chǔ)塊進(jìn)行擦除、讀、寫(xiě)操作時(shí),邏輯地址經(jīng)過(guò)兩層地址映射得到的物理地址塊被判斷為壞塊時(shí),更新中間邏輯地址和物理地址的映射關(guān)系:
3)一次上電完成數(shù)據(jù)存儲(chǔ)后,同樣將反映第二層地址映射信息關(guān)系的Table_BM 以及Last_Res_Addr記錄到非易失性存儲(chǔ)器中。
基于兩層地址映射方法,本文設(shè)計(jì)了一款NAND Flash控制器,并運(yùn)用于某型浮空器的傳感器數(shù)據(jù)采集系統(tǒng)中,用于控制片外NAND Flash進(jìn)行實(shí)驗(yàn)數(shù)據(jù)存取。傳感器數(shù)據(jù)采集系統(tǒng)主控芯片采用ZYNQ7020,下面介紹NAND Flash控制器的設(shè)計(jì)過(guò)程。
NAND Flash控制器整體結(jié)構(gòu)如圖2所示??刂破鞯闹黧w功能基于ZYNQ 的PL(programable logic)端實(shí)現(xiàn),ZYNQ的PS(processing system)端向PL端的控制器發(fā)送控制指令,實(shí)現(xiàn)對(duì)片外NAND Flash的控制。片外NAND Flash使用Micron公司的MT29F2G08ABAEAH4,芯片共有2 048個(gè)存儲(chǔ)塊,每塊64頁(yè),每頁(yè)2 048+64字節(jié),總存儲(chǔ)容量2Gb,I/O接口為異步模式,具備內(nèi)部硬件ECC功能。
圖2 NAND Flash控制器結(jié)構(gòu)圖
PL端NAND Flash控制器由寄存器配置模塊、時(shí)序邏輯控制模塊、地址映射模塊以及DMA 數(shù)據(jù)傳輸模塊4個(gè)部分構(gòu)成。PS端通過(guò)寄存器讀寫(xiě)模塊發(fā)送控制指令,讀取PL端NAND Flash控制器工作狀態(tài)。時(shí)序邏輯控制模塊根據(jù)NAND Flash接口時(shí)序要求,驅(qū)動(dòng)NAND Flash控制和數(shù)據(jù)信號(hào)。地址映射模塊根據(jù)兩層地址映射的原理,更新地址映射信息表Table_WL以及Table_BM,完成邏輯地址到物理地址的映射,實(shí)現(xiàn)磨損均衡和壞塊管理的功能。DMA數(shù)據(jù)傳輸模塊采用DMA 的方式實(shí)現(xiàn)PS端與PL 端的數(shù)據(jù)搬運(yùn),并通過(guò)乒乓操作的方法提高數(shù)據(jù)傳輸效率。
寄存器讀寫(xiě)模塊用于PS端對(duì)PL 端NAND Flash控制器的控制寄存器、狀態(tài)寄存器等進(jìn)行訪問(wèn)。各寄存器的定義如表1所示。
表1 NAND Flash控制器寄存器定義表
PS端通過(guò)對(duì)命令寄存器發(fā)送相應(yīng)指令碼,控制NAND Flash控制器執(zhí)行相應(yīng)操作。本文設(shè)計(jì)的NAND Flash控制器共有6種操作,每種操作對(duì)應(yīng)的指令編碼如表2所示。
表2 NAND Flash操作指令碼
地址寄存器用于指定NAND Flash讀寫(xiě)等操作的目標(biāo)地址,包括列地址和行地址,其中行地址又分為頁(yè)地址和塊地址。PS端向命令寄存器寫(xiě)入指令編碼前,需要先向地址寄存器寫(xiě)入目標(biāo)地址。狀態(tài)寄存器用于指示每一種操作的執(zhí)行狀態(tài),PS端通過(guò)讀狀態(tài)寄存器判斷每一種操作成功或失敗。ID寄存器1和ID 寄存器2用于保存讀ID 操作讀取的NAND Flash芯片40位ID號(hào)。
本文設(shè)計(jì)的NAND Flash控制器支持中斷的工作方式,每執(zhí)行完一種操作就會(huì)產(chǎn)生中斷信號(hào),中斷信號(hào)連接至PS端,PS端響應(yīng)中斷后可通過(guò)讀狀態(tài)寄存器消除中斷。中斷使能寄存器用于配置每一種操作是否啟用中斷。
PS端通過(guò)AIX_LITE接口讀寫(xiě)寄存器,實(shí)現(xiàn)對(duì)PL端NAND Flash控制器的使用。這種方式便于應(yīng)用層程序?qū)AND Flash的控制,也易于PL端進(jìn)行后續(xù)功能的擴(kuò)展。
地址映射的過(guò)程需要以映射前的地址為索引,通過(guò)查詢(xún)映射關(guān)系表,得到映射后的地址。地址映射的過(guò)程符合RAM(random access memory)的工作方式,即以地址為索引訪問(wèn)存儲(chǔ)內(nèi)容。BRAM(block RAM)是FPGA 內(nèi)嵌的存儲(chǔ)資源,具有延遲周期確定、不占用邏輯資源的優(yōu)點(diǎn),因此采用BRAM 存儲(chǔ)Table_WL 以及Table_BM 的地址映射信息,并通過(guò)對(duì)BRAM 的讀寫(xiě)實(shí)現(xiàn)地址映射信息的更新。
考慮到使用的NAND Flash芯片共有2 048個(gè)存儲(chǔ)塊,為了預(yù)留約2%的存儲(chǔ)塊用于替換壞塊,設(shè)定邏輯地址和中間邏輯地址的范圍為1~2 008,物理地址范圍為1~2 048。分別使用兩個(gè)位寬為11比特,深度為2 048的BRAM 存儲(chǔ)兩層地址映射信息表,具體存儲(chǔ)方式如圖3所示。RAM_WL存儲(chǔ)第一層地址映射信息,其中地址0保存單次上電結(jié)束時(shí),邏輯地址進(jìn)行最后一次映射得到的中間邏輯地址Last_Temp_Addr;地址1~2 008保存邏輯地址對(duì)應(yīng)的中間邏輯地址Temp_Addr(1)~Temp_Addr(2 008)。RAM_BM 存儲(chǔ)第二層地址信息,地址0保存著單次上電結(jié)束時(shí),最后一次用于替換壞塊的保留塊地址;地址1~2 008保存中間邏輯地址對(duì)應(yīng)的物理Phy_Addr(1)~Phy_Addr(2 008)。
圖3 地址映射信息存儲(chǔ)圖
第二層地址映射用于實(shí)現(xiàn)壞塊管理,需要對(duì)芯片出廠時(shí)帶有的壞塊和使用過(guò)程中產(chǎn)生的壞塊進(jìn)行判斷。系統(tǒng)使用的NAND Flash 芯片每一個(gè)存儲(chǔ)塊首頁(yè)的空閑區(qū)域(spare area)都有出廠壞塊標(biāo)志,當(dāng)讀取壞塊標(biāo)志為0x00時(shí),表示此存儲(chǔ)塊為壞塊[18]。對(duì)于NAND Flash使用過(guò)程中出現(xiàn)的壞塊,需要使用ECC 校驗(yàn)碼進(jìn)行判斷。本文采用NAND Flash芯片內(nèi)部帶有的硬件ECC功能,該ECC具有每512字節(jié)5比特錯(cuò)誤檢測(cè)、4比特錯(cuò)誤糾正的能力。在每次使用前,需要發(fā)送相應(yīng)指令使能芯片內(nèi)部ECC 功能。在使用過(guò)程中,每完成一次讀、寫(xiě)、擦除操作后,通過(guò)讀取芯片執(zhí)行狀態(tài)(operation status)來(lái)判斷是否出現(xiàn)壞塊。通過(guò)使用芯片內(nèi)部硬件ECC 功能,可以減少PL 端邏輯資源的消耗,降低NAND Flash控制器設(shè)計(jì)的復(fù)雜度。
由于系統(tǒng)掉電后RAM 存儲(chǔ)的信息會(huì)丟失,需要在系統(tǒng)上電結(jié)束前將RAM_WL和RAM_BM 保存到非易失性存儲(chǔ)器中。非易失性存儲(chǔ)器可以選擇在主控芯片外增加一小容量存儲(chǔ)芯片,如E2PROM[19]、非易失性隨機(jī)鐵電存儲(chǔ)器[6]等。由于系統(tǒng)使用的NAND Flash在使能內(nèi)部ECC 進(jìn)行存儲(chǔ)數(shù)據(jù)保護(hù)的前提下,可以保證第0號(hào)存儲(chǔ)塊數(shù)據(jù)的正確性。因此在系統(tǒng)掉電前將RAM_WL和RAM_BM 的信息存入NAND Flash芯片的第0塊中,在實(shí)現(xiàn)地址映射信息掉電不丟失的同時(shí),避免了增加存儲(chǔ)芯片帶來(lái)的硬件資源消耗。
RAM_WL和RAM_BM 的上電初始化過(guò)程以及掉電前存入NAND Flash第0塊的過(guò)程需要對(duì)NAND Flash進(jìn)行讀寫(xiě),這兩個(gè)過(guò)程分別由時(shí)序邏輯控制模塊的初始化功能和信息存儲(chǔ)功能實(shí)現(xiàn)。地址映射模塊使用狀態(tài)機(jī)的方式進(jìn)行設(shè)計(jì),狀態(tài)轉(zhuǎn)移如圖4所示。根據(jù)前文所述地址映射方法原理,地址映射模塊工作過(guò)程如下:1)對(duì)NAND Flash進(jìn)行擦除操作時(shí),時(shí)序邏輯控制模塊發(fā)出S_M(jìn)ap_E信號(hào),地址映射模塊更新RAM_WL 信息,然后以邏輯地址為索引訪問(wèn)RAM_WL得到對(duì)應(yīng)的中間邏輯地址,再以中間邏輯地址為索引訪問(wèn)RAM_BM 得到物理地址。2)對(duì)NAND Flash進(jìn)行讀、寫(xiě)操作時(shí),時(shí)序邏輯控制模塊發(fā)出S_M(jìn)ap_WR 信號(hào),地址映射模塊通過(guò)讀RAM-BM 和RAM_WL得到邏輯地址對(duì)應(yīng)的物理地址。3)對(duì)NAND Flash進(jìn)行讀、寫(xiě)、擦除操作過(guò)程中出現(xiàn)壞塊時(shí),時(shí)序邏輯控制模塊發(fā)出Bad_Block信號(hào),地址映射模塊更新RAM_BM 信息。
圖4 地址映射模塊狀態(tài)轉(zhuǎn)移圖
NAND Flash時(shí)序邏輯模塊用于實(shí)現(xiàn)NAND Flash讀寫(xiě)等操作的復(fù)雜時(shí)序邏輯控制,實(shí)現(xiàn)對(duì)NAND Flash的直接驅(qū)動(dòng)。片外NAND Flash與PL 端控制器的連接采用標(biāo)準(zhǔn)ONFI協(xié)議,主要控制信號(hào)包含片選信號(hào)CE、命令鎖存信號(hào)CLE、地址鎖存信號(hào)ALE、寫(xiě)使能信號(hào)WE 以及讀使能信號(hào)RE,另外有8位數(shù)據(jù)、命令、地址分時(shí)復(fù)用的IO 信號(hào)[20]。NAND Flash各種操作的時(shí)序主要由異步地址輸入、異步命令輸入、異步數(shù)據(jù)輸入、異步數(shù)據(jù)輸出四種總線操作模式構(gòu)成,不同模式對(duì)應(yīng)的控制信號(hào)變化如表3所示。
表3 控制信號(hào)狀態(tài)表
根據(jù)不同總線操作模式下控制信號(hào)的變化,NAND Flash讀寫(xiě)時(shí)序如圖5、圖6所示。為了實(shí)現(xiàn)NAND Flash不同操作的時(shí)序驅(qū)動(dòng)需求,采用有限狀態(tài)機(jī)的方法進(jìn)行控制邏輯設(shè)計(jì)[21],其中狀態(tài)機(jī)狀態(tài)轉(zhuǎn)移如圖7 所示?;贜AND Flash的控制需求,狀態(tài)機(jī)實(shí)現(xiàn)了讀頁(yè)、頁(yè)編程、擦除等基本控制操作,以及初始化操作和信息存儲(chǔ)操作的時(shí)序控制。其中初始化和信息存儲(chǔ)操作分別用于地址映射信息的加載和存儲(chǔ)。根據(jù)圖7的狀態(tài)轉(zhuǎn)移過(guò)程,不同操作的流程如下:
圖5 NAND Flash頁(yè)編程操作時(shí)序圖
圖6 NAND Flash讀頁(yè)操作時(shí)序圖
圖7 時(shí)序邏輯控制模塊狀態(tài)轉(zhuǎn)移圖
1)讀頁(yè)操作:首先通過(guò)地址映射模塊得到物理地址,接著發(fā)送讀命令和讀地址,等待R/B(忙閑信號(hào))信號(hào)拉高后發(fā)出讀狀態(tài)命令。通過(guò)狀態(tài)編碼判斷讀頁(yè)操作是否成功,若成功則讀取一頁(yè)數(shù)據(jù),若失敗則通知地址映射模塊更新RAM_BM 信息。
2)頁(yè)編程操作:通過(guò)地址映射得到待寫(xiě)存儲(chǔ)塊的物理地址,接著發(fā)送寫(xiě)命令和寫(xiě)地址,并寫(xiě)入一頁(yè)數(shù)據(jù)。之后等待R/B信號(hào)拉高,發(fā)出讀狀態(tài)命令來(lái)判斷寫(xiě)頁(yè)操作是否成功,若失敗則通知地址映射模塊更新RAM_BM 信息。
3)擦除操作:通過(guò)地址映射模塊得到物理地址,發(fā)送擦除命令和地址,等待R/B 信號(hào)拉高,發(fā)出讀狀態(tài)命令來(lái)判斷擦除操作是否成功,若失敗則通知地址映射模塊更新RAM_BM 信息。
4)初始化操作:發(fā)送復(fù)位命令復(fù)位NAND Flash 芯片,接著通過(guò)Set_Feature命令啟動(dòng)NAND Flash內(nèi)嵌硬件ECC功能。讀取初次啟動(dòng)標(biāo)志Flag判斷初始化方法,如果是初次使用,遍歷第1~2 008個(gè)存儲(chǔ)塊的壞塊標(biāo)志位進(jìn)行RAM 表初始化;若非初次使用,讀取NAND Flash第0塊存儲(chǔ)的地址映射信息,將信息寫(xiě)入RAM _WL 和RAM_BM。系統(tǒng)每次上電使用NAND Flash之前,都需要進(jìn)行初始化操作。
5)信息存儲(chǔ)操作:發(fā)送寫(xiě)命令和寫(xiě)地址,讀取RAM_WL以及RAM _BM 的信息并寫(xiě)入NAND Flash,最后寫(xiě)入初次啟動(dòng)標(biāo)志Flag,完成地址映射信息存儲(chǔ)。系統(tǒng)每次掉電之前,都需要進(jìn)行信息存儲(chǔ)操。
基于NAND Flash的結(jié)構(gòu),通常將數(shù)據(jù)按頁(yè)為單位進(jìn)行寫(xiě)入和讀出[20]。將數(shù)據(jù)寫(xiě)入NAND Flash進(jìn)行存儲(chǔ)的過(guò)程中,首先將待寫(xiě)入數(shù)據(jù)從PS端搬運(yùn)到PL 端的緩存中,等待緩存滿一頁(yè)數(shù)據(jù)后PS端發(fā)出頁(yè)編程操作指令,寫(xiě)入數(shù)據(jù);讀取NAND Flash存儲(chǔ)數(shù)據(jù)的過(guò)程中,PS端首先發(fā)送讀頁(yè)操作指令,將數(shù)據(jù)讀到PL端的緩存中,完成一頁(yè)數(shù)據(jù)讀取后,需要將數(shù)據(jù)搬運(yùn)到PS端用于后續(xù)處理。對(duì)于PS端與PL 端之間大容量數(shù)據(jù)的搬運(yùn),采用DMA(direct memory access)的方式可以提高PS端CPU 的工作效率。
采用Xilinx的AXI_DMA 控制器IP核實(shí)現(xiàn)數(shù)據(jù)搬運(yùn)。系統(tǒng)中PS端掛載DDR3芯片作為運(yùn)行內(nèi)存,因此DMA 控制器實(shí)現(xiàn)的是內(nèi)存與PL 端緩存之間的數(shù)據(jù)搬運(yùn)。AXI_DMA 控制器共有三種數(shù)據(jù)通道,每種通道的作用如下:1)S_AXI_LITE通道,使用AXI_LITE接口協(xié)議,連接到PS端的M_AXI_GP接口,用于DMA 控制器的功能配置以及初始化;2)M _AXI_M(jìn)M2S 通道、M _AXI_2SMM 通道,均使用AXI_FULL接口協(xié)議,連接到PS端的M_AXI_GP接口,可通過(guò)M _AXI_GP 接口直接訪問(wèn)內(nèi)存,分別用于從內(nèi)存中讀出數(shù)據(jù)和向內(nèi)存寫(xiě)入數(shù)據(jù);3)S_AXIS_S2MM 通道、M _AXIS_M(jìn)M2S 通道,使用AXI_STREAM 接口協(xié)議,連接到PL 端緩存,分別用于從緩存中讀出數(shù)據(jù)和向緩存寫(xiě)入數(shù)據(jù)??紤]到設(shè)計(jì)中使用的NAND Flash芯片一頁(yè)大小為2 048字節(jié),采用位寬為8比特,深度為2048的FIFO 作為讀寫(xiě)緩存,并將FIFO 接口設(shè)置為AXI_STREAM 形式。
DMA 控制器寫(xiě)滿一頁(yè)緩存的速度快于將一頁(yè)緩存的數(shù)據(jù)寫(xiě)入NAND Flash的速度,將一頁(yè)數(shù)據(jù)從NAND Flash讀到緩存中的速度慢于DMA 控制器將一頁(yè)緩存數(shù)據(jù)寫(xiě)到內(nèi)存的速度,為了平衡緩存讀寫(xiě)端口的速度差異,采用乒乓操作的方式。對(duì)于頁(yè)編程和讀頁(yè)操作,設(shè)置兩個(gè)大小相同的緩存,分別為WFIFO_1、WFIFO_2以及RFIFO_1、RFIFO_2。當(dāng)DMA 控制器向其中一個(gè)WFIFO 寫(xiě)入數(shù)據(jù)時(shí),時(shí)序邏輯控制模塊可以將數(shù)據(jù)從另外一個(gè)WFIFO 中讀出并寫(xiě)入NAND Flash中;當(dāng)時(shí)序邏輯控制模塊從NAND Flash讀出一頁(yè)數(shù)據(jù)并存入其中一個(gè)RFIFO 中,DMA 控制器可以將另一RFIFO 的數(shù)據(jù)讀出。為了實(shí)現(xiàn)數(shù)據(jù)讀寫(xiě)時(shí)的乒乓操作,需要控制讀寫(xiě)緩存FIFO 的切換。FIFO 接口使用AXI_STREAM 協(xié)議,AXI_STREAM 協(xié)議的TLAST信號(hào)拉高表示一次數(shù)據(jù)傳輸完成,因此通過(guò)檢測(cè)TLAST 信號(hào)的上升沿變化來(lái)控制緩存接口的切換,具體電路結(jié)構(gòu)如圖8所示。
圖8 讀寫(xiě)緩存切換電路圖
3.1.1 仿真環(huán)境
基于Vivado 平臺(tái),編寫(xiě)Testbench 對(duì)PL 端NAND Flash控制器功能進(jìn)行測(cè)試,仿真測(cè)試模塊功能劃分如圖9所示。其中DUT(Design Under Test)為待測(cè)模塊,即PL端NAND Flash 控制器;NAND Flash MODEL 采用Micron公司提供的MT29F系列Verilog仿真模型,能夠模擬MT29F2G08ABAEAH4 型NAND Flash 的 功 能;CTRL(Control)模塊用于模擬PS端發(fā)送控制指令;BRAM 模塊用于保存NAND Flash控制器待發(fā)送數(shù)據(jù)和讀取數(shù)據(jù)。
圖9 測(cè)試模塊圖
3.1.2 功能仿真
NAND Flash控制器功能仿真如圖10所示,仿真過(guò)程中各信號(hào)定義如下:
圖10 功能仿真圖
1)NAND Flash 控制信號(hào):ce、ale、cle、re、we、rb、Flash_data_io。
2)RAM 表讀寫(xiě)控制信號(hào):包括RAM _WL _we、RAM _WL _addr、RAM _WL _din、RAM _WL _dout、RAM _BM _we、RAM _BM _addr、RAM_BM_din、RAM_BM_dout。
3)地址信號(hào):包括Logic_Addr(邏輯地址)、Temp_Addr(中間邏輯地址)、Phy_Addr(物理地址)。
圖10(a)為地址映射信息初始化過(guò)程,遍歷NAND Flash 的出廠壞塊標(biāo)志位,進(jìn)行地址映射信息表RAM _WL 和RAM_BM 的初始化。仿真過(guò)程中,為了模擬芯片出廠時(shí)帶有壞塊的情況,設(shè)置NAND Flash第50號(hào)存儲(chǔ)塊和第1 000號(hào)存儲(chǔ)塊的壞塊標(biāo)志位為0x00。RAM_BM初始化過(guò)程如下:控制器發(fā)送讀取每一個(gè)存儲(chǔ)塊首頁(yè)的空閑區(qū)域的命令(如區(qū)間A、B表示讀第1號(hào)存儲(chǔ)塊的壞塊標(biāo)志),若檢測(cè)出壞塊(如區(qū)間C、D 所示),采用保留區(qū)的存儲(chǔ)塊替換壞塊,并將好塊—壞塊的映射關(guān)系寫(xiě)入RAM_BM 中。RAM_WL初始化過(guò)程中始終將邏輯地址映射到的中間邏輯地址設(shè)置為“1”。
圖10(b)為NAND Flash控制器進(jìn)行擦除、頁(yè)編程、讀頁(yè)操作仿真,三種操作的邏輯地址均設(shè)置為 “2”。區(qū)間A 為塊擦除過(guò)程,地址映射模塊通過(guò)訪問(wèn)RAM_WL 得到中間邏輯地址為“1”,并更新RAM_WL 的信息,接著以中間邏輯地址為索引訪問(wèn)RAM_BM 得到物理地址為“1”,并向第1號(hào)存儲(chǔ)塊發(fā)出擦除命令。區(qū)間B、C 分別為頁(yè)編程、讀頁(yè)過(guò)程,首先通過(guò)地址映射模塊得到實(shí)際物理地址為“1”,并向第1號(hào)存儲(chǔ)塊發(fā)出編程命令和讀命令。
為了測(cè)試突發(fā)壞塊的情況,對(duì)物理地址為 “1”的存儲(chǔ)塊進(jìn)行編程操作時(shí),設(shè)置讀取操作狀態(tài)結(jié)果為失敗,即出現(xiàn)突發(fā)壞塊,仿真過(guò)程如圖10(c)所示。NAND Flash控制器向物理地址為“1”的存儲(chǔ)塊發(fā)出編程指令(如區(qū)間A所示)。完成存儲(chǔ)數(shù)據(jù)發(fā)送后,讀取操作狀態(tài)為0xe1(如區(qū)間B所示),表示編程操作失敗,待編程的存儲(chǔ)塊為壞塊。地址映射模塊更新RAM _BM,使用保留區(qū)的好塊地址“2010”替換壞塊地址“1”,實(shí)現(xiàn)壞塊管理功能。
為了驗(yàn)證基于地址映射方法實(shí)現(xiàn)的磨損均衡功能的有效性,模擬數(shù)據(jù)采集系統(tǒng)的工作情況,每次從初始地址開(kāi)始,向一定數(shù)量的存儲(chǔ)塊寫(xiě)入數(shù)據(jù)。為了覆蓋足夠數(shù)量的存儲(chǔ)塊,每次寫(xiě)入存儲(chǔ)塊的數(shù)量占NAND Flash總?cè)萘康?0%~100%,重復(fù)寫(xiě)入數(shù)據(jù)1萬(wàn)次。分別使用地址映射方法和直接控制法寫(xiě)入數(shù)據(jù),NAND Flash存儲(chǔ)塊磨損情況如圖11所示。由仿真結(jié)果可見(jiàn),相較于直接控制法,地址映射方法能夠更為均勻地擦除存儲(chǔ)塊。這是因?yàn)槊看芜M(jìn)行數(shù)據(jù)寫(xiě)入時(shí),地址映射方法將邏輯地址映射到序號(hào)遞增的物理地址中,避免了序號(hào)靠后的存儲(chǔ)塊較少被寫(xiě)入數(shù)據(jù)的情況,達(dá)到存儲(chǔ)塊均衡使用的目的。
圖11 NAND Flash存儲(chǔ)塊磨損情況
將設(shè)計(jì)的NAND Flash控制器應(yīng)用于某型浮空器的傳感器數(shù)據(jù)采集系統(tǒng),該系統(tǒng)通過(guò)多路串口、SPI接口和AD接口實(shí)時(shí)獲取壓差傳感器、溫度傳感器和電源電壓數(shù)據(jù),并存入NAND Flash中,系統(tǒng)程序基于裸機(jī)執(zhí)行。為了驗(yàn)證NAND Flash控制器功能的正確性,在系統(tǒng)工作過(guò)程中,將以下信息通過(guò)串口發(fā)送到PC 端存儲(chǔ):1)存入NAND Flash的傳感器數(shù)據(jù);2)NAND Flash擦除、編程操作的邏輯地址和物理地址;3)NAND Flash擦除、編程操作的完成情況。PC端接收到的部分?jǐn)?shù)據(jù)如圖12所示。數(shù)據(jù)采集完成后,將NAND Flash中存儲(chǔ)的實(shí)驗(yàn)數(shù)據(jù)讀出并與之前實(shí)時(shí)存儲(chǔ)的數(shù)據(jù)進(jìn)行對(duì)比,并統(tǒng)計(jì)每個(gè)存儲(chǔ)塊的擦除次數(shù)。
圖12 PC端串口接收數(shù)據(jù)圖
經(jīng)過(guò)多次實(shí)驗(yàn)測(cè)試,數(shù)據(jù)采集系統(tǒng)寫(xiě)入NAND Flash的數(shù)據(jù)與從NAND Flash讀出的數(shù)據(jù)均保持一致,存儲(chǔ)塊最大擦次數(shù)與最小擦除次數(shù)之差始終為1。實(shí)驗(yàn)過(guò)程中未出現(xiàn)壞塊,模擬壞塊出現(xiàn)情況,對(duì)第1號(hào)存儲(chǔ)塊進(jìn)行編程操作時(shí)設(shè)置編程狀態(tài)為失敗,經(jīng)測(cè)試NAND Flash控制器能夠使用保留區(qū)好塊地址代替壞塊地址。由此驗(yàn)證了基于地址映射方法的NAND Flash控制器可以在嵌入式數(shù)據(jù)采集系統(tǒng)得到正確使用。
本文提出了一種基于地址映射的NAND Flash控制方法,通過(guò)建立、維護(hù)、查詢(xún)邏輯地址到物理地址的映射信息表,實(shí)現(xiàn)嵌入式數(shù)據(jù)采集系統(tǒng)中NAND Flash的壞塊管理和磨損均衡功能。相比于使用文件系統(tǒng)的NAND Flash控制方法,對(duì)硬件資源要求更低,更為簡(jiǎn)單。基于地址映射方法,本文設(shè)計(jì)了一款NAND Flash控制器,仿真和實(shí)際應(yīng)用測(cè)試結(jié)果表明,控制器能夠管理出廠壞塊和突發(fā)壞塊,均衡每個(gè)存儲(chǔ)塊的負(fù)載,提高系統(tǒng)的可靠性,在嵌入式數(shù)據(jù)采集領(lǐng)域具有一定的應(yīng)用價(jià)值。