基于PCI9054的数据采集卡的设计与实现

时间:2022-05-26 06:48:53

基于PCI9054的数据采集卡的设计与实现

摘要:介绍了采用PCI9054实现PCI接口数据采集卡的设计方案及实现,其中包括从模式下单周期读写和主模式下DMA的实现。结合开发实例,介绍了如何开发PCI接口的DMA驱动程序。

关键词:PCI;单周期读写;DMA;驱动

中图分类号:TP274文献标识码:A文章编号:1009-3044(2009)26-7520-02

PCI9054 Data Acquisition Card Based on the Design and Implementation

WANG Song-tao

(Chinese Academy of air-to-air missile, Luoyang 471009, China)

Abstract: This paper introduces the realization of PCI9054 data acquisition card PCI interface design and implementation,including from the single-cycle read and write mode and the main mode of realization of bined with the development of examples of how the development of PCI interface DMA driver.

Key words: PCI; single-cycle read and write; DMA; driver

高速数据采集在嵌入式系统、工控领域中有广泛的应用。采集的数据需要和存储阵列或者数据处理模块进行互连。所以标准的、高速的总线选取显得尤为重要。目前PCI接口的开发方式主要有两种:一是使用专用的PCI 接口芯片,例如PLX公司的9054,AMCC公司的S593X等;二是使用CPLD/FPGA,自己开发或采用FPGA厂家提供的IPcore实现PCI接口。如果使用第一种方式,用户可能只会用到专用芯片的一部分功能,会造成资源的浪费,并且PCI接口芯片面积比较大,会给密集型板卡的布线带来困难。而使用第二种方式则有如下两个优点:一是设计者可以根据自己的需要开发出PCI接口相应的功能;二是设计者可以将PCI接口宏模块与用户逻辑集成在一块FPGA中,并且可以在顶层通过仿真来验证PCI接口及用户逻辑的正确性,这样可以提高调试速度,缩短开发周期,降低功耗和成本,提高电路板的集成度和性能。本文将详细讨论基于FPGA PCI接口设计,主要包括基于FPGA PCIcore的PCI接口的实现和PCI驱动程序的开发 。

1 存储器硬件结构介绍及芯片的选型

本板卡是一个高速数据采集板卡AD板卡由高速AD和FPGA、PCI9054组成。其硬件结构如图所示。

FPGA为整个板卡的控制核心。板卡的控制核心芯片采用Altera公司的EP2 S30 F672C5芯片,它属于STRA TIXⅡ系列,适合复杂时序逻辑的设计及高速数据的传输缓存,也完全适合用PCI IPcore实现PCI接口功能。FPGA实现的主要模块包括PCI接口模块、读FIFO、写FIFO、接口控制模块。其中PCI接口实现的功能如下:采数据时,主机通过PCI接口实时存储,主机通过PCI接口回显数据波形,判断数据的有效性;采完数据后,主机通过PCI接口读回数据并存储在硬盘中。读写FIFO实现异步时钟同步。

2 PCI模式的读和写

2.1 PCI IP core的选择

Altera 的IP核包括四种类型:PCI_MT64,PCI_MT32,PCI_ T64和PCI_T32。由于我们设计的是32位PCI,并且DMA 控制器必须工作在主模式下,因此选择了PCI_MT32。

2.2 从模式单周读写的实现

在开发PCI接口初期,实现了PCI 从模式下单周读写,其时序仿真图如图2所示。

周期读写适合少量数据传输,在第1节中提到的通过PCI接口发命令和地址以及下文将要提到的DMA寄存器的设置都是通过从模式下单周期读写实现的。

2.3 主模式下DMA的实现

针对高速传输数率的要求,实现了基于PCI_MT32主模式下的DMA传输方式。DMA模式是PCI_MT32配合自主设计的DMA控制器来实现的,所以DMA控制器是整个设计的关键。于 PCI_MT32没有DMA控制器,必须自己在 FPGA里面实现DMA控制器。DMA控制器由DMA寄存器、DMA时序状态机组成。DMA寄存器是主机控制DMA的窗口。DMA状态机是控制PCI总线数据传输的核心,其结构框图如图3所示 。

PCI9054是一款高性能的桥接芯片,它把复杂的PCI协议(CPCI与PCI软件协议一致)转化为简单的局部端协议。在设计中它是板卡与主机通信的桥梁。本设计实现了从模式的读和写。从模式的写过程为主机(上层软件配合驱动程序)把数据通过CPCI总线写入PCI9054的FIFO,PCI9054检测到数据后发动局部端总线周期把数据写出;从模式的读过程为主机向PCI9054发出地址和读请求,PCI9054从局部端读数,然后驱动给主机。由于PCI协议完全得到实现,这里我们只要关心其局部端操作时序的实现。PCI9054有三种局部总线接口模式(M,C,J),本设计选用了C模式,数据线地址线不复用。

・C模式局部端接口所采用的信号如下:

・LCLK:局部端时钟,输入信号,本设计时钟由FPGA驱动,时钟速率50M;

・LHOLD:局部总线请求,由PCI9054驱动;

・LHOLDA:总线确认信号,由FPGA驱动;

・/ADS:一次读写周期的发起信号,由PCI9054发起;

・/BLAST:突发模式的最后一个数据指示,由PCI9054驱动;

・LW/R:读写信号,由PCI9054驱动;

・LA[31:2]:地址总线,由于设计采用数据包分发的方式,地址信息隐藏在数据包的首部,所以LA不用;

・LD[31:0]:数据总线;

・/BTERM:持续突发终止信号,由FPGA驱动;

・/READY:当次操作完成信号,由FPGA驱动,若有效则表示可以进行下一个传送;否则产生等待信号。/READY信号的使用接口协议实现的关键。

FPGA与PCI9054的信号连接如图4所示。

PCI9054的操作时序比较简单,这里不再详细分析,不突发的时序有下面三个过程:

1)当主机发起数据传输,PCI9054发起LHOLD请求局部端总线控制权,FPGA 有效LHOLDA,允许PCI9054发起操作;

2)检测到/ADS信号为低时,判断读写操作,如果是读,检测读FIFO是否为空,不为空则拉低/READY,同时驱动数据,数据将在下一周期有效;为空则驱动/READY为高,进入等待。如果是写,检测写FIFO是否为满,不为满则拉低/READY,在下一周期从LD上取数据存入FIFO,否则驱动/READY为高,进入等待。

3)PCI9054检测到/READY为高,进入等待,直到/READY信号为低,此时如果还有数据要发送,回到第二步。

PCI9054支持4字突发以及无限突发模式,这通过设置PCI9054的LBRD0/LBRD1寄存器来实现。突发可以提高局部端接口速度,时序上没太大区别,多了检测/BLAST信号及在合适的时候驱动/BTERM,限于篇幅,这里不再赘述。

3 PCI 驱动程序开发

3.1 WDM 驱动程序的工作原理

在 Win2000下,应用程序直接访问硬件设备是受限制的。为了使用户应用程序能对硬件资源进行存取,我们开发了工作在内核模式下的PCI驱动程序。WDM模型(Window s Driver Mo del)是现在流行的驱动程序设计的一种构架。我们选用Numega公司的Driver Works来开发运行在 Win2000下的WDM 模式PCI设备驱动程序。在开机或者是扫描即插即用硬件时,总线驱动程序枚举总线上的设备,并为设备创建一个PDO(Physical Device Object),通知PnP管理器。当PnP管理器发现一个新加入的PDO,就向总线驱动程序发送一个IRP以获取标识这个设备的符号。PnP管理器通过这个符号参考注册表以确定这个设备需要哪个驱动程序,接着PnP管理器调用其Ad2dDevice,AddDevice例程创建功能设备对象并将其连入设备堆栈。此后PnP管理器将为所有的设备驱动程序分配资源,一旦资源分配确定,PnP管理器通过向设备发送一个带有IRP_MN _STAR T_D EVICE 次功能代码的PnP请求来通知设备。此PnP请求的派遣例程获分配资源,此后其他派遣例程就可以对获得的资源进行处理。分配了资源的驱动程序接下来就可以处理其他的IRP,包括对硬件资源存取的IRP。

3.2 驱动开发实例

3.2.1 普通读写模式

普通读写过程的关键是驱动程序如何获得应用程序的缓冲区。Windows 2000为驱动程序访问用户模式数据缓冲区提供了三种方法:Buffered 方式、Direct方式和Neit her方式。在此次开发中,我们使用的是 Direct方式,I/O管理器把用户输入缓冲区数据复制到一个系统缓冲区,驱动程序可以用KIrp::IoctlBUffer访问这个缓冲区。输出缓冲区被类KMemory对象映射,驱动程序可以用KIrp::Mdl访问这个缓冲区。

3.2.2 DMA模式读写

上面的普通读写模式传输数据速率很低,所以又实现了DMA模式传输。在DMA模式下,读写数据都是由PCI_M T32发起的。本例开发使用的是BlockDMA方式,在应用程序以事件驱动,调用Win32A PI函数将其传到驱动程序,应用程序无限等待事件的触发,在驱动程序中读完或写完数据后触发事件。事件触发后,应用程序开始从驱动程序中读取DMA传输的结果。由于篇幅有限,现仅对驱动程序的关键几步介绍一下:

1) 在 Driver St udio 的 Driver Wizard中添加资源,如DMA适配器、内存空间和中断等等。

2) 在OnStartDevice 例程中初始化硬件中断并连接到相应的中断服务程序,建立延迟过程调用,分配一段公共缓冲区来存放DMA传输的数据,缓冲区的大小影响DMA速度。

3) 在读写例程中设置和DMA、中断有关的寄存器,启动DMA传输。通过向m_Memo ryRange0表示的存储器空间写数,设置DMA寄存器。

4) 在中断服务例程中,先判断中断是否为本设备产生的中断,是则清除中断,启动DPC延迟调用。

5) 在DPC延迟调用中,触发内核事件,通知应用程序DMA传输结束,可以读取数据。

6) 在DMA读回例程中,将数据从公共缓冲区拷到用户模式缓冲区。

4 总结

针对采集数据时所需的高速传输速率,本文讨论了基于FPGA PCI IPcore的PCI接口中单周期模式读写和DMA模式读写的实现及其驱动程序的开发。这种设计方法具有电路板集成性能高、功耗低、传输速率高的优点。另外用Driv2er Works所开发的DMA模式PCI驱动程序具有通用性,在两者的结合下很好地实现了主机应用程序对数据进行快速的存取 。

参考文献:

[1] PCI compiler user guide(vision 4.0)[EB/OL].Altera Corporation,2005..cn/literature/ug/ug_pci.pdf.

[2] 李贵山,陈金鹏.PCI局部总线及其应用[M].西安:西安电子科技大学出版社,2003.

[3] 武安河,邰铭,于洪涛.Windows2000/XP WDM,设备驱动程序开发[M].北京:北京电子工业出版社,2003.

上一篇:空间数据仓库技术的应用 下一篇:Sakai开源学习平台的实现技术分析