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