李槐生
(太原理工大學(xué)信息學(xué)院,山西 太原 030024)
隨著科技的進(jìn)步,電子產(chǎn)品已經(jīng)以各種各樣的形式進(jìn)入到了千家萬(wàn)戶。如人們每天接觸的MP3、手機(jī)、數(shù)碼相機(jī)、移動(dòng)存儲(chǔ)設(shè)備等電子產(chǎn)品。數(shù)據(jù)的存儲(chǔ)是電子設(shè)備的關(guān)鍵技術(shù)之一。而目前應(yīng)用最為廣泛的存儲(chǔ)介質(zhì)就是NAND FLASH,它具有存儲(chǔ)容量大、價(jià)格低廉、速度快等優(yōu)點(diǎn)。對(duì)NAND FLASH的控制可以直接使用專用的控制芯片,這種方法比較簡(jiǎn)單,但是性價(jià)比較低,該芯片的部分功能得不到使用,造成浪費(fèi),兼容性較差。目前隨著FPGA(即現(xiàn)場(chǎng)可編程邏輯門陣列)技術(shù)的發(fā)展,越來(lái)越多的工程師選擇自己開發(fā)專用集成芯片。這種方法可以根據(jù)用戶特有的需求來(lái)量身打造,且IP核可以與其它系統(tǒng)很好地集成互聯(lián),兼容性好。本設(shè)計(jì)就是用FPGA來(lái)實(shí)現(xiàn)了NAND FLASH的控制器,并通過(guò)測(cè)試驗(yàn)證了該IP核。
本控制器所實(shí)現(xiàn)的是對(duì)NAND FLASH的讀、寫、擦除以及壞塊處理等操作,其中利用FPGA內(nèi)部RAM資源設(shè)計(jì)出32 K緩存,用來(lái)暫存FLASH中的數(shù)據(jù),并留下控制端口,與MCU系統(tǒng)進(jìn)行互聯(lián),使得MCU等對(duì)NAND FLASH進(jìn)行操作時(shí)不需要考慮具體的控制時(shí)序以及壞塊等問(wèn)題,只需關(guān)注存儲(chǔ)數(shù)據(jù)以及存儲(chǔ)位置即可,使得MCU代碼開發(fā)者不需要過(guò)多地考慮物理底層的設(shè)計(jì),簡(jiǎn)化開發(fā)難度??刂破骰炯軜?gòu)框見圖1。
圖1 NAND FLASH控制器
本設(shè)計(jì)選用的NAND FLASH為三星公司的K9F5608U0B,其容量為32 M×8 Bit。它有2 048個(gè)塊,每塊32頁(yè),每頁(yè)有528個(gè)字節(jié),其中每頁(yè)的最后16個(gè)字節(jié)用來(lái)存儲(chǔ)ECC校驗(yàn)碼。FPGA選用的是Xilinx公司所生產(chǎn)的XC3S1000-4-FT256C。
該模塊作為整個(gè)控制器的核心模塊,起到了協(xié)調(diào)各個(gè)子模塊運(yùn)行以及實(shí)現(xiàn)與MCU通信的作用。主要實(shí)現(xiàn)以下功能:
(1)首先接收到MCU發(fā)送過(guò)來(lái)的讀寫命令以及起始地址和數(shù)據(jù)總數(shù)。
(2)根據(jù)接收到的上述數(shù)據(jù),該模塊計(jì)算出起始?jí)K地址、起始頁(yè)地址、終止塊地址、終止頁(yè)地址以及總共塊數(shù)、總共頁(yè)數(shù)。
(3)如果從MCU讀命令,則用one page read命令來(lái)啟動(dòng)FLASH讀模塊,按頁(yè)連續(xù)讀取。
(4)如果從MCU寫命令,啟動(dòng)FLASH寫模塊,并進(jìn)行如下操作:①首先將起始?jí)K中未涉及到的頁(yè)的內(nèi)容用Sequential Row Read命令讀取出來(lái),并放入緩沖中;②對(duì)終止塊中未涉及到的頁(yè)進(jìn)行上述處理;③對(duì)所涉及到的塊,用erase命令全部擦除;④將緩沖的數(shù)據(jù)再放回到FLASH中原先的位置中;⑤開始從MCU接收數(shù)據(jù),并用write命令,一頁(yè)一頁(yè)地寫進(jìn)FLASH中;⑥在寫完之后,啟動(dòng)壞塊處理模塊,對(duì)所涉及的塊進(jìn)行掃描,確定壞塊。
K9F5608U0B的讀命令種類比較多,有READ1與READ2兩種。Read2命令讀取的是spare area,即存放ECC校驗(yàn)位的區(qū)域;Read1又可分為Read one page與Sequential Row Read1 Operation兩種操作。Read one page即一次只能讀一頁(yè),而Sequential Row Read1 Operation則可以連續(xù)讀取多頁(yè)。連續(xù)讀取的范圍僅限于本塊當(dāng)中,即如果控制器不發(fā)送停止該讀命令的信號(hào),則在讀完本塊的最后一頁(yè)后Flash會(huì)自動(dòng)停止讀取。當(dāng)然,大部分的命令識(shí)別工作已經(jīng)由FLASH控制模塊實(shí)現(xiàn)了。讀操作模塊中所寫的狀態(tài)機(jī)部分代碼如下:
process(cu_st,read,r_b,counter_we,counter_re_cyc,counter_re)begin
case cu_st is
when por=>
when wait_cmd=>
when cmd_adr_input=>
when wait_busy=>
when wait_ready=>
when read_process=>
end case;
end process;
該狀態(tài)機(jī)與控制模塊配合便可實(shí)現(xiàn)FLASH讀命令的各種時(shí)序。
圖2 寫模塊流程圖
從控制模塊接收到啟動(dòng)命令,在接收了要寫入的地址以及數(shù)據(jù)之后,開始啟動(dòng)狀態(tài)機(jī)。寫命令之前要進(jìn)行塊擦除,這個(gè)是由控制模塊來(lái)協(xié)調(diào)的。流程見圖2。首先寫入write命令(80 H),之后輸入地址,由于地址有3個(gè)字節(jié),所以需要在3個(gè)WE周期將地址輸入。首先輸入列地址,之后兩個(gè)字節(jié)為行地址(即頁(yè)地址)。將ALE地址鎖存信號(hào)拉低,依次輸入一頁(yè)的數(shù)據(jù)。輸入program command(80 h),F(xiàn)LASH將R/B信號(hào)拉低,并開始寫入數(shù)據(jù)。寫完之后FLASH將R/B信號(hào)置高,F(xiàn)LASH控制器檢測(cè)到R/B的變化,則輸入read status command,從I/O 0口獲取反饋,如果是0,表明寫操作成功,否則失敗。
塊擦除(Block erase)命令每次擦除一塊,所以在系統(tǒng)設(shè)計(jì)中,要設(shè)計(jì)一個(gè)32 K緩沖。當(dāng)要寫一塊數(shù)據(jù)時(shí)先將該塊中有用的數(shù)據(jù)存儲(chǔ)到緩沖中再進(jìn)行擦除,防止數(shù)據(jù)的丟失。塊擦除的工作流程見圖3。
圖3 擦除模塊流程圖
首先寫建立擦除命令(60 h),然后寫塊地址,這兒的地址為兩個(gè)字節(jié)。之后寫擦除指令(D0 h),在擦除的過(guò)程中,R/B信號(hào)為低,擦除完成之后置高。這時(shí)控制器檢測(cè)到R/B的高電位,輸入read status command命令來(lái)讀取狀態(tài)。如果I/O 0為低說(shuō)明擦除成功,為高則說(shuō)明擦除失敗。
每塊flash難免會(huì)有壞塊,但第一塊要確保是正常的。廠商在出廠時(shí)就會(huì)在壞塊上有相應(yīng)的標(biāo)記。Flash在使用之前,所有的字節(jié)都為FFH,但如果是壞塊的話,廠商會(huì)在其第1或第2頁(yè)的列地址為517處設(shè)置成non-FF,即spare field的第六個(gè)字節(jié)為非全1。
當(dāng)所設(shè)計(jì)的系統(tǒng)準(zhǔn)確度要求非常高的時(shí)候,對(duì)flash首先要做一次檢測(cè),確定有哪些壞塊,并建立一個(gè)表來(lái)存儲(chǔ)這些壞塊的地址。而且在以后正常使用后,還要在每次擦除以及寫操作之后讀取flash狀態(tài),如果是狀態(tài)為error的話就將這塊的地址存儲(chǔ)到壞塊表中。
分別通過(guò)對(duì)讀、寫以及擦除模塊的仿真,驗(yàn)證了該設(shè)計(jì)的正確性以及可行性。仿真結(jié)果見圖4。
圖4 仿真結(jié)果
NAND FLASH存儲(chǔ)器已經(jīng)成了存儲(chǔ)介質(zhì)的主流產(chǎn)品,而其控制器大部分是國(guó)外產(chǎn)品,加快集成電路設(shè)計(jì)行業(yè)的發(fā)展是我國(guó)的當(dāng)務(wù)之急,利用FPGA可以設(shè)計(jì)出具有自主知識(shí)產(chǎn)權(quán)的IP核,并且增強(qiáng)了兼容性與靈活性。
[1]K9F5608U0B FLASH MEMORY datasheet.http://www.samsung.com.2003.
[2]曾祥萍.ISE集成開發(fā)環(huán)境下基于FPGA的數(shù)字設(shè)計(jì).電腦知識(shí)與應(yīng)用,No.12P.156-158.2006.
[3]楊之廉.超大規(guī)模集成電路設(shè)計(jì)方法學(xué)導(dǎo)論(第二版).清華大學(xué)出版社,1999.
[4]徐欣,于紅旗等.基于FPGA的嵌入式系統(tǒng)設(shè)計(jì).北京:機(jī)械工業(yè)出版社,2005.