摘 要:提出了一种ARINC429总线转PCI总线的设计方法。PCI接口设计是基于PCIC_CORE实现的,ARINC429接口选用HI-8582协议芯片实现,驱动程序采用WINDRIVER开发,用户应用程序采用LABVIEW实现。该测试卡经实际测试完全能满足工程使用要求。
关键词:FPGA;PCI总线;ARINC429总线;LABVIEW;WINDRIVER;
中图法分类号:TP331 文献标识码:B
Abstract: A design method of ARINC429/PCI interface is put forward. The design of PCI interface is realized base on PCI_CORE. ARINC429 interface is realized by HI-8582. The card driver is designed via the WINDRIVER. User program is designed by LABVIEW. The results of test card show that the test card can satisfy the requirement of engineering application.
Key words: FPGA; PCI BUS; ARINC429 BUS; LABVIEW; WINDRIVER;
0 引言ARINC429总线是一种广泛应用于航空电子设备上的数据传输总线。在对航空产品的研发及使用过程中,经常需要利用计算机对航空产品进行调试、检测、监控及控制,因此需要一个可与ARINC429总线及计算机进行通信的测试卡。PCI总线成熟稳定,传输速度快,是工控计算机的标准配置,目前本项目组所使用的测试卡就是国外基于PCI总线设计的,但价格昂贵,而且出现问题难于维护且维护成本高、周期长。所以本文设计了一种基于PCI总线的ARINC429测试卡,而且与国外采用专用PCI接口芯片的测试卡不同,本设计采用PCI_CORE软核嵌入到FPGA中做为一个模块以实现PCI接口与计算机通信,使设计更紧凑、成本更低、可靠性更高。系统结构框图如图1所示。该测试卡的PCI驱动采用JUNGO公式的WINDRIVER快速实现,应用软件采用NI公式的LABVIEW开发。
图1 系统结构框图 2 硬件设计 硬件设计包括两部分,一部分为PCI接口电路设计,用于同计算机通信;另外一部分为ARINC429接口电路设计,用于同具有ARINC429总线的航空电子设备通信。 2.1 PCI接口设计 PCI(peripheral component interconnect)总线,即外部器件互连总线,是一种成熟的、高效的地址/数据复用总线。标准配置是32bit宽、33MHz时钟,理论最大传输速率是132MB/s。PCI接口电路的实现主要有两种方法,一种是利用专用PCI接口芯片,如PLX公司的PCI9054芯片,该方法设计难度低,集成度低,使用不够灵活。另外一种方法是在FPGA/CPLD中嵌入PCI核实现,该方法成本低,集成度高,设计灵活,扩展能力强,本文就采用该方法。
FPGA选择XILINX公司的低端产品SPARTANⅡ系列的x2s200-pq208,集成度约20万门,具有4704个四输入查找表,56kbit块RAM,另外该器件5v耐压,这样所设计的PCI测试卡可以设计成适应3.3v和5v信号环境的通用卡。
PCI接口的硬件设计主要注意一下几点即可: PCI总线端IRDY、TRDY和PCLK信号在FPGA上有专用支持引脚,一定要使用这些专用引脚; FPGA的第107、153及154管脚是JTAG配置专用引脚,不可它用; 该器件的全局时钟引脚只能用作输入,如果有双向信号或输出信号切忌连到全局时钟引脚上; PCLK时钟长度为2500±100mil,其余PCI信号小于1500mil即可; PCI信号PRST1#和PRSNT2#表示能耗需求,不能都悬空。具体定义如表1所示。 表1 板卡配置信号 PRSNT1# PRSNT2# 板卡配置 开路 开路 不存在板卡 地 开路 有板卡,最大功耗25W 开路 地 有板卡,最大功耗15W 地 地 有板卡,最大功耗7.5W 只要遵循了上述几点,PCI接口的硬件设计就不应该存在问题了。软核使用XILINX公司的PCI Initiator/Target V3.162版本,该IP核支持主和从模式,本设计中仅使用Target从模式。该核的使用关键要设置好配置信息,主要配置信息如下:
// Device ID and Vendor ID
assign CFG[151:120] = 32'h1234_5678 ;
// Class Code and Revision ID
assign CFG[183:152] = 32'h06800001 ;
// BAR0
assign CFG[0] = `ENABLE ;
assign CFG[32:1] = `SIZE16 ;
assign CFG[33] = `IO_PREFETCH ;
assign CFG[35:34] = `IO_TYPE ;
assign CFG[36] = `IO ; 2.2 ARINC429接口设计ARINC429数据总线协议规定一个数据字由32位组成,以脉冲形式发送,采用双极性归零码,码速率为12.5kb/s或100kb/s。电气特性为:高电平(+10V)为逻辑1;低电平(-10V)为逻辑0;0电平(0V)发送自身时钟脉冲,字与字之间以一定间隔(不少于4位)分开,以此间隔作为字同步。一个32位的数据字由五部分组成:标志位(LABEL),用于标识传输数据的信息类型;源/目的标识码(S/D),用于判断在一个多系统中的源系统;数据区(DATA);符号/状态位(SSM),用于标识数据字的特征或数据发生器的状态;奇偶校验位(PARITY),ARINC429数字信息传输使用奇校验。
从ARINC429总线协议的规定可以看出,FPGA的IO特性是无法满足ARINC429所要求的电气特性的,必须增加外部协议芯片。本文选择HOLT公司的HI-8582协议芯片完成与航空电子设备的通信。该芯片是+5V和±10V供电,其并行16位数据线及相关控制信号线直接引入FPGA的IO,由FPGA内部的429接口逻辑模块控制对HI-8582芯片收发数据。429接口逻辑模块的主要Verilog-HDL代码如下:
//429各逻辑信号产生
//地址2为写HI-8582发送寄存器
assign pl1_n = arinc_oe | (arinc_addr != 2);
assign pl2_n = shift_cnt[7] | (arinc_addr != 2);
//地址5为写HI-8582控制寄存器
assign cwstr_n = arinc_oe | (arinc_addr != 5);
//地址0为读HI-8582状态寄存器
assign sel = ((arinc_addr == 0 | arinc_addr == 3) ? arinc_cs : 1'b1) | (read429_flag != 1);
//地址1为读HI-8582控制寄存器
assign rsr_n = arinc_oe | (arinc_addr[2:1] != 2'b00) | (read429_flag != 1);
//地址3为读HI-8582接收寄存器
assign read429_en = read429_clk1 & read429_clk2;
assign read429_clk1 = arinc_oe | (arinc_addr != 3) | (read429_flag != 1);
assign read429_clk2 = shift_cnt[7] | (arinc_addr != 3) | (read429_flag != 1);
assign readfir_clk = read429_clk1 & rsr_n_bak;
assign entx = ((entx_reg[7:0] == 8'h5A) ? 1 : 0);
assign arinc_429d[15:0] = (pl1_n_bak & cwstr_n_bak) ? ((pl2_n_bak) ? 16'hz : my_io_reg[31:16]) : my_io_reg[15:0];
assign ADIO = out_rd ? out_reg[31:0] : 32'bz;
always @ (posedge readfir_clk or posedge RST)
if(RST) out_reg[15:0] <= 16'h0;
else out_reg[15:0] <= arinc_429d[15:0];
always @ (posedge read429_clk2 or posedge RST)
if(RST) out_reg[31:16] <= 16'h0;
else out_reg[31:16] <= arinc_429d[15:0]; 3 驱动设计 本文的驱动程序采用JUNGO公司出品的WinDriver设备驱动程序工具包进行开发,该工具包提供了功能全面的API函数,使得基于PCI、USB等不同总线的硬件设备驱动程序的开发周期大为缩短,并且具有良好的可移植性。
考虑到内存的使用效率以及开发用户应用程序的LABVIEW不直接支持结构体类型,所以在本文的设计中对WinDriver的API函数以及板卡功能函数进行了再封装,生成动态链接库,这个动态链接库为用户应用程序提供必需的API接口,用户应用程序通过调用这些接口函数完成对接口板卡的驱动功能。动态链接库的重封装使用VC++6.0,由于本文的应用程序主要实现存储器访问,所以仅对以下几个必要的接口函数进行了重封装: