羅東明,馬 躍,董 旭,連文濤
(北京機電工程研究所,北京 100074)
當前國內的裝備保障與測試系統大多是基于Windows XP系統開發,但裝備系統內部任務具有高實時性的特性,因而當前裝備測試系統無法滿足其測試實時性的要求;其次,當前測試設備普遍使用總線板卡的方式進行設計,使得測試設備體積大,板卡資源存在極大冗余,進而使得測試設備成本較高。同時基于軟件的并行測試受到測試設備處理器性能的影響,軟件的并發運行并不是真正的硬件并發執行,而僅僅是對系統時間片的分時復用。因而,開發一款高實時性、并發處理能力強的裝備測試系統具有重要的現實意義,能夠極大的提高對裝備系統測試的實時性,進而提高測試的覆蓋性。
由于較高的靈活性和相比專用集成電路具有更低的價格,(FPGA ,field programmable gate array)正被廣泛應用到嵌入式系統中。同時現代FPGA的靈活性被其動態可重構(dynamic partial reconfiguration)功能進一步增強[1]。該特性能夠在運行過程中,實現用戶動態改變FPGA特定區域邏輯資源的功能,并且在改變過程中其他區域的邏輯功能不受任何影響,同時配置的次數和時間不受限制[2]。FPGA內部集成的硬件邏輯使其實現了真正的并發處理與運行,而動態配置的特性,使得在運行中修改部分邏輯資源功能得以實現。
隨著開源的Linux系統在嵌入式中的廣泛應用,Xilinx公司推出了ZYNQ系列的FPGA,該系列的FPGA將處理器的軟件可編程能力與FPGA的硬件可編程能力實現了完美的結合。ZYNQ系列的FPGA,保留了V系列FPGA的可重構特性[3]。其支持通過PS控制重構端口進行重構,從而實現在運行過程中對硬件邏輯資源功能的動態改變。本文基于開源Linux系統,并結合ZYNQ系列FPGA的可重構特性,設計了具有高并發處理能力的實時裝備測試系統,提高了裝備測試系統的測試實時性,增強了測試過程中并發處理的能力,進而提高了測試的可靠性與準確性。整個裝備測試系統是基于ZYNQ系列FPGA進行開發。
裝備測試系統是指采用計算機控制,能夠實現自動化測試的系統,裝備測試系統廣泛應用于設備調試、故障檢測和定位、系統狀態確認等場合。裝備測試設備是在總裝廠或技術陣地完成裝備技術準備和周期性維護測試工作的維護設備,其在測試過程中需要與裝備控制裝置進行指令交互以及實時采集裝備的關鍵信號并依據判據完成測試,從而確定裝備的性能狀態。

圖1 系統總體結構
目前國內裝備測試系統主要是基于標準軟件開發環境二次開發的測試平臺,平臺一般依賴用戶及操作系統,測試流程庫是基于數據庫開發,具有一定的二次開發能力,但系統實時性較差,同時內部的并發測試完全通過軟件調度實現,導致測試過程并行執行能力較差,進而限制了對裝備瞬時狀態的監測能力。
為了方便用戶進行測試序列開發和操作,另一種測試系統是通過用戶鼠標拖拽方式實現測試流程的開發與儀器配置,縮短了測試程序集的開發周期和難度,但系統實時性較差,同時由于其測試程序執行過程為順序執行,因此其不具備并發測試的功能。
以上提及的裝備測試系統,實時性和并發測試能力都無法滿足當前裝備測試的實時性需求,因而,有必要開發一款實時性強且并發執行能力好的裝備裝備測試系統。
本文提出的裝備測試系統是在嵌入式Linux系統的基礎上,以FPGA為主控制器并結合其部分動態可重構配置的特性,實現測試任務的硬件并發執行,進而滿足飛航裝備對裝備測試系統實時性以及并發性的需求;FPGA部分動態可重構的技術使得裝備測試系統能夠進行軟擴展,減少了由于被測對象的改變而帶來的硬件修改,縮短了設計周期;同時該特性使得裝備測試系統的主控制器體積大大降低,進而推動測試系統向著小型化、高集成發展。系統總體結構見圖1所示。
整個裝備測試系統由底層的硬件系統和基于開源Linux的嵌入式軟件系統兩部分組成。底層的硬件系統是由硬件描述語言VHDL進行設計,其中包含存儲子系統、ICAP(internal configuration access port )控制器、以及裝備測試硬件重構任務(HT,hardware task)[4]。軟件部分用于實現在Linux多線程的基礎上控制底層硬件。
在整個裝備測試系統中,測試過程是由硬件重構測試任務和軟件任務共同完成,硬件重構測試任務是運行在FPGA硬件邏輯資源上功能電路,其用來執行相關信號的采集與數據傳輸。軟件任務實現對硬件重構測試任務的控制,輔助系統上層與底層FPGA資源進行信息交互。
用戶根據測試需求,向裝備測試系統發起重構請求,即此次測試過程包含的硬件重構測試任務數量,系統通過ICAP控制器加載相應硬件重構測試任務的配置文件,為測試提供相應的儀器資源;硬件重構測試任務是根據測試功能通過Xilinx的PLANAHEAD工具進行生成,生成之后將其存儲在外部存儲器中;在硬件重構測試任務建立之后,系統為每一個任務建立相應的軟件任務,以便硬件重構測試任務與重構系統進行數據交互和控制作用。

圖2 存儲子系統執行流圖
在整個過程中,系統的內存用來存儲硬件重構測試任務的數據以及系統數據。系統的外存用來存放硬件重構測試任務的部分比特文件和重構任務放置的位置信息配置文件。位置配置文件中描述了每一個硬件重構測試任務的放置信息。在測試過程中,裝備測試系統通過ICAP控制器加載相應的硬件重構測試任務,通過查詢位置配置文件中任務位置信息,在線修改配置文件的位置配置信息,將比特文件加載到重構任務指定的位置,實現對測試系統中測試資源的動態配置;在裝備測試系統執行測試的過程中,通過系統上層的軟件任務實現對硬件重構測試任務的數據讀寫,完成對裝備系統的測試過程。
動態重構系統為軟件和硬件提供了統一的系統服務和編程接口。在Linux多線程模型的基礎上,系統增加了對硬件重構任務的支持。在用戶角度中,通過委托任務使得硬件任務和軟件任務具有相同的使用機制,方便了用戶使用FPGA動態可重構特性。
重構硬件任務是用戶基于硬件描述語言開發的具有特定功能的邏輯電路,包含與上層系統進行同步的同步邏輯部分以及用戶自定義的功能模塊;ICAP控制器負責從外存中加載相應硬件重構任務的比特配置文件,并配置到指定的重構區域中;存儲子系統負責硬件重構任務與系統內存間進行數據交互;Linux內核負責提供系統開發過程中依賴的庫文件以及底層模塊的驅動文件;應用軟件層提供用戶用于重構過程控制的系統接口,包括基于Linux系統調用的重構軟件任務以及委托任務創建、硬件任務動態配置以及任務間進行數據同步。
重構過程是由硬件任務、軟件任務和委托任務共同完成的,硬件任務是運行在FPGA硬件邏輯資源上功能電路,而軟件任務是基于Linux多線程機制進行開發的特定軟件線程。委托任務是硬件任務與用戶之間的橋梁,通過委托任務,用戶可以像控制軟件任務一樣控制硬件任務,包括向硬件任務發送數據和命令。
在系統運行中,用戶向系統提出重構任務請求,請求內容包含此次重構包含的硬件任務和軟件任務數目,重構系統根據用戶請求的硬件任務數量,通過ICAP控制器將硬件任務比特配置文件從外部存儲中重配置到FPGA內部;相應的比特配置文件是通過Xilinx的PlanAhead工具開發并生成,存儲在外部存儲器中;在硬件任務建立的同時,系統為每一個硬件任務建立相應的委托任務,用于硬件任務與上層系統進行數據和指令的交互;與此同時,建立相應數量的軟件任務用于與硬件任務并行執行計算任務。在重構過程中,硬件任務在本地完成數據處理和外圍輔助電路控制,然后通過存儲子系統將處理后的數據轉發到系統軟件上層,以便其他軟件任務或硬件任務調用,最終完成總體的裝備測試任務。
在裝備測試過程中,應用系統上層需要與硬件重構測試任務進行數據交互,為此,本文設計了存儲子系統用于實現FPGA底層硬件邏輯與軟件上層之間的信息交互。整個存儲子系統由內存控制器、任務仲裁器、地址轉換器、存儲管理單元以及附加控制器組成,存儲子系統執行流程見圖2所示。
2.1.1 硬件重構測試任務向存儲系統讀取數據
硬件重構測試任務向任務仲裁器申請讀數據請求,經仲裁之后,任務仲裁器將讀數據地址和讀取長度發送到突發訪問轉換器,轉換器根據當前頁面的大小對讀取地址進行轉換,將地址轉換為短地址以適應存儲頁面的大小。突發訪問轉換器將轉換后的地址發送到內存管理單元(MMU,memory management unit),MMU通過附加控制器從CPU獲取當前活動進程的轉換表基地址作為下面地址轉換的基準。MMU首先在本地的轉換檢測緩存區(TLB,translation lookaside buffer)中查找相應的地址信息,如果在TLB中找到相應的地址信息,則將小頁基地址信息返回到物理地址生成邏輯,如果在TLB中沒有找到相應的信息,那么MMU將委托內存控制器向CPU查詢地址信息,并將生成物理地址依賴的中間地址信息返回,然后在MMU中生成相應的物理地址,并將物理地址發送到內存控制器,通過內存控制器向CPU讀取物理地址中的數據,并將數據經過AXI總線返回到硬件任務。

圖3 硬件重構任務結構
2.1.2 硬件重構測試任務向存儲系統寫入數據
硬件重構測試任務向任務仲裁器申請寫數據請求,經仲裁之后,任務仲裁器將寫數據地址和寫數據長度發送到突發訪問轉換器,轉換器根據當前頁面的大小對寫地址進行轉換,將地址轉換為短地址以適應存儲頁面的大小。寫操作的地址轉換過程與讀操作的一致。內存控制器將寫物理地址發送到CPU,CPU回復內存控制器寫地址準備就緒信號,然后硬件任務通過任務仲裁器向系統內存中的物理地址寫入數據。
整個裝備測試系統基于Linux開源系統。在Linux系統中,應用程序是基于多線程編程模型進行開發的,通常由線程、消息隊列以及信號量等實體組成。并且Linux對這些實體進行了嚴格的定義和接口說明。因此,為了充分發揮Linux實體的強大功能,裝備測試系統開放給用戶的最小控制單元是重構任務。重構任務分為硬件重構測試任務、軟件任務。軟件任務是運行在系統CPU之上的不占用硬件邏輯資源的任務,主要的功能是實現系統上層對硬件重構測試任務的控制。重構硬件測試任務是放置在指定邏輯位置的基于硬件描述語言實現的單元,其在運行過程中需要接收CPU的控制,并且訪問系統內存中的數據。下面將重點介紹硬件重構測試任務的設計。
硬件重構測試任務是放置在指定槽位的硬件邏輯,需要接收CPU的控制,并且訪問存儲系統中的數據。為了統一管理,需要每一個硬件重構測試任務都具有相同的接口;同時在硬件重構測試任務訪問存儲系統的過程中,同一時刻只能有一個任務進行訪問,因而,需要建立一個同步機制,使得每一時刻訪問存儲系統只能有一個硬件重構測試任務。
在每一個硬件重構測試任務中,都有一個同步狀態機(synchronization finite state machine),用來管理每一個任務對裝備測試系統的存儲子系統訪問。
每一個重構任務都有4個FIFO。其中的兩個用于硬件重構測試任務與CPU之間進行數據交互,另外兩個用于存儲子系統的訪問。同步狀態機控制硬件任務與CPU之間的數據交互過程,具體過程見圖3所示。在測試系統開發過程中,用戶可以通過修改用戶邏輯進而改變每一個硬件重構測試任務的功能,實現飛航裝備系統的測試資源在線重配置。
在ZYNQ系列的FPGA中,提供了ICAP和PCAP兩種端口支持重構[5],但是PCAP在加載比特文件的過程中會阻塞(block)CPU,這不滿足重構系統的要求。因而,采用了ICAP端口。
ICAP控制器主要負責將內存中的硬件重構測試任務的配置文件加載到ICAP端口,實現對硬件重構測試任務的在線重配置。在這個過程中,如果直接使用CPU進行比特文件的加載,會導致系統頻繁進行讀寫操作,則使CPU發生阻塞。同時使用CPU進行比特文件加載的速度有限,這會使整個重構過程變的較慢,失去重構任務實時加載的特性。因而,本文采用DMA(DMA,Direct Memory Access)控制器與ICAP相結合的設計。
ICAP控制器中(圖4所示),DMA控制器接收PS的控制,直接從外存中將數據加載到位轉換狀態機中,用于部分重配置,這個過程中,CPU只負責過程的開始和結束,在傳輸的過程中并不會占用CPU的資源,因而,有效的降低了CPU的負載,同時加快了重配置的速度。

圖4 ICAP控制器結構
本文提出的ICAP控制器支持在線修改比特文件的配置位置,根據比特文件的結構信息,如圖5所示,在每一個部分比特文件中都有一個獨一無二的32位地址,稱為FAR(frame address register),來決定這個部分比特文件配置的起始位置,通過修改部分比特文件的FAR,實現對部分比特文件放置到其他重構位置。在比特文件中包含有一個CRC校驗碼,其位于比特文件的尾部,用于對配置文件的有效性進行檢查。為了使修改之后的比特文件能夠正確載入到配置區域,需要將配置過程的CRC校驗禁止[6-8]。

圖5 比特文件結構
在重構裝備測試系統中,DMA控制器和ICAP控制器驅動程序部署在Linux系統下[9],實現對ICAP控制器的調用與操作,提高了重構系統的二次開發效率。

圖6 裝備測試系統驗證
本文提出的測試系統支持用戶根據自身功能需求進行二次開發。開發過程具體如下。第一部分是源文件準備:采用C語言編寫軟件任務;采用硬件描述語言編寫硬件任務;根據系統設計修改重構系統的配置文件,以及對系統和平臺進行描述。第二部分是生成流程:使用Linux下的交叉編譯環境對系統的軟件任務進行編譯生成相應的可執行文件;執行腳本文件,啟動Xilinx EDK軟件工具生成重構系統的系統網表文件以及重構任務的網表文件[10-12],然后在Xilinx PlanAhead軟件對重構區域進行劃分并生成對應的比特配置文件。在系統運行過程中,通過FPGA系統板與上位機交互進行實現。上位機向FPGA系統板發送重構請求,系統板接收指令并通過NFS文件系統加載指定的比特文件完成硬件重構任務的加載,同時創建軟件任務,實現軟件任務與硬件任務并行處理數據,在處理數據的過程中,重構硬件任務通過委托任務與系統進行指令交互,并結合存儲子系統實現與系統內存的數據交互。系統板最終將數據結果返回上位機進行顯示,供用戶對結果進行查看。
為了驗證系統的有效性,本文基于裝備測試系統設計了“硬件重構測試任務+軟件任務”的驗證試驗,用來驗證裝備測試系統功能的正確性。首先,針對裝備系統測試過程中測試資源的需求,設計了典型的硬件重構測試任務,包含用于實現繼電器控制的硬件重構測試任務、用于處理經外圍光電隔離電路之后的數字量采集硬件重構測試任務以及用于進行串并轉換的422通信硬件重構測試任務。實驗過程中通過在線重構設計的典型硬件重構測試任務,并通過軟件任務實現對硬件重構測試任務的控制,模擬裝備系統測試過程,從而驗證系統的有效性。
驗證重構系統所使用的主控芯片是Xilinx Zynq-7000系列xc7z020clg484-1 FPGA[13],其內部集成了雙ARM內核以及具有豐富的片上邏輯資源和外設,能夠滿足重構測試系統的驗證需求。
在驗證過程中,首先通過上位機串口向運行于FPGA系統板之上的重構測試系統發送測試請求,該請求包含測試過程中所包含的硬件重構測試任務和軟件任務,重構系統接收用戶的測試請求,并根據指定的軟件與硬件重構測試任務的類型,通過網絡文件系統讀取存放在上位機指定路徑的硬件重構測試任務,然后通過ICAP控制器完成動態重配置,以及在重構系統上層創建相應的軟件任務,實現對硬件重構測試任務的控制。在重構系統測試過程中,硬件重構測試任務并行的實現對數據的采集以及數據的傳輸,通過軟件任務實現對采集數據的上傳和通信數據的交互,最后通過串口將測試過程數據進行輸出。
在驗證過程中,通過對422通訊任務、繼電器控制任務和數字量輸入采集任務過程數據的記錄,具體結果詳見表1所示,通過對原始數據分析可知,重構裝備測試系統創建的硬件和軟件測試任務在與被測對象測試中運行正常,各任務之間信息交互正常,且FPGA中的控制邏輯與外圍的輔助電路功能執行正常。

表1 結果分析
傳統裝備測試系統多數通過采用PXI總線架構[14],各功能板卡均通過PXI總線實現互聯和系統集成[15],本文的驗證過程如通過傳統測試設備實現,則需要3塊PXI功能板卡,分別是422通訊板卡、繼電器板卡、數字量采集板卡,每塊板卡均需要一塊FPGA作為板卡主控芯片參與邏輯控制,則完成上述驗證試驗功能需要3塊具有一定規模的FPGA芯片,除此之外,還需要一塊標準零槽控制器作為系統的主控制單元[16-20];而本文提出的基于動態重構技術的測試系統,其僅需要一塊具有動態重構功能的FPGA芯片,該芯片即作為操作系統的運行載體,又是各重構任務加載的載體,即二者共享FPGA的片上資源,極大的提高了FPGA資源利用率,同時隨著系統所需芯片數量的較少,也極大地降低了系統的硬件成本。
綜合上面實驗,首先證明了重構系統成功的完成硬件裝備測試任務的動態加載以及軟件任務的創建。其次重構裝備測試系統較傳統的裝備測試系統體積小、功耗低、在測試資源的分配和管理上具有很好的靈活性。最后,由于重構測試系統減少了FPGA芯片的數量,從而降低了測試設備成本,推動裝備測試系統向著高度集成化、低成本、測試資源分配靈活的方向發展。
本文針對當前裝備測試系統所存在的測試過程實時性差、測試資源冗余以及并發測試能力弱的問題,提出了基于FPGA部分動態可重構技術的測試系統,并搭建了實際的驗證系統,對重構測試系統的功能進行驗證,實驗結果證明,本文提出的重構測試系統可有效減少測試系統功能單元的FPGA使用數量,提高資源利用率,并充分利用硬件重構任務并發執行特性,提高測試任務實時性;當前重構測試系統僅驗證了簡單的總線通訊和狀態量采集控制功能,尚未開展復查測試任務的充分驗證。