一種基于FPGA的NAND Flash容錯(cuò)方法
【專利摘要】本發(fā)明公開(kāi)了一種基于FPGA的NAND Flash容錯(cuò)方法,包括Flash壞塊檢測(cè)、壞塊管理和動(dòng)態(tài)查表。通過(guò)Flash寫標(biāo)志位的狀態(tài)和讀寫內(nèi)容是否相同來(lái)檢測(cè)壞塊。利用壞塊管理算法對(duì)檢測(cè)到的好、壞塊地址進(jìn)行管理,并建立地址映射表。FPGA通過(guò)動(dòng)態(tài)查表的方式對(duì)Flash進(jìn)行寫入、讀取和擦除操作,大大提高了數(shù)據(jù)存取的準(zhǔn)確性和高效性。本方法能直接提高Flash空間利用率,使其整體性能和處理速度得到重要的保障,對(duì)新一代大容量NAND Flash的應(yīng)用發(fā)展具有參考意義。
【專利說(shuō)明】
_種基于FPGA的NAND FI ash容錯(cuò)方法
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及Flash容錯(cuò)技術(shù),尤其涉及一種基于FPGA的NANDFlash容錯(cuò)方法。
【背景技術(shù)】
[0002]隨著信息技術(shù)地不斷發(fā)展,數(shù)字產(chǎn)品已經(jīng)成為生活至關(guān)重要的一部分。在人們不斷追求高品質(zhì)生活的過(guò)程中,智能手機(jī)、數(shù)碼相機(jī)、播放器等數(shù)字產(chǎn)品的容量和處理性能亟需提升。與此同時(shí),存儲(chǔ)產(chǎn)業(yè)面臨著由巨大需求帶來(lái)的發(fā)展機(jī)遇?,F(xiàn)今民用消費(fèi)電子市場(chǎng)中,閃存(Flash)在非易失性存儲(chǔ)介質(zhì)中扮演著主要角色。由邏輯架構(gòu)上的差異可分為NORFlash和NAND Flash兩種。NOR Flash在早期市場(chǎng)中占據(jù)主要地位,技術(shù)革新后,NAND Flash強(qiáng)調(diào)降低每比特的成本,可像磁盤一樣通過(guò)接口輕松升級(jí),具有速度高,可靠性高,功耗低,體積小、發(fā)熱少、抗震強(qiáng)等優(yōu)點(diǎn),逐漸取代NOR Flash,日益成為存儲(chǔ)器的主流。
[0003]由于NAND Flash的工藝不能保證NAND的Memory Array在其生命周期中保持性能的可靠,因此在出場(chǎng)和使用過(guò)程中會(huì)產(chǎn)生不能擦除錯(cuò)誤的無(wú)效塊,即壞塊。出場(chǎng)時(shí)存在的壞塊不能用于存儲(chǔ)數(shù)據(jù),已被廠家標(biāo)識(shí)好,而后天由于使用次數(shù)增多引起的壞塊的某些位不能發(fā)生翻轉(zhuǎn),使系統(tǒng)變得不穩(wěn)定,導(dǎo)致Flash中數(shù)據(jù)無(wú)法被正常地讀取和寫入,甚至引起Flash報(bào)廢等問(wèn)題。因此,壞塊管理一直是NAND Flash管理中的技術(shù)關(guān)鍵和難點(diǎn)。通過(guò)對(duì)壞塊的檢測(cè)和管理,不僅可以在第一時(shí)間發(fā)現(xiàn)壞塊,而且可以根據(jù)需要跳過(guò)或替換壞塊,并把替換的壞塊存儲(chǔ)在保留區(qū)中,可保障數(shù)據(jù)安全,避免數(shù)據(jù)丟失等不必要的麻煩。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提供一種基于FPGA的NANDFlash容錯(cuò)方法。
[0005]本發(fā)明的目的是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的:一種基于FPGA的NANDFlash容錯(cuò)方法,包括Flash壞塊檢測(cè)、壞塊管理和動(dòng)態(tài)查表。通過(guò)Flash寫標(biāo)志位的狀態(tài)和讀寫內(nèi)容是否相同來(lái)檢測(cè)壞塊。利用壞塊管理算法對(duì)檢測(cè)到的好、壞塊地址進(jìn)行管理,并建立地址映射表。FPGA通過(guò)動(dòng)態(tài)查表的方式對(duì)Flash進(jìn)行寫入、讀取和擦除操作,大大提高了數(shù)據(jù)存取的準(zhǔn)確性和高效性。
[0006]進(jìn)一步地,所述Flash壞塊檢測(cè)過(guò)程如下:
[0007](I)通過(guò)FPGA對(duì)Flash芯片所有塊按頁(yè)地址進(jìn)行寫操作,一次寫一頁(yè)。一個(gè)寫周期結(jié)束后,通過(guò)檢查寫狀態(tài)標(biāo)志位來(lái)判斷是否寫成功,若連續(xù)3次未寫成功,則判斷當(dāng)前塊為壞塊;
[0008](2)若寫入成功,則將寫數(shù)據(jù)存儲(chǔ)至RAM。讀取當(dāng)前塊內(nèi)容,和RAM中的寫數(shù)據(jù)進(jìn)行對(duì)比,連續(xù)2次讀取和寫入內(nèi)容不相同,則判斷當(dāng)前塊為壞塊;
[0009](2)若寫入成功,讀取當(dāng)前塊內(nèi)容,和RAM中的寫數(shù)據(jù)進(jìn)行對(duì)比,連續(xù)2次讀取和寫入內(nèi)容不相同,則判斷當(dāng)前塊為壞塊;
[0010]進(jìn)一步地,所述壞塊管理過(guò)程如下:
[0011](I)對(duì)每塊Flash檢測(cè)到的第一個(gè)好塊進(jìn)行擦除操作,擦除后所有字節(jié)內(nèi)容均為0XFF。然后在其第一頁(yè)所有字節(jié)寫入OXOA進(jìn)行標(biāo)記,表明該塊用于存放地址映射表,記為Blockl,其塊地址記為addressl ;
[0012](2)定義一個(gè)16位的寄存器,記為block_addr,用于存放檢測(cè)塊的狀態(tài)。Blockl的第二頁(yè)開(kāi)始,采用每個(gè)bit標(biāo)記一個(gè)塊的方式存放地址映射表,好塊記為I,壞塊記為O;
[0013](3)從Blockl之后的塊開(kāi)始檢測(cè),若為好塊,則
[0014]block_addr[0]=I,
[0015]反之,
[0016]block_addr[0] =O0
[00?7] 同時(shí),block_addr左移一位,并定義寄存器bi t_counter,記錄左移位數(shù);
[0018](4)通過(guò)檢查寫狀態(tài)標(biāo)志位檢測(cè)壞塊過(guò)程中,若當(dāng)前頁(yè)滿足寫入失敗條件,則判斷當(dāng)前塊為壞塊,并跳過(guò)后續(xù)頁(yè)的檢測(cè),直接開(kāi)始下一塊的檢測(cè);
[0019](5)當(dāng)bit_counter = 31時(shí),把block_addr 寫入到 Blockl 的第二頁(yè)的第一個(gè) word,并且Blockl列地址加I,bit_counter清零。同時(shí),定義寄存器block_counter,記錄清零次數(shù);
[°02°] (6)設(shè)Flash總共有N個(gè)塊,最大塊地址記為addr_max,若滿足[0021 ] block_counter> = (addr_max-addr e s s I) /16,
[0022]則說(shuō)明檢測(cè)完成,地址映射表已存儲(chǔ)于Blockl。
[0023]進(jìn)一步地,所述Flash在建立地址映射表后,動(dòng)態(tài)查表過(guò)程如下:
[0024](I)讀取:從Flash的第一個(gè)塊開(kāi)始執(zhí)行讀操作,若讀取到塊的第一頁(yè)全為0Χ0Α,則判斷當(dāng)前塊為地址映射表存儲(chǔ)塊。讀取第二頁(yè)的地址映射表,并存儲(chǔ)至RAM,同時(shí),塊地址后移至下一塊。逐位判斷地址映射表,若為I,讀取當(dāng)前塊內(nèi)容,若為0,則跳過(guò)當(dāng)前塊。每次位判斷和塊操作結(jié)束后,地址均后移一個(gè)單位,直至執(zhí)行至塊地址addrjnax;
[0025](2)擦除:從Flash的第一個(gè)塊開(kāi)始執(zhí)行讀操作,若讀取到塊的第一頁(yè)全為0Χ0Α,則判斷當(dāng)前塊為地址映射表存儲(chǔ)塊。從下一塊開(kāi)始執(zhí)行擦除操作,直至執(zhí)行至塊地址addr_max;
[0026](3)動(dòng)態(tài)更新:擦除后再次執(zhí)行寫入操作時(shí),首先從Flash的第一個(gè)塊開(kāi)始執(zhí)行讀操作,若讀取到塊的第一頁(yè)全為0Χ0Α,則判斷當(dāng)前塊為地址映射表存儲(chǔ)塊。讀取第二頁(yè)的地址映射表,并存儲(chǔ)至RAM,同時(shí),塊地址后移至下一塊。逐位判斷地址映射表,若為O,跳過(guò)當(dāng)前塊,若為I,在當(dāng)前塊寫入數(shù)據(jù),同時(shí)執(zhí)行檢測(cè)操作,若當(dāng)前塊檢測(cè)為壞塊,則更新地址映射表,將當(dāng)前記錄位更新為0,并跳過(guò)當(dāng)前塊。每次位判斷和塊操作結(jié)束后,地址均后移一個(gè)單位,直至執(zhí)行至塊地址addr_max。
[0027]本發(fā)明具有的有益效果是:基于FPGA的NANDFlash容錯(cuò)方法,可以有效地解決壞塊檢測(cè)和管理問(wèn)題,從而提高Flash存儲(chǔ)性能,延長(zhǎng)其使用壽命,保障用戶的數(shù)據(jù)安全。該方法包括Flash壞塊檢測(cè)、壞塊管理和動(dòng)態(tài)查表。通過(guò)Flash寫標(biāo)志位的狀態(tài)和讀寫內(nèi)容是否相同來(lái)檢測(cè)壞塊。利用壞塊管理算法對(duì)檢測(cè)到的好、壞塊地址進(jìn)行管理,并建立地址映射表。FPGA通過(guò)動(dòng)態(tài)查表的方式對(duì)Flash進(jìn)行寫入、讀取和擦除操作,針對(duì)現(xiàn)有技術(shù)的不足提出了切實(shí)可行的處理方法,大大提高了數(shù)據(jù)存取的準(zhǔn)確性和高效性??傊?,通過(guò)NAND Flash容錯(cuò)方法,能對(duì)使用過(guò)程中遇到的壞塊進(jìn)行動(dòng)態(tài)管理,動(dòng)態(tài)更新壞塊信息表,直接提高塊空間利用效率,使Flash整體性能和處理速度得到重要的保障,對(duì)新一代大容量NAND Flash的應(yīng)用發(fā)展具有參考意義。
【附圖說(shuō)明】
[0028]圖1是Flash壞塊檢測(cè)流程圖;
[0029]圖2是Flash壞塊管理流程圖;
[0030]圖3是地址映射表動(dòng)態(tài)更新流程圖。
【具體實(shí)施方式】
[0031]下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步說(shuō)明。
[0032]如圖1所示,F(xiàn)lash壞塊檢測(cè)過(guò)程如下:
[0033](I)通過(guò)FPGA對(duì)Flash芯片所有塊按頁(yè)地址進(jìn)行寫操作,一次寫一頁(yè)。一個(gè)寫周期結(jié)束后,通過(guò)檢查寫狀態(tài)標(biāo)志位來(lái)判斷是否寫成功,若連續(xù)3次未寫成功,則判斷當(dāng)前塊為壞塊;
[0034](2)若寫入成功,則將寫數(shù)據(jù)存儲(chǔ)至RAM。讀取當(dāng)前塊內(nèi)容,和RAM中的寫數(shù)據(jù)進(jìn)行對(duì)比,連續(xù)2次讀取和寫入內(nèi)容不相同,則判斷當(dāng)前塊為壞塊;
[0035]如圖2所示,壞塊管理過(guò)程如下:
[0036](I)對(duì)每塊Flash檢測(cè)到的第一個(gè)好塊進(jìn)行擦除操作,擦除后所有字節(jié)內(nèi)容均為0XFF。然后在其第一頁(yè)所有字節(jié)寫入OXOA進(jìn)行標(biāo)記,表明該塊用于存放地址映射表,記為Blockl,其塊地址記為addressl ;
[0037](2)定義一個(gè)16位的寄存器,記為block_addr,用于存放檢測(cè)塊的狀態(tài)。Blockl的第二頁(yè)開(kāi)始,采用每個(gè)bit標(biāo)記一個(gè)塊的方式存放地址映射表,好塊記為I,壞塊記為O;
[0038](3)從Blockl之后的塊開(kāi)始檢測(cè),若為好塊,則
[0039]block_addr[0]=I,
[0040]反之,
[0041]block_addr[0] =O0
[0042]同時(shí),block_addr左移一位,并定義寄存器bit_counter,記錄左移位數(shù);
[0043](4)通過(guò)檢查寫狀態(tài)標(biāo)志位檢測(cè)壞塊過(guò)程中,若當(dāng)前頁(yè)滿足寫入失敗條件,則判斷當(dāng)前塊為壞塊,并跳過(guò)后續(xù)頁(yè)的檢測(cè),直接開(kāi)始下一塊的檢測(cè);
[0044](5)當(dāng)bit_counter = 31時(shí),把block_addr 寫入到 Blockl 的第二頁(yè)的第一個(gè) word,并且Blockl列地址加I,bit_counter清零。同時(shí),定義寄存器block_counter,記錄清零次數(shù);
[0045](6)設(shè)Flash總共有N個(gè)塊,最大塊地址記為addr_max,若滿足
[0046]block_counter> = (addr_max-addr e s s I) /16,
[0047]則說(shuō)明檢測(cè)完成,地址映射表已存儲(chǔ)于Blockl。
[0048]如圖3所示,F(xiàn)lash在建立地址映射表后,動(dòng)態(tài)查表過(guò)程如下:
[0049](I)讀取:從Flash的第一個(gè)塊開(kāi)始執(zhí)行讀操作,若讀取到塊的第一頁(yè)全為0Χ0Α,則判斷當(dāng)前塊為地址映射表存儲(chǔ)塊。讀取第二頁(yè)的地址映射表,并存儲(chǔ)至RAM,同時(shí),塊地址后移至下一塊。逐位判斷地址映射表,若為I,讀取當(dāng)前塊內(nèi)容,若為0,則跳過(guò)當(dāng)前塊。每次位判斷和塊操作結(jié)束后,地址均后移一個(gè)單位,直至執(zhí)行至塊地址addrjnax;
[0050](2)擦除:從Flash的第一個(gè)塊開(kāi)始執(zhí)行讀操作,若讀取到塊的第一頁(yè)全為0Χ0Α,則判斷當(dāng)前塊為地址映射表存儲(chǔ)塊。從下一塊開(kāi)始執(zhí)行擦除操作,直至執(zhí)行至塊地址addr_max;
[0051](3)動(dòng)態(tài)更新:擦除后再次執(zhí)行寫入操作時(shí),首先從Flash的第一個(gè)塊開(kāi)始執(zhí)行讀操作,若讀取到塊的第一頁(yè)全為0Χ0Α,則判斷當(dāng)前塊為地址映射表存儲(chǔ)塊。讀取第二頁(yè)的地址映射表,并存儲(chǔ)至RAM,同時(shí),塊地址后移至下一塊。逐位判斷地址映射表,若為O,跳過(guò)當(dāng)前塊,若為I,在當(dāng)前塊寫入數(shù)據(jù),同時(shí)執(zhí)行檢測(cè)操作,若當(dāng)前塊檢測(cè)為壞塊,則更新地址映射表,將當(dāng)前記錄位更新為0,并跳過(guò)當(dāng)前塊。每次位判斷和塊操作結(jié)束后,地址均后移一個(gè)單位,直至執(zhí)行至塊地址addr_max。
【主權(quán)項(xiàng)】
1.一種基于FPGA的NAND Flash容錯(cuò)方法,其特征在于,包括Flash壞塊檢測(cè)、壞塊管理和動(dòng)態(tài)查表。通過(guò)Flash寫標(biāo)志位的狀態(tài)和讀寫內(nèi)容是否相同來(lái)檢測(cè)壞塊。利用壞塊管理算法對(duì)檢測(cè)到的好、壞塊地址進(jìn)行管理,并建立地址映射表。F P G A通過(guò)動(dòng)態(tài)查表的方式對(duì)Flash進(jìn)行寫入、讀取和擦除操作。2.根據(jù)權(quán)利要求1所述的一種基于FPGA的NANDFlash容錯(cuò)方法,其特征在于,所述Flash壞塊檢測(cè)過(guò)程如下: (1)通過(guò)FPGA對(duì)Flash芯片所有塊按頁(yè)地址進(jìn)行寫操作,一次寫一頁(yè)。一個(gè)寫周期結(jié)束后,通過(guò)檢查寫狀態(tài)標(biāo)志位來(lái)判斷是否寫成功,若連續(xù)3次未寫成功,則判斷當(dāng)前塊為壞塊; (2)若寫入成功,則將寫數(shù)據(jù)存儲(chǔ)至RAM。讀取當(dāng)前塊內(nèi)容,和RAM中的寫數(shù)據(jù)進(jìn)行對(duì)比,連續(xù)2次讀取和寫入內(nèi)容不相同,則判斷當(dāng)前塊為壞塊。3.根據(jù)權(quán)利要求1所述的一種基于FPGA的NANDFlash容錯(cuò)方法,其特征在于,所述壞塊管理過(guò)程如下: (1)對(duì)每塊Flash檢測(cè)到的第一個(gè)好塊進(jìn)行擦除操作,擦除后所有字節(jié)內(nèi)容均為OXFF。然后在其第一頁(yè)所有字節(jié)寫入OXOA進(jìn)行標(biāo)記,表明該塊用于存放地址映射表,記為Blockl,其塊地址記為address I ; (2)定義一個(gè)16位的寄存器,記為block_addr,用于存放檢測(cè)塊的狀態(tài)。Blockl的第二頁(yè)開(kāi)始,采用每個(gè)bit標(biāo)記一個(gè)塊的方式存放地址映射表,好塊記為I,壞塊記為O; (3)從Blockl之后的塊開(kāi)始檢測(cè),若為好塊,則 block_addr[0]=I, 反之, block_addr[0] =O0 同時(shí),block_addr左移一位,并定義寄存器bi t_counter,記錄左移位數(shù); (4)通過(guò)檢查寫狀態(tài)標(biāo)志位檢測(cè)壞塊過(guò)程中,若當(dāng)前頁(yè)滿足寫入失敗條件,則判斷當(dāng)前塊為壞塊,并跳過(guò)后續(xù)頁(yè)的檢測(cè),直接開(kāi)始下一塊的檢測(cè); (5)當(dāng)bit_counter= 31時(shí),把block_addr寫入到Blockl的第二頁(yè)的第一個(gè)word,并且Blockl列地址加I,bit_counter清零。同時(shí),定義寄存器block_counter,記錄清零次數(shù); (6)設(shè)Flash總共有N個(gè)塊,最大塊地址記為addr_max,若滿足 block_counter> = (addr_max_addressl)/16, 則說(shuō)明檢測(cè)完成,地址映射表已存儲(chǔ)于Blockl。4.根據(jù)權(quán)利要求1所述的一種基于FPGA的NANDFlash容錯(cuò)方法,其特征在于,所述Flash在建立地址映射表后,動(dòng)態(tài)查表過(guò)程如下: (1)讀取:從Flash的第一個(gè)塊開(kāi)始執(zhí)行讀操作,若讀取到塊的第一頁(yè)全為0Χ0Α,則判斷當(dāng)前塊為地址映射表存儲(chǔ)塊。讀取第二頁(yè)的地址映射表,并存儲(chǔ)至RAM,同時(shí),塊地址后移至下一塊。逐位判斷地址映射表,若為I,讀取當(dāng)前塊內(nèi)容,若為0,則跳過(guò)當(dāng)前塊。每次位判斷和塊操作結(jié)束后,地址均后移一個(gè)單位,直至執(zhí)行至塊地址addr_max ; (2)擦除:從Flash的第一個(gè)塊開(kāi)始執(zhí)行讀操作,若讀取到塊的第一頁(yè)全為0Χ0Α,則判斷當(dāng)前塊為地址映射表存儲(chǔ)塊。從下一塊開(kāi)始執(zhí)行擦除操作,直至執(zhí)行至塊地址addrjnax; (3)動(dòng)態(tài)更新:擦除后再次執(zhí)行寫入操作時(shí),首先從Flash的第一個(gè)塊開(kāi)始執(zhí)行讀操作,若讀取到塊的第一頁(yè)全為OXOA,則判斷當(dāng)前塊為地址映射表存儲(chǔ)塊。讀取第二頁(yè)的地址映射表,并存儲(chǔ)至RAM,同時(shí),塊地址后移至下一塊。逐位判斷地址映射表,若為O,跳過(guò)當(dāng)前塊,若為I,在當(dāng)前塊寫入數(shù)據(jù),同時(shí)執(zhí)行檢測(cè)操作,若當(dāng)前塊檢測(cè)為壞塊,則更新地址映射表,將當(dāng)前記錄位更新為O,并跳過(guò)當(dāng)前塊。每次位判斷和塊操作結(jié)束后,地址均后移一個(gè)單位,直至執(zhí)行至塊地址addr_max。
【文檔編號(hào)】G06F12/02GK105843749SQ201610173425
【公開(kāi)日】2016年8月10日
【申請(qǐng)日】2016年3月24日
【發(fā)明人】張曉峰, 史治國(guó), 陳積明
【申請(qǐng)人】浙江大學(xué)