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