寧靜 劉國斌 祝周榮 劉偉 陳云
摘要:當(dāng)使用FLASH來存儲數(shù)據(jù)時,相同的地址不能重復(fù)寫入數(shù)據(jù)。在沒有擦除的情況下,重復(fù)對同一個地址進(jìn)行寫操作,會使得存儲的數(shù)據(jù)內(nèi)容出錯,從而導(dǎo)致從FLASH中讀出的數(shù)據(jù)出錯。因此,需要對FLASH的寫溢出功能進(jìn)行測試。當(dāng)FLASH中的所有好塊被占用,F(xiàn)PGA應(yīng)能自動停止寫入數(shù)據(jù),等待下一輪的寫操作。
關(guān)鍵詞:FLASH;自動寫停;擦除操作;FPGA
中圖分類號:TP333 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2018)04-0212-02
FLASH存儲器由于其容量較大,體積較小,掉電數(shù)據(jù)不丟失,讀寫速度快等優(yōu)點,適用于大數(shù)據(jù)的存儲[1]。基于FLASH本身的固有特性,F(xiàn)LASH存儲器在寫入數(shù)據(jù)前應(yīng)進(jìn)行擦除操作,并且不能對同一地址進(jìn)行多次的寫操作,否則會導(dǎo)致存儲的數(shù)據(jù)變?yōu)閬y碼。因此無論設(shè)計方的需求中是否明確提出需求,都需要對FLASH進(jìn)行寫溢出功能測試。
1 FPGA對FLASH的控制流程
對FLASH的擦除/讀/寫操作是通過FPGA(現(xiàn)場可編程邏輯門陣列)發(fā)送指令來控制的,常用的指令包括復(fù)位指令、擦除指令、寫操作指令、讀操作指令等。
由于生產(chǎn)工藝的原因,F(xiàn)LASH在出廠前就存在壞塊,記錄該壞塊信息的稱為初始壞塊表。在對FLASH擦除/讀/寫操作過程中,也有可能產(chǎn)生壞塊[2]。因此,F(xiàn)PGA需不斷更新壞塊表來標(biāo)記FLASH中的壞塊位置。這就要求設(shè)計與驗證時需要充分考慮壞塊在整個基片中的分布情況以確保FLASH能正常工作。
FPGA對FLASH控制主流程主要有擦除流程、寫流程、讀流程、壞塊管理流程等。若當(dāng)前狀態(tài)為擦除狀態(tài)且擦除結(jié)束標(biāo)志有效時,則執(zhí)行壞塊管理流程;若當(dāng)前狀態(tài)為頁寫狀態(tài)且非寫溢出時執(zhí)行寫流程;若當(dāng)前狀態(tài)為頁讀狀態(tài)且非讀溢出時執(zhí)行讀流程。
2 測試平臺的搭建
仿真測試是在Linux操作系統(tǒng)下VCS2010環(huán)境下進(jìn)行的。構(gòu)建激勵模型,編寫執(zhí)行腳本Makefile文件,觀察結(jié)果輸出,檢查被測模塊的功能實現(xiàn)。激勵模型框圖如1所示。
該FPGA產(chǎn)品的主要功能是接收文件控制FPGA的遙控指令,接收各路載荷數(shù)據(jù)并對接收的數(shù)據(jù)進(jìn)行復(fù)接處理后存儲到FLASH中,或者從FLASH存儲陣列中讀出數(shù)據(jù),發(fā)送給各功能模塊。管理FLASH中的壞塊表,完成壞塊表的更新和重構(gòu)。在搭建激勵模型時,需要模擬不同壞塊分布情況下的FLASH模型。
根據(jù)激勵模型圖,主要需構(gòu)建以下幾組測試模塊,如表1所示。
3 FLASH寫溢出功能測試
FPGA接收寫指令后,查詢該塊是否為好塊,若為好塊,查詢FLASH是否寫溢出,寫溢出則結(jié)束這一輪的寫操作,否則往FLASH中存儲數(shù)據(jù)。
我們需要測試不同壞塊分布情況的,F(xiàn)LASH自動寫停功能是否正常。因此,需要在FLASH的模型中設(shè)置不同的壞塊分布情況。
(1)設(shè)置最后一塊為好塊,且相鄰塊為好塊:
FLASH模型設(shè)置最后一塊為好塊且相鄰塊為好塊時,當(dāng)寫指針wr_addr達(dá)到最后一塊時,該FLASH被寫滿,寫溢出標(biāo)志wr_over置高,F(xiàn)PGA停止往FLASH中寫入數(shù)據(jù),寫溢出功能正常。
(2)設(shè)置最后一塊為好塊,且相鄰塊為壞塊:
FLASH模型設(shè)置最后一塊為好塊且相鄰塊為壞塊時,當(dāng)寫指針wr_addr達(dá)到最后一塊時,該FLASH被寫滿,寫溢出標(biāo)志wr_over置高,F(xiàn)PGA停止往FLASH中寫入數(shù)據(jù),寫溢出功能正常。
(3)設(shè)置最后一塊為壞塊,且相鄰塊為好塊:
FLASH模型設(shè)置最后一塊為壞塊且相鄰塊為好塊時,該FLASH被寫滿后,無法自動停止寫入數(shù)據(jù),從而導(dǎo)致寫指針回頭,繼續(xù)對已存儲過數(shù)據(jù)的好塊中執(zhí)行FLASH寫操作。相同的塊被兩次寫入后,會使得存儲的數(shù)據(jù)內(nèi)容出錯,從而導(dǎo)致從FLASH中讀出的數(shù)據(jù)錯誤。寫溢出功能錯誤。
(4)設(shè)置最后一塊為壞塊,且相鄰塊為壞塊:
FLASH模型設(shè)置最后一塊為壞塊且相鄰塊為壞塊時,該FLASH被寫滿后,無法自動停止寫入數(shù)據(jù),寫溢出功能錯誤。
4 FLASH寫溢出問題分析及糾正措施
寫溢出功能的判斷條件如圖2所示。
從圖2中可以看出,當(dāng)寫到最后一塊的最后一頁時,判定為寫溢出,F(xiàn)PGA應(yīng)停止寫入數(shù)據(jù)。由于設(shè)計時,并未考慮最后一塊為壞塊的情況。FLASH寫操作前,會預(yù)先判斷該塊為好塊還是壞塊,當(dāng)最后一塊為壞塊時,則不會往該壞塊中寫入數(shù)據(jù),寫指針可能的最大值為(”11”&”fffe”),使得寫地址wr_addr永遠(yuǎn)無法滿足預(yù)定的寫溢出條件,wr_over始終為0,最終導(dǎo)致flash寫操作無法自動停止。
針對以上寫溢出問題,當(dāng)寫地址wr_addr達(dá)到最后一塊時,無論最后一塊是好塊還是壞塊,均判定為寫溢出,停止寫入數(shù)據(jù)。修改后的代碼如圖3所示。
5 結(jié)語
FLASH寫溢出問題會導(dǎo)致在沒有擦除的情況下,對同一個地址重復(fù)進(jìn)行寫操作,從而導(dǎo)致存儲在FLASH中的數(shù)據(jù)錯亂。需要充分考慮最后一塊及相鄰塊分別為好塊/壞塊情況下的寫溢出功能是否正常,提高FPGA對FLASH控制的可靠性。
參考文獻(xiàn)
[1]李文博.flash陣列存儲技術(shù)研究.哈爾濱工業(yè)大學(xué)碩士研究生學(xué)位論文,2010:10-11.
[2]林剛.NAND Flash 壞塊管理算法及邏輯驅(qū)動層設(shè)計.西安電子科技大學(xué)碩士研究生學(xué)位論文,2009:1-6.