作者:閻穩,王國東,姜運生
機載計算機的幾何結構一般采用高強度機箱和底板來連接各功能模塊。底板總線類型大部分采用VME總線規范。VME總線是1981年Motorola等公司為歐洲板(Euroboard)設計的總線,是歐洲通用模塊(VME-Versa Module Europe)的首字母縮寫。經過二十多年的演變發展,已經成為美國國家標準。它以高性能、并行性、實時性和高可靠性四大特點贏得機載計算機青睞,模塊結構具有良好的抗震性,抗沖擊能力。本文結合我們的實際工作,重點介紹VME總線接口邏輯的工程實踐方法。
VME總線簡介
VME總線建立了8位、16位、32位和64位并行傳輸計算機體系,能夠實現單個或多個微處理器共存的對等分布式系統。VME總線是一種緊耦合(Closely coupled)總線,將微處理器、數據存儲器以及外設控制器通過總線統一互聯起來,實現高速通訊。物理上采用96芯或160芯標準連接器,各功能模塊分別插在其中某一個插槽(slot)中。圖1是VME總線系統的通用結構,它包括4個子總線,即數據傳輸總線,優先級中斷總線,仲裁總線,工具總線。表1是其中數據總線和優先級中斷總線主要信號的定義。
在VME總線的4類子總線中,數據傳輸總線(DTB-Data Transfer Bus)和中斷優先總線(PIB-Priority Interrupt Bus)包含了主要信號。VME總線允許多個處理器控制總線,所以必須有系統總線管理者,即系統控制器。它位于VME總線的一號插槽上,功能包括:提供系統時鐘、總線仲裁器、中斷響應菊花鏈驅動器和總線定時器,還可能包括串行時鐘驅動器、電源監視器功能。總線周期類型主要由地址修飾碼AM(Address Modifer)規定,主要包括讀周期、寫周期、塊讀周期、塊寫周期、信號復用周期等周期。尋址單元以字節為單位,可以進行單字節、雙字節、3字節、4字節,甚至8字節存取。字節界限可以是偶地址或奇地址,可以通過數據選通信號DS1*和DS0*,LWord* 以及A2 A1地址線的組合決定。
VME數據總線通用訪問邏輯設計
VME總線各功能模塊現在一般設計為智能型,把自己映射成整個VME總線地址空間的一部分。在模塊內部一般都有自己的CPU管理模塊內功能接口,然后通過雙口存儲器和主控模塊交換數據。這樣,對各功能模塊的訪問統一轉換成對存儲器的訪問。圖2是我們為殲轟七機載計算機設計的VME總線的I/O 模塊,下面以此為例說明DTB總線控制邏輯。
在圖2中,板內CPU可以根據需要選擇,內總線隨CPU型號而變化,但必須對底板提供VME總線接口。控制邏輯需要處理的主要信號如表1所示,其中信號方向從VME總線進入本模塊為輸入,否則為輸出。
在表1中可以看到,數據線只有32-Bit,地址只有31位,如何實現64Bit傳輸,這涉及到信號復用(Multiple)問題。在32Bit以下模式,地址線和數據線是獨立的兩組信號。在64Bit模式下,將訪問周期分為兩個相位階段(Phase),階段是地址階段,用D31..D0的數據線傳輸高32Bit地址。在第二階段是數據階段,利用31Bit地址A31..A1以及長字選擇LWord*作為高32Bit數據。顯然,在64Bit模式下,從方模塊應該設計一個64Bit地址鎖存器,將相位階段的地址穩定鎖存,保證第二階段的數據尋址正確。6位地址修飾碼AM5..AM0用來定義本次總線尋址模式,即地址寬度和傳輸性質,如16地址塊傳輸等,可以產生64種尋址類型。
圖2中的I/O模塊是作為系統從設備,當主控方選擇訪問時,控制邏輯首先應該產生系統選擇信號,以啟動模塊內數據通路。可以用以下方法實現:
…
VA15,VA14,VA13 pin; // VME 總線地址高 3 位
VA3,VA2,VA1 pin; // VME 總線地址低 3 位
VAM5..VAM0 pin; // VME 總線地址修飾碼
VAM node;
VDS1,VDS0 pin; // 字節選擇。
VAS,VRW pin; // 地址選通、讀寫信號
…
VAM = VAM5 & !VAM4 & VAM3 & !VAM2 & !VAM1 & VAM0; // = 10.1001: 短管理訪問
// 為雙口普通讀寫產生片選信號
!CS_VME = !VAS & VIACK & VAM & (VAddr 》= StartA ddr) & (VAddr 《= EndAddr);
// VME 數據總線使能
!VDEN = (!VDS1 # VDS0) & !CS_VME #
// 普通DTB讀寫時要開門
!VIACK & !VIACKIN & (IntID == MyIntID);
// 應答中斷時也要開門
VDIR = !VRW; // VME 數據方向
…
上面一段邏輯代碼,主要判斷地址修飾碼AM和地址映像范圍,產生VME總線訪問啟動信號,亦即雙口RAM的片選信號CS_VME。為增強信號驅動能力,在模塊輸出數據信號前插入雙向驅動。VDEN信號就是數據驅動器的開門信號,數據方向控制信號VDIR由讀寫信號反相后產生。當從模塊完成DTB周期后,應該驅動DTACK*,通知主控模塊本次訪問完成。這個信號各個從模塊都要驅動,一般在控制邏輯產生應答后加OC驅動(如54F05)。其上拉電阻由底板統一,若由各模塊自行上拉,勢必造成并聯電阻值變小,灌電流變大,嚴重影響信號驅動能力,使各模塊不能同時工作。這個信號產生的邏輯涉及到下面的菊花鏈中斷處理,詳細邏輯方法可參考下節。
菊花鏈中斷優先級邏輯設計
VME優先級中斷機制采用菊花鏈,它用于在板與板之間傳送一電平信號。它始于槽而終結于一槽。系統可以提供IRQ1*~IRQ7*共7個中斷請求,其中IRQ7*具有優先級。當中斷處理器處理中斷請求時,中斷應答菊花鏈驅動器啟動中斷應答菊花鏈工作,以確保只有一個中斷器響應正在進行中的中斷應答周期。整個原理示意如圖3所示。當應答某個中斷時,首先把IACK*信號驅動為低,表示當前周期是中斷應答周期,同時將中斷識別碼通過數據線傳輸,而中斷響應主要由中斷響應輸入(IACKIN*)和中斷響應輸出(IACKOUT*)組成應答菊花鏈。若某一模塊發出中斷請求,并且響應的中斷識別碼和自己匹配,同時要接到上傳下來的有效的IACKIN*信號。若是自己的中斷響應,應該堵塞IACKOUT*信號,使之為高電平,否則應該繼續下傳IACKOUT*信號。顯然,若某一插槽為空或者不具備中斷響應能力,應該將IACKIN* 和IACKOUT* 短接,否則菊花鏈將中斷。當中斷響應后,要及時撤除中斷請求。下邊邏輯實現菊花鏈優先級中斷,其中狀態機處理包含數據總線訪問周期和菊花鏈中斷實現的所有邏輯。
// VME 中斷管理邏輯。
VCLK pin; //VME 總線時鐘,16MHz
VMID3..VMID0 pin; //底板為該模塊分配的標識
VIACK pin; //VIACK = 0: VME 中斷應答周期
= 1: VME 普通總線周期
VIACKIN ,VIACKOUT pin; //中斷應答菊花鏈輸出/輸出
Qv2,Qv1,Qv0 pin istype ‘REG’; //VME 總線操作控制狀態機
VDTACK pin istype ‘REG’; //VME 總線讀寫完成應答,
//高有效,經OC 門后低有效
VIRQ3 pin istype ‘REG’; //向VME之中斷請求
VD3..VD0 pin istype ‘REG’; //要發送的中斷應答向量(具 有輸出 /OE 之緩沖)
MyIntID = [0,1,1]; //通過 VA3 VA2 VA1 送來的中
斷應答號,本模塊使用 IRQ3*
圖3 LACKIN*/IACKOUT*菊花鏈
MyVector = [VMID3..VMID0]; //本模塊使用的中斷應答向量
IntID = [VA3,VA2,VA1]; //VME 送來的 IRQ 號
IntVec = [VD3..VD0]; //本模塊應答時的中斷向量
// VME 中斷申請 和 清除 狀態編碼
IntS0 = ^B0;
IntS1 = ^B1;
EQUATIONS
// 以下語句確立VME 總線器控制由系統時鐘管理
[Qv2,Qv1,Qv0].clk = VCLK;
VDTACK.clk = VCLK;
IntVec.clk = VCLK;
VIRQ3.clk = VCLK;
IntVec:= !MyVector; // 中斷應答向量隨時準備放出去
// 放出中斷應答向量。
IntVec.OE = !VIACK & !VIACKIN & // 中斷應答周期
(IntID = MyIntID); // 而且是我們的
。.
//==========================================
// VME 總線周期控制之狀態機 (包括中斷應答)
//==========================================
State_Diagram [Qv2,Qv1,Qv0];
State SV0:
VIACKOUT = 1; // 不能亂傳中斷應答
VDTACK := 0; // 不能隨便應答
if (!RST) then SV0
else if (!CS_VME) then SV1 // VME 普通讀寫
else if (!VIACK & !VIACKIN) then SV4
else SV0; // 原地待命
State SV1: // 普通讀寫周期
VIACKOUT = 1; // 不傳中斷應答
VDTACK := 0;
if (!RST) then SV0
else SV2; // 順延
State SV2:
VIACKOUT = 1; // 不傳中斷應答
VDTACK := 0; // 還在干
if (!RST) then SV0;
else if (!BUSYL) then SV2 // 雙口正忙
else SV3
with { VDTACK := 1;}
State SV3:
VIACKOUT = 1; // 不傳中斷應答
VDTACK := 1; // 準備好了
if (!RST) then SV0
else if (!CS_VME) then SV3 // 本周期沒完沒了
else SV0
with {VDTACK := 0; }
// SV4..SV7 為中斷應答周期
State SV4:
VIACKOUT = H; // 情況不明,先別往下傳
VDTACK := L;
if (!RST # VIACK # VIACKIN) then SV0
else if (IntID == MyIntID) then SV6 // 應答我們的
with {
VDTACK := H; // 早已準備好
}
else SV5 // 應答別人的
with {VIACKOUT = L; } // 趕快往下傳
State SV5:
VIACKOUT = L; // 傳。傳.傳
VDTACK := L;
if (!RST) then SV0
else if (!VIACK & !VIACKIN) then SV5
// 還在中斷應答周期
else SV0; // 總算熬到結束了
State SV6:
VIACKOUT = H; //是自己的,不能往下傳
VDTACK := H;
if (!RST) then SV0
else if (!VIACK & !VIACKIN) then SV6
// 還在中斷應答周期
else SV0;
State SV7:
goto SV0; // 非法狀態,趕快轉
//=========================================
// 本狀態機實現 VME 總線中斷請求和清除控制
//=========================================
State_Diagram [VIRQ3]
State IntS0:
//對 011AH 讀寫,觸發對 VME 中斷請求
if (!RST) then IntS0
else if (!CS_ALLP & (IOAddr == VMEIRQReg))
then IntS1
else IntS0; // 老實呆著
State IntS1:
// 此狀態時,保持中斷請求
if (!RST ) then IntS0
else if (!VIACK & !VIACKIN & (IntID == MyIntID))
then IntS0 // 已經應答
else IntS1; // 不應答不走
END
結束語
VME總線的應用愈來愈廣泛,各種機載計算機系統總線都在逐漸向它靠攏。按照以上思想設計的機載計算機已經經過了試飛階段,實踐也證明VME總線性能和可靠性優于以前的各種總線。
責任編輯:gt
評論
查看更多