基于PXI总线的高速数字I/O卡的设计依据PXI总线规范,应用PCI9054总线控制器实现PXI总线接口,通过FPGA控制PCI9054总线控制器局部总线和FIFO的读写端口来实现高速数字输入输出。测试结果表明,该板卡能够稳定地传输不低16MHz的高速数字信号。PXI是PCI在仪器领域的扩展(PCIExtensionforInstrumentation),其技术规范是NI公司于1997年9月1日推出的,现已有60多家联盟[1]。PCI局部总线可以在33MHz和32位数据通路的条件下达到峰值132Mb/s的带宽,在66MHz和64位数据通路的条件下达到峰值528Mb/s的带宽[2]。PXI吸收了VXI的优点,同时受益于CompactPCI(CPCI),因而速度更快、结构坚固紧凑、系统可靠稳定,在射频和微波频带以下的低、中高频段可以替代VXI而且价格优势明显,深受广大用户欢迎,目前正朝气蓬勃地向商用与军用领域拓展。PXI高速数字I/O卡是实现各种功能复杂的高速传输模块的最基本单元。对它的深入研究设计有助于更好地理解PXI总线及其接口设计。1系统结构与设计原理一个完整的数字I/O系统由PCI总线控制器、FPGA、FIFO等模块组成。PCI总线控制器实现PXI总线接口,FIFO作为数据输入输出的缓存器件,经FPGA控制后实现局部总线数据的读写操作。具体的结构如图1。数据传输流程为:输入时,外部数据通过写入FIFO后读出传入PCI9054局部总线,经PCI9054传入到PXI总线;输出时,数据经PXI总线送人PCI9054后经局部总线传到输出FIFO后,通过读取FIFO实现数据的输出。整个传输过程的时序由FPGA严格控制。2硬件设计硬件设计包括接口设计和局部总线设计。2.1接口设计当前国际上实现PXI接口主要有两种途径:一种是直接通过FPGA进行接口设计,主要是调用FPGA中的PCI宏单元。另一种是直接通过专用的PCI接口芯片来实现接口设计。前一种方法要求对PCI总线规范十分了解,调试困难较大,开发周期较长,而直接购买PCI的IP核又太贵,所以这里采用第二种方案。目前提供PCI通讯芯片的厂家很多,比较成熟的接口芯片有PLX公司的PCI90XX系列、AMCC公司的S59XX系列以及CYPRESS公司的CY7C094XX系列。PCI9054是由美国PLX公司生产的先进的PCII/OAccelerator;符合PCI2.2协议,采用了先进的数据流水线结构技术;局部总线提供了M、C、J三种工作模式以适应不同的局部处理器;具有可选的串行EEPROM接口,本地总线时钟可和PCI时钟异步。PCI9054内部有6种可编程的FIFO,以实现零等待突发传输及本地总线与PCI总线之间的异步操作;本地时钟可以达到50MHz,且与PCI时钟异步。它支持突发以及DMA传输,能在主模式和从模式、DMA模式下工作,是应用非常广泛的一款PCI接口芯片[3]。PXI接口框图如图2。数据总线和地址总线是复用的,分别为AD0-AD31;控制总线主要包括C/BE[0:3]#、FRAME#、IRDY#、DEVSEL#、TRDY#、STOP#、IDSEL#、LOCK#、PAR#、PEER#、SERR#、REQ#、GNT#等,在硬件连接时只要将PXI接口和PCI9054对应的这些端口相连即可。与串行EEPROM对应的端口为CS、SK、DI、DO,在电路中DI和DO是物理连接的,EEPROM的EEDI/EEDO引脚的配置要注意:当不安装EEPROM时,该引脚一定要下拉,用1kΩ的下拉电阻即可,此时启动后9054会按默认值进行配置;当安装空白的EEPROM时,该引脚需要上拉;当安装烧录好的EEPROM时,该引脚需要上拉。2.2局部总线设计由图2可知,PCI9054的局部总线分别与FPGA和功能模块相连。由于在功能模块中用到的是FIFO缓存器,所以不需要局部地址总线,只需将数据总线分别连接到两块FIFO中,局部总线的控制信号和FIFO的控制信号连接到FPGA中,通过FPGA来控制FIFO的读写。为了灵活地改变数据的传输速率,在FPGA中调用锁相环来给FIFO分配读写时钟。局部总线的电路连线如图3。为了配合外部电路的速度和匹配要求,在这里应用了Altera的库生成了PLL(PhaseLockedLoop)。PLL具有低的时钟偏移,应用灵活,通过调整比例关系就可以得到所需要的时钟频率。其symbol如图4,时序仿真如图5。通过设置寄存器DMAMODE的第7位可以使能或禁止外部等待输入控制信号READY#,以使PCI9054工作于外部等待或内部等待状态。当READY#被禁止时,则在每次传输的地址和数据间插入等待状态,其数目由内部的等待状态计数器决定;若READY#使能,则READY#信号的持续时钟周期决定了附加的等待状态。本设计采用C模式READY#使能方式。根据PCI9054的时序图(见PCI9054DataBook5.6节),每次数据传输时,首先发出地址选通信号ADS#,当总线准备好则使READY#信号有效,开始数据传输;否则总线处于等待状态。数据一旦开始传输,局部总线控制器将判断传输结束标志信号BLAST#,若BLAST#为高电平,则发出有效的READY#信号,数据持续传输,否则,在发出最后一个READY#信号后结束数据传输。状态机转换的具体过程如表1。本设计采用的是ALTERA公司的FPGA器件EP1C6,在QuartusⅡ软件下编写了整个的程序,软件仿真结果如图6。3驱动程序设计在Windows操作系统中,为了保证系统的安全性和可移植性,限制了应用程序对硬件的操作,尤其Windows2000和WindowsXP均不支持直接对系统的硬件资源的操作。因而在设计开发PCI设备时,需要开发相应的驱动程序来实现对PCI设备的操作,用户应用程序通过驱动程序来访问PCI设备。开发WDM驱动程序的主要工具是微软为各操作系统提供的开发软件包DDK(DeviceDriverKits),该软件包为驱动程序开发者提供了用于驱动程序开发的资源文件、编译连接程序、开发技术文档等。还有第三方提供的开发工具:NuMega公司的DriverStudio和Jungo公司的WinDriver,这些工具是在DDK的基础上为方便开发用户而开发的工具[4]。在使用中,虽然利用DDK开发驱动程序难度较大,但是代码非常简洁,结构清晰,效率也高。利用第三方开发工具使用简单,开发速度较快,但对于驱动程序的理解和深入开发不如DDK。因此选择DDK开发PCI设备驱动程序,虽然开始会觉得非常复杂,但从执行效率和功能上会更有利。在WDM中,采用了分层的驱动程序体系结构,总线驱动程序或类驱动程序在最底层直接与设备打交道,设备功能驱动程序在上层通过与低层驱动程序打交道,实现设备的功能,中间还可以有类过滤驱动程序或设备过滤驱动程序用于数据的过滤或转换。在PCI总线的驱动程序层中,其层次图如图7。在实际开发中,一般无需分很多层次,只需要开发一个设备驱动程序即可。设备驱动程序直接与PCI总线驱动程序打交道,进行硬件操作,以实现PCI设备的功能。4PCB设计要点和硬件测试结果为了提高设备工作稳定性和抗干扰性,在布局布线时采取了如下措施:采用四层板,模拟地与数字地用磁珠隔离;为了避免信号线间串扰,两条信号线应采取垂直交叉方式,要拉开两线的距离,并在两条平行的信号线之间增设一条线;采用铁氧体磁心加电容滤波的方法对每组电源分别去耦,以取得最好的滤波效果。最后对设计出来的板卡进行了硬件测试,在应用程序中编写如下简单程序:voidCPDC4000DemoDlg::OnBlockDmaPciToLocalDemo()//DMA模式输出数据{unsignedcharpData[0x100];//待输出的数组for(inti=0;i0x100;i++){pData[i]=i+0x0;}m_iStatus=STATUS_BLOCK_WRITE;BlockDmaPciToLocal(pData,0x100);}通过逻辑分析仪测量板卡的输出波形,得到输出低8位结果,见图8。波形符合写入的数据,数据输出的速率为16MHz。本模块已达到预定的设计指标,运行稳定可靠。该模块的优点是设计简单,开发周期短,开发成本低。缺点是功能比较单一。如有需要,可以将该模块扩展为功能更为复杂的应用单元。随着PXI总线的不断发展,基于PXI总线的产品设计具有十分广阔的前景。参考文献[1]NationalInstrumen.ThePXISystemArchitecture[S],1997.[2]尹勇,李宁.PCI总线设备开发宝典.北京:北京航空航天大学出版社,2005.[3]PlxTechnology.PCI9054DataBook,Version2.1.PlxTechnology,2000.[4]CANTC.WindowsWDM设备驱动程序开发指南.孙义,译.北京:机械工业出版社,2000.