胡紅,王少云,葉艷
(1.南京航空航天大學電子信息工程學院,江蘇南京210016;2.南京航空航天大學無人機研究院,江蘇南京210016)
Flash芯片作為一種新興的半導體存儲器件,具有集成度高、非易失性、功耗低、價格低、容量大、可擦除次數(shù)多等優(yōu)點,被廣泛應(yīng)用于大容量數(shù)據(jù)存儲系統(tǒng)中。Samsung公司的K9F8G08U0M單片容量達到8GB,可通過多片NAND Flash串聯(lián)的方法擴大系統(tǒng)容量。但是由于工藝和使用環(huán)境等因素,NAND Flash較其他形式的存儲芯片更易出現(xiàn)壞塊問題,同時由于NAND Flash存儲芯片的容量大,出現(xiàn)壞塊問題也更多。因此,在使用NAND Flash存儲芯片時,對壞塊的管理愈顯重要。
使用NAND Flash存儲芯片時,對壞塊的管理的一般方法有:1)基于FPGA的片內(nèi)RAM,存儲有效塊信息,將有效塊地址作為數(shù)據(jù)存入RAM中。進行讀寫操作時,從RAM中讀出有效塊地址。2)基于FPGA內(nèi)部RAM,RAM地址與塊地址相對應(yīng),在與壞塊地址相對應(yīng)的RAM中存儲1,而其他存儲0[1]。
本文提出了一種基于FPGA的大容量數(shù)據(jù)記錄儀的壞塊管理方法,利用FPGA[2]內(nèi)部RAM[3]空間建立壞塊地址信息存儲區(qū),通過查詢存儲區(qū)中的信息,來確定當前存儲塊是否損壞,若是壞塊則跳過,從而避免對壞塊的操作,實現(xiàn)了對Flash存儲空間的有效管理。該壞塊管理方案在不增加FPGA使用的復雜程度的條件下,需要的內(nèi)存資源比方法1、方法2明顯減少。
文中的大容量數(shù)據(jù)記錄儀采用9片Samsung公司的NAND Flash芯片K9F8G08U0M,其總?cè)萘窟_到72G。K9F8G08U0M芯片由4096個塊組成,每個塊有64頁,每個頁為(4K+128)Bytes,其中4KBytes為Main Area,128Bytes為Spare area,Main Area專門存儲數(shù)據(jù),Spare Area存儲其他信息,如ECC校檢碼、壞塊信息等。K9F8G08U0M的讀寫操作以頁為最小單位,擦除操作以塊為最小單位進行,禁止按位擦除。8個I/O引腳為多路復用,既可以作為數(shù)據(jù)線進行數(shù)據(jù)傳輸,也可以作為地址線進行尋址。這個方案顯著減少了芯片引腳,允許在保持系統(tǒng)板不變的情況下升級存儲密度[4]。
K9F8G08U0M芯片是數(shù)據(jù)記錄儀的核心部分,若某個塊發(fā)生損壞時,視為壞塊。記錄儀工作時,剔除壞塊,只將數(shù)據(jù)存儲到好塊中,從而提高存儲數(shù)據(jù)的正確性,即數(shù)據(jù)記錄儀使用NAND Flash存儲芯片時,需要對存儲板壞塊進行管理。
由于Flash的制造工藝不能保證其存儲陣列在其生命周期中保持性能的可靠,因此,在Flash的生產(chǎn)與使用過程中會產(chǎn)生壞塊。
NAND Flash的壞塊可分為兩類:固有壞塊、使用壞塊。固有壞塊是出廠前,由于生產(chǎn)工藝所產(chǎn)生的壞塊。廠商已經(jīng)對固有壞塊進行了壞塊標記,在每個塊第1頁的第一個備份字節(jié)標志壞塊值,若為0xff,則為好塊,若為非0xff,則為壞塊。為了保持與固有壞塊信息一致,使用過程中發(fā)現(xiàn)新的壞塊時,將新的壞塊第一頁的第一個備份字節(jié)標志為非0xff。
使用壞塊是出廠后,用戶對芯片使用產(chǎn)生過程中產(chǎn)生的新壞塊。
本文提出的壞塊管理方法是對方法1上進行改進后形成的。我們稱為方法3。方法3在FPGA中內(nèi)建片上RAM來存儲壞塊地址信息,通過壞塊查詢模塊來辨別當前存儲塊是否有效。壞塊管理需要做以下工作:識別壞塊并建立壞塊表(BBT,bad block table),將壞塊地址信息存儲到壞塊表中;在對當前存儲塊進行操作時,發(fā)生錯誤需更新BBT,并且通過壞塊查詢模塊來跳過壞塊,從而對有效塊進行操作。
2.2.1 識別壞塊與存儲信息
第一次對NAND Flash進行操作之前,先要識別固有壞塊,建立初始BBT。其操作流程為:設(shè)置塊初始地址為0,檢查塊中備份區(qū)的第一個字節(jié)是否為0xff,如果是,則為有效塊,如果不是,則為壞塊,產(chǎn)生初始壞塊表(后面的塊為壞塊,則需更新BBT),將該壞塊地址信息存儲進去,增加塊地址,繼續(xù)上面的步驟,直到最后一塊。流程圖如圖1所示。
圖1 創(chuàng)建壞塊表的流程圖Fig.1 Flow chart of creating initial bad block table
在壞塊管理過程中,不僅僅要識別壞塊,而且必須將壞塊地址信息存儲起來,這樣在對存儲塊進行操作時只需要檢查該塊是否在BBT中,不需要每次去識別,節(jié)省了大量時間。首先在FPGA中建立RAM空間,將壞塊地址信息存儲到RAM壞塊地址信息存儲區(qū),然后再寫入到NAND Flash的一個有效塊中。為了防止意外掉電,每個BBT必須在Flash里保存兩份[5]。當發(fā)現(xiàn)兩個BBT不一樣時,說明出現(xiàn)狀況,必須重新建立壞塊表[7]。
NAND Flash除了固有壞塊,對NAND Flash進行讀寫擦除操作過程中也會隨機產(chǎn)生新的壞塊,這時需要更新BBT。NAND Flash讀操作失敗時,一般不會造成整頁全部出錯,僅僅是頁中的一個或幾個比特出錯。文中使用一種比較專用的校檢—ECC(Error Correction Code)。ECC能夠糾正一個比特錯誤以及檢測兩個比特錯誤,而且計算速度很快[6]。本設(shè)計中,對每個512Bytes原始數(shù)據(jù)生成3個字節(jié)ECC校檢碼:8比特的列校檢碼和16比特的行校檢碼。對于每頁4KB的數(shù)據(jù)來說,會產(chǎn)生24Bytes的ECC校檢碼。當出現(xiàn)1bit錯誤時,可糾正;當出現(xiàn)2bits以上的錯誤,就將該塊標記為壞塊,這時需要更新BBT,如圖2所示。當擦寫操作失敗時,其狀態(tài)會相應(yīng)地反映到狀態(tài)寄存器上,將壞塊里面的內(nèi)容備份到有效塊中,然后將其標志為壞塊,這時也需要更新BBT,如圖3所示。
圖2 讀操作失敗更新BBTFig.2 Update BBT with failure of read operation
2.2.2 壞塊查詢模塊
對當前存儲塊進行操作時,需要調(diào)用壞塊查詢模塊。上電時,首先將壞塊信息從Flash的存儲區(qū)讀入到RAM中。當對第n塊進行操作時,只需調(diào)用壞塊查詢模塊,查詢FPGA內(nèi)部RAM的壞塊地址信息,如果該塊為壞塊,則對第n+1個壞塊查詢,直至查詢到一個有效塊。查詢壞塊模塊部分代碼如下所示。
always@(posedge clk or negedge rst)
if(!rst)
begin
valid_blockaddr<=12'b0;
i<=5'b0;
read<=1'b0;
圖3 擦寫操作失敗更新BBTFig.3 Update BBT with failure of erase and write operation
num<=5'b0;
end
else
begin
if(i<64)
begin
block_addr<=addr[30:19]+num;
read<=1'b1;
address<=i;
if(block_addr==data)//說明該塊為壞塊,設(shè)num為1,則塊地址加1
begin
i<=0;
num<=num+5'b1;
end
else//與下一個地址信息對比,num不變,則地址不變
begin
i<=i+5'b1;
num<=num;
end
end
else//當i大于63時,說明已與所有壞塊地址信息對比過,并且該塊不在壞塊中
begin
valid_blockaddr<=block_addr;
i<=0;
num<=5'b0;
end
end
其中read、address分別為存儲壞塊地址信息RAM的讀使能端、地址,數(shù)據(jù)寬度為12,深度為64。addr為31位操作地址,data為RAM輸出的壞塊地址,將操作地址與壞塊地址data相比較,如果數(shù)據(jù)相同,說明該塊為壞塊,則將塊地址加1,從而跳過壞塊。由于所選型號不同以及工藝上的差別,壞塊數(shù)目自然不同,因此根據(jù)實際情況建立RAM[5]。
由于一般壞塊的數(shù)量不超過總量的2%,所以其壞塊信息量較有效塊信息量小很多。方法3只占用FPGA較少的RAM資源。對于單片K9F8GU0M而言,對方法1、方法2以及本文所提出的方法進行存儲信息以及占用RAM資源的比較,如表1所示。方法3占用RAM的資源大約是方法1的2.5%,是方法3的30%。
表1 壞塊管理設(shè)計方法比較Tab.1 The comparison of bad block storage methods
本文使用Verilog HDL語言進行編程,在QuartusII軟件平臺上對實現(xiàn)的功能進行編譯、運行,并且在Modelsim仿真平臺上編寫測試[8]平臺,對模塊進行功能仿真。圖4、圖5分別為識別壞塊仿真圖、壞塊查詢仿真圖。
圖4 識別壞塊仿真圖Fig.4 Simulation diagram of identifying bad block
圖5 壞塊查詢仿真圖Fig.5 Stimulation graph of checking bad block
圖4為識別固有壞塊仿真時序。該數(shù)據(jù)記錄儀由9片K9F8G08U0M組成,圖中CE_L為9位片選信號,低電平有效;ALE_H為地址鎖存使能,高電平有效;CLE_H為命令鎖存使能,高電平有效;WE_L為寫使能,低電平有效;RE_L為讀使能,低電平有效;RB為設(shè)備狀態(tài)對于識別壞塊的仿真,本設(shè)計片選第1個芯片,讀出每塊的第一個備份字節(jié)。塊的初始地址為0,讀出數(shù)據(jù)后,將塊地址加1。由仿真圖可知第0,1塊為好塊,第2塊為壞塊,依次類推。仿真結(jié)果表明該壞塊管理中的壞塊識別模塊能夠?qū)崿F(xiàn)識別壞塊的功能。
圖5為壞塊查詢模塊仿真圖。為了便于觀察,設(shè)置RAM中第1、2、3、4地址存儲的壞塊地址為第1、3、5、6塊。圖5中addr為31位操作地址,分別設(shè)置為0x00000000、0x00180000、0x00280000,其對應(yīng)的塊地址為第0、3、5塊;valid_block為12位有效塊地址。由圖5可知,當對第3塊操作時,由于該塊為壞塊,所以跳過壞塊,對第4塊進行操作;當對第5塊進行操作時,由于該塊為壞塊,并且下一個塊即第6塊也為壞塊,所以跳到第7塊進行操作。仿真結(jié)果表明,該壞塊管理中壞塊查詢模塊能夠?qū)崿F(xiàn)辨別當前存儲塊是否為壞塊,并且跳過壞塊的功能。
文中的大容量數(shù)據(jù)記錄儀的存儲板由9片NAND Flash串聯(lián)組成,存儲容量大,出現(xiàn)壞塊問題的可能也多,因此提出了一種基于FPGA存儲壞塊地址信息的壞塊管理方案,來解決存儲板中的壞塊管理問題。仿真分析表明,該壞塊管理方案能夠有效地解決NAND Flash的壞塊管理問題,具有占用FPGA資源少的優(yōu)點,也可供其他類型的大容量數(shù)據(jù)記錄儀作為參考。
[1] 張勝勇,高世杰,吳志勇,等.基于FPGA的NAND Flash壞塊處理方法[J].計算機工程,2010,36(6):239-243.ZHANG Sheng-yong,GAO Shi-jie,WU Zhi-yong,et al.Bad block handle method of NAND flash memory based on FPGA[J].Computer Engineering,2010,36(6):239-243.
[2] 華清遠見嵌入式培訓中心.FPGA應(yīng)用開發(fā)入門與典型實例[M].北京:人民郵電出版社,2008.
[3] 夏宇聞.Verilog數(shù)字系統(tǒng)設(shè)計教程[M].北京:北京航空航天大學出版社,2008.
[4] Samsung Electronics.K9F8G08UXMFLASH Memory[M].2007.
[5] 羅曉,劉昊.一種基于FAT文件系統(tǒng)的NAND Flash壞塊處理方法[J].電子器件,2008,31(2):716-719.LUO Xiao,LIU Hao.Method of NAND flash memory bad block management based on FAT file system[J].Chinese Journal Of Electron Devices,2008,31(2):716-719.
[6] 韓勇豪,王少云.一種固態(tài)飛行參數(shù)記錄儀的研制[J].電子設(shè)計工程,2011,19(16)159-162.HAN Yong-hao,WANG Shao-yun.Design of a solid flight parameter recorder[J].Electronic Design Engineering,2011,19(16)159-162.
[7] 周軍.NAND Flash的壞塊管理設(shè)計[J].單片機與嵌入式系統(tǒng)應(yīng)用,2010(9):15-17.ZHOU Jun.Bad block management for NAND flash[J].Microcontrollers&Embedded Systems,2010(9):15-17.
[8] 王文龍,張少博,陳海峰.一種試驗數(shù)據(jù)處理軟件設(shè)計[J].火箭推進,2012(1):76-80.WANG Wen-long,ZHANG Shao-bo,CHEN Hai-feng.Design of a test data processing software[J].Journal of Rocket Propulsion,2012(1):76-80.