基于PC/104的ARINC429总线接口模块的FPGA实现 | |
作者:雷艳静,胡红明,王玉梅,韩立华 时间:2007-04-30 来源: | |
摘要:针对分立元件设计的总线接口电路复杂、可靠性差等缺点,采用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。通常高速用于军用飞机中,低速用于民用飞机中。
ARINC429接口模块的硬件设计 设计思路
具体实现 (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内部的触发器来实现。主机可通过查询或置位相应的寄存器来进行控制。 ARINC429接口模块的软件设计 软件采用简捷方便的标准C语言进行编制,主要完成初始化和数据收发功能。 初始化 数据发送 unsignedlongPoll_Send_Msg(unsignedlonglength,unsignedlong*Send_Data_Buff) 若按照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) 数据接收 Unsigned long Poll_Recv_Msg(unsigned long*Recv_Data_Buff) 在中断接收方式中,主程序无需查询FIFO的状态,而是当接收FIFO非空或者超过设定的阈值时引发中断要求CPU来取数,接收数据在中断服务程序中执行。这样,CPU可以腾出大量的时间进行其他操作,而不被查询过程独占。在中断服务程序中维持一个循环队列,每次进入中断,接收的数据进入对列。主程序需要时可直接从队列中取数。对于FIFO非空产生的中断,进入中断服务程序后只要取一个数据即可,而对于FIFO超过阈值产生的中断,中断服务程序可取多个数据,直到产生中断的条件不成立为止。笔者只给出超过阈值的中断服务程序和主程序范例,前者可依次类推。 voidthreshold() 有关中断问题的讨论 (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模块已成功应用在某直升机中。使用情况表明,该接口模块性能稳定、实用性好。 |
标签: ARINC429 PC/104 FPGA |
文章评论(0条评论)
登录后参与讨论