張桐林,石云波 ,曹慧亮,趙 銳,張 越,張英杰
(1.中北大學電子測試技術重點實驗室,山西 太原 030051;2.山西北方機械制造有限責任公司,山西 太原 030009;3.中國船舶重工集團有限公司第七一〇研究所,湖北 宜昌 443003)
隨著導彈信息化、智能化、實戰化發展,彈載信息處理器對非易失的大容量數據存儲需求變得非常迫切,隨著彈載飛行過程中需要記錄的數據量不斷增加,對存儲設備的存儲速度和數據可靠性提出了更高的要求[1],如何以更小的存儲設備尺寸發揮更大的作用同樣是不變的話題[2]。近年來,大多數存儲裝置采用多片Flash組成陣列,并采用流水線的存儲機制來實現高速大容量存儲[3]。例如:意大利美光半導體公司Luca Nubile等人提出了一種針對Flash存儲陣列的多線程控制算法,該算法對系統的邏輯開銷、存儲速度和容量等性能進行了優化[4];俄羅斯的Puryga等人研發的湯姆遜散射診斷數據采集系統同樣包含多片存儲單元,它允許以5 GHz采樣率采集八通道數據[5];類似的組建Flash陣列以增加存儲容量的方式在一些嵌入式系統和大數據硬件神經網絡系統領域同樣存在廣泛的應用[6-8]。目前所廣泛采用的NAND Flash在使用過程中會存在壞塊無法進行數據的存儲與讀取,且位置隨機,這對于復雜Flash陣列的可靠性問題是極大的挑戰[9];或者在大容量彈載記錄儀讀取數據的過程中,難以快速提取有用數據,降低數據處理效率;或者在復雜的測試環境下,傳統存儲系統的觸發方式可能增加其發生誤觸發的風險[10]。
針對上述提到的壞塊多、讀取速度慢、誤觸發風險高等嚴重影響存儲器可靠性與工作效率的問題,本文提出一種基于NAND Flash協處理系統的彈載記錄儀。
傳統彈載記錄儀的電路模塊主要包括控制器、信號適配電路、A/D轉換器、存儲器、接口電路以及電源控制等部分。控制器完成對采集電路的控制、數字量的解碼、混合數據流控制和讀寫存儲器。信號適配電路將待測量的模擬信號經過放大和濾波調理后送入A/D轉換器,A/D轉換器將模擬信號轉化為數字信號,然后存入數據存儲器,接口電路實現記錄儀與上位機之間的連接與通信。傳統彈載記錄儀原理框圖如圖1所示。

圖1 傳統彈載記錄儀原理框圖Fig.1 Schematic diagram of traditional bomb-borne recorder
1.2.1壞塊管理方式
NAND Flash出廠攜帶的壞塊被稱為固有壞塊,在使用過程中,對塊的擦除或編程操作失敗,或是發生超出數據校驗算法糾錯能力的塊被稱為使用壞塊。好的壞塊管理策略是保證存儲數據可靠性的關鍵[11]。
為了在使用過程中不受壞塊影響,若采用傳統的壞塊管理手段,即提前對Flash進行壞塊檢測,并產生相應的壞塊管理表[12-13],在數據寫入Flash的塊存儲單元前,同壞塊表進行預匹配,若驗證該塊為好塊則開始記錄數據。這種方式會限制Flash的存儲速度,而且占用大量的設計資源,效率過低;若采用已優化的方法如頁粒度管理方法,對于整個Flash的頁錯誤率進行考慮,并采用DAM_FTL算法進行替換塊適配,實現又過于復雜[14-16]。
如果能實現一種壞塊管理策略,既能省去預匹配操作的時間,又能以相對簡單的方式實現,這將大大提高數據存儲效率。
1.2.2數據回讀方式
彈載記錄儀通常用于高沖擊試驗中記錄彈道參數相關的高過載加速度信號。在侵徹試驗中,需要實時完成對膛內發射與著靶侵徹過程中加速度信息的采集與記錄,這一過程持續時間通常5~15 ms。為保證彈體發射和著靶侵徹過程被完整記錄,需要保證彈載記錄儀不間斷地記錄數據20~30 min。彈體回收以后,由計算機對記錄儀中數據進行回讀與分析。
彈體發射過程中會記錄大量的數據,而其中膛內與侵徹數據卻僅有億分之一為有效數據。若采用傳統方案,雖然通過引出多根數據線傳輸多bit數據,或者通過更換通信協議,可以提高數據傳輸速度,但這些方式或占用接口較多,或占用記錄儀體積較大,且同樣需要分析大量無效數據,并不能較好地解決問題。
如果系統在回讀數據時,能夠快速定位有效數據位置并設置任意起始地址,這將大大提高讀數和數據處理的效率。
1.2.3觸發與數據記錄方式
傳統彈載記錄儀的觸發方式主要有兩種,第一種是設置觸發時間,第二種是設置觸發閾值。
設置觸發時間方式,可以為炮彈裝載入膛等準備工作留出時間,這種觸發方式具有較高的可靠性,適用于有效數據少,測試環境復雜的侵徹信號的采集與存儲。然而該方式的靈活性較低,如果彈體裝載等準備工作超時或者發射時間推遲,此時炮彈已無法取出,記錄儀卻開始工作,等到Flash中數據計滿后,系統自動斷電,最終可能會導致試驗失敗。
設置觸發閾值方式,即當系統實時檢測的敏感信號大于閾值電壓時,存儲器使能,開始記錄數據。首先,侵徹過程的測試環境較為復雜,各種諧波噪聲疊加,且有效數據長度過短,因此在高過載測試環境中,這種觸發方式的可靠性有待加強;其次,為避免丟失觸發時間節點之前的數據,在系統對敏感信號和閾值電壓的比較之前,需要暫存固定長度的預采樣數據。FPGA內部RAM資源有限,可存儲的預采樣數據也很有限。這種觸發方式的靈活性較高,適合應用于遠距離彈飛行姿態等數據的采集與存儲。
如果存在觸發和數據記錄方式,同時具備高的可靠性和靈活性,將大大提高彈載記錄儀的性能。
協處理器是一種與主控制器件協同工作,輔助其完成特定計算任務的專用處理芯片或器件。對于相對簡單的系統,可以利用FPGA并行執行特點,針對NAND Flash設計協處理模塊,配合主控制模塊完成對存儲系統的設計與優化。對于彈載記錄儀來說,既可以實現單個主控制器難以勝任的功能,又在成本和空間上有著明顯的優勢。
圖2為基于協處理系統彈載記錄儀的原理框圖。相比傳統彈載記錄儀,系統中多了協處理模塊與存儲陣列。結合NAND Flash的特點和傳統記錄儀待優化的方向,協處理系統的設計主要包括以下模塊:以整合好塊地址為基礎的壞塊管理策略,以可控起始地址為基礎的數據讀取方式,以Flash存儲陣列為基礎的“邊擦邊寫”的二級流水操作。主控制系統與協處理系統協同工作,共同完成數據的采集與存儲。

圖2 基于協處理系統彈載記錄儀原理框圖Fig.2 Schematic diagram of Missile recorder based on co-processing system
本文選用三星NAND Flash器件K9WBG08,其存儲結構為:NAND Flash數據以bit方式保存在memory cell,一個cell只能存儲一個bit。這些cell以8個為單位,連成bit line,形成Byte。這些Byte line會再組成page,每64個page形成一個block。block是NAND Flash中最大的操作單元,擦除按照block為單位完成,編程/讀取按照 page 為單位完成[17]。
基于整合好塊的壞塊管理策略的操作流程如圖3所示。在塊擦除操作的同時,判斷該塊是否為好塊,則是將好塊地址存入FPGA的RAM核中,否則跳過該塊。NAND Flash芯片在出廠時會保證第一塊為好塊,因此將block0作為存放好塊地址的固定區域,等待全部塊擦除完畢后,將整合好的好塊列表寫入其中,即使系統下電數據依然存在。在執行頁編程或數據讀取操作前,首先從NAND Flash的固定區域中讀取好塊地址,并將其存放在FPGA的RAM核中,當需要向Flash發送待操作塊地址時,可以快速從表中讀出好塊地址,從而實現以整合好塊為前提的壞塊管理。

圖3 壞塊管理流程Fig.3 Bad block management process
相比傳統的壞塊管理策略,本文方案更容易實現,且每執行一次擦除操作,便重新生成好塊RAM表,不僅做到隨時更新,還可以將處理壞塊的時間集中在擦除操作期間,為頁編程操作省去預匹配的時間,相比傳統方案大大提高數據存儲速度;不僅如此,構建的好塊RAM表還可以串聯協處理系統的其他模塊,使整個系統更加簡單。
基于起始地址可控的數據讀取方式操作流程如圖4所示。以構建好塊RAM表的方法為前提,PC端可隨意設置起始地址;系統上電以后,自動從NAND Flash的固定區域中讀取好塊地址;當讀取的地址等于和起始地址時,將之后的好塊存放在FPGA的RAM核中;當讀到16位結束標志“ABCD”后停止,至此建立好了以起始地址為首的好塊RAM表。在回讀數據的過程中,待讀取的塊地址從好塊表中取出,當表中所有好塊地址讀完或接收到停止讀數指令時,整個數據讀取操作結束。

圖4 起始地址可控的數據讀取流程Fig.4 Data read process with controllable start address
2.5.1二級流水式的并行操作
圖5為NAND Flash執行單次操作的時間劃分,在加載時間內,FPGA向Flash發送指令、地址和數據;在忙碌時間內,NAND Flash不響應任何指令,此時Flash與FPGA之間的總線空閑,可通過軟硬件的協同合作,利用忙碌時間對另外的Flash進行加載操作,這也稱為對存儲陣列進行流水操作。

圖5 NAND Flash單次操作時間劃分Fig.5 Time division of single operation of NAND Flash
K9WBG08由兩個相同型號的小容量Flash基片組成,分別稱為chip1和chip2,除片選和等待信號外,其他端口均可共用。每個基片在讀、寫、擦操作的過程中存在忙碌時間,在此期間Flash不進行其余操作,這樣在存儲過程中,必然會造成時間的浪費,影響操作速度。利用Flash內部的兩個基片組成存儲陣列,在存儲記錄的過程中引入流水線式的并行操作,可以提高NAND Flash的使用效率。
與傳統的并行操作不同,本文方案利用Flash內部的兩個基片chip1、chip2交替地執行塊擦除和頁編程操作,形成一種“邊擦邊寫”的記錄方法,如圖6所示,該方法可以在檢測到敏感信號之前不斷地進行數據更新。敏感信號到達后,FPGA總控模塊發送start record指令,隨后系統脫離“邊擦邊寫”的循環狀態,正式開始記錄數據。

圖6 二級流水式的并行操作Fig.6 Two-stage pipelined parallel operation
2.5.2“邊擦邊寫”的循環記錄法
“邊擦邊寫”循環記錄的方法是指按照圖6中箭頭所指方向,將箭頭所指的塊稱作next block,將箭尾所指的塊稱作block。圖7為單次“邊擦邊寫”操作,在Flash按塊存儲數據的過程中,先將next block中的數據擦除,等待塊擦除操作進入忙碌狀態后,再對block進行頁編程操作,直到該塊的64頁全部記錄滿后,對后續的塊執行相同操作。在整個過程中,chip1、chip2交替并行執行擦寫操作,循環往復。

圖7 一次“邊擦邊寫”操作Fig.7 One “erase-and-write” operation
這種方法可以在記錄數據至某塊前,保證該塊為空。同時如圖6所示,可以通過代碼設置參數“x”,保留敏感信號到達之前任意存儲容量的數據,因此最終的結果一定包含全部的有用數據。在此基礎上,系統可以有充足的時間對敏感信號進行實時檢測與多次核對,進而大大提高檢測精度,降低誤觸發的風險。
2.5.3存儲器存儲數據的具體操作流程
存儲系統存儲數據的具體操作流程如圖8所示。上電后,首先對系統進行初始化;其次,自動從NAND Flash的block0中讀取好塊地址,并將其存放在FPGA的RAM核中;隨后進入“邊擦邊寫”循環狀態。值得注意的是,在檢測到敏感信號前,RAM表中的好塊地址被讀出使用后又會被重新寫入,由此整個操作流程得以循環往復;檢測到敏感信號后,RAM表中的好塊地址只出不進,直到表中剩余好塊數量為提前設置的x時,Flash存儲記錄操作結束。
采用二級流水操作令Flash內部的兩個基片分時復用,可在宏觀上達到存儲效率最大化,使系統吞吐率接近理論值,不僅如此,該方法同樣可以運用在多片NAND Flash組成的復雜陣列中,以實現四級、八級甚至更多級流水操作,在提升存儲效率的同時,大大節約FPGA的引腳,節省PCB布線空間[18]。

圖8 彈載存儲器記錄數據的流程圖Fig.8 The flow chart of the on-board memory recording data
ChipScope軟件是Xilinx公司提供的一個校驗FPGA設計的工具。它的本質是一個虛擬的邏輯分析儀,能調用FPGA內部的邏輯資源對代碼中的各個變量進行抓取分析。與ModelSim等一些其他的FPGA仿真工具不同的是,ChipScope可以直接反映代碼在實際硬件上的執行情況,從而能夠更加有效地定位設計中的問題。
實現壞塊管理的邏輯電路仿真時序如圖9所示,已知第2 589塊為壞塊(0x0A1D),上電以后進行遍歷檢測,發現可以有效地跳過壞塊。同時發現rd_goodb_in_vld信號翻轉,表示好塊地址被寫入FPGA的RAM核中,形成好塊表。

圖9 壞塊管理仿真時序圖Fig.9 Bad block management simulation timing diagram
實現起始地址可控的數據讀取方式的邏輯電路仿真時序如圖10所示。PC端設置起始地址為第32塊(0x0020),上電復位以后,從NAND Flash的固定區域中讀取好塊地址(如圖10(a)),當讀取到第32塊時,rd_goodb_in_vld信號開始翻轉,表示開始將讀取到的好塊地址存放于FPGA的RAM核中,直到讀到結束標志“ABCD”后結束,至此建立好以第32塊為首地址的好塊RAM表。接下來讀取操作開始(如圖10(b)),首先向NAND Flash發送讀命令“00h”,然后rd_goodb_out_vld信號的電平置1,等待從RAM表中讀出待讀取塊地址,隨后以5個周期發送至Flash,再發送命令“30h”,等待rb置0再置1后,忙碌狀態結束,數據被讀出 。

圖10 起始地址可控的讀操作仿真時序圖Fig.10 Read operation simulation timing diagram
實現基于Flash存儲陣列的“邊擦邊寫”的二級流水操作方式的邏輯電路仿真時序如圖11所示,chip_cnt高電平表示對chip1使能,低電平表示對chip2使能,“邊擦邊寫”操作開始后,首先建立好塊RAM表,當識別到好塊地址結束標志“ABCD”時,使能chip2并向其發送“60h”塊擦除指令,然后rd_goodb_out_vld信號的電平置1,從RAM表中讀出待擦除塊地址goodb_add,并將其分為3個周期發送至Flash中。值得注意的是,若此時未檢測到敏感信號(如圖11(a)),則rd_goodb_in_vld信號的電平置1,隨后等待剛剛讀出的goodb_add重新寫入好塊RAM表中;若此時敏感信號已到(如圖11(b)),則RAM表中的好塊地址自此只出不進。發送完地址以后,向Flash發送指令“D0h”,等待rb2電平置0,chip2進入忙碌狀態后,使能chip1并向其發送“80h”和5個周期的待編程地址,等待該塊全部頁編程操作結束,便完成了一次“邊擦邊寫”操作。

圖11 “邊擦邊寫”操作仿真時序圖Fig.11 “Erase-while-write” operation simulation timing diagram
上述仿真結果表明,小型彈載同步NAND Flash存儲控制器的三項關鍵技術的功能基本實現。
仿真分析論證通過后,構建高過載測試環境,開展靶場炮擊試驗,在彈體內部搭載小型同步NAND Flash存儲控制器,通過在高過載環境下存儲記錄加速度信息,驗證記錄器在實際應用中的性能。
彈載存儲系統使用Endvco傳感器和自研高量程諧振式陀螺儀分別對膛內和侵徹過程中的三軸加速度和角速度信號進行分解;采用16位的模數轉換芯片AD7606 B,以單通道800 kHz的采樣率對調理后的6路模擬信號加2路穩壓信號進行采集轉換;由協處理系統完成對轉換數據的編幀、緩存以及同觸發閾值的比較,進而控制系統的觸發和數據的存儲。如圖12所示,將小型存儲電路板、傳感器和電池進行集成,然后依次灌封于內殼體、外殼體和試驗彈體內。試驗彈采用改造過的130 mm彈丸,存儲記錄單元搭載于彈體尾部。靶體規格為2 m×2 m×2 m,混凝土抗壓強度為C15,使用鋼筋束縛圍壓。

圖12 內殼體(左)、外殼體(中)和試驗彈(右)Fig.12 Inner case (left), outer case (middle), test bomb (right)
試驗現場如圖13所示,發射平臺采用130 mm口徑加農炮,激光測速裝置布置在炮口19 m處,靶體布置在距離測速裝置29.4 m處,使用高速攝影記錄彈丸的整個侵徹歷程,彈丸穿過靶體之后由后面的夯土靶回收。

圖13 侵徹實驗現場Fig.13 Penetration experiment site
侵徹測試結束后,回收彈體并取出彈體內部的存儲器(如圖14),通過外露接口將數據上傳至上位機并進行數據處理。

圖14 回收彈體(左)和取出內部存儲器(右)Fig.14 Recovering the projectile (left) and removing the internal memory (right)
用HEX Edit軟件打開讀取到的原始數據,如圖15所示。左側方框中4 B數據為幀計數,右側方框中的0xEB90為數據幀尾標志,由圖可知數據幀格式正確。上位機繪制的過載信號原始波形如圖16所示,從圖中可以看出,膛內與侵徹過載信號均為半正弦狀脈沖,侵徹過載包括彈體的結構震蕩以及噪聲,用Matlab對數據進行處理,得到膛內與侵徹過程中的過載和脈寬,同理論值進行比較后得出本次試驗數據無誤。至此證明了小型彈載存儲測試系統在實際測試環境中的工作性能穩定、可靠性高,能夠完成大量原始數據的高速記錄。

圖15 讀取的原始數據Fig.15 Raw data read

圖16 過載信號原始波形Fig.16 Original waveform of overload signal
本文通過對影響彈載存儲系統可靠性的因素進行分析,從壞塊管理、數據讀取和多級流水操作3個方面入手,通過建立以整合好塊為基礎的壞塊管理策略,以可控起始地址為基礎的數據讀取方式,以Flash存儲陣列為基礎的“邊擦邊寫”的二級流水操作方式,實現了3項基于NAND Flash的關鍵技術功能,設計了一種功能更加全面的小型彈載存儲控制器。相比于傳統的彈載存儲系統,該方案存在以下幾點優勢:
1) 構建好塊RAM表的方法可以作為幾項關鍵技術的前提,使整個系統得以串聯,更加簡單高效。
2) 壞塊管理方式不但更加簡單,而且不以犧牲數據存儲速度為前提,將構建好塊RAM的時間集中在擦除操作期間,省去了頁編程前的預匹配操作,相比于傳統方案數據存儲地速度更快。
3) 數據讀取方式更靈活,讀取速度更快。
4) 降低誤觸發的風險,提高存儲系統的可靠性。
本文提出的設計方案可以大大提高存儲設備在復雜環境中的可靠性,為高速、靈活、小型化存儲系統的研究提供思路,具有一定的實用價值。但系統同樣存在一些不足,比如:構建好塊RAM表雖然可以省去預匹配時間,卻也不得不消耗部分FPGA資源來存儲好塊地址;在存儲速度上,存儲陣列擦寫交替操作不比存儲陣列交替頁編程操作,如果要求系統搭載極高的采樣率,則不利于數據的超高速存儲。解決這些問題是后續研究的重點。