翟成瑞,林天鵬,張彥軍
(中北大學省部共建動態(tài)測試技術(shù)國家重點實驗室,山西太原 030051)
在航空航天領(lǐng)域裝備的不斷發(fā)展中,F(xiàn)lash 以其體積小,掉電數(shù)據(jù)不丟失,工作可靠等優(yōu)點在航空航天設(shè)備的研制試驗過程中備受歡迎。隨著所需存儲數(shù)據(jù)量的增加和存儲數(shù)據(jù)速度的提高,單片F(xiàn)lash 的存儲容量和速度已經(jīng)不能滿足要求,如果使用其他大容量存儲介質(zhì)會存在掉電丟失,存儲介質(zhì)體積大,不利于布局,以及部分存儲介質(zhì)存在工作不可靠等缺點[1-2]。因此,針對高速大容量數(shù)據(jù)存儲的要求,對Flash陣列式存儲展開了研究,針對Flash工作特性進行了流水線管理,無效塊檢測等高效使用存儲陣列的方法研究。
由于Flash 芯片的特性,在數(shù)據(jù)寫入時會有兩個基本操作,先是將數(shù)據(jù)寫到頁寄存器中,然后再從頁寄存器中將數(shù)據(jù)寫入對應(yīng)地址的Flash 存儲頁中,這個過程稱為頁編程[3]。頁編程過程是由芯片自主完成的,在一片F(xiàn)lash 進行頁編程的時候,此片F(xiàn)lash 不能進行其他操作,要等到完成頁編程之后才可以,頁編程的時間相對于其他操作時間較長,這對數(shù)據(jù)存儲速度將會產(chǎn)生影響。而在Flash進行自動頁編程時是可以進行其他芯片的操作。所以在一個數(shù)據(jù)記錄模塊中同時控制多片F(xiàn)lash作為存儲載體不僅可以提高存儲系統(tǒng)的存儲容量,還可以提高數(shù)據(jù)的存儲速度[4]。
多片F(xiàn)lash 組合方式的不同也將對存儲速度產(chǎn)生不同的影響,將Flash 并行排列以后,可以同時對多片F(xiàn)lash 進行存儲操作,增加了存儲容量[5],在一定程度上數(shù)據(jù)寫入速度也得到了提升,但是并行排列的方式依然存在頁編程時間等待,資源浪費等問題,沒有充分發(fā)揮出組合的優(yōu)點。并行組合示意圖如圖1 所示。
圖1 并行組合
將Flash 串行排列以后,可以在一片F(xiàn)lash 進行頁編程的時候?qū)νǖ纼?nèi)其他的Flash 操作來進行數(shù)據(jù)寫入,這種排列方式充分利用了在一片F(xiàn)lash 頁編程期間自身不能進行其他操作而需要等待的時間,提高了數(shù)據(jù)存儲的速度和資源利用率[6]。但是串行排列的方式不能同時對多片F(xiàn)lash 同時進行數(shù)據(jù)加載,也沒有充分發(fā)揮出組合的優(yōu)點。串行組合示意圖如圖2 所示。
圖2 串行組合
基于上述優(yōu)缺點,提出了通道間并行排列加通道內(nèi)串行排列的矩陣式組合方式,在通道間可以同時對多片F(xiàn)lash 進行操作,在通道內(nèi),當一片F(xiàn)lash 頁編程操作時,可以對其他Flash進行操作。這種組合方式不僅充分利用了FPGA 的邏輯資源,也充分利用了Flash的存儲特性進行存儲,很大程度上提高了數(shù)據(jù)存儲速度及數(shù)據(jù)存儲容量。該組合示意圖如圖3所示。
圖3 矩陣式組合
Flash 的內(nèi)部寫入數(shù)據(jù)和讀取數(shù)據(jù)以頁為單位,每一頁中都包含有數(shù)據(jù)空間和緩存空間。許多個頁組成一個塊,數(shù)據(jù)擦除一般以塊為單位[7]。許多個塊組合組成一個存儲單元。以單片容量為8 Gb的Flash為例將陣列式存儲單元與單片存儲單元的存儲效率做以對比[8]。該Flash 的邏輯結(jié)構(gòu)圖如圖4 所示。
圖4 Flash邏輯結(jié)構(gòu)圖
選用的Flash 每頁的容量為2 kB,在時鐘周期50 MHz,即系統(tǒng)在時鐘周期為20 ns 下工作。Flash寫入數(shù)據(jù)的流程為首先寫入一個字節(jié)的命令加五個字節(jié)將要存放數(shù)據(jù)的地址,然后將數(shù)據(jù)加載到頁寄存器中,最后將頁寄存器中的數(shù)據(jù)加載到Flash 對應(yīng)的存儲單元中,即頁編程[9]。
寫入指令加地址的時間為t1,一共需要六個時鐘周期;查閱數(shù)據(jù)手冊得知地址到數(shù)據(jù)加載時間需要t2=70 ns;將2 kB 的數(shù)據(jù)加載到頁寄存器中需要的時間為t3,共2 048 個時鐘周期;寫使能從高狀態(tài)到忙信號的拉低時間需要t4=100 ns;而自動頁編程時間t5平均需要200 μs,最大需要700 μs,以平均頁編程時間計算寫入一頁數(shù)據(jù)總共需要的時間。該時間為T=t1+t2+t3+t4+t5=241.25 μs。單片F(xiàn)lash 的寫入速度為V=2 kB÷241.25 μs=8.1 MB/s。
當Flash 組成陣列式存儲單元后,通道間可以同時對多片F(xiàn)lash 進行數(shù)據(jù)加載及頁編程,通道內(nèi)可以在一片F(xiàn)lash 進行自動頁編程時對通道內(nèi)其他的Flash 進行數(shù)據(jù)加載操作。以此可以大幅提高數(shù)據(jù)存儲速度和存儲模塊的存儲容量[10]。
通道間Flash為獨立存在,互不影響,可以同時進行頁編程操作,即同時可以將數(shù)據(jù)寫入多個通道的第一片F(xiàn)lash。通道內(nèi)的Flash只能同時對一個芯片進行頁編程。因此在通道內(nèi),當數(shù)據(jù)加載到第一片F(xiàn)lash中的頁寄存器中后,利用第一片進行自動頁編程的時間可以繼續(xù)將需要存儲的數(shù)據(jù)緩存到通道內(nèi)下一片F(xiàn)lash的頁寄存器,第一片頁編程時間足夠?qū)νǖ纼?nèi)后面的好幾片F(xiàn)lash進行數(shù)據(jù)加載至頁寄存器中的操作[11]。
該芯片數(shù)據(jù)加載到頁寄存器的時間為41.25 μs,頁編程時間200 μs,第一片進行頁編程時,其余幾片頁加載時間總和大于頁編程時間200 μs 就可以對頁編程的時間進行充分利用,因此單個通道Flash 大于六片即可。所以單個通道串行排列的數(shù)據(jù)存儲速度最大可以達到V=2 kB÷41.25 μs=47.35 MB/s。單個通道內(nèi)為了節(jié)省資源和便于控制,F(xiàn)PGA 與存儲芯片的數(shù)據(jù)傳輸接口、命令、地址、讀寫接口均為公用的傳輸線,只有片選信號和忙閑信號為單獨的傳輸線。單個通道內(nèi)串行排列的方式,其最大數(shù)據(jù)存儲速度就是單頁的存儲容量除以數(shù)據(jù)加載到頁寄存器的時間,這個速度相對于單片F(xiàn)lash的存儲速度已經(jīng)有了很大提升,但是在某些高速數(shù)據(jù)的存儲需求下,該速度還是不能滿足要求,所以在通道內(nèi)串行排列的基礎(chǔ)上再進行通道間的并行排列,這可以使數(shù)據(jù)存儲速度比串行排列數(shù)據(jù)存儲速度成倍增加,并且依靠FPGA 強大的數(shù)據(jù)處理能力和并行運行的特點,該存儲陣列也是比較容易實現(xiàn)的[12]。如上述單個通道串行排列時的數(shù)據(jù)傳輸速度最快可以達到47.35 MB/s,通道間N倍并行排列后,存儲速度將會為N×47.35 MB/s。通道間并行,通道內(nèi)串行的流水線控制如圖5所示。
圖5 流水線控制
由于受nand Flash 生產(chǎn)工藝的影響,不能保證在整個使用周期中都是可靠的,或多或少的都會產(chǎn)生壞塊,并且Flash 在出廠時有的就會存在壞塊[13]。Flash 在全部擦除后,沒有數(shù)據(jù)寫入前,正常狀態(tài)所有的位都為高位,而出現(xiàn)壞塊后,將會在擦除或者寫入數(shù)據(jù)時不能將某些位拉高,如果不對這些壞塊加以處理,將會導致數(shù)據(jù)存儲出現(xiàn)錯誤,達不到預期的存儲效果[14]。
Flash 每頁都會有備用區(qū),而壞塊的信息將在每塊第一頁的備用區(qū)做以標記。單片F(xiàn)lash 的檢測方式為每次對Flash 進行擦除或者數(shù)據(jù)寫入等操作時,都對存放壞塊信息的頁空閑區(qū)進行遍歷性檢查,如果為壞塊,將會做壞塊標記,后續(xù)操作對該塊不再進行數(shù)據(jù)寫入,如果為正常的存儲塊,則地址加一,繼續(xù)檢查下一塊,直到所有的塊狀態(tài)信息都檢查結(jié)束。這種壞塊檢查方法雖然實現(xiàn)起來較簡單,但是所需時間較長,不適合高速數(shù)據(jù)的存儲。
將Flash 陣列組合是為了滿足高速數(shù)據(jù)存儲的要求。如果壞塊檢測還是使用遍歷性檢查的方法,那將會對存儲系統(tǒng)的存儲速度產(chǎn)生很大影響,為此將使用一種提高壞塊檢測效率的方法進行陣列式Flash 的壞塊檢測。
Flash 中塊的好壞只有兩種狀態(tài),這兩種狀態(tài)可以用0、1 來表示,該設(shè)計所選的Flash 有8 192 個塊,8 kB 的RAM 可以將這些Flash 的所有塊信息寫入,這個操作只需在上電后將塊信息進行讀取寫入RAM中,后續(xù)操作需要進行壞塊檢測時只需讀取RAM 中的信息即可。這種壞塊檢測方式相對于遍歷性檢測大大節(jié)省了檢測時間,提升了系統(tǒng)的存儲速度。當遇到陣列式Flash時,如果每片都映射到一個RAM中,那所需的時間也相對較長,也會造成資源的浪費。通道內(nèi)的Flash 每個芯片的存儲塊數(shù)是相同的,地址也是相同的,因此設(shè)計了一種將一個通道內(nèi)地址相同的塊看成一個大塊的檢測方法,這個大塊中如果有一個塊是壞塊,就判定這一整個大塊為壞塊,如圖6所示。
圖6 組合塊檢測
這種壞塊檢測方式一定程度上浪費了一些好的存儲塊,但是相對系統(tǒng)總體來說,提高了系統(tǒng)的數(shù)據(jù)存儲速度,所浪費的存儲容量相對總?cè)萘縼碚f也是很少的一部分[15]。查閱芯片手冊可知,該芯片最少有8 032個有效塊,即最多每塊中有160個壞塊,以每個通道串行6片,且每塊Flash的壞塊地址都不相同,每個通道最多可達3 600個壞塊,這也就導致可能會有最多3 000個有效塊被浪費。經(jīng)計算得知,在每個通道最多浪費3 000個有效塊的情況下,該通道的Flash 存儲利用率為93.9%,而實際使用下,每片的壞塊不會那么多,無效組合塊也就不會那么多,實際的存儲容量利用率也會高于93.9%,對存儲空間不會造成太多的浪費。
在Flash 使用過程中,也會不可避免的產(chǎn)生一些突發(fā)的壞塊,在數(shù)據(jù)寫入時如果不做相應(yīng)的處理,就會使數(shù)據(jù)存儲產(chǎn)生錯誤,導致數(shù)據(jù)存儲失敗,降低數(shù)據(jù)存儲裝置的可靠性[16]。
在數(shù)據(jù)存儲過程中,當數(shù)據(jù)寫入到塊A 的第n頁時,如果發(fā)現(xiàn)返回錯誤信息,不能正常寫入數(shù)據(jù),將該塊和該頁的地址記錄下來,并將該塊第n頁到最后一頁的數(shù)據(jù)寫入到下一個能正常存儲數(shù)據(jù)的塊B對應(yīng)頁中,并對上述塊A 做壞塊標記。當全部數(shù)據(jù)都寫入完成以后,對照之前記錄的壞塊和頁地址,將已經(jīng)寫入壞塊A 中的前n-1 頁的數(shù)據(jù)以頁為單位讀出后重新寫入到其下個正常塊B 的對應(yīng)頁中完成數(shù)據(jù)的完整寫入。滯后重寫如圖7 所示。
圖7 滯后重寫
將模擬信號源產(chǎn)生的數(shù)據(jù)存入矩陣式存儲陣列中,對存儲系統(tǒng)存儲容量,存儲速度以及存儲陣列的利用率等進行測試。結(jié)果顯示矩陣式存儲陣列存儲容量和數(shù)據(jù)存儲速度相較單片存儲有成倍的提高,單個通道的有效塊使用效率達到了99%以上,遠高于理論最低使用率的93.9%,且數(shù)據(jù)存儲可靠,滿足數(shù)據(jù)存儲系統(tǒng)的各項要求。圖8 為矩陣式存儲陣列存儲的數(shù)據(jù)。
圖8 存儲數(shù)據(jù)
針對單片F(xiàn)lash 存儲容量有限,存儲速度較低的現(xiàn)狀,結(jié)合Flash 的存儲特性,提出了一種使用Flash陣列存儲數(shù)據(jù)的方法,通過布置存儲陣列,RAM 映射進行壞塊檢測,滯后重寫等設(shè)計大大提升了數(shù)據(jù)存儲容量和數(shù)據(jù)存儲速度,經(jīng)過理論分析及試驗驗證,該方法可行性高,技術(shù)實現(xiàn)難度適中,為高速數(shù)據(jù)存儲提供了可行性方案和技術(shù)路線。