《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 設計應用 > 基于FPGA的K9F4G08 Flash控制器設計
基于FPGA的K9F4G08 Flash控制器設計
來源:電子技術應用2010年第5期
唐 磊,周 旋,吳 瑤,李金城
北京交通大學 電子信息工程學院,北京100044
摘要: 設計了一種能使FPGA的主狀態(tài)機直接管理Flash的控制器,該控制器具有自己的指令集和中斷管理方式。用戶可以根據(jù)FPGA的系統(tǒng)時鐘對控制器進行操作,無需關心Flash對指令和數(shù)據(jù)的時序要求??刂破鹘⒘俗约旱膲膲K管理機制,合并了一些Flash的常用關聯(lián)指令,方便了用戶對FPGA主狀態(tài)機的設計。
中圖分類號: TN431.2
文獻標識碼: A
Design of K9F4G08 Flash controller based on FPGA
TANG Lei,ZHOU Xuan,WU Yao,LI Jin Cheng
School of Electronic and Information Engineering, Beijing Jiaotong University, Beijing 100044,China
Abstract: This paper designs a Flash controller, which enables the FPGA main state-machine to manage a Flash memory chip efficiently. The controller builds its own instruction set derived from the construction set of Flash, as well as a simple interrupt mechanism. User operates the controller with the system clock of FPGA without caring about the timing sequences required by the Flash. The proposed Flash controller develops its own method for the reorganization and mapping of invalid blocks in a Flash chip. Some of the constructions in the original construction set of the Flash are combined and enhanced to help the users coding their HDL with a more compact style.
Key words : FPGA;Flash;state-machine;mapping;instruction set

    K9F4G08是三星公司的512 MB NAND Flash,具有8 bit輸入輸出總線。存儲空間共分成4 096個塊,每個塊有64個頁,每個頁容量為2 KB,外加64 B的備用空間,組成256 K行×(2 K+64)列的存儲陣列,其地址用5個字節(jié)表示[1]。
    K9F4G08具有自己的指令集,可以完成對Flash一個頁的讀、寫以及對一個塊的擦除等操作。有嚴格的時序要求以保證芯片正確地執(zhí)行相應的指令。Flash在出廠時會有壞塊[1],壞塊是無法操作的,這對于連續(xù)大批量的數(shù)據(jù)存儲來說有一定的難度,需要建立一套Flash空間管理方案以保證壞塊不被讀寫,提高數(shù)據(jù)讀寫的可靠性。
    用FPGA直接管理Flash不僅是一種可行的方案,而且還能精簡硬件結(jié)構(gòu)。但與具有專用Flash接口的MCU或ARM等高檔嵌入式微處理器不同,F(xiàn)PGA不能通過簡單的讀寫指令編程管理Flash,而必須按照時序要求對Flash的端口進行指令和參數(shù)的具體操作。若FPGA的主狀態(tài)機直接管理Flash,將會使狀態(tài)機的狀態(tài)數(shù)量大量增加,代碼將異常復雜,甚至無法完成設計[2][3]。
    為解決上述問題,本文設計了一個Flash控制器controller_4G08,它建立了自己的指令集,可以方便地實現(xiàn)FPGA對Flash的控制和讀寫操作。FPGA主狀態(tài)機可以在系統(tǒng)時鐘頻率下對controller_4G08發(fā)送指令,然后等待controller_4G08返回的中斷,中斷返回即表示操作完成,無需關心Flash要求的操作時序。采用這個控制器將大大簡化FPGA主狀態(tài)機的狀態(tài)數(shù)量,方便設計和調(diào)試,同時代碼具有很強的可移植性。
1 controller_4G08的設計方案
    理論上講FPGA可以直接對Flash操作,但這樣會使主狀態(tài)機狀態(tài)很多,程序繁瑣,當需要大批量數(shù)據(jù)反復讀寫時很不方便。本文設計了一個控制器controller_4G08,用這個控制器完成數(shù)據(jù)指令讀寫的時序操作。
    用controller_4G08管理Flash的系統(tǒng)框圖如圖1所示。FPGA部分有2個模塊:主狀態(tài)機和controller_4G08,它們之間的端口連接包括4 bit指令端口cmd_code_4G08、8 bit數(shù)據(jù)輸入輸出端口data_in_4G08與 data_out_4G08、中斷信號int_ctl_4G08;FPGA對K9F4G08芯片接口包括8 bit雙向數(shù)據(jù)端口data_4G08、忙標志rb、讀使能we、寫使能re等端口。FPGA主狀態(tài)機若想對Flash進行操作,只需要通過cmd_code_4G08向controller_4G08發(fā)指令,按照系統(tǒng)時鐘通過data_in_4G08與 data_out_4G08收發(fā)數(shù)據(jù),然后controller_4G08會對K9F4G08執(zhí)行相應的操作,指令執(zhí)行完之后會通過int_ctl_4G08給主狀態(tài)機一個中斷信號,告訴主狀態(tài)機執(zhí)行完畢。FPGA主狀態(tài)機不必關注Flash指令操作的時序問題,從而使設計簡化。

2 controller_4G08的指令集
    K9F4G08具有自己的指令集,以讀操作為例,其操作過程是:首先發(fā)送命令00h,再發(fā)5個周期地址,最后發(fā)送命令30h。Flash開始讀相應的頁,此時rb信號為低(表示Flash處于busy狀態(tài)),等到rb信號為高,再按照時序改變讀使能信號,便可將1個頁的數(shù)據(jù)依次讀出[1]。
    controller_4G08根據(jù)K9F4G08的指令集建立了自己的指令集,新增了全擦、部分擦指令,并且在讀寫指令前加入了壞塊匹配功能,如表1所示。

2.1 匹配表
    Flash出廠后可能存在壞塊,使用中也有可能會再出現(xiàn)新的壞塊。制造商保證每個芯片中的壞塊不多于80個,同時保證第0個塊肯定是好的,且保證擦寫1 000次不壞[1]。當進行連續(xù)地址的數(shù)據(jù)讀寫時有可能遇到壞塊,壞塊無法進行操作,會導致數(shù)據(jù)的丟失。因此必須建立一個匹配表,當遇到壞塊時,將其匹配到好塊的地址上。
    實際的數(shù)據(jù)讀寫中只使用4 000個塊,根據(jù)這些要求設計了這樣的匹配表:長度512 B,存放在第0個塊的第0個頁(B0P0)。具體內(nèi)容見表2。

    一個塊的地址用2 B的16進制數(shù)表示。256 B可以存儲128個塊地址。0~255與256~512中存儲的塊地址是一一對應的,當使用到0~255中的塊地址時,需要從256~511中尋找對應的塊地址進行替換。
    在FPGA中生成一個512 B的ram:ram_512,專門用于存放匹配表,當系統(tǒng)上電復位后,狀態(tài)機會自動將B0P0的數(shù)據(jù)讀出,并將前512 B的數(shù)據(jù)存入該ram_512中,以便后面匹配時使用[4]。
2.2 全擦與部分擦指令
    該指令用于擦除所有的塊,建立新的匹配表。由于壞塊會導致擦除不成功,狀態(tài)機在擦除過程中會記錄下1~4 000個塊中擦除失敗的壞塊的地址、4 000~4 095個塊中好塊的地址,先按照匹配表規(guī)定的順序?qū)懭雛am_512,全部擦除完成后將ram_512中的數(shù)據(jù)寫入B0P0。由于數(shù)據(jù)量不足2 KB,因此后面補零。其流程圖如圖2所示。

    部分擦除與全擦類似,執(zhí)行這條指令需要給定起始與結(jié)尾的塊地址,controller_4G08可以完成對2個塊地址之間所有塊的擦除。當擦除過程中擦到壞塊時,狀態(tài)機會從匹配表中尋找該壞塊對應的好塊,并擦除。若沒有尋找到該壞塊的匹配塊,則出現(xiàn)了新的壞塊,會產(chǎn)生一個報錯的標志位,提示主狀態(tài)機需要進行全擦,以便建立新的匹配表。
2.3 讀寫匹配
    如果遇到壞塊,會造成讀寫失敗,為了滿足大批量數(shù)據(jù)讀寫的連續(xù)性,在讀寫數(shù)據(jù)之前必須對當前塊地址進行匹配,這些工作由controller_4G08完成,當主狀態(tài)機給controller_4G08發(fā)送塊地址后就會執(zhí)行。
    Flash讀寫是對頁操作的,一次2 KB。FPGA中有一個4 KB的ram:ram_4096,用來作為緩沖區(qū)存放數(shù)據(jù)。當需要向Flash中寫入數(shù)據(jù)時,主狀態(tài)機向controller_4G08發(fā)Page_program指令,發(fā)送5 B地址,controller_4G08會自動進行塊地址匹配,匹配完之后會給主狀態(tài)機一個中斷信號,主狀態(tài)機收到這個信號便開始將ram_4096中的數(shù)據(jù)發(fā)給controller_4G08,之后等待中斷,收到中斷說明寫指令執(zhí)行成功。
    當需要讀取數(shù)據(jù)時,主狀態(tài)機向controller_4G08發(fā)Page_read指令,發(fā)送5字節(jié)地址,controller_4G08會自動進行塊地址匹配及Flash的頁讀操作,等中斷一到便開始接收來自controller_4G08的數(shù)據(jù)并存至ram_4096中。
    controller_4G08中有一個存放上次塊地址的寄存器,每次進行讀寫操作時,會將當前塊地址與上次的塊地址進行比較,若相同則說明是好塊,可以讀寫;若不同則需要進行匹配。狀態(tài)機會從ram_512中尋找該塊是否為壞塊,進行一系列處理。與擦除指令一樣,當讀寫操作遇到新的壞塊時,也會向系統(tǒng)報錯。匹配流程圖如圖3所示。

3 controller_4G08主狀態(tài)機
    圖4是主狀態(tài)機的狀態(tài)轉(zhuǎn)換圖,系統(tǒng)上電復位后,主狀態(tài)機將進入等待使能信號狀態(tài)。收到使能信號后,主狀態(tài)機會從cmd_code_4G08中讀取操作碼,然后啟動對應的子狀態(tài)機,執(zhí)行對應的操作。子狀態(tài)機執(zhí)行完畢以后就會通過int_ctl_4G08發(fā)送給主狀態(tài)機一個中斷信號,同時將執(zhí)行結(jié)果返回。主狀態(tài)機收到中斷信號后,又進入空閑狀態(tài)等待下一個使能信號。這樣設計的主狀態(tài)機隨時都可以添加新的指令,可擴展性強[4-5]。

4 FPGA下裝驗證結(jié)果
    采用FPGA開發(fā)板進行驗證。此開發(fā)板的硬件資源包括Cyclone的FPGA:EP1C12Q240C、3片F(xiàn)lash:K9F4G08、1片USB總線控制芯片:CH372。利用FPGA控制CH372,可以完成FPGA與PC通過USB進行數(shù)據(jù)收發(fā)[6]。
    在PC上用VB軟件編寫了調(diào)試軟件[7],利用該軟件可以通過USB口向FPGA發(fā)送指令,從而完成對任意Flash頁的讀、寫及全擦。
    首先進行Flash全擦,讀取B0P0即可看到匹配表。從匹配表中找到一個壞塊的地址對其寫入2 KB的數(shù)據(jù),然后斷電再上電,讀取該壞塊地址,比較寫入與讀出的數(shù)據(jù)發(fā)現(xiàn)完全一致,從而驗證了本設計的壞塊管理和壞塊匹配方法的正確性。通過軟件操作,對普通好塊的讀寫也是正確的,這里就不再說明了。
    本文用FPGA主狀態(tài)機直接管理controller_4G08、controller_4G08控制芯片的設計方案可以減少主狀態(tài)機的狀態(tài)數(shù)量,使FPGA很方便地實現(xiàn)Flash控制功能,設計更加容易實現(xiàn),具有較強的可復用性與移植性。同時建立了一套完善的Flash文件管理機制。目前該控制器模塊已經(jīng)應用于數(shù)據(jù)采集回放系統(tǒng)中[8-9]。
參考文獻
[1] Samsung.K9F4G08手冊.2006.
[2] 王崇劍,李玉山.基于FPGA的K9F2G08U0M Nand FLASH控制器設計[J].電子元器件應用,2008,10(3):4-7.
[3] 陳明義,連帥軍,周建國.基于FPGA的FLASH控制器系統(tǒng)設計及實現(xiàn)[J].電子科技,2008,21(7):11-13.
[4] 王誠,吳繼華.Altera FPGA/CPLD設計[M].北京:人民郵電出版社,2005.
[5] 夏雨聞.Verilog數(shù)字系統(tǒng)設計教程[M].北京:北京航天航空大學出版社,2003.
[6] 南京沁恒電子有限公司.CH372中文手冊(一).2007.
[7] 劉彬彬,高春艷,孫秀梅.VB從入門到精通[M].北京:清華大學出版社,2008.
[8] 李蘭,寧永海,基于CH372的USB數(shù)據(jù)采集系統(tǒng)的設計與實現(xiàn)[J].微計算機信息,2007,23(12):76-77.
[9] 周治良,劉俊,張斌珍.基于FPGA及FLASH的數(shù)據(jù)采集存儲系統(tǒng)設計[J].微計算機信息,2007,23(31):91-92.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權禁止轉(zhuǎn)載。