基于FPGA的K9F4G08 Flash控制器設計
2.1 匹配表
Flash出廠(chǎng)后可能存在壞塊,使用中也有可能會(huì )再出現新的壞塊。制造商保證每個(gè)芯片中的壞塊不多于80個(gè),同時(shí)保證第0個(gè)塊肯定是好的,且保證擦寫(xiě)1 000次不壞[1]。當進(jìn)行連續地址的數據讀寫(xiě)時(shí)有可能遇到壞塊,壞塊無(wú)法進(jìn)行操作,會(huì )導致數據的丟失。因此必須建立一個(gè)匹配表,當遇到壞塊時(shí),將其匹配到好塊的地址上。
實(shí)際的數據讀寫(xiě)中只使用4 000個(gè)塊,根據這些要求設計了這樣的匹配表:長(cháng)度512 B,存放在第0個(gè)塊的第0個(gè)頁(yè)(B0P0)。具體內容見(jiàn)表2。
一個(gè)塊的地址用2 B的16進(jìn)制數表示。256 B可以存儲128個(gè)塊地址。0~255與256~512中存儲的塊地址是一一對應的,當使用到0~255中的塊地址時(shí),需要從256~511中尋找對應的塊地址進(jìn)行替換。
在FPGA中生成一個(gè)512 B的ram:ram_512,專(zhuān)門(mén)用于存放匹配表,當系統上電復位后,狀態(tài)機會(huì )自動(dòng)將B0P0的數據讀出,并將前512 B的數據存入該ram_512中,以便后面匹配時(shí)使用[4]。
2.2 全擦與部分擦指令
該指令用于擦除所有的塊,建立新的匹配表。由于壞塊會(huì )導致擦除不成功,狀態(tài)機在擦除過(guò)程中會(huì )記錄下1~4 000個(gè)塊中擦除失敗的壞塊的地址、4 000~4 095個(gè)塊中好塊的地址,先按照匹配表規定的順序寫(xiě)入ram_512,全部擦除完成后將ram_512中的數據寫(xiě)入B0P0。由于數據量不足2 KB,因此后面補零。其流程圖如圖2所示。
部分擦除與全擦類(lèi)似,執行這條指令需要給定起始與結尾的塊地址,controller_4G08可以完成對2個(gè)塊地址之間所有塊的擦除。當擦除過(guò)程中擦到壞塊時(shí),狀態(tài)機會(huì )從匹配表中尋找該壞塊對應的好塊,并擦除。若沒(méi)有尋找到該壞塊的匹配塊,則出現了新的壞塊,會(huì )產(chǎn)生一個(gè)報錯的標志位,提示主狀態(tài)機需要進(jìn)行全擦,以便建立新的匹配表。
評論