admin管理员组

文章数量:1658479

2024年2月6日发(作者:)

PCI-e高速数据采集卡的驱动与上位机软件设计

孙文硕;赛景波

【摘 要】为了解决采集卡与上位机之间的海量数据传输问题,结合自行开发的高速数据采集卡,提出了一种基于PCI-e高速数据采集卡的设备驱动与上位机软件的开发方案.该方案对使用WinDriver开发设备驱动的开发步骤以及DMA传输的实现方法进行了介绍,对利用LabWindows/CVI设计上位机软件的方法予以阐述,并利用DLL动态链接库解决了采集卡与应用程序之间的通信.实验结果表明,在PCI-e

X1链路下,数据采集速度可达到182MB/s,能够满足高速数据采集的要求.

【期刊名称】《电子器件》

【年(卷),期】2015(038)005

【总页数】5页(P1126-1130)

【关键词】高速数据采集;设备驱动;PCI Express;WinDriver;动态链接库

【作 者】孙文硕;赛景波

【作者单位】北京工业大学,电子信息与控制工程学院,北京100022;北京工业大学,电子信息与控制工程学院,北京100022

【正文语种】中 文

【中图分类】TP919

EEACC:7210G

doi:10.3969/.1005-9490.2015.05.030

随着电子技术的高速发展,对数据采集的要求迅速提高。在实际应用中,海量数据

的信息处理、高帧频图像的数据采集以及在线视频的实时显示的实现,均需要以高速率的数据传输作为前提

[1]。如何实现海量数据的高速、实时传输是采集系统设计中需要解决的主要问题。

高速数据采集卡是数据采集和处理的硬件前端,通过总线接口与PC机进行数据通信。传统的PCI总线不能满足高带宽传输,需要寻求一种新的总线协议,因此出现了PCI Express总线,即PCI-e总线。PCI-e总线是取代PCI总线的新一代总线技术,采用了点对点串行连接,为每个设备分配独享的通道带宽,充分保证了每个设备的带宽资源,仅X1通道的单向传输速度可达2.5 Gbit/s,并有很大的拓展空间,能够满足海量数据传输的要求

[2-3]。

为了实现上位机对硬件设备的控制与通信,需要开发基于PCI-e总线的上位机设备驱动程序和应用程序。高效、稳定的驱动程序设计是解决海量数据传输问题的主要方法,同时设备驱动不能单独工作,需要应用程序调用来实现人机交互。因此本文提出一种基于PCI-e数据采集卡的设备驱动及上位机软件的设计方法,以实现数据的高速传输。

1 系统架构

本文中驱动程序是基于自行研发的高速数据采集卡,系统整体框图如图1所示。采集卡以Xilinx公司的Virtex-5系列FPGA作为控制核心器

[4],用来配置PCI-e配置寄存器、基地址寄存器、Memory空间、I/O空间,并且作为DMA引擎来实现数据DMA传输。PCI-e IP硬核是Xilinx公司提供的PCI-e LogiCORE IP Endpoint Block Plus核,用于实现PCI-e协议转

换,系统逻辑实现DMA数据传输和DDR2 SDRAM控制

[5]。

图1 系统整体框图

高速数据采集卡的工作流程如下:首先数据通过I/O口传输到FPGA中;接着FPGA会根据上位机控制命令,将数据缓存到DDR2 SDRAM中,然后通过系统逻辑中的DMA引擎,用DMA方式将DDR2中的数据通过PCI-e X1链路上传至上位机;最后上位机对采集到的数据进行实时处理、存储与显示。由此可见,驱动程序是硬件板卡与PC机通信的桥梁,硬件板卡的识别、控制以及DMA数据传输均需要以设备驱动作为支撑,驱动程序是否高效、稳定直接制约采集卡的数据传输性能

[6]。

2 驱动程序设计

本次设计通过Jungo公司的WinDriver开发设备驱动。WinDriver简化了驱动程序的开发流程,特点是简洁高效。开发人员不需熟悉操作系统内核,驱动程序可在用户态开发。WinDriver API函数通过.Vxd或者.Sys文件的交互驱动硬件,并且允许开发者使用所熟悉的语言开发,如C/C++、VB、Del⁃phi等,因此适合快速设计出符合高速数据传输的驱动程序

[7]。

本次驱动设计的开发语言为C,具体设计步骤如下:

(1)将采集卡安装到PC机的PCI-e插槽上,使用WinDriver自带的Driver

Wizard工具生成硬件板卡的.inf文件并安装;

(2)通过Driver Wizard对采集卡进行测试,包括寄存器读写、中断监听等,确保采集卡能够正常通信;

(3)调用WinDriver API函数编写驱动代码;

(4)驱动程序文件打包和发布。

本次设计的驱动程序主要针对数据采集,实现采集卡设备访问、上位机内存分配、数据DMA传输与处理等功能,其具体工作流程图如图2所示。

图2 驱动程序流程图

2.1硬件板卡访问

在进行数据传输之前,首先对采集卡进行初始化工作,获取设备板卡信息,实现对硬件设备的访问。设备板卡信息包括设备ID号,厂商ID号,内存映射空间,设备插槽号等信息

[8]。WinDriver通过设备的De⁃vice ID和Vendor ID来识别与打开PCI-e总线设备。

硬件板卡访问程序的主要代码编写如下:

(1)声明所需的设备信息结构。

WDC_DEVICE_HANDLE hDev;

//定义设备句柄//

WDC_PCI_SCAN_RESULT scanResult;

//定义PCI设备位置信息结构//

WD_PCI_CARD_INFO deviceInfo;

//定义PCI-e设备描述表结构//

PVIRTEX5_DEV_CTX pDevCtx;

//定义指向设备描述表的指针//

(2)开启设备所需的API函数。

WDC_DriverOpen(WDC_DRV_OPEN_DEFAU-LT,VIR⁃TEX5_DEFAULT_LICENSE_STRING);

//打开WDC函数库//

WDC_PciScanDevices(dwVendorId,dwDeviceId,&scan⁃Result);

//根据设备号和厂商号扫描PCI-e总线//

WDC_PciGetDeviceInfo(&deviceInfo);

//枚举设备资源信息//

pDevCtx =(PVIRTEX5_DEV_CTX)calloc(1,sizeof(VIR⁃TEX5_DEV_CTX));

//为设备描述表分配内存//

WDC_PciDeviceOpen(&hDev,&deviceInfo,pDevCtx,NULL,NULL,NULL);

//打开硬件设备//

2.2寄存器读写

上位机在获得采集卡配置信息的同时,将配置空间中的基址寄存器映射到上位机的内存中,为其开辟一块与基址寄存器大小相等的内存空间。本次设计中DMA控制寄存器被定义映射于PCI-e的基址寄存器BAR0空间中,类型为Memory,大小

为256字节,DMA数据传输的控制是通过对BAR0的内存映射内存地址读写控制字来完成的

[9]。

在DMA传输中,数据由硬件设备传输到上位机的过程为DMA写操作,DMA写操作主要用到的寄存器如表1和表2所示。

表1 DMA控制寄存器

表2 DMA控制/状态寄存器

本设计对PCI-e设备的访问使用如下代码:

WDC_WriteAddr32(hDev,0,offset,value);

//向BAR0中偏移量为offset的空间写入一个双字//

WDC_ReadAddr32(hDev,0,offset,value);

//从BAR0中偏移量为offset的空间读取一个双字//

2.3 DMA传输

对于高速数据,需要DMA传输方式保证数据高速传输。DMA传输即直接内存访问,DMA控制器与CPU交互获得PCI-e总线的控制权,使数据直接在PC机内存和硬件设备之间传送,不占用CPU资源,满足高速外设数据传输的需要

[10]。

DMA依照缓冲区分配方式分为两种:Block(块)DMA和Scatter/Gather(分散/集聚)DMA

[11]。Block DMA是指申请缓冲区为一段物理地址连续的内存空间,如果用到多个缓冲区的数据就需要开启多次DMA操作;Scatter/Gather DMA是指申请的缓冲区在物理地址不连续,但分配的分散缓冲区会被映射到一个连续的用户地址空间中,开启一次DMA操作就能传输不同物理地址的缓冲区数据,适合大容量(大于4 kbyte)的数据传输,适用于本次设计。

在开启DMA写操作之前先对硬件进行初始化和复位操作,确认采集卡已经能够正常通信,并确保每次DMA开启前寄存器内的值为初始状态。然后通过对DMA寄存器写控制字段来确定DMA传输方向、数据大小、缓冲区地址,在完成上述操作后向DMA写开始位写控制字,启动DMA传输。本驱动采用轮询的方式判断DMA传输是否完成,即循环读取DMA控制/状态寄存器中DMA写完成位的值来判定操作是否完成。整体DMA采集操作的流程如图3所示。

图3 DMA数据采集流程图

DMA数据传输操作中用到的主要代码:(1)声明所需的DMA信息结构。

VIRTEX5_DMA_HANDLE hDma;//定义DMA结构体句柄//

PVOID pBuf;//定义缓冲区指针//

DWORD dwOptions = DMA_FROM_DEVICE;//定义DMA传输方向为由设备至上位//2)DMA操作所需的函数代码。

pVIRTEX5Dma =(VIRTEX5_DMA_STRUCT *)malloc (sizeof(VIRTEX5_DMA_STRUCT));//分配与 VIR⁃TEX5_DMA_STRUCT等大的内存//

WDC_DMASGBufLock(hDev,ppBuf,dwOpti

ons,dwBytes,&pVIRTEX5Dma->pDma);//锁定SG DMA内存缓冲区//

WDC_WriteReg32(hDev,0,VIRTEX5_ DMAR-ET_OFF⁃SET,0x1);//系统复位//

WDC_WriteReg32(hDev,0,VIRTEX5_ DMAR-ET_OFF⁃SET,0x0);//系统取消复位//

WDC_WriteReg32(hDev,0,VIRTEX5_DMA-WAS_OFF⁃SET,DDR2Addr);//设置DDR2的地址//

WDC_WriteReg32(hDev,0,VIRTEX5_DMAWAD_L_OFFSET,LowerAddr);//设置上位机低32位地址//

WDC_WriteReg32(hDev,0,VIRTEX5_DMA-WXS_OFF⁃SET,Data_Size);//设置采集数据大小//

WDC_DMASyncCpu(hDma->pDma);//刷新CPU缓冲寄存器中的数据,同步CPU高速缓冲寄存器和DMA缓存//

WDC_WriteReg32(hDma->hDev,0,VIRTEX5_DMAC⁃ST_OFFSET,0x1);//开始DMA写操作//

WDC_DMASyncIo(hDma->pDma);//刷新DMA缓冲寄存器中的数据,同步CPU高速缓冲寄存器和DMA缓存//

WDC_ReadAddr32(hDev,0,VIRTEX5_ DMAC-ST_OFF⁃SET,value);//判断DMA写操作是否完成//

DWORD timeout=10000000;//10s//for(i=0;i

{WDC_Sleep(2,0);}//轮询查询操作,以2 ms为周期//

3 应用程序设计

为了实现良好的人机交互,本次设计中使用LabWindows/CVI开发应用程序。LabWindows/CVI是基于C/C++的虚拟仪器开发平台,其提供的集成化的开发环境、丰富的用户界面库函数可以方便的设计出人性化的用户界面

[12]。

3.1操作面板设计

对象编程是LabWindows/CVI编程的核心,应用程序的面板以及面板上的按钮、开关、指示灯、显示屏、文本框等控件均是对象。对象有两个基本元素,即属性和事件。操作面板设计中是通过调用用户界面函数并更改对象的属性来实现的,当控件属性改变时,将触发这个控件的事件,并调用相应的回调函数

[13]。

根据采集卡的功能,本次设计的上位机用户界面如图4所示,操作界面主要划分为六个模块,分别为采集操作、面板操作、数据显示、波形显示、速率显示和开关状态。

图4 上位机应用程序界面

3.2 DLL设计

为了实现应用程序和驱动程序的交互,需要将驱动程序代码实现到相关控件的事件回调函数中。

在本次设计中,驱动程序以DLL动态链接库的形式进行封装。DLL是一种可执行文件,是一个包含可由多个程序同时使用的代码和数据的库,不能独立运行,主要用于为应用程序或其他DLL提供共享函数

[14]。应用程序通过调用驱动程序DLL接口函数来解决操作面板与采集卡的通信,主要的接口函数及其声明如下:

WDC_DEVICE_HANDLE OPEN_DEVICE(

DWORD dwVendorId,DWORD dwDeviceId);//打开采集卡设备//

BOOL CLOSE_DEVICE(WDC_DEVICE_HA

NDLE hDev,VIRTEX5_DMA_HANDLE hDma);

//关闭采集卡设备//

DMA_Open(WDC_DEVICE_HANDLE hDev,DWORD Buf_size,unsigned

int *wave_data,WORD data_size);//开启DMA传输//

DMA_Close(WDC_DEVICE_HANDLE hDev,VIR⁃TEX5_DMA_HANDLE

hDma);//结束DMA传输//

4 实验测试结果

4.1测试环境搭建

为了检验本次开发的设备驱动程序的性能,系统测试环境的搭建如图5所示。

图5 系统测试环境框图

本次设计采用NI公司的PXIe-6544数字波形发生器作为外部数据发送端。PXIe-6544数字波形发生器具有100 MHz最大时钟频率,可以准确的产生32通道的

数据,首先保证了待采集数据的准确性。

在系统测试之前需要对高速数据采集卡进行硬件配置。将采集卡插入PCI-e X1插槽中,用Xilinx ISE 13.3软件将FPGA逻辑代码经过综合布线后生成.b文件,并通过JTAG数据线下载到采集卡中

[15]。

在测试之前,还需要在上位机进行软件配置。在Windows操作系统中,WDM驱动主要是通过.sys文件的交互来控制硬件设备的。首先使用WinDriver工具包自带的wdreg安装工具,动态加载安装、和 3个内核模块,然后安装Driver Wizard工具生成的采集卡的.inf文件。

在完成软硬件配置后,具体的系统测试步骤如下:

(1)将PXIe-6544输出口与采集卡I/O口用数据线连接,用PXIe-6544循环发送一定量数据;

(2)通过上位机应用程序设置数据量并开启DMA操作,利用ISE 13.3软件中的Chipscope工具对数据采集通道的数据进行捕捉;

(3)从上位机应用程序读取经过PCI-e总线上传到PC机的数据文件,同时查看数据传输速率;

(4)通过比对波形发生器、采集卡和上位机3点的数据,确定数据是否正确传输。

4.2测试结果

在PCI-e总线技术中,PC机与PCI-e设备的通信数据包类型为TLP包,通过配置PCI-e IP硬核,设置TLP包长和包数。在不同TLP包长和包数的条件下,得到的实验结果如表3所示。

表3 数据采集实验结果

由实验结果可以看出,在TLP包长为512 byte,TLP包数为5 000个的测试条件下,得到的最大数据传输速率为182 MB/s。可以得出以下结论,TLP包长越大,数据量越大的情况下,传输带宽越大。

5 结束语

本次设计实现了PCI-e高速数据采集卡的设备驱动程序和上位机应用程序的设计、调试与测试,在Windows XP SP3操作系统下,驱动程序和上位机应用软件能够稳定工作,在PCI-e X1链路下,数据采集速率可达到182 MByte/s,能够满足高速数据采集的要求。同时,本次设计的驱动程序具有很强的可移植性,只需经过少许修改,就能够应用于其它PCI-e设备中,可以广泛使用于数据传输、图像采集、在线视频等实际应用中,具有较高的实用价值。

【相关文献】

[1]黎绍秀,卫红,兰春嘉. PCI-E图像采集系统的WDF驱动程序设计[J].科学技术与工程,2011,11(16):2834-2837.

[2]王齐. PCI Express体系结构导读[M].北京:机械工业出版社,2010:102-103.

[3]梁国龙,何昕,魏仲慧,等. PCIE数据采集系统的驱动程序开发[J].计算机工程与应用,2009,45(31):63-65.

[4]何宾. Xilinx可编程逻辑器件设计技术详解[M].北京:清华大学出版社,2010:225-227.

[5]兰春嘉,汤心溢,王世勇,等.基于PCIExpress的高速红外图像采集系统[J].红外技术,2011,33(1):37-40.

[6]刘波,库锡树,孙兆林.基于PCIE总线协议的数据采集设备驱动程序实现[J].工业控制w计算机,2007,20(7):28-29.

[7]Jungo Ltd. WinDriverTM PCI/ISA/CardBus User's Manual Ver⁃sion 10.20[S][.s.l.]:Jungo Ltd,2009.

[8]杨阿锋,吴帅,刘凯,等. PCIe接口高速数据传输卡的驱动程序开发[J].中国测试技术,2008,34(2):67-68.

[9]沈辉,张萍. FPGA在PCI Express总线接口中的应用[J].现代电子技术,2010,33(14):109 -111.

[10]孙晓晔.基于PCIE的SG DMA高速数据传输系统[J].计算机技术与发展,2013,23(9):195-198.

[11]李晃,巩峰,陈彦化.基于PCIE驱动程序的数据传输卡DMA传输[J].电子科技,2014,27(1):117-120.

[12]王建新,隋美丽. LabWindows/CVI虚拟仪器设计技术[M].北京:化学工业出版社,2013:15-16.

[13]朱中锐,蔡志明,郭岩.基于LabWindows/CVI数据采集系统[J].电子测量技术,2007,30(1):105-106.

[14]王海涛,付钧,鲜勇,等.基于LabWindows/CVI的数据采集系统软件设计[J].舰船电子工程,2010,30(5):64-66.

[15]王聪,王彬,薛洁,等.基于PCIe总线协议的设备驱动开发[J].信息技术,2013(3):32-35.

孙文硕(1989-),男,汉族,北京人,北京工业大学硕士研究生,主要从事无线通信、设备驱动方面的研究,****************;

赛景波(1964-),男,汉族,黑龙江人,北京工业大学副教授,主要从事嵌入式系统、无线通信和移动IP等研究,saijing⁃***********.cn。

本文标签: 数据设备采集设计上位