基于FPGA的K9F4G08 Flash控制器設(shè)計(jì)
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]。
評(píng)論