机载计算机的几何结构一般采用高强度机箱和底板来连接各功能模块。底板总线类型大部分采用VME总线规范。VME总线是1981年Motorola等公司为欧洲板(Euroboard)设计的总线,是欧洲通用模块(VME-VersaModuleEurope)的首字母缩写。经过二十多年的演变发展,已经成为美国国家标准。它以高性能、并行性、实时性和高可靠性四大特点赢得机载计算机青睐,模块结构具有良好的抗震性,抗冲击能力。本文结合我们的实际工作,重点介绍VME总线接口逻辑的工程实践方法。
VME总线简介
VME总线建立了8位、16位、32位和64位并行传输计算机体系,能够实现单个或多个微处理器共存的对等分布式系统。VME总线是一种紧耦合(Closelycoupled)总线,将微处理器、数据存储器以及外设控制器通过总线统一互联起来,实现高速通讯。物理上采用96芯或160芯标准连接器,各功能模块分别插在其中某一个插槽(slot)中。图1是VME总线系统的通用结构,它包括4个子总线,即数据传输总线,优先级中断总线,仲裁总线,工具总线。表1是其中数据总线和优先级中断总线主要信号的定义。
在VME总线的4类子总线中,数据传输总线(DTB-DataTransferBus)和中断优先总线(PIB-PriorityInterruptBus)包含了主要信号。VME总线允许多个处理器控制总线,所以必须有系统总线管理者,即系统控制器。它位于VME总线的一号插槽上,功能包括:提供系统时钟、总线仲裁器、中断响应菊花链驱动器和总线定时器,还可能包括串行时钟驱动器、电源监视器功能。总线周期类型主要由地址修饰码AM(AddressModifer)规定,主要包括读周期、写周期、块读周期、块写周期、信号复用周期等周期。寻址单元以字节为单位,可以进行单字节、双字节、3字节、4字节,甚至8字节存取。字节界限可以是偶地址或奇地址,可以通过数据选通信号DS1*和DS0*,LWord*以及A2A1地址线的组合决定。
VME数据总线通用访问逻辑设计
在图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,VA13pin;//VME总线地址高3位
VA3,VA2,VA1pin;//VME总线地址低3位
VAM5..VAM0pin;//VME总线地址修饰码
VAMnode;
VDS1,VDS0pin;//字节选择。
VAS,VRWpin;//地址选通、读写信号
…
VAM=VAM5&!VAM4&VAM3&!VAM2&!VAM1&VAM0;//=10.1001:短管理访问
//为双口普通读写产生片选信号
!CS_VME=!VAS&VIACK&VAM&(VAddr》=StartAddr)&(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中断管理逻辑。
VCLKpin;//VME总线时钟,16MHz
VMID3..VMID0pin;//底板为该模块分配的标识
VIACKpin;//VIACK=0:VME中断应答周期
=1:VME普通总线周期
VIACKIN,VIACKOUTpin;//中断应答菊花链输出/输出
Qv2,Qv1,Qv0pinistype‘REG’;//VME总线操作控制状态机
VDTACKpinistype‘REG’;//VME总线读写完成应答,
//高有效,经OC门后低有效
VIRQ3pinistype‘REG’;//向VME之中断请求
VD3..VD0pinistype‘REG’;//要发送的中断应答向量(具有输出/OE之缓冲)
MyInTID=[0,1,1];//通过VA3VA2VA1送来的中
断应答号,本模块使用IRQ3*
图3LACKIN*/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];
StateSV0:
VIACKOUT=1;//不能乱传中断应答
VDTACK:=0;//不能随便应答
if(!RST)thenSV0
elseif(!CS_VME)thenSV1//VME普通读写
elseif(!VIACK&!VIACKIN)thenSV4
elseSV0;//原地待命
StateSV1://普通读写周期
VIACKOUT=1;//不传中断应答
VDTACK:=0;
if(!RST)thenSV0
elseSV2;//顺延
StateSV2:
VIACKOUT=1;//不传中断应答
VDTACK:=0;//还在干
if(!RST)thenSV0;
elseif(!BUSYL)thenSV2//双口正忙
elseSV3
with{VDTACK:=1;}
StateSV3:
VIACKOUT=1;//不传中断应答
VDTACK:=1;//准备好了
if(!RST)thenSV0
elseif(!CS_VME)thenSV3//本周期没完没了
elseSV0
with{VDTACK:=0;}
//SV4..SV7为中断应答周期
StateSV4:
VIACKOUT=H;//情况不明,先别往下传
VDTACK:=L;
if(!RST#VIACK#VIACKIN)thenSV0
elseif(IntID==MyIntID)thenSV6//应答我们的
with{
VDTACK:=H;//早已准备好
}
elseSV5//应答别人的
with{VIACKOUT=L;}//赶快往下传
StateSV5:
VIACKOUT=L;//传。传.传
VDTACK:=L;
if(!RST)thenSV0
elseif(!VIACK&!VIACKIN)thenSV5
//还在中断应答周期
elseSV0;//总算熬到结束了
StateSV6:
VIACKOUT=H;//是自己的,不能往下传
VDTACK:=H;
if(!RST)thenSV0
elseif(!VIACK&!VIACKIN)thenSV6
//还在中断应答周期
elseSV0;
StateSV7:
gotoSV0;//非法状态,赶快转
//=========================================
//本状态机实现VME总线中断请求和清除控制
//=========================================
State_Diagram[VIRQ3]
StateIntS0:
//对011AH读写,触发对VME中断请求
if(!RST)thenIntS0
elseif(!CS_ALLP&(IOAddr==VMEIRQReg))
thenIntS1
elseIntS0;//老实呆着
StateIntS1:
//此状态时,保持中断请求
if(!RST)thenIntS0
elseif(!VIACK&!VIACKIN&(IntID==MyIntID))
thenIntS0//已经应答
elseIntS1;//不应答不走
END
结束语
VME总线的应用愈来愈广泛,各种机载计算机系统总线都在逐渐向它靠拢。按照以上思想设计的机载计算机已经经过了试飞阶段,实践也证明VME总线性能和可靠性优于以前的各种总线。