于 戈,胡翔宇,曾凡銓,馮 偉
(1.上海航天控制技術研究所,上海 201109; 2.上海市伺服系統工程技術研究中心,上海 201109)
在運載火箭系統中,發動機噴管采用伺服機構驅動其搖擺,近年來,大功率航天電動伺服機構技術在國內外得到了深入研究,電動伺服系統的綜合性能已逐步超越了液壓伺服系統,得到了越來越多的應用[1]。在電動伺服系統中通常采用電機作為能量轉換元件,永磁同步電機因具有高功率密度、高效率和高可靠性等優點得到了廣泛應用。然而,作為一個強耦合、多變量的非線性系統,永磁同步電機在控制過程中必須執行復雜的解耦控制算法。
伺服控制器作為驅動單元的核心,要求具備很高的硬實時性和充分的可靠性。伺服控制過程通常需要反饋信號采集、伺服控制算法計算和通信等功能,整個任務的控制周期決定了伺服系統的采樣率,而高速的采樣率能明顯提升系統的動、靜態性能。另一方面,隨著控制算法的復雜化和通信的高速化,考慮到軍用元器件使用的局限性,通常單中央處理器(Central Processing Unit, CPU)難以滿足功能需求。
在航天伺服系統中通常具有單臺控制器驅動多路伺服機構的特點,這給伺服控制計算單元提出了更高的要求。當前在伺服控制系統中,基于CPU+FPGA的架構已經成為熱門方案[2],在CPU和現場可編程門陣列(Field-Programmable Gate Array, FPGA)間多采用雙口隨機存取存儲器(Random Access Memory, RAM)進行數據傳輸實現數據的緩存和共享,高速可靠的數據傳輸成為系統的關鍵單點。現有防止雙口RAM訪問沖突的方式各種各樣,有基于旗語邏輯的令牌仲裁方式[3-5]、中斷等待方式[6-7]、優先級搶占方式[8-9]、循環緩沖方式[10-14]等。其中令牌仲裁方式和優先級搶占方式類似,設計了雙口RAM數據訪問的優先級機制,經握手后確定訪問順序,優先級低者需進行等待或再次請求,一方面增加了握手等待時間,一方面需要進行等待,占用了CPU利用率。中斷等待方式占用了CPU的高優先級中斷資源;循環緩沖方式機制復雜,建立緩沖機制的開銷往往占用較長的CPU時間,適用于大量數據傳輸的系統中。
綜上可知,雙口RAM的防沖突機制都是為了不在同一時刻占用同側總線和同一存儲空間。本文直接從最根本的訪問時間出發,基于DSP+FPGA架構,在FPGA內部實現了一個雙口RAM,提出了一種分時訪問機制,減少了等待握手環節和CPU使用率,縮短了伺服控制周期,框架設計簡單清晰,保證了數字信號處理器(Digital Signal Processor, DSP)和FPGA間數據高速無差錯的傳輸。
本文中伺服系統的架構如圖1所示,主要由DSP、FPGA和雙口RAM組成,各個模塊的主要功能如下:DSP作為主處理器,主要實現讀取雙口RAM中的數據執行伺服控制算法計算,并將遙測數據寫入雙口RAM中,同時在每次中斷執行開始時刻發出同步信號給FPGA;FPGA作為協處理器,主要實現反饋數據的采樣和通信指令的解析,同時將伺服控制用的數據寫入雙口RAM,并從雙口RAM中讀取遙測和自檢數據并上傳;雙口RAM作為數據緩存的橋梁,實現DSP和FPGA之間的數據雙向傳輸。

圖1 伺服系統架構圖Fig.1 Servo system frame
基于雙口RAM的數據傳輸分為上行數據傳輸和下行數據傳輸,上行數據傳輸指DSP將需要進行遙測的數據寫入雙口RAM的A端,FPGA從雙口RAM的B端讀取遙測數據;下行數據傳輸指FPGA將控制算法需要的反饋數據和指令信息寫入雙口RAM的B端,DSP從雙口RAM的A端讀取控制算法需要的數據。其中,下行傳輸的數據包括反饋采樣數據和通信指令數據,反饋采樣數據分別來自ADC模塊和RDC模塊,通信指令數據包括兩路1553B總線通信的指令消息。上行和下行傳輸數據地址分配分別如表1和表2所示。在航天伺服系統中,指令和反饋數據對整個航天器的運行至關重要,數據傳輸不允許出現錯誤,遙測數據表明了當前系統狀態,數據出錯會影響系統運行狀態的判斷。

表1 上行傳輸數據地址分配

表2 下行傳輸數據地址分配
在硬件雙口RAM器件中具有2套獨立的訪問控制總線,該2套總線共享數據存儲空間,當兩側的總線在同一時刻對同一數據存儲空間進行寫數據,或一方總線對數據空間寫、另一方總線對該空間讀時,該地址空間訪問數據產生競爭,此數據空間的數據會出現亂碼,應當避免這種情況的發生[15]。為了保證通信的可靠性,當2套總線同時訪問雙口RAM的同一地址空間時需要進行握手等待,這種握手機制會增加訪問雙口RAM的時間,當數據傳輸量較少的情況下,握手機制將占用總訪問時間的一半以上,且握手機制會占用額外的中斷或者是查詢時間,增加CPU負擔。特別是在伺服系統中,伺服控制算法的運算周期決定了其最終性能,因此要最大程度地減少數據傳輸時間和降低CPU任務負擔。
由表2可以看出,本系統中由FPGA傳輸至DSP的下行傳輸數據來自多個FPGA的功能模塊,這些數據需要按照規定的地址編碼放入下行傳輸數據空間內。當多個模塊對雙口RAM單側進行訪問時,同樣需要設計合理的仲裁邏輯避免同時占用總線。類似于雙口RAM雙側訪問機制,設計合理的總線訪問機制有助于簡化程序架構,提高FPGA對內部雙口RAM的寫入和讀取時間,提高采樣率和通信速率。
按模塊化設計方法,本系統將雙口RAM設計為2個模塊,頂層模塊為Prior_DRAM,例化的子模塊為Dual_Port_Memory,頂層模塊完成雙口RAM與其訪問功能模塊的接口設計。如圖2所示,各個模塊對FPGA側總線的訪問均具備獨立的數據地址總線和控制信號。圖2中,左側信號位輸入信號,右側信號位輸出信號。

圖2 頂層模塊接口圖Fig.2 Top level module interface diagram
子模塊負責上行和下行傳輸數據的存儲,接口如圖3所示,具備2套獨立的數據地址總線和控制信號,其中A端通過頂層模塊映射后與DSP相連,B端通過頂層模塊映射后與FPGA相連。

圖3 子模塊接口圖Fig.3 Sub-module interface diagram
為了保證上下行傳輸過程中數據讀寫速度最快,數據存儲子模塊內部不設優先級訪問順序,保證在一個時鐘沿實現數據的輸入和輸出。為了進一步提高數據空間存儲的可靠性,設計了上下行傳輸分段存儲防差錯機制,單側讀取和寫入數據時訪問的空間為獨立的存儲地址,實現代碼如下:
reg[15∶0]Down_RAM[127∶0];
reg[15∶0]Up_RAM[63∶0];
//下行數據傳輸:
always@(posedge Clock) begin
if(A_Port_RD&&A_Port_EN) begin
A_Port_Data_Out<=Down_RAM[A_Port_Addr[6∶0]];
//A Port Reading
end
end
if(B_Port_WE) begin
Down_RAM[B_Port_Addr[6∶0]]<=B_Port_Data_In;
//B Port Writing
end
end
//上行數據傳輸:
always@(posedge Clock) begin
if(A_Port_WE&&A_Port_EN) begin
Up_RAM[A_Port_Addr[5∶0]]<=A_Port_Data_In;
//A Port Writing
end
if(B_Port_RD) begin
B_Port_Data_Out<=Up_RAM[B_Port_Addr[5∶0]];
//B Port Reading
end
end
由上可以看出,雙口RAM存儲設計未對雙口RAM數據共享空間進行初始化,需要在頂層模塊設計初始化功能,將雙口RAM存儲空間初始化為0。
伺服系統通常以固定周期進行反饋數據采樣和給定指令的讀取、執行控制算法并進行輸出,因此,本系統中雙口RAM數據需要在此周期內完成傳輸,且盡量減少數據傳輸占用CPU的處理時間。在本伺服系統中,控制周期為50μs,其中將雙口RAM數據傳輸的過程劃分為6個事件進行設計,如表3所示。

表3 雙口RAM數據傳輸事件
得益于FPGA的硬件可編程邏輯特性,雙口RAM的B端口訪問按照固定邏輯時序進行,6個事件分布在控制周期的固定時刻,在定時周期開始的零時刻,DSP輸出一個下降沿作為同步信號給到FPGA,FPGA將當前時刻作為零時刻。雙方按照表3中的時刻對雙口RAM進行訪問。在零時刻DSP啟動事件①任務,事件①任務完成后執行事件②任務,由于DSP處理的任務為順序執行,因此A端口不會產生讀寫沖突,且設計任務用時少于20μs。在25μs時刻開始,FPGA啟動后續任務③④⑤⑥,采用順序結構保證B端口讀寫任務不會產生讀寫沖突,且設計任務用時少于20μs。
在保證時序余量的前提下將任務按時間段進行了分割,雙口RAM的A端口和B端口讀寫被分布到定時周期的上、下2個半區,避免了在同一時刻對雙口RAM的同一地址空間進行讀寫。
FPGA內部雙口RAM采用VerilogHDL完成設計編碼,在ISE下設計了仿真激勵文件,使用ModelSim進行了功能仿真,仿真時序如圖4和圖5所示。

圖4 雙口RAM A端口讀寫時序邏輯Fig.4 A-port sequential logic in dual port RAM

圖5 雙口RAM B端口讀寫時序邏輯Fig.5 B-port sequential logic in dual port RAM
由圖4可以看出,雙口RAM A端口數據讀寫最快不超過4μs;由圖5可以看出,雙口RAM B端口數據讀寫時間總占用不超過15μs。由于B端口數據寫入是由FPGA內部多個功能模塊完成,在進行總線切換時會增加數據讀寫時間,因此比A端口訪問時間更長。
為了驗證雙口RAM在數據傳輸中的可靠性,采用1553B總線進行了測試。使用PC機作為BC端,伺服系統為RT端,設計測試用例如下:
1)BC發送指令消息至RT;
2)FPGA將此消息解析為控制指令并寫入雙口RAM B端;
3)DSP從雙口RAM A端讀取控制指令并將其第3個數據逐地址加1,形成遙測數據寫入雙口RAM A端;
4)FPGA將遙測數據傳輸至BC;
5)改變指令消息數據,重復步驟1)~5)。

圖6 測試過程與數據Fig.6 Test procedures and data
測試過程與數據如圖6所示,經過上百萬次測試和數據對比分析,結果顯示雙口RAM數據傳輸誤碼率為0,上下行數據傳輸穩定可靠。
本文針對雙口RAM數據傳輸防差錯問題,設計了一種同步分時訪問機制。仿真分析與實驗結果表明:
1)同步分時機制在小數據量傳輸過程中運行穩定且具有更快的訪問速度,占用更少的CPU資源和利用率;
2)本文所提的同步分時機制適用于雙口RAM兩側CPU具有硬件同步機制的實時系統中,且需要CPU運行時序穩定可靠;
3)本文中FPGA訪問雙口RAM時仍可設計分時機制,增加總線切換開關,減少總線占用時間。