>
首页 » 业界动态 » 基于PC/104的ARINC429总线接口模块的FPGA实现

基于PC/104的ARINC429总线接口模块的FPGA实现

作者:雷艳静,胡红明,王玉梅,韩立华  时间:2007-04-30 21:34  来源:

摘要:针对分立元件设计的总线接口电路复杂、可靠性差等缺点,采用FPGA技术结合高性能的HS-3282/HS-3182芯片组实现了基于PC/104的ARINC429总线接口模块。硬件上,该接口模块具有模块化强、电路简单、器件少、可靠性高等特点,软件上采用简捷方便的C语言实现多种工作方式下数据的收发功能。

关键词:ARINC429;总线;PC/104;FPGA;接口模块

引言

ARINC429总线是当代运输机、军用飞机、商用飞机和民航客机中常用的总线之一,是航空电子设备之间传输数字信息的航空工业标准。该总线上各子系统必须通过ARINC429接口才能相互通信,从而共同完成对飞机的控制、操纵、信息综合和导航的任务。因此,开发ARINC429接口模块十分必要。然而,使用普通PC机开发ARINC429接口模块,体积大,功耗高。PC/104系统作为嵌入式PC的一种,在软件和硬件上均与标准的台式PC(PC/AT)完全兼容,但它具有体积小、功耗低、可靠性高、工作温度范围宽、紧固堆叠方式安装、抗震性好等突出优点,因此是开发ARINC429接口模块的理想平台。早期使用分立元件开发ARINC429接口模块,不仅电路复杂,集成度低,开发周期长,而且性能差,可靠性低。为此,本文采用价格低、集成度高的FPGA配合高性能的HS-3282/HS-3182芯片组来设计与实现ARINC429接口模块。

ARINC429总线简介

ARINC429规范由美国航空无线电公司于1977年推出,其全称为“数字信息传输系统(DITS:Digital Information Transfer System),Mark33”,它是专为航空电子设备之间传输数字信息而制定的航空运输工业标准。目前,ARINC429已广泛应用在波音(Boeing)系列飞机(B727、B737、B747、B757、B767)、贝尔直升机以及欧洲空中客车Air2bus(A310/A320和A330/A340)等机种。我国的惯导系统也以ARINC429为主要通信总线。

ARINC429中数据字为32位,分为5段:标号(Label)、源/目标识别码(SDI)、数据区(Data)、符号状态位(SSM)和奇偶校验位(Parity)。32位的数据以脉冲形式通过屏蔽双绞线串行发送,并采用双极归零调试方式,发送的脉冲有三种电平:高电平(+10V),中电平(0V),低电平(-10V)。高电平表示逻辑1,低电平表示逻辑0,中电平为发送自身时钟脉冲,如图1所示。字与字之间由4位间隔分开,作为同步信息。ARINC429规定了两种传输速率:一种为高速100Kbit/s,另一种为低速12~14.5Kbit/s。通常高速用于军用飞机中,低速用于民用飞机中。


图1 ARINC429双极归零调制信号

ARINC429接口模块的硬件设计

设计思路
PC/104系统支持8位或16位的并行数据,而ARINC429总线上传输的是32位的串行数据,且使用的是三态码双极归零的差分信号。为此,接口模块在收发数据时首先要进行串并转换和电平转换,工业标准ARINC429芯片组HS-3282/HS23182可完成此功能。其次,由于发送和接收可并行独立工作,故需要一个核心控制逻辑来调度发送和接收过程。另外,HS-3282支持一发两收,核心控制逻辑还要负责对两个接收通道进行通道选择和通道切换。当一个通道出现故障时,核心控制逻辑要实时激活另一个备份通道。此外,为了保证数据收发的实时性,减少对主程序的干预,硬件上还应支持一些中断处理,该部分也由核心控制逻辑负责。最后,笔者还构造了一组寄存器,便于主机查询和控制。以上所有这些操作均在PC/104接口逻辑的控制下进行。根据以上思路,笔者设计的ARINC429接口模块结构如图2所示。在该图中,除了HS-3282/HS-3182芯片组之外,所有的逻辑均在一片FPGA中实现。


图2 ARINC429接口模块的组成

具体实现
(1)PC/104接口逻辑:负责对PC/104的地址总线和控制总线进行译码以产生相应的命令。由于设备地址可能产生冲突,故需在接口模块中设定跳线以便灵活地改变地址空间。

(2)接收逻辑:当检测到有数据到来时,HS-3282会自动进行串并转换并锁存数据,这时有效。该信号触发FPGA内部的接收逻辑将数据存放在相应的FIFO中(每个接收通道对应一个FIFO)。当主机需要数据时可从FIFO中读取。若PC/104设置成16位工作方式,则FIFO的宽度相应的也设计成16位,这样,主程序可通过连续读两次FIFO来组成一个32位数。每个FIFO的深度均可编程。

(3)发送逻辑:HS-3282本身自带一个8×32的发送FIFO,当发送数据时,数据首先写入该FIFO,只有启动发送时(ENTX信号有效),数据才从发送FIFO中真正发出去。数据发送过程期间,主程序不能向该FIFO写数据,直到FIFO中数据全部发送完毕(TXR有效)为止。

(4)核心控制逻辑:发送过程和接收过程之间的调度可采用固定时间片轮转法。当有服务请求并且处于服务时间内,则进行相应的发送或接收,否则,等待下一次轮转。通道的切换可通过FPGA内部的一个通道屏蔽寄存器来实现。当有数据到来、接收FIFO非空或超过设定阈值、发送FIFO为空时,都可能引发中断,核心控制逻辑负责当中断源有效时把相应的IRQ置位。

(5)寄存器组:包括中断屏蔽寄存器、中断状态寄存器、接收FIFO阈值寄存器、通道屏蔽寄存器等。它们都可通过利用FPGA内部的触发器来实现。主机可通过查询或置位相应的寄存器来进行控制。

(6)其他辅助逻辑:包括复位HS-3282并设置其工作方式、清FPGA内部的接收FIFO、读取各个FIFO空满状态以及设置输入时钟分频系数等。

ARINC429接口模块的软件设计

软件采用简捷方便的标准C语言进行编制,主要完成初始化和数据收发功能。

初始化
初始化主要完成的工作:①复位HS-3282和FPGA内部的接收FIFO;②设置HS-3282输入时钟的分频系数,使其能提供给HS-32821M的输入时钟;③选择通道;④设置控制字,包括设置字长(32位或25位)、收发频率、奇偶校验、自测试等;⑤设置工作方式,选择是中断发送/接收还是查询发送/接收。

数据发送
数据的发送包括查询发送和中断发送两种方式。在查询发送中,主程序要发送一个数据块时,它首先把该数据块分成组,每组数据的个数小于或等于8(由于发送FIFO深度为8,若每组个数大于8,则FIFO中最后的数据会被覆盖)。每发一组数据后,打开HS-3282的发送使能ENTX信号,使数据真正从FIFO中发送出去。此后,主程序要监测该过程是否发送完毕,即查询TXR是否有效。只有当前一组数据发送完毕后才能开始下一组数据的发送。以下是查询发送的一个例子。

unsignedlongPoll_Send_Msg(unsignedlonglength,unsignedlong*Send_Data_Buff)
{for(inti=1;i<=length;i++)
{write_long(*(Send_Data_Buff++));//发送一个数
if((i%8)==0)//每8个数据为一组
{enable_ENTX();//使数据从FIFO中发出去
while(!TXR);//判TXR,若为0则等待,为1则继续
disable_ENTX();//无效发送使能信号ENTX
}
}
if(length%8)//最后剩余的数据,可能为0~7个
{enable_ENTX();while(!TXR);disable_ENTX();
}
returni-1;//返回发送数的个数
}

若按照ARINC429最高发送速率100Kb/s计算,每一位数据需要10us,将FIFO中数据全部发送出去的时间为(32+4)×8×10=2.88ms。这样,每发送一组数据,主程序要等待2.88ms的时间,这个时间对航空电子设备之间的实时通信来说是相当长的。因此,查询方式发送数据不仅效率低,而且不能满足高速通信的要求。

在中断发送方式中,若主程序要发送一个数据块,它首发送一组数据(≤8个),然后使能ENTX,让数据自动从FIFO中发出去,这时主程序就结束了,CPU可以转去处理其他事情,而不必等待漫长的2.88ms的发送过程。当FIFO中数据发送完毕时,它会引发一个硬件中断,CPU收到该中断后在相应的中断服务程序中发送剩余的数据。显然,这种方式下CPU的利用率较高。由于主程序仅发送一组数据,过程非常简单,可参考查询方式的发送过程,在此不再赘述。笔者仅给出中断服务程序的函数框架:

Void interrupt NewISR(void)
{disable();//关中断
intIntStatus=read_IntStatusReg();//读取中断状态寄存器
intIntMask=read_IntMaskReg();//读取中断屏蔽寄存器
if((IntStatus&0x01)&&(IntMask&0x01))sendover();//发送完毕中断分支
if((IntStatus&0x02)&&(IntMask&0x02))not_
empty();//接收FIFO非空分支
if((IntStatus&0x04)&&(IntMask&0x04))thresh old();//接收FIFO超过阈值
EndOfInt(IRQNum);//中断结束
enable();//打开中断
}
voidsendover()
{disable_ENTX();
if(counter {for(inti=1;i<=8;i++)//8个数据为一组
{write_long(send_data[counter++]);//send_data为发送缓冲区
if(counter>=total)break;//counter为已发送的数据个数
}
enable_ENTX();}
}

数据接收
数据的接收也可有查询接收和中断接收两种方式。在查询接收中,主程序每读取一个数据都要查询接收FIFO的状态,只有FIFO非空时才能读取数据。这种方式虽然简单,但是效率较低。查询接收的函数框架如下:

Unsigned long Poll_Recv_Msg(unsigned long*Recv_Data_Buff)
{int i;intempty=read_fifo_empty();//读取FIFO的空标志
while(empty!=1)//若FIFO非空,则不断读取数据
{*(Recv_Data_Buff++)=read_long();//将数据放入接收缓冲区
empty=read_fifo_empty();//再次查询FIFO状态
i++;//数据计数
}
returni;//返回接收的数据个数
}

在中断接收方式中,主程序无需查询FIFO的状态,而是当接收FIFO非空或者超过设定的阈值时引发中断要求CPU来取数,接收数据在中断服务程序中执行。这样,CPU可以腾出大量的时间进行其他操作,而不被查询过程独占。在中断服务程序中维持一个循环队列,每次进入中断,接收的数据进入对列。主程序需要时可直接从队列中取数。对于FIFO非空产生的中断,进入中断服务程序后只要取一个数据即可,而对于FIFO超过阈值产生的中断,中断服务程序可取多个数据,直到产生中断的条件不成立为止。笔者只给出超过阈值的中断服务程序和主程序范例,前者可依次类推。

voidthreshold() 
{while(cnt)//cnt=阈值/2
{if(queue_threshold.front!=(queue_threshold.rear+1)%QueueSize)//队列不满
{queue_threshold.rear=(queue_threshold.rear+1)%QueueSize;//改变队尾指针
queue_threshold.data[queue_threshold.rear]=read_long();//进队
cnt--;
}
}
}
unsignedlongInt_Recv_Msg_threshold(unsignedlong*Recv_Data_Buff)
{inti=0;
while(queue_threshold.front!=queue_threshold. rear)//队列不空
{queue_threshold.front=(queue_threshold.front+1)%QueueSize;//改变队头指针
*(Recv_Data_Buff++)=queue_threshold.data
[queue_threshold.front];//出队
i++;//读取数据个数
}
returni;
}

有关中断问题的讨论

(1)在有些接口设计中,接收数据时只要判断DR1或DR2信号有效即触发硬件中断,要求CPU来取数。由于数据的接收具有惯性,即当接收到一个数据时很有可能后面紧跟着很多数据,若使用该方法,则会不停的进出中断,且进入中断之后只取一个数。而进出入中断的过程要进栈(保护现场)和出栈(恢复现场),其开销和进入中断服务程序之后仅取一个数据的时间相比有些“得不偿失”。本设计中,DR1或DR2信号的有效会触发接收逻辑,它自动把数据放入接收FIFO中,只有当FIFO中数据个数达到一定值时才通知CPU处理,因此,该方法可减少对主程序的干预,明显地提高了效率。

(2)中断接收数据时,虽然本设计支持FIFO非空和超过阈值两种中断方式,但实际应用中,前者的效率低下,笔者建议使用后者。在该设计中,中断的引发条件是FIFO超过阈值而不是FIFO满,这是因为若FIFO满时才产生中断,则在中断处理过程中新接收的数据可能会丢失。当然,FIFO的阈值要做适当选择。若阈值太小,则会经常进中断,效率太低;若太大,则会丢失数据。建议将阈值设置成半满或为FIFO深度的60%。

(3)由于PC/104系统的中断不像PCI中那样由系统统一分配,而是由用户根据系统资源使用状态自己设定,为此必须将中断设计成跳线开关形式,使其具有一定的灵活性。

结束语

采用FPGA技术结合高性能的HS-3282/HS-3182芯片组设计并实现了基于PC/104的ARINC429接口模块,该模块支持多种工作方式,使用器件少,可靠性高。软件上采用简捷方便的C语言实现了中断、查询方式的数据收发功能。目前,整套ARINC429模块已成功应用在某直升机中。使用情况表明,该接口模块性能稳定、实用性好。

相关推荐

台PC厂触控面板订单偏淡:3月将回温

PC  触控面板  2014-01-20

没有退路的FPGA与晶圆代工业者

FPGA  晶圆代工  2014-01-03

英特尔新战略:以退为进能否驰骋沙场?

英特尔  PC  2013-11-27

Q2全球DRAM市场营运利润率27%创三年新高

DRAM  PC  2013-10-22

英特尔第三季度财报:净利润同比降0.7%

英特尔  PC  2013-10-18

采用FPGA的可编程电阻的设计结构分析

FPGA  电阻  2013-09-24
在线研讨会
焦点