文獻標識碼: A
K9F4G08是三星公司的512 MB NAND Flash,具有8 bit輸入輸出總線。存儲空間共分成4 096個塊,每個塊有64個頁,每個頁容量為2 KB,外加64 B的備用空間,組成256 K行×(2 K+64)列的存儲陣列,其地址用5個字節表示[1]。
K9F4G08具有自己的指令集,可以完成對Flash一個頁的讀、寫以及對一個塊的擦除等操作。有嚴格的時序要求以保證芯片正確地執行相應的指令。Flash在出廠時會有壞塊[1],壞塊是無法操作的,這對于連續大批量的數據存儲來說有一定的難度,需要建立一套Flash空間管理方案以保證壞塊不被讀寫,提高數據讀寫的可靠性。
用FPGA直接管理Flash不僅是一種可行的方案,而且還能精簡硬件結構。但與具有專用Flash接口的MCU或ARM等高檔嵌入式微處理器不同,FPGA不能通過簡單的讀寫指令編程管理Flash,而必須按照時序要求對Flash的端口進行指令和參數的具體操作。若FPGA的主狀態機直接管理Flash,將會使狀態機的狀態數量大量增加,代碼將異常復雜,甚至無法完成設計[2][3]。
為解決上述問題,本文設計了一個Flash控制器controller_4G08,它建立了自己的指令集,可以方便地實現FPGA對Flash的控制和讀寫操作。FPGA主狀態機可以在系統時鐘頻率下對controller_4G08發送指令,然后等待controller_4G08返回的中斷,中斷返回即表示操作完成,無需關心Flash要求的操作時序。采用這個控制器將大大簡化FPGA主狀態機的狀態數量,方便設計和調試,同時代碼具有很強的可移植性。
1 controller_4G08的設計方案
理論上講FPGA可以直接對Flash操作,但這樣會使主狀態機狀態很多,程序繁瑣,當需要大批量數據反復讀寫時很不方便。本文設計了一個控制器controller_4G08,用這個控制器完成數據指令讀寫的時序操作。
用controller_4G08管理Flash的系統框圖如圖1所示。FPGA部分有2個模塊:主狀態機和controller_4G08,它們之間的端口連接包括4 bit指令端口cmd_code_4G08、8 bit數據輸入輸出端口data_in_4G08與 data_out_4G08、中斷信號int_ctl_4G08;FPGA對K9F4G08芯片接口包括8 bit雙向數據端口data_4G08、忙標志rb、讀使能we、寫使能re等端口。FPGA主狀態機若想對Flash進行操作,只需要通過cmd_code_4G08向controller_4G08發指令,按照系統時鐘通過data_in_4G08與 data_out_4G08收發數據,然后controller_4G08會對K9F4G08執行相應的操作,指令執行完之后會通過int_ctl_4G08給主狀態機一個中斷信號,告訴主狀態機執行完畢。FPGA主狀態機不必關注Flash指令操作的時序問題,從而使設計簡化。
2 controller_4G08的指令集
K9F4G08具有自己的指令集,以讀操作為例,其操作過程是:首先發送命令00h,再發5個周期地址,最后發送命令30h。Flash開始讀相應的頁,此時rb信號為低(表示Flash處于busy狀態),等到rb信號為高,再按照時序改變讀使能信號,便可將1個頁的數據依次讀出[1]。
controller_4G08根據K9F4G08的指令集建立了自己的指令集,新增了全擦、部分擦指令,并且在讀寫指令前加入了壞塊匹配功能,如表1所示。
2.1 匹配表
Flash出廠后可能存在壞塊,使用中也有可能會再出現新的壞塊。制造商保證每個芯片中的壞塊不多于80個,同時保證第0個塊肯定是好的,且保證擦寫1 000次不壞[1]。當進行連續地址的數據讀寫時有可能遇到壞塊,壞塊無法進行操作,會導致數據的丟失。因此必須建立一個匹配表,當遇到壞塊時,將其匹配到好塊的地址上。
實際的數據讀寫中只使用4 000個塊,根據這些要求設計了這樣的匹配表:長度512 B,存放在第0個塊的第0個頁(B0P0)。具體內容見表2。
一個塊的地址用2 B的16進制數表示。256 B可以存儲128個塊地址。0~255與256~512中存儲的塊地址是一一對應的,當使用到0~255中的塊地址時,需要從256~511中尋找對應的塊地址進行替換。
在FPGA中生成一個512 B的ram:ram_512,專門用于存放匹配表,當系統上電復位后,狀態機會自動將B0P0的數據讀出,并將前512 B的數據存入該ram_512中,以便后面匹配時使用[4]。
2.2 全擦與部分擦指令
該指令用于擦除所有的塊,建立新的匹配表。由于壞塊會導致擦除不成功,狀態機在擦除過程中會記錄下1~4 000個塊中擦除失敗的壞塊的地址、4 000~4 095個塊中好塊的地址,先按照匹配表規定的順序寫入ram_512,全部擦除完成后將ram_512中的數據寫入B0P0。由于數據量不足2 KB,因此后面補零。其流程圖如圖2所示。
部分擦除與全擦類似,執行這條指令需要給定起始與結尾的塊地址,controller_4G08可以完成對2個塊地址之間所有塊的擦除。當擦除過程中擦到壞塊時,狀態機會從匹配表中尋找該壞塊對應的好塊,并擦除。若沒有尋找到該壞塊的匹配塊,則出現了新的壞塊,會產生一個報錯的標志位,提示主狀態機需要進行全擦,以便建立新的匹配表。
2.3 讀寫匹配
如果遇到壞塊,會造成讀寫失敗,為了滿足大批量數據讀寫的連續性,在讀寫數據之前必須對當前塊地址進行匹配,這些工作由controller_4G08完成,當主狀態機給controller_4G08發送塊地址后就會執行。
Flash讀寫是對頁操作的,一次2 KB。FPGA中有一個4 KB的ram:ram_4096,用來作為緩沖區存放數據。當需要向Flash中寫入數據時,主狀態機向controller_4G08發Page_program指令,發送5 B地址,controller_4G08會自動進行塊地址匹配,匹配完之后會給主狀態機一個中斷信號,主狀態機收到這個信號便開始將ram_4096中的數據發給controller_4G08,之后等待中斷,收到中斷說明寫指令執行成功。
當需要讀取數據時,主狀態機向controller_4G08發Page_read指令,發送5字節地址,controller_4G08會自動進行塊地址匹配及Flash的頁讀操作,等中斷一到便開始接收來自controller_4G08的數據并存至ram_4096中。
controller_4G08中有一個存放上次塊地址的寄存器,每次進行讀寫操作時,會將當前塊地址與上次的塊地址進行比較,若相同則說明是好塊,可以讀寫;若不同則需要進行匹配。狀態機會從ram_512中尋找該塊是否為壞塊,進行一系列處理。與擦除指令一樣,當讀寫操作遇到新的壞塊時,也會向系統報錯。匹配流程圖如圖3所示。
3 controller_4G08主狀態機
圖4是主狀態機的狀態轉換圖,系統上電復位后,主狀態機將進入等待使能信號狀態。收到使能信號后,主狀態機會從cmd_code_4G08中讀取操作碼,然后啟動對應的子狀態機,執行對應的操作。子狀態機執行完畢以后就會通過int_ctl_4G08發送給主狀態機一個中斷信號,同時將執行結果返回。主狀態機收到中斷信號后,又進入空閑狀態等待下一個使能信號。這樣設計的主狀態機隨時都可以添加新的指令,可擴展性強[4-5]。
4 FPGA下裝驗證結果
采用FPGA開發板進行驗證。此開發板的硬件資源包括Cyclone的FPGA:EP1C12Q240C、3片Flash:K9F4G08、1片USB總線控制芯片:CH372。利用FPGA控制CH372,可以完成FPGA與PC通過USB進行數據收發[6]。
在PC上用VB軟件編寫了調試軟件[7],利用該軟件可以通過USB口向FPGA發送指令,從而完成對任意Flash頁的讀、寫及全擦。
首先進行Flash全擦,讀取B0P0即可看到匹配表。從匹配表中找到一個壞塊的地址對其寫入2 KB的數據,然后斷電再上電,讀取該壞塊地址,比較寫入與讀出的數據發現完全一致,從而驗證了本設計的壞塊管理和壞塊匹配方法的正確性。通過軟件操作,對普通好塊的讀寫也是正確的,這里就不再說明了。
本文用FPGA主狀態機直接管理controller_4G08、controller_4G08控制芯片的設計方案可以減少主狀態機的狀態數量,使FPGA很方便地實現Flash控制功能,設計更加容易實現,具有較強的可復用性與移植性。同時建立了一套完善的Flash文件管理機制。目前該控制器模塊已經應用于數據采集回放系統中[8-9]。
參考文獻
[1] Samsung.K9F4G08手冊.2006.
[2] 王崇劍,李玉山.基于FPGA的K9F2G08U0M Nand FLASH控制器設計[J].電子元器件應用,2008,10(3):4-7.
[3] 陳明義,連帥軍,周建國.基于FPGA的FLASH控制器系統設計及實現[J].電子科技,2008,21(7):11-13.
[4] 王誠,吳繼華.Altera FPGA/CPLD設計[M].北京:人民郵電出版社,2005.
[5] 夏雨聞.Verilog數字系統設計教程[M].北京:北京航天航空大學出版社,2003.
[6] 南京沁恒電子有限公司.CH372中文手冊(一).2007.
[7] 劉彬彬,高春艷,孫秀梅.VB從入門到精通[M].北京:清華大學出版社,2008.
[8] 李蘭,寧永海,基于CH372的USB數據采集系統的設計與實現[J].微計算機信息,2007,23(12):76-77.
[9] 周治良,劉俊,張斌珍.基于FPGA及FLASH的數據采集存儲系統設計[J].微計算機信息,2007,23(31):91-92.