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