controller_4G08的方案設計 實(shí)現了FPGA對Flash的控制
1 controller_4G08的設計方案
理論上講FPGA可以直接對Flash操作,但這樣會(huì )使主狀態(tài)機狀態(tài)很多,程序繁瑣,當需要大批量數據反復讀寫(xiě)時(shí)很不方便。本文設計了一個(gè)控制器controller_4G08,用這個(gè)控制器完成數據指令讀寫(xiě)的時(shí)序操作。
用controller_4G08管理Flash的系統框圖如圖1所示。FPGA部分有2個(gè)模塊:主狀態(tài)機和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、寫(xiě)使能re等端口。FPGA主狀態(tài)機若想對Flash進(jìn)行操作,只需要通過(guò)cmd_code_4G08向controller_4G08發(fā)指令,按照系統時(shí)鐘通過(guò)data_in_4G08與 data_out_4G08收發(fā)數據,然后controller_4G08會(huì )對K9F4G08執行相應的操作,指令執行完之后會(huì )通過(guò)int_ctl_4G08給主狀態(tài)機一個(gè)中斷信號,告訴主狀態(tài)機執行完畢。FPGA主狀態(tài)機不必關(guān)注Flash指令操作的時(shí)序問(wèn)題,從而使設計簡(jiǎn)化。
2 controller_4G08的指令集
K9F4G08具有自己的指令集,以讀操作為例,其操作過(guò)程是:首先發(fā)送命令00h,再發(fā)5個(gè)周期地址,最后發(fā)送命令30h。Flash開(kāi)始讀相應的頁(yè),此時(shí)rb信號為低(表示Flash處于busy狀態(tài)),等到rb信號為高,再按照時(shí)序改變讀使能信號,便可將1個(gè)頁(yè)的數據依次讀出[1]。
controller_4G08根據K9F4G08的指令集建立了自己的指令集,新增了全擦、部分擦指令,并且在讀寫(xiě)指令前加入了壞塊匹配功能,如表1所示。
2.1 匹配表
Flash出廠(chǎng)后可能存在壞塊,使用中也有可能會(huì )再出現新的壞塊。制造商保證每個(gè)芯片中的壞塊不多于80個(gè),同時(shí)保證第0個(gè)塊肯定是好的,且保證擦寫(xiě)1 000次不壞[1]。當進(jìn)行連續地址的數據讀寫(xiě)時(shí)有可能遇到壞塊,壞塊無(wú)法進(jìn)行操作,會(huì )導致數據的丟失。因此必須建立一個(gè)匹配表,當遇到壞塊時(shí),將其匹配到好塊的地址上。
實(shí)際的數據讀寫(xiě)中只使用4 000個(gè)塊,根據這些要求設計了這樣的匹配表:長(cháng)度512 B,存放在第0個(gè)塊的第0個(gè)頁(yè)(B0P0)。具體內容見(jiàn)表2。
一個(gè)塊的地址用2 B的16進(jìn)制數表示。256 B可以存儲128個(gè)塊地址。0~255與256~512中存儲的塊地址是一一對應的,當使用到0~255中的塊地址時(shí),需要從256~511中尋找對應的塊地址進(jìn)行替換。
在FPGA中生成一個(gè)512 B的ram:ram_512,專(zhuān)門(mén)用于存放匹配表,當系統上電復位后,狀態(tài)機會(huì )自動(dòng)將B0P0的數據讀出,并將前512 B的數據存入該ram_512中,以便后面匹配時(shí)使用[4]。
2.2 全擦與部分擦指令
該指令用于擦除所有的塊,建立新的匹配表。由于壞塊會(huì )導致擦除不成功,狀態(tài)機在擦除過(guò)程中會(huì )記錄下1~4 000個(gè)塊中擦除失敗的壞塊的地址、4 000~4 095個(gè)塊中好塊的地址,先按照匹配表規定的順序寫(xiě)入ram_512,全部擦除完成后將ram_512中的數據寫(xiě)入B0P0。由于數據量不足2 KB,因此后面補零。其流程圖如圖2所示。
部分擦除與全擦類(lèi)似,執行這條指令需要給定起始與結尾的塊地址,controller_4G08可以完成對2個(gè)塊地址之間所有塊的擦除。當擦除過(guò)程中擦到壞塊時(shí),狀態(tài)機會(huì )從匹配表中尋找該壞塊對應的好塊,并擦除。若沒(méi)有尋找到該壞塊的匹配塊,則出現了新的壞塊,會(huì )產(chǎn)生一個(gè)報錯的標志位,提示主狀態(tài)機需要進(jìn)行全擦,以便建立新的匹配表。
2.3 讀寫(xiě)匹配
如果遇到壞塊,會(huì )造成讀寫(xiě)失敗,為了滿(mǎn)足大批量數據讀寫(xiě)的連續性,在讀寫(xiě)數據之前必須對當前塊地址進(jìn)行匹配,這些工作由controller_4G08完成,當主狀態(tài)機給controller_4G08發(fā)送塊地址后就會(huì )執行。
Flash讀寫(xiě)是對頁(yè)操作的,一次2 KB。FPGA中有一個(gè)4 KB的ram:ram_4096,用來(lái)作為緩沖區存放數據。當需要向Flash中寫(xiě)入數據時(shí),主狀態(tài)機向controller_4G08發(fā)Page_program指令,發(fā)送5 B地址,controller_4G08會(huì )自動(dòng)進(jìn)行塊地址匹配,匹配完之后會(huì )給主狀態(tài)機一個(gè)中斷信號,主狀態(tài)機收到這個(gè)信號便開(kāi)始將ram_4096中的數據發(fā)給controller_4G08,之后等待中斷,收到中斷說(shuō)明寫(xiě)指令執行成功。
當需要讀取數據時(shí),主狀態(tài)機向controller_4G08發(fā)Page_read指令,發(fā)送5字節地址,controller_4G08會(huì )自動(dòng)進(jìn)行塊地址匹配及Flash的頁(yè)讀操作,等中斷一到便開(kāi)始接收來(lái)自controller_4G08的數據并存至ram_4096中。
controller_4G08中有一個(gè)存放上次塊地址的寄存器,每次進(jìn)行讀寫(xiě)操作時(shí),會(huì )將當前塊地址與上次的塊地址進(jìn)行比較,若相同則說(shuō)明是好塊,可以讀寫(xiě);若不同則需要進(jìn)行匹配。狀態(tài)機會(huì )從ram_512中尋找該塊是否為壞塊,進(jìn)行一系列處理。與擦除指令一樣,當讀寫(xiě)操作遇到新的壞塊時(shí),也會(huì )向系統報錯。匹配流程圖如圖3所示。
3 controller_4G08主狀態(tài)機
圖4是主狀態(tài)機的狀態(tài)轉換圖,系統上電復位后,主狀態(tài)機將進(jìn)入等待使能信號狀態(tài)。收到使能信號后,主狀態(tài)機會(huì )從cmd_code_4G08中讀取操作碼,然后啟動(dòng)對應的子狀態(tài)機,執行對應的操作。子狀態(tài)機執行完畢以后就會(huì )通過(guò)int_ctl_4G08發(fā)送給主狀態(tài)機一個(gè)中斷信號,同時(shí)將執行結果返回。主狀態(tài)機收到中斷信號后,又進(jìn)入空閑狀態(tài)等待下一個(gè)使能信號。這樣設計的主狀態(tài)機隨時(shí)都可以添加新的指令,可擴展性強[4-5]。
4 FPGA下裝驗證結果
采用FPGA開(kāi)發(fā)板進(jìn)行驗證。此開(kāi)發(fā)板的硬件資源包括Cyclone的FPGA:EP1C12Q240C、3片Flash:K9F4G08、1片USB總線(xiàn)控制芯片:CH372。利用FPGA控制CH372,可以完成FPGA與PC通過(guò)USB進(jìn)行數據收發(fā)[6]。
在PC上用VB軟件編寫(xiě)了調試軟件[7],利用該軟件可以通過(guò)USB口向FPGA發(fā)送指令,從而完成對任意Flash頁(yè)的讀、寫(xiě)及全擦。
首先進(jìn)行Flash全擦,讀取B0P0即可看到匹配表。從匹配表中找到一個(gè)壞塊的地址對其寫(xiě)入2 KB的數據,然后斷電再上電,讀取該壞塊地址,比較寫(xiě)入與讀出的數據發(fā)現完全一致,從而驗證了本設計的壞塊管理和壞塊匹配方法的正確性。通過(guò)軟件操作,對普通好塊的讀寫(xiě)也是正確的,這里就不再說(shuō)明了。
本文用FPGA主狀態(tài)機直接管理controller_4G08、controller_4G08控制芯片的設計方案可以減少主狀態(tài)機的狀態(tài)數量,使FPGA很方便地實(shí)現Flash控制功能,設計更加容易實(shí)現,具有較強的可復用性與移植性。同時(shí)建立了一套完善的Flash文件管理機制。
評論