基于FPGA的K9F4G08 Flash控制器設(shè)計
摘 要: 設(shè)計了一種能使FPGA的主狀態(tài)機直接管理Flash的控制器,該控制器具有自己的指令集和中斷管理方式。用戶可以根據(jù)FPGA的系統(tǒng)時鐘對控制器進行操作,無需關(guān)心Flash對指令和數(shù)據(jù)的時序要求??刂破鹘⒘俗约旱膲膲K管理機制,合并了一些Flash的常用關(guān)聯(lián)指令,方便了用戶對FPGA主狀態(tài)機的設(shè)計。
K9F4G08是三星公司的512 MB NAND Flash,具有8 bit輸入輸出總線。存儲空間共分成4 096個塊,每個塊有64個頁,每個頁容量為2 KB,外加64 B的備用空間,組成256 K行×(2 K+64)列的存儲陣列,其地址用5個字節(jié)表示[1]。
K9F4G08具有自己的指令集,可以完成對Flash一個頁的讀、寫以及對一個塊的擦除等操作。有嚴(yán)格的時序要求以保證芯片正確地執(zhí)行相應(yīng)的指令。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,將會使?fàn)顟B(tài)機的狀態(tài)數(shù)量大量增加,代碼將異常復(fù)雜,甚至無法完成設(shè)計[2][3]。
為解決上述問題,本文設(shè)計了一個Flash控制器controller_4G08,它建立了自己的指令集,可以方便地實現(xiàn)FPGA對Flash的控制和讀寫操作。FPGA主狀態(tài)機可以在系統(tǒng)時鐘頻率下對controller_4G08發(fā)送指令,然后等待controller_4G08返回的中斷,中斷返回即表示操作完成,無需關(guān)心Flash要求的操作時序。采用這個控制器將大大簡化FPGA主狀態(tài)機的狀態(tài)數(shù)量,方便設(shè)計和調(diào)試,同時代碼具有很強的可移植性。
1 controller_4G08的設(shè)計方案
理論上講FPGA可以直接對Flash操作,但這樣會使主狀態(tài)機狀態(tài)很多,程序繁瑣,當(dāng)需要大批量數(shù)據(jù)反復(fù)讀寫時很不方便。本文設(shè)計了一個控制器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、忙標(biāo)志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í)行相應(yīng)的操作,指令執(zhí)行完之后會通過int_ctl_4G08給主狀態(tài)機一個中斷信號,告訴主狀態(tài)機執(zhí)行完畢。FPGA主狀態(tài)機不必關(guān)注Flash指令操作的時序問題,從而使設(shè)計簡化。
2 controller_4G08的指令集
K9F4G08具有自己的指令集,以讀操作為例,其操作過程是:首先發(fā)送命令00h,再發(fā)5個周期地址,最后發(fā)送命令30h。Flash開始讀相應(yīng)的頁,此時rb信號為低(表示Flash處于busy狀態(tài)),等到rb信號為高,再按照時序改變讀使能信號,便可將1個頁的數(shù)據(jù)依次讀出[1]。
controller_4G08根據(jù)K9F4G08的指令集建立了自己的指令集,新增了全擦、部分擦指令,并且在讀寫指令前加入了壞塊匹配功能,如表1所示。
評論