張志洲, 李東陽
(國防科技大學 空天科學學院,長沙 410073)
大氣外層空間存在很強的自然輻射,主要來自各種宇宙射線和一些高能粒子(包括高能質(zhì)子、中子、粒子、重離子等)。高能粒子具有很高的能量,很難通過屏蔽來防護。特別是隨著微電子技術(shù)的發(fā)展,微電子器件體積小、質(zhì)量輕、功耗低的特點使其迅速在航天器中得到廣泛應(yīng)用,并且它的集成度越來越高,于是出現(xiàn)了單個高能帶電粒子造成航天器邏輯系統(tǒng)紊亂,導致航天器故障的單粒子效應(yīng)(Single Event Effect,SEE)[1-2]。在眾多的SEE中,對電路影響最大的,也是人們最為關(guān)注的分別是單粒子閂鎖效應(yīng)和單粒子翻轉(zhuǎn)效應(yīng)(Single Event Upset,SEU),其中又以SEU對星載RAM的影響最大[3-4]。
單粒子翻轉(zhuǎn)效應(yīng)是人們最早發(fā)現(xiàn)的單粒子效應(yīng),所造成的邏輯錯誤不是永久的,屬于單粒子效應(yīng)中的一種軟性錯誤,通過系統(tǒng)復位、重新加電或?qū)懭肟苫謴汀F渥钪饕挠绊懯鞘勾鎯ζ鲾?shù)據(jù)位翻轉(zhuǎn) (“1”變“0”,“0”變“1”)[2,5]。飛行記錄表明,單個高能粒子引發(fā)的單粒子翻轉(zhuǎn)導致大量飛行器發(fā)生故障,輕則引起衛(wèi)星各種數(shù)據(jù)錯誤;重則導致衛(wèi)星執(zhí)行錯誤指令、發(fā)生異?;蚬收希踔潦剐l(wèi)星處于災難性局面之中。
1989年10月的太陽質(zhì)子事件期間,美國TDRS-1衛(wèi)星的RAM存儲器記錄到239次單粒子翻轉(zhuǎn)事件?!帮L云一號B”氣象衛(wèi)星于1990年9月發(fā)射后,星上姿控計算機多次出現(xiàn)單粒子翻轉(zhuǎn),從而致使衛(wèi)星姿態(tài)失控、衛(wèi)星失效;美國MSTI和IRON9906衛(wèi)星分別于1993年和1997年發(fā)生嚴重單粒子效應(yīng)而提前結(jié)束壽命?!皩嵺`四號”探測衛(wèi)星平均每天測到3.4次單粒子翻轉(zhuǎn)事件[6-9]。
由于航天器設(shè)計要求電子器件的體積小、功耗低、存儲量大、運行速度快,這就必然促使微電子器件的集成度提高,內(nèi)部的單元電路體積縮小,而每一次狀態(tài)改變所需的能量和電荷下降,其結(jié)果是抗單粒子效應(yīng)的能力下降。因此,隨著航天事業(yè)的發(fā)展和微電子器件集成度的提高,將會不斷出現(xiàn)新的單粒子效應(yīng)問題。在航天電子設(shè)計領(lǐng)域中,這已經(jīng)成為一個不能忽視的問題,必須提出有效的手段加以解決。
本文采用EDAC技術(shù)用于克服單粒子翻轉(zhuǎn)引起的航天電子系統(tǒng)故障,優(yōu)勢在于可以延長衛(wèi)星壽命,提高衛(wèi)星應(yīng)用能力,非常適合未來敏捷航天器的平臺需要。通過了解國內(nèi)外關(guān)于EDAC技術(shù)方面的研究現(xiàn)狀,本文提出了星載機EDAC模擬系統(tǒng)設(shè)計方案,給出星載機EDAC模擬系統(tǒng)硬件電路設(shè)計,完成星載機EDAC模擬系統(tǒng)軟件設(shè)計,最后進行演示驗證。
錯誤檢測與糾正(Error Detection And Correction,EDAC)技術(shù)是一種差錯控制技術(shù),也稱作糾錯編碼、數(shù)據(jù)校驗碼。它是一種具有發(fā)現(xiàn)某些錯誤和自動改錯能力的數(shù)據(jù)編碼方法,起初應(yīng)用于數(shù)字通信系統(tǒng)中用以提高數(shù)據(jù)傳輸?shù)目煽啃?,現(xiàn)在也應(yīng)用于星載處理器中用以提高星載RAM存儲數(shù)據(jù)的可靠性,防止RAM內(nèi)部因單粒子翻轉(zhuǎn)效應(yīng)引發(fā)的錯誤。其工作原理是首先對要存儲到RAM中的數(shù)據(jù)進行編碼,即在原始數(shù)據(jù)中以一定的規(guī)則加入不同方式的冗余碼,然后存儲到RAM內(nèi)。在對數(shù)據(jù)進行讀取時,依靠多余的冗余碼來發(fā)現(xiàn)或糾正數(shù)據(jù)的錯誤。
目前,國內(nèi)外航天界對存儲器的EDAC實現(xiàn)已經(jīng)很少采用EDAC專用芯片,而一般采用以下兩種方式:①將EDAC功能直接集成在航天用CPU芯片內(nèi);②使用沒有集成EDAC功能的CPU,采用FPGA或其它器件實現(xiàn)EDAC功能[10-16]。
本文設(shè)計一種EDAC系統(tǒng),可模擬因單粒子翻轉(zhuǎn)引起的翻轉(zhuǎn)故障,并可能利用EDAC技術(shù)排除故障。一般地,EDAC過程實現(xiàn)方案大致可分為硬件和軟件兩種方案。硬件方案是通過硬件邏輯器件(分離元件、現(xiàn)場可編程邏輯器件)實現(xiàn);軟件方案是在處理器內(nèi)部,通過EDAC編碼和解碼程序進行處理。
本文采用軟件方案。在MCU和SRAM之間設(shè)計模擬邏輯模擬單粒子翻轉(zhuǎn)故障,然后通過EDAC編碼程序檢查并糾正錯誤,其結(jié)構(gòu)框圖如圖1所示。設(shè)計步驟主要包括:①設(shè)計帶有MCU、RS-232接口和擴展RAM的模擬星載機,并制板實現(xiàn);②串口接收數(shù)據(jù),進行EDAC編碼后,寫入存儲器;③讀取存儲器數(shù)據(jù)時隨機注入錯誤,星載計算機進行EDAC處理,將錯誤數(shù)據(jù)和糾錯數(shù)據(jù)發(fā)送回PC機記錄。
圖1 星載機EDAC模擬系統(tǒng)方案
目前,絕大多數(shù)的高可靠微處理器中都采用了一定的EDAC技術(shù)。EDAC有多種編碼方式,不同的編碼方式有不同的檢錯和糾錯能力。例如奇偶校驗碼只能檢測出一個碼字中的奇數(shù)位錯誤,但是不能定位錯誤更不能糾正錯誤。其他的,如漢明碼可以糾正一個碼字中任何1位錯誤,檢測出兩位錯誤,但是對于多位錯誤不具有任何的檢錯和糾錯能力。當然,還有許多其他的編碼方式,可以檢測和糾正一個碼字中的多位錯誤,但是它們的算法往往更為復雜,增加了編碼器和譯碼器的實現(xiàn)難度,增加了電路面積開銷,而且關(guān)鍵路徑中的延時也會變得更大。
漢明碼[9,12,16]有多種編碼方式,如果只要求糾錯1位錯誤,那么校驗位K和數(shù)據(jù)位N之間的對應(yīng)關(guān)系如表1所示。
表1 校驗位K和數(shù)據(jù)位N之間的對應(yīng)關(guān)系表
數(shù)據(jù)存儲時常見的編碼方式為(7,4),這里闡述漢明碼(7,4)編碼的規(guī)則。
假設(shè)漢明碼共m位(HmHm-1…H2H1),包括N位數(shù)據(jù)位(DNDN-1…D1)和K位校驗位(PKPK-1…P1)。
規(guī)則1每個校驗位Pi在漢明碼中被分在位號2i-1的位置,其余為數(shù)據(jù)位,并從低到高依次排列。
以(7,4)為例,3個校驗位分別對應(yīng)漢明碼的位號為1、2、4。排列順序為D4D3D2P3D1P2P1。
規(guī)則2每1位校驗碼Hi由多個校驗位校驗,其關(guān)系為被校驗的每1位位號要等于校驗它的校驗位的位號之和。
(7,4)編碼的7位漢明碼如表2所示。
表2 (7,4)編碼的7位漢明碼表
據(jù)此,可以求出由各有關(guān)數(shù)據(jù)位形成Pi值的偶校驗結(jié)果:
P1=D1⊕D2⊕D4
P2=D1⊕D2⊕D4
P3=D2⊕D3⊕D4
根據(jù)如下關(guān)系對漢明碼進行偶校驗:
S1=P1⊕D1⊕D2⊕D4
S2=P2⊕D1⊕D2⊕D4
S3=P3⊕D2⊕D3⊕D4
記S=S3∶S1為伴隨向量。根據(jù)S3∶S1中“1”的數(shù)量和位置可以反映漢明碼的出錯情況。
若在傳輸過程中只有1位出錯,可以得出錯誤位與伴隨向量的對應(yīng)關(guān)系(即漢明碼譯碼表),如表3所示。
表3 錯誤位與伴隨向量的對應(yīng)關(guān)系表
基于漢明碼的EDAC技術(shù)的處理流程為:
(1) 編碼。根據(jù)數(shù)據(jù)位(D)計算校驗位(P)形成漢明編碼(H),將編碼H存儲到RAM中。
(2) 解碼。從RAM中讀出漢明編碼(R),計算伴隨向量(S),根據(jù)漢明碼譯碼表確定錯誤位置,并進行糾正。
(3) 錯誤處理。如果發(fā)現(xiàn)1位錯誤,則進行數(shù)據(jù)回寫。如果發(fā)現(xiàn)超過1位錯誤,則告知CPU發(fā)生多位錯誤。
在MCU和SRAM之間專門設(shè)計故障注入單元來模擬單粒子翻轉(zhuǎn)故障,然后通過EDAC編碼程序檢查并糾正錯誤。
模擬步驟如圖2所示。①數(shù)據(jù)寫入時,S1與S12相連,數(shù)據(jù)正確寫入RAM。②數(shù)據(jù)讀出時,將S1與S11相連,當S2與S22相連時,Dn位始終為“0”,當S2與S22相連時,Dn位始終為“1”。當Dn的狀態(tài)與RAM中實際狀態(tài)相反時,就是1位SEU故障。
圖2 SEU模擬邏輯圖
EDAC編碼流程:①根據(jù)數(shù)據(jù)D計算校驗碼P;②將數(shù)據(jù)寫入外部RAM的Addr地址;③將校驗碼寫入外部RAM的Addr+1地址。
EDAC解碼流程:①從RAM的Addr地址讀回數(shù)據(jù)位;②從RAM的Addr+1地址讀回校驗位;③計算伴隨向量S;④根據(jù)S4、S3、S2、S1譯碼,確定錯誤位置,并糾正數(shù)據(jù)位;⑤如果S不全為0且沒有對應(yīng)編碼,則錯誤超過1位。
按照EDAC模擬系統(tǒng)的設(shè)計需求,給出系統(tǒng)硬件架構(gòu),其總體結(jié)構(gòu)圖如圖3所示。
圖3 星載機EDAC模擬系統(tǒng)硬件架構(gòu)
(1) 單片機最小系統(tǒng)。本系統(tǒng)采用Silicon Laboratories公司的C8051F040單片機。C8051單片機是功能最強大的8位單片機之一,具有飛行經(jīng)歷。
單片機最小系統(tǒng)如圖4所示。除了電源接口、復位接口、時鐘電路,該系統(tǒng)還提供了RAM接口、通信接口等。
圖4 單片機最小系統(tǒng)
(2) RAM存儲單元。RAM存儲單元包括15位地址線和8位數(shù)據(jù)線,如圖5所示。
圖5 RAM存儲單元
(3) 通信接口。通信接口將單片機的數(shù)據(jù)TX0_A發(fā)送至上位機Txd_PC,同時將上位機的命令Rxd_PC傳遞到單片機RX0_A(見圖6)。按照上述硬件系統(tǒng)的設(shè)計要求,完成PCB的布局、布線、加工和焊接。
該系統(tǒng)的軟件算法用于模擬EDAC過程,采用(7,4)編碼結(jié)構(gòu),能驗證1位出錯時的檢錯與糾錯過程。模擬過程如下:
(1) PC機通過串口發(fā)送一個0x00~0x0F之間的16進制數(shù)給星載計算機(OBC);
圖6 通信接口
(2) OBC將數(shù)據(jù)進行EDAC編碼后正常寫入RAM;
(3) 對外部故障注入單元的某1位強制為0或1,以此造成RAM數(shù)據(jù)存儲過程中的某1位錯誤,模擬一次SEU事件;
(4) PC機發(fā)送命令控制OBC讀出RAM存儲的數(shù)據(jù);
(5) OBC對讀出的數(shù)據(jù)進行EDAC校驗;
(6) OBC將讀出的原始數(shù)據(jù)、EDAC校驗后數(shù)據(jù)、錯誤數(shù)據(jù)編碼等通過串口發(fā)送給PC機;
(7) 在PC機對處理結(jié)果進行判斷。
涉及的軟件程序包括:
(1) 系統(tǒng)的初始化。主要包括禁止看門狗定時器、配置系統(tǒng)時鐘、端口配置、串口初始化、RAM模塊測試等。
(2) 接收數(shù)據(jù)。包括測試串口通信,等待串口發(fā)送數(shù)據(jù),接收數(shù)據(jù)后再發(fā)送回PC。
(3) 數(shù)據(jù)編碼。首先將十進制數(shù)轉(zhuǎn)化為二進制序列,然后根據(jù)漢明碼算法計算以上4位有效數(shù)據(jù)的校驗碼P1、P2、P3,保存到 BinaryArray 數(shù)組中,即1、2、4位保存校驗位,3、5、6、7保存數(shù)據(jù)位。將BinaryArray數(shù)組中保存的數(shù)據(jù)(Dx)和校驗碼(Px)按照漢明碼的編碼方式進行編碼后,保存到變量CodeData中,并將CodeData寫入RAM。
(4) 數(shù)據(jù)解碼。人工調(diào)整撥碼開關(guān),強制該位為0或1,使得某數(shù)據(jù)位出現(xiàn)編碼翻轉(zhuǎn)。然后讀取內(nèi)存data_buffer[0],保存到變量ReadData中。隨后根據(jù)漢明碼,使用數(shù)組BinaryArray計算校驗碼S1、S2、S3。根據(jù)校驗碼S1、S2、S3計算S。按照前文的錯誤位與伴隨向量的對應(yīng)關(guān)系表,發(fā)現(xiàn)故障位ErrorBit,同時調(diào)整數(shù)據(jù)翻轉(zhuǎn)位ErrorBit的值,完成糾錯,并將糾錯后的數(shù)據(jù)重新保存。
演示過程分為以下幾個步驟:
(1) 打開串口助手,設(shè)置串口號COM,波特率為600 b/s,校驗位為NONE,數(shù)據(jù)位8,停止位1,設(shè)定16進制發(fā)送,然后運行程序。
(2) PC用串口助手手動發(fā)送00~0F的16進制數(shù)。如在“發(fā)送的字符/數(shù)據(jù)”一欄中填入2個8位的16進制數(shù),點擊發(fā)送。串口助手界面將顯示剛發(fā)送的數(shù)據(jù)SendData,解析出4為有效數(shù)據(jù)ValidData,給出編碼后的數(shù)據(jù)CodeData。
(3) 設(shè)置故障位,跳線、撥動撥碼開關(guān),并且再次點擊“手動發(fā)送”,編碼后的數(shù)據(jù)將寫入RAM。串口助手的界面將顯示出讀回的數(shù)據(jù)ReadData,標示出錯誤的位ErrorBit,并給出校正后的數(shù)據(jù)DecoData。
這里演示某數(shù)第0位檢錯糾錯過程。①發(fā)送16進制數(shù)據(jù)“14”,界面顯示收到發(fā)送的數(shù)據(jù)SendData位“14”,解析出4為有效數(shù)據(jù)ValidData為“04”,給出編碼后的數(shù)據(jù)CodeData為“2A”。②設(shè)置跳線和撥動撥碼開關(guān),令數(shù)據(jù)第1位為“1”,并且再次點擊“手動發(fā)送”,編碼后的數(shù)據(jù)將寫入RAM。串口助手的界面將顯示出讀回的數(shù)據(jù)ReadData為“2B”,標示出錯誤的位ErrorBit為“1”,并給出校正后的數(shù)據(jù)DecoData為“04”。其中,強制設(shè)置數(shù)據(jù)第1位為1的故障注入單元如圖7所示。
整個演示過程串口助手界面的顯示結(jié)果如圖8所示。
上述演示結(jié)果表明,星載機檢錯糾錯模擬系統(tǒng)可以模擬MCU和RAM存儲單位間的1位數(shù)據(jù)翻轉(zhuǎn),并且可以自動糾正該位錯誤。通過多次選擇不同的16進制數(shù)據(jù),上述模擬系統(tǒng)都能很好的模擬1位數(shù)據(jù)位故障,并能正確地糾正出該位錯誤。
圖7 數(shù)據(jù)位第1位強制置1
圖8 演示結(jié)果
本文設(shè)計了基于漢明碼的EDAC存儲器檢錯糾錯模擬系統(tǒng)。包括帶有MCU、RS-232接口和擴展RAM的模擬星載機,可以隨機模擬RAM存儲數(shù)據(jù)過程中的1位錯誤,此時該系統(tǒng)讀取帶有1位故障位的存儲器數(shù)據(jù)時能進行EDAC處理,將錯誤數(shù)據(jù)和糾錯數(shù)據(jù)發(fā)送回PC機記錄,自動完成檢錯糾錯過程。整個過程模擬了因單粒子效應(yīng)引起的翻轉(zhuǎn)故障,并運用了EDAC技術(shù)進行消除,達到了預期的設(shè)計效果。