摘 要: 在某些存儲(chǔ)回放系統(tǒng)" title="回放系統(tǒng)">回放系統(tǒng)中,要求在存儲(chǔ)容量大、數(shù)據(jù)可靠性高的同時(shí),具有較寬的數(shù)據(jù)帶寬,為此,,可采用NAND型Flash實(shí)現(xiàn)容量要求和數(shù)據(jù)的非易失性;采用FPGA進(jìn)行多片存儲(chǔ)體并行讀取,從而克服了NANDFlash固有的讀取速度慢的缺點(diǎn),并擴(kuò)展了存儲(chǔ)深度,;同時(shí)引入雙主設(shè)備的設(shè)計(jì),利用FPGA與PC104實(shí)現(xiàn)存儲(chǔ)和讀取的功能分離,是存儲(chǔ)方式靈活,控制方便的解決方案,。本文介紹的方案降低了此類系統(tǒng)的實(shí)現(xiàn)難度,縮短了產(chǎn)品研發(fā)周期,已應(yīng)用于實(shí)際系統(tǒng)中并得到好評(píng),。
關(guān)鍵詞: NAND Flash FPGA PC104
閃存(Flash Memory)由于其具有非易失性、電可擦除性,、可重復(fù)編程以及高密度,、低功耗等特點(diǎn),而被廣泛地應(yīng)用于U盤(pán),、MP3和數(shù)碼相機(jī)等的數(shù)據(jù)存儲(chǔ)" title="數(shù)據(jù)存儲(chǔ)">數(shù)據(jù)存儲(chǔ)設(shè)備中,。NAND 和NOR Flash是目前市場(chǎng)上兩種主要的非易失閃存芯片。與NOR型Flash相比,,NAND型Flash在容量,、功耗、使用壽命等方面的優(yōu)勢(shì)使得它成為高數(shù)據(jù)存儲(chǔ)密度的理想解決方案,。本文以Samsung公司生產(chǎn)的K9F1G08UOM為例,,介紹NAND型Flash在板載大容量" title="大容量">大容量數(shù)據(jù)存儲(chǔ)回放系統(tǒng)中的應(yīng)用,。
1 器件簡(jiǎn)介
1.1功能特性
NAND型Flash芯片是Samsung 公司推出的新一代大容量數(shù)據(jù)存儲(chǔ)器件,電源電壓范圍為1.7~3.6V,,功耗低,,TSSOP封裝體積小,目前最大" title="最大">最大單片容量可達(dá)8Gb,,按頁(yè)讀寫(xiě),,按塊擦除。本次應(yīng)用開(kāi)發(fā)的是容量為1Gb的K9F1G08UOM,,其功能框圖[1]如圖1所示,。由圖1可以看出,該器件按功能可以劃分為如下幾個(gè)部分:存儲(chǔ)陣列,、輸入輸出緩沖,、命令寄存器,、地址譯碼寄存器和控制邏輯產(chǎn)生,。其中,命令寄存器用來(lái)確定外部設(shè)備對(duì)存儲(chǔ)器進(jìn)行操作的類型,,地址譯碼寄存器保存被訪問(wèn)的地址并產(chǎn)生相應(yīng)的譯碼選通信號(hào),。主設(shè)備通過(guò)8位的I/O" title="I/O">I/O端口分時(shí)復(fù)用訪問(wèn)器件命令、地址和數(shù)據(jù)寄存器,,完成對(duì)芯片內(nèi)存儲(chǔ)體的訪問(wèn),。
1.2 存儲(chǔ)體的組織結(jié)構(gòu)
K9F1G08UOM的組織結(jié)構(gòu)框圖[1]如圖2所示。從圖2可知,,該K9F1G08UOM存儲(chǔ)體由1024個(gè)塊(Block)組成,,每個(gè)Block含有64個(gè)頁(yè)(Page),每個(gè)Page內(nèi)有2K+64個(gè)字節(jié),,其中2KB為主存儲(chǔ)區(qū),,用來(lái)保存用戶數(shù)據(jù);剩余的64個(gè)字節(jié)為輔助存儲(chǔ)區(qū),,用來(lái)保存一些狀態(tài)信息,,如:壞塊標(biāo)志位、ECC碼等,。由圖2中所列的表可知,,由于I/O端口的寬度為8位,訪問(wèn)時(shí)需要在前兩個(gè)地址訪問(wèn)周期內(nèi)給出12位列地址(沒(méi)有使用到的地址管腳必須拉至低電平),,以及尋址到頁(yè)內(nèi)字節(jié),,然后在接下來(lái)的兩個(gè)地址訪問(wèn)周期內(nèi)給出16位的行地址以確定頁(yè)號(hào)和塊號(hào);對(duì)于同等容量16位器件,,由于二者的區(qū)別僅在于單頁(yè)字節(jié)容量不同,,所以訪問(wèn)時(shí)頁(yè)內(nèi)地址只需要給出11位,,并且地址仍按8位經(jīng)由I/O0~I/O7給出,其余未使用的地址管腳拉至低電平,。
?
1.3 選擇器件的參考因素
選擇NAND器件時(shí),,除了根據(jù)實(shí)際應(yīng)用選擇合適的容量以外,還需要考慮對(duì)NAND型Flash各種操作的速度是否能滿足系統(tǒng)需求,。表1給出了1Gb容量?jī)煞N位寬類型的器件在讀,、寫(xiě)、擦除三種主要操作的近似速度,,具體計(jì)算方法和參數(shù)可見(jiàn)參考文獻(xiàn)[2],、[3]。需要強(qiáng)調(diào)的是:
(1)位寬加倍對(duì)編程速度沒(méi)有太大影響,,這主要是因?yàn)樵趯⒁豁?yè)數(shù)據(jù)寫(xiě)入Flash片內(nèi)的寄存器后,,器件自身將該頁(yè)數(shù)據(jù)寫(xiě)入存儲(chǔ)單元的時(shí)間基數(shù)較大。
(2)位寬加倍使得讀取速度接近翻番,。
(3)由于器件按塊擦除,,所以位寬對(duì)擦除速度基本沒(méi)有影響。
2 應(yīng)用實(shí)例
以一板載大容量數(shù)據(jù)回放系統(tǒng)為例,,其系統(tǒng)結(jié)構(gòu)如圖3所示,,主要包括CPU模塊、FPGA,、NAND Flash和數(shù)模轉(zhuǎn)換模塊四部分,。其中,CPU模塊為一個(gè)與IBM-PC/AT兼容的PC/104 CPU模塊,,并作為整個(gè)系統(tǒng)的主控設(shè)備,,完成數(shù)據(jù)接收、存儲(chǔ),、回放參數(shù)設(shè)置等功能,。CPU模塊直接通過(guò)標(biāo)準(zhǔn)PC/104接插件固定在母板上;FPGA采用Xilinx公司Spartan3系列XC3S1000[2],,主要完成數(shù)據(jù)的回放功能,;數(shù)模轉(zhuǎn)換模塊完成數(shù)據(jù)從數(shù)字域到模擬域的轉(zhuǎn)換,轉(zhuǎn)換速率為100MBps,;NAND Flash采用8位位寬,、單片1Gb容量的K9F1G08UOM,用來(lái)存儲(chǔ)回放數(shù)據(jù),,考慮單片F(xiàn)lash的數(shù)據(jù)輸出率有限,,系統(tǒng)中采用8片并行處理,所以存儲(chǔ)容量是8Gb。
FPGA模塊是本系統(tǒng)的關(guān)鍵,,其片內(nèi)系統(tǒng)結(jié)構(gòu)如圖4所示,。設(shè)計(jì)要點(diǎn)如下:
2.1 功能劃分
系統(tǒng)中允許兩個(gè)主設(shè)備即FPGA和CPU模塊訪問(wèn)Flash;在此將FPGA在邏輯上劃分為Master和Slave兩種模式,。Master表示FPGA作為Flash的主設(shè)備,,占用Flash 的總線,此時(shí)CPU模塊只能訪問(wèn)FPGA內(nèi)的控制寄存器,;Slave則表示FPGA和Flash均作為CPU模塊的從設(shè)備接受訪問(wèn),,F(xiàn)lash和FPGA均映射到CPU模塊的某段I/O地址空間。此時(shí)對(duì)Flash來(lái)講,,F(xiàn)PGA只是提供CPU至Flash的數(shù)據(jù)和控制通路,。FPGA片內(nèi)系統(tǒng)結(jié)構(gòu)如圖4所示。圖中:CPU通過(guò)PC/104總線訪問(wèn)控制寄存器的相應(yīng)位來(lái)控制FPGA的狀態(tài)切換,,粗黑線只代表數(shù)據(jù)鏈路(控制鏈路都為單向信號(hào),,較數(shù)據(jù)鏈路簡(jiǎn)單,但連接方式與數(shù)據(jù)通路類似,,為簡(jiǎn)化框圖已省略),。
雖然CPU模塊與FPGA均能訪問(wèn)Flash,但是在具體實(shí)現(xiàn)時(shí),,如圖4所示,,F(xiàn)PGA內(nèi)只實(shí)現(xiàn)對(duì)Flash的讀控制,,而其他諸如寫(xiě)操作,、擦除以及檢測(cè)壞塊(invalid block)等操作則由CPU模塊完成。這樣設(shè)計(jì)的原因是:
(1)系統(tǒng)帶寬要求,。前面提到了系統(tǒng)要求的輸出數(shù)據(jù)速率為100MBps,而單片F(xiàn)lash的峰值數(shù)據(jù)輸出速率僅為16MBps,;PC/104總線的時(shí)鐘頻率為8MHz,且一個(gè)指令周期至少需要6個(gè)時(shí)鐘,這樣即使多片F(xiàn)lash并片操作也難滿足系統(tǒng)要求,。而FPGA實(shí)現(xiàn)時(shí),,則可以完全根據(jù)Flash的訪問(wèn)時(shí)序要求設(shè)計(jì)狀態(tài)機(jī),時(shí)間裕量可以很精確地調(diào)整,,從而盡可能地接近對(duì)Flash訪問(wèn)的最大帶寬,。因此用FPGA實(shí)現(xiàn)其控制,性能要優(yōu)于CPU實(shí)現(xiàn)的方案,。
(2)簡(jiǎn)化系統(tǒng)的設(shè)計(jì)和調(diào)試難度,。雖然FPGA實(shí)現(xiàn)對(duì)Flash的訪問(wèn)可以達(dá)到最大帶寬,但是它的設(shè)計(jì)以及調(diào)試卻遠(yuǎn)較CPU實(shí)現(xiàn)復(fù)雜和困難,。在FPGA設(shè)計(jì)中,,設(shè)計(jì)者必須很精確地以數(shù)據(jù)流形式描述整個(gè)設(shè)計(jì),必須很清楚地了解每個(gè)時(shí)刻信號(hào)的變化,,而且設(shè)計(jì)當(dāng)中的信號(hào)很不易觀測(cè),,出現(xiàn)錯(cuò)誤后對(duì)問(wèn)題的定位比較困難,。相比之下,CPU模塊通過(guò)高級(jí)語(yǔ)言,,以算法級(jí)的方式實(shí)現(xiàn),再輔助以良好的開(kāi)發(fā)調(diào)試環(huán)境,,實(shí)現(xiàn)Flash控制要容易得多。本應(yīng)用中將對(duì)Flash的寫(xiě),、擦除,、記錄壞塊表等對(duì)時(shí)間要求不高的操作轉(zhuǎn)移至CPU模塊,這樣可以大大降低整個(gè)系統(tǒng)的設(shè)計(jì)和調(diào)試難度,。
2.2 FPGA與NAND Flash的接口設(shè)計(jì)
NAND Flash和通常使用的存儲(chǔ)器最大差別是接口的不同,,通常使用的非易失性存儲(chǔ)器如NOR Flash,由于它有一套完整的地址映射即訪問(wèn)接口,,指定的地址總線和數(shù)據(jù)總線,,從而可以很容易地訪問(wèn)其內(nèi)部的每一個(gè)字節(jié)。而NAND Flash沒(méi)有專門(mén)的地址線,;它的接口是一種間接類I/O接口[3],,通過(guò)8位的總線分別發(fā)送命令和地址到命令、地址寄存器來(lái)控制,。以典型的“讀”命令為例:寫(xiě)“讀”命令到命令寄存器,,寫(xiě)入4字節(jié)的地址到地址寄存器,等待設(shè)備將要求的數(shù)據(jù)放到輸出寄存器,,從數(shù)據(jù)寄存器讀取一頁(yè)的數(shù)據(jù),。NAND Flash這種接口的缺點(diǎn)是一般情況下無(wú)法用來(lái)引導(dǎo)系統(tǒng),除非外接專門(mén)的狀態(tài)機(jī)或控制器,。其優(yōu)點(diǎn)是:由于地址寄存器在芯片內(nèi)部,,芯片的管腳隨著芯片容量的增加基本上不變,而且FPGA實(shí)現(xiàn)Flash訪問(wèn),,其接口設(shè)計(jì)無(wú)任何特殊要求,,接口信號(hào)按通用I/O管腳設(shè)計(jì)即可(這里說(shuō)的接口設(shè)計(jì)是指在Slave模式下,CPU模塊與Flash接口設(shè)計(jì)),。本設(shè)計(jì)中采用的接口如圖5所示,。
由圖5可知,設(shè)計(jì)中通過(guò)L_A0,、L_A1(在Slave模式下直接映射到PC/104總線對(duì)應(yīng)的低地位地址線,;在Master模式下則連接至讀控制的對(duì)應(yīng)輸出端口)直接產(chǎn)生命令寄存器和地址寄存器選通信號(hào),而芯片的Ready/Busy信號(hào)直接通過(guò)L_GPIO口傳遞給FPGA,,然后給CPU模塊,。這種設(shè)計(jì)結(jié)構(gòu)簡(jiǎn)單,訪問(wèn)速度快,唯一的缺點(diǎn)就是要求所使用的NAND型Flash必須具備CEDC(Chip Enable Don′t Care)特性,,即不需要/CE(芯片使能信號(hào))在整個(gè)操作的周期都一直拉低,。
2.3 FPGA實(shí)現(xiàn)NAND型Flash讀狀態(tài)機(jī)的設(shè)計(jì)
K9F1G08UOM的讀時(shí)序如圖6[2]所示。設(shè)計(jì)中的關(guān)鍵是保證命令,、地址,、數(shù)據(jù)以及控制信號(hào)在時(shí)序上的要求。由圖可知,,對(duì)Flash的讀,、寫(xiě)操作的最小時(shí)鐘周期分別為tWC(45ns)和tRC(50ns)。為了方便設(shè)計(jì),,狀態(tài)機(jī)的時(shí)鐘選取40MHz(25ns),。當(dāng)然,在資源足夠的情況下也可以采用更高頻率的時(shí)鐘以減小時(shí)間裕量,,從而提高訪問(wèn)速度,。本設(shè)計(jì)程序?qū)嵗缦拢?BR> //cle_o-命令寄存器使能; ce_o-片選使能; we_o-寫(xiě)使能; ale_o-地址寄存器使能
//re_o-讀使能; rb_i-等待/忙信號(hào) //start_i-讀啟動(dòng)信號(hào)
always @ (posedge clk_i )
if ( rst_i) begin
MooreState<=S0; //復(fù)位狀態(tài)
cle_o<=1′b0;ce_o<=1′b1;we_o<=1′b1;re_o<=1′b1;ale_o<=1′b0;io_o<=8′hxx;
count_en<=1′b0; end
else
case (MooreState)
S0:begin MooreState<=start_i?S1:S0;re_o<=1′b1;end
S1: begin MooreState <= S2; //寫(xiě)命令寄存器
cle_o<=1′b1;ce_o<=1′b0;we_o<=1′b0;io_o<=8′h00; end
S2: begin MooreState<=S3;we_o<=1′b1;end
S3: begin MooreState <=S4; //寫(xiě)地址寄存器1
cle_o<=1′b0; we_o<=1′b0;ale_o<=1′b1;io_o<=
coladr_l; end
S4: begin MooreState<=S5;we_o<=1′b1;end
S5: begin MooreState<=S6; //寫(xiě)地址寄存器2
we_o<=1′b0;io_o<=coladr_h; end
S6: begin MooreState<=S7;we_o<=1′b1;end
S7: begin MooreState<=S8; //寫(xiě)地址寄存器3
we_o<=1′b0;io_o<=radr_l; end
S8: begin MooreState<=S9;we_o<=1′b1;end
S9: begin MooreState<=S10; //寫(xiě)地址寄存器4
we_o<=1′b0;io_o<=radr_h; end
S10: begin MooreState<=S11;we_o<=1′b1;end
S11: begin MooreState <= S12; //寫(xiě)命令寄存器
cle_o<=1′b1;we_o<=1′b0;ale_o<=1′b0;io_o<=
8′h30; end
S12: begin MooreState<=S13;we_o<=1′b1;end
S13: begin MooreState<= rb_i? //忙等待
S14: S13;
cle_o<=1′b0;io_o<=8′hxx; end
S14: begin MooreState <= S15; //循環(huán)讀一頁(yè)數(shù)據(jù)
re_o<=1′b0;count_en<=1′b1;end
S15: begin MooreState<= (count_n==4095)?S16:S14;
re_o<=1′b1; end
S16: begin MooreState <=S0; //結(jié)束
ce_o<=1′b1;count_en<=1′b0; end
endcase
always @ (posedge clk_i )
begin if (rst_i) count_n<=1;
else if (count_en) count_n<=count_n+1;
else count_n<=1;
end
上述程序中,在讀操作時(shí)使用了Moore型狀態(tài)機(jī),,其最大特點(diǎn)就是輸出僅依賴于狀態(tài)機(jī)的狀態(tài),,與它的輸入無(wú)關(guān);而描述Moore狀態(tài)機(jī)的最佳方式之一就是在always語(yǔ)句中使用case語(yǔ)句實(shí)現(xiàn)不同狀態(tài)間的轉(zhuǎn)換,,且每種狀態(tài)的輸出邏輯都在相應(yīng)的分支中描述,。
狀態(tài)進(jìn)程:本例中將讀操作分成17個(gè)狀態(tài),其中狀態(tài)S0用來(lái)初始化各輸出信號(hào),,狀態(tài)S1~S2和S12~S13完成對(duì)命令寄存器的寫(xiě)操作,,狀態(tài)S3~S11完成4次對(duì)地址寄存器的寫(xiě)操作,狀態(tài)S14,、S15則完成一頁(yè)數(shù)據(jù)的連續(xù)讀取,。
組合進(jìn)程:組合進(jìn)程是根據(jù)當(dāng)前狀態(tài)(現(xiàn)態(tài))給輸出信號(hào)賦值,,并決定下一狀態(tài)(次態(tài)),。在本例中,狀態(tài)機(jī)根據(jù)不同的狀態(tài)對(duì)ce,、ale,、cle、we,、re,、io等Flash信號(hào)進(jìn)行賦值,以實(shí)現(xiàn)對(duì)Flash 的控制功能,。
另外,,增加一個(gè)always語(yǔ)句實(shí)現(xiàn)同步計(jì)數(shù),用于對(duì)讀取的數(shù)據(jù)個(gè)數(shù)計(jì)數(shù)。
上述程序只是讀操作部分,,具體讀控制還包括地址產(chǎn)生,、壞塊表檢測(cè)以及其他一些控制部分,由于篇幅有限,,此處不贅述,。
2.4 壞塊表的建立
由于NAND型Flash存儲(chǔ)容量較大,難免在使用過(guò)程中出現(xiàn)存儲(chǔ)單元的損壞,,因此有必要記錄每片F(xiàn)lash壞塊的位置,。設(shè)計(jì)中首先由CPU模塊通過(guò)PC104總線訪問(wèn)Flash,檢測(cè)器件中的壞塊并建立壞塊表(invalid block table),,然后存儲(chǔ)在FPGA內(nèi)的雙口RAM中,。數(shù)據(jù)回放時(shí),讀狀態(tài)機(jī)在跨塊時(shí)需要將當(dāng)前塊的塊號(hào)和壞塊表中的塊號(hào)按遍歷方式進(jìn)行比較,,當(dāng)確認(rèn)該塊為壞塊時(shí),,將跳至下一可用塊;否則讀取該塊數(shù)據(jù),。檢測(cè)壞塊的程序流程如圖7所示,,實(shí)現(xiàn)壞塊檢測(cè)的C代碼如下:
RAdr_H=0; RAdr_L=0;
for(k=0; k<256; k++)
//遍歷1024個(gè)block,檢測(cè)壞block
{
for(j=0; j<4; j++)
{ //讀取第1頁(yè)第2 048個(gè)字節(jié)
outportb(ComReg,0x00);
outportb (AddReg,0x00);
outportb (AddReg,0x08);
outportb (AddReg, RAdr_L);
outportb (AddReg, RAdr_H);
outportb (ComReg,0x30);
while( inportb(RB_Adr )!=0x01) { };
FP2048=inportb (DataReg);
outportb(ComReg,0x00);
//讀取第2頁(yè)第2 048個(gè)字節(jié)
outportb (AddReg,0x00);
outportb (AddReg,0x08);
outportb (AddReg,RAdr_L+1);
outportb (AddReg,RAdr_H);
outportb (ComReg,0x30);
while( inportb (RB_Adr)==0x01 ) {};
SP2048= inportb (DataReg);
if((FP2048!=0xff)or(SP2048)!=0xff) )
//判斷第1,、2頁(yè)的第2048字節(jié)是否為0xff
{Inv_Add=RAdr_H*256+RAdr_L&0xC0;
outport(Inv_Add,Inv_Tab_Add);
Inv_Tab_Add=Inv_Tab_Add+1;}
RAdr_L=RAdr_L+0x40;
} /* end of for(..j..) */
RAdr_H=RAdr_H+1;
} /* end of for(..k..) */
上述代碼中,,ComReg為命令寄存器地址,AddReg為地址寄存器地址,,DataReg為數(shù)據(jù)端口地址,,Inv_Tab_Add為壞塊表地址,RB_Adr則為芯片R/B信號(hào)反饋至GPIO口的端口地址,。
2.5 數(shù)據(jù)緩沖問(wèn)題
如前所述,,F(xiàn)PGA內(nèi)部8個(gè)并行運(yùn)行的讀狀態(tài)機(jī)獨(dú)立完成每片F(xiàn)lash的讀取操作,并片后,,必然會(huì)導(dǎo)致各片F(xiàn)lash在讀取數(shù)據(jù)時(shí)存在時(shí)間上的錯(cuò)位,,特別是當(dāng)其中一片F(xiàn)lash出現(xiàn)壞塊,讀狀態(tài)機(jī)需要跨塊讀取時(shí),,這個(gè)問(wèn)題會(huì)更加嚴(yán)重,。為了解決這個(gè)問(wèn)題,F(xiàn)PGA的設(shè)計(jì)中增加了用來(lái)緩沖數(shù)據(jù)的FIFO,,以隔離FIFO前后速度非一致的數(shù)據(jù)流,。FIFO的深度由讀狀態(tài)機(jī)跨塊所需要的時(shí)間間隔和FIFO的輸出時(shí)鐘100MHz共同決定,以保證FIFO輸出數(shù)據(jù)流不間斷,。
本文介紹的系統(tǒng)利用FPGA和PC104模塊分別完成對(duì)NAND型Flash的讀寫(xiě)操作,不僅滿足了系統(tǒng)存儲(chǔ)深度8Gb的要求,,而且利用FPGA內(nèi)多個(gè)獨(dú)立并行狀態(tài)機(jī)實(shí)現(xiàn)了多片F(xiàn)lash的并行讀取操作,,滿足了數(shù)據(jù)回放的帶寬要求,并實(shí)際應(yīng)用于某干擾系統(tǒng)中,,效果理想,。
參考文獻(xiàn)
1 XILINX. Spartan-3 platform FPGA handbook[EB/OL],http://www.xilinx.com, 2003
2 Samsung. K9F1G08UOM K9F1G16UOM flash memory data-sheet rev.13[EB/OL],,http://www.sumsung.com,2003
3 Samsung. NAND flash spare assignment recommendation [EB/OL],,http://www.sumsung.com, 2003
4 TOSHIBA,What is NAND flash memory? [EB/OL],,http://www.toshiba.com, 2003