微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于FPGA和PCI的AFDX终端接口卡设计

基于FPGA和PCI的AFDX终端接口卡设计

时间:06-05 来源:互联网 点击:

航空电子系统的发展已成为现代飞机性能不断提高的重要因素。以ARINC429和1553B为代表的现役机载总线已不能满足现代航空电子系统对通信速度和带宽的要求。美国航空电子技术委员会(AEEC)提出了航空电子全双工交换式以太网AFDX(Avionics Full Duplex Switched Ethernet),它是在商用交换式以太网的基础上,经过实时性和可靠性等方面的改进建立起来的,符合IEEE802.3和ARINC664规范。

AFDX是一种全双工、高数据率、双冗余的总线,具有传输速度快、易扩展、可维护性好等优点,可以有效减少系统布线,减轻飞机重量。不仅能满足航空电子系统数据通信对带宽的需求,并已成功应用于A380和B787,也是我国新研制大型客机的理想选择[1]。作为AFDX的重要组成部分,终端接口卡性能的好坏直接影响到AFDX网络的整体性能。因此,设计可靠性高、实时性好、满足实际应用需求的AFDX终端接口卡具有广阔的应用前景和良好的经济、军事效益。

1 AFDX终端接口卡总体设计

依据ARINC664规范对终端系统的要求,在参考了参考文献[2]对终端协议芯片的设计和相关成熟产品的基础上,提出一种AFDX终端接口卡的设计方案。该接口卡性能特点为:采用Stratix II系列FPGA芯片实现协议栈主要功能,可以实现256个传输虚链路(最多2 048个接收虚链路);独立的MAC核简化了设计,保证了系统的稳定性和100 Mb/s的传输速率;PCI总线可实现132~264 Mb/s的高速数据传输,最大限度地满足接口卡对时延的性能要求;2个100/10 Mb/s端口,实现全双工的双冗余通道。AFDX终端接口硬件框图如图1所示。

FPGA模块是系统的核心协议芯片,实现AFDX协议栈的主要功能,包括流量整形、虚链路调度、完整性检查、冗余管理等。MAC模块连接物理层和FPGA,为数据的发送和接收提供数据接口和控制接口,控制PHY进行发送和接收。PHY模块实现以太网的物理层接口功能。PCI接口电路是主机连接AFDX终端接口卡的桥梁,提供主机和接口卡间高速、双向交互数据的接口。CPU模块是系统的核心控制模块,协调各模块之间的工作,实现AFDX协议栈UDP、IP层的功能。

2 AFDX终端接口卡的关键模块设计

2.1 FPGA芯片设计

航空电子系统的运行环境特殊,对AFDX终端接口卡芯片的性能参数、工作温度和稳定性的要求高,因此,应选用集成度高、逻辑资源和存储器资源丰富、速度快、可以完成复杂的时序与组合逻辑电路功能的芯片。普通商业级的FPGA无法胜任,必须要采用工业级FPGA。综合考虑各方面因素,本接口卡选用Altera公司Stratix II EP2S180系列FPGA。FPGA芯片的内部功能结构如图2所示。

配置数据存储器在片内控制器的作用下完成终端接口卡的初始化,对有关硬件进行配置。初始化完成后,即可进行数据的发送和接收工作。发送数据时,CPU模块经PCI接口通过DMA方式,将航空电子系统中的数据帧传送到发送数据缓存器中;发送模块按照调度算法将数据帧调度到相应VL中,为数据帧添加序列号(SN)后,同时发往MAC A和MAC B;接收数据时,PHY模块将数据帧发送至MAC模块(MAC A和MAC B),经MAC模块CRC校验后发送至接收模块。接收模块将MAC模块传来的数据存入自身缓存中,并进行完整性检查和冗余管理;CPU检测到已收到新数据帧后启动DMA,将数据帧送至航空电子系统。数据缓存器用于存储发送和接收过程中的数据。

2.1.1 接收模块

数据接收模块负责接收从MAC送来的数据,实现完整性检查,消除从冗余通道接收的重复有效帧。该模块包括完整性检查模块、冗余检查模块、SN表和包分栋器。

完整性检查模块校验每个从MAC模块传来的接收帧是否具有该VL所期待的SN。冗余检查模块接收所有经过完整性检查的合法帧,若接收到两个具有相同SN号的帧时,将转发先接收到的,然后丢弃第二个。SN表存储接口卡各接收虚链路最后收到帧的SN,用于完整性检查[2]。VL号映射表存储各接收VL的逻辑VL号与物理VL号的对应关系。查询该映射表,可得到VL的逻辑VL号所对应的物理VL号。包分拣器根据VL号判断到来的帧属于哪条虚链路,并将该帧存入该虚链路对应的数据接收缓存中[3]。

2.1.2 发送模块

发送模块实现流量整形、多路复用及传输端冗余控制(TRC)功能。该模块包括:寄存器模块、虚链路调度模块、传输端冗余控制。

寄存器模块存储发送模块所用到的信息,如VL的BAG值(带宽分配间隔)、Lmax值(最大帧长度)等。虚链路调度模块由整形模块和多路复用模块组成。为消除虚链路相互竞争引入的抖动,本设计的虚链路调度方案使用周期为125 μs的静态调度方法。整形模块负责确保每一条VL都遵守它所分配的带宽限制,控制并监视BAG和Jitter定时器,使数据流以比较均匀的速度向外发送,限制VL上的突发流量。通过多路复用技术将整形后的虚链路的帧合并到一条物理链路上,并确保多路复用后输出的抖动在可接受的范围内。传输端冗余控制(TRC)模块的主要作用是根据调度模块的输入决定将要传送帧的目的地,可以只传送给MAC A和MAC B中的一个,也可以同时传送给MAC A和MAC B。

2.2 MAC模块

为简化设计,本系统采用ACTEL公司的两个Core10/100 Ethernet IP核建立两个独立的通道。该IP核具有100 Mb/s的传输速率,已经在实验和实际应用中多次验证符合IEEE802.3标准和ARINC664规范,可较好地实现MAC功能,其主要组成模块及关系如图3所示[4]。

控制、状态寄存器及控制逻辑(CSR)模块向外部模块提供控制接口和MII管理接口,包含控制寄存器、状态寄存器及控制逻辑。主机通过CSR模块实现对Core10/100的中断控制和电源管理,从而达到控制IP核的目的。数据控制模块将外部模块需要发送的数据存入内部的发送FIFO中,等待发送,并自动使用CPU间隙将接收FIFO中收到的数据发往外部模块。发送、接收FIFO分别用于暂存待发送的数据和接收到的数据,为外部存储器工作于FIFO模式提供接口。发送及接收控制模块作为发送及接收的MII接口,控制PHY芯片进行数据的发送与接收。发送控制模块从发送FIFO中读取待发送数据,形成帧,并通过MII接口发送数据帧;接收控制模块通过接收MII把数据从外部PHY设备传送到接收数据存储器中,并完成地址过滤。

主机与IP核之间的数据交换是通过FIFO缓存器进行的。数据交换包括发送和接收两个独立的过程,这两个过程都存在三种状态:运行、终止和暂停。发送和接收进程各有一个描述符列表,位置由CSR中的寄存器来定义。Core10/100执行载波监听多路访问/冲突检测(CSMA/CD)算法来解决冲突[4]。其算法流程如图4所示。


2.3 PCI接口模块

2.3.1 硬件设计

为避免设计所有PCI总线协议需要的接口逻辑,减轻工作难度,本设计采用PLX公司的64 bit总线控制器PCI9656。PCI9656与FPGA连接如图5所示。

PCI9656符合PCI V2.2协议,支持32/64 bit、33/66 MHz时钟,采用流水线架构技术可以支持7个外部主控器,支持多路复用,可直接生成所有的控制、地址和数据信号以驱动PCI总线,而不需要额外驱动电路。

根据需要,将PCI地址空间划分为用户配置空间、发送缓冲空间和接收缓冲空间。EEPROM作为配置信息存储器,在控制器的作用下完成对PCI设备的初始化配置。本设计采用0类配置空间,需配置的信息包括设备的厂商、类别、设备所申请的存储器和I/O空间、设备的中断信息及工作方式等。

申请局部总线控制权时,PCI9656使LHOLD变高;FPGA检测到LHOLD变高后,立即回应LHOLDA,总线申请成功。读数据时,PCI9656先使LW/R变低,下一个周期使ADS变低,并根据地址高两位进行译码,选择要访问的SDRAM控制器模块,使能SDRAM;当FPGA发出REDAY信号有效后,从SDRAM中读数据。写数据时,PCI9656使LW/R变高,下一个周期使ADS变低,此时地址有效,并根据地址高两位进行译码,选择要访问的SDRAM控制器模块,使能SDRAM;当FPGA发出REDAY信号有效后,把数据写到SDRAM中。当数据传输结束时,PCI9656使REDAY信号无效、LW/R变高,下一个时钟周期撤销LHOLD,再下一个周期FPGA会撤销LHOLDA信号,至此取消总线成功。

2.3.2 驱动程序

本设计设备驱动程序采用微软的WDM驱动程序模式,实现即插即用。驱动程序的开发和调试采用DriverStudio开发工具包中的DriverWorks和SoftICE作为主要的工具。

设计驱动程序主要需要考虑四方面因素:PCI设备的硬件访问;中断处理;DMA数据传输和安全性、稳定性、可靠性。为实现AFDX对数据传输实时性的要求,设备驱动程序采用中断方式。为满足快速传送数据、I/O响应时间短和CPU额外开销小的需求,采用DMA的块传输方式进行数据传输。为保证驱动程序的可靠性和稳定性,设计采用Windows 98/2000/XP内核模式的标准驱动程序例程。

驱动程序可分为两部分,一部分用于PCI9656各个配置寄存器赋值并初始化;另一部分用于主程序,用来完成PCI9656与主机CPU之间的数据交互。使用DriverStudio中的DriverWizard创建PCI驱动程序框架,采用VC++6.0的面向对象设计思想创建了接口芯片抽象类C_PCI9656,将PCI9656芯片的属性和需实现的操作封装起来。在头文件Register_PCI9656.h中定义PCI9656提供的内部寄存器,包括PCI配置寄存器、DMA寄存器、运行时间寄存器和消息队列寄存器等。资源分配通过IRP(I/O Request Packe)例程实现。DMA传输流程如图6所示[5]。

首先在应用程序中创建一个事件对象,将该事件传递给驱动程序并产生中断,中断例程判读中断来源。若是Local中断,则应用程序发送DMA读写命令,该操作将IRP传递给驱动调用SerialRead()或SerialWrite()例程,运行回调例程OnDmaReady()判定是否符合DMA传输条件并开启StartDMA()例程实现DMA传输,产生DMA中断;若是DMA中断,则调用OnDmaReady()例程判定DMA传输是否结束,未结束则再一次开启StartDMA()例程继续DMA传输并产生中断。如此循环一直到完成所有的DMA传输,应用程序结束线程。为提高设备驱动程序的安全性和可靠性,在设计中采用自旋锁来保护共享数据和设备寄存器,编写程序时严格遵循编程规范和C++语言标准语法格式。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top