基于PCIE单通道信号采集方案

前言

从事于信号采集及信号存储也有很多年了,也积累了一些丰富的经验。一直想记录下PCIE信号采集存储等应用。本系列设计采用PCIE进行数据传输适用于多通道数据采集,可以选择相应的高速ADC如AD9361、AD9208 等。多板卡处理适用于多任务应用场景。如数据采集存储,数据回放分析,视频图像传输,雷达信号系统等处理领域。

一、单通道信号采集系统设计

本系统设计采用xilinx FPGA 通过多次调试和多个项目应用验证,可实现
1、支持SG_DMA读写方式
2、支持5.9GB/S的高带宽
3、支持外部信号触发采集
4、支持门控触发采集
5、支持数据预览、存盘处理
6、支持DLL库可编程开发
本文介绍应用中的基本框架,单通道系统相对多通道系统稍微简单点,在Host端为了适配高带宽传输速率。采用双缓冲机制实现采集数据的快速存盘处理。当然存储速度仍然处决于SSD的读写速度。信号预览采用隔时隔采集帧预览。参数设置可设置l连续采集模式,触发方式以及门控参数等。
系统框图

二、FPGA设计

采用xilinx FPGA 设计搭载ADC子卡方式,可灵活适配不同的ADC采集子卡,支持可配置BAR空间,支持C2H和H2C通道。HOST端通道BAR通道设置板卡参数。通过H2C通道向板卡系统写数据,通过C2H将采集数据传输至PC端。
在这里插入图片描述

三、驱动及应用

(1)创建工程
在新建qt应用程序(Kit选项选择MinGW编译器)之后,需要在项目属性pro里设置调用动态链接库路径如图所示。
1)将CPCIAcquisitionCard.dll拷贝到工程目录下,然后右键弹出菜单中点击“添加现有文件”,将CPCIAcquisitionCard.dll添加到qt工程中。然后在.pro文件中,在附加库路径中输入用到*.lib链接库文件。
在这里插入图片描述
2) 在需要用到 SDK 的地方,包含头文件CPCIAcquisitionCard.h。
在这里插入图片描述
3)将对应版本的*.dll 文件拷贝到Debug(/Release)可执行文件的生成路径中。
在这里插入图片描述
(2)采集卡 API 说明

  1. int CPCIAcquisitionCardPrepareChannels(void)
    初始化采集卡类内部通道。
    成功返回 ACQUISITION_CARD_SUCCESS(0x00)。
    失败返回 ACQUISITION_CARD_FAILED(0xff)。
  2. int CPCIAcquisitionCardSearchDevice(unsigned int* pNum)
    搜索主板上安装的采集卡,先声明 unsigned int 类型变量,将地址传入函数形参 unsigned int* pNum,函数调用结束后,通过形参返回采集数量,若不需要获得采集卡数量,则设置 参数为 NULL 即可该函数在类初始化过程中必须调用一次。
    成功返回 ACQUISITION_CARD_SUCCESS。
    失败返回 ACQUISITION_CARD_FAILED。
    未搜到采集卡返回 ACQUISITION_CARD_NOT_FOUND。
    3.int CPCIAcquisitionCardOpenDevice(unsigned int deviceIndex)
    打开采集卡,参数 deviceIndex 为采集卡编号,从 0 开始。 成功返回 ACQUISITION_CARD_SUCCESS。失败返回 ACQUISITION_CARD_FAILED。
    4.int CPCIAcquisitionCardCloseDevice(unsigned int deviceIndex);
    关闭采集卡,参数 deviceIndex 为采集卡编号,从 0 开始。
    成功返回 ACQUISITION_CARD_SUCCESS。
    失败返回 ACQUISITION_CARD_FAILED。
    5.int CPCIAcquisitionCardGetReadChannelCnt(unsigned int deviceIndex, unsigned int* pNum);
    获取板卡准备的读通道数目。参数 deviceIndex 为采集卡编号,从 0 开始,pNum返回驱动准备好的通道数。
    成功返回 ACQUISITION_CARD_SUCCESS。
    失败返回 ACQUISITION_CARD_FAILED。
  3. int CPCIAcquisitionCardGetWriteChannelCnt(unsigned int deviceIndex, unsigned int* pNum);
    获取板卡准备的写通道数目。参数 deviceIndex 为采集卡编号,从 0 开始,pNum返回驱动准备好的通道数。
    成功返回 ACQUISITION_CARD_SUCCESS。
    失败返回 ACQUISITION_CARD_FAILED。
  4. int CPCIAcquisitionCardWriteRegister(unsigned int deviceIndex, unsigned int offset, unsigned int* pValue)

写寄存器值,FPGA 内部每个寄存器长度均为 32bit。写寄存器,参数 deviceIndex 为采集卡编号,offset 为寄存器偏移(具体参见寄存器具体含义),从 0 开始,通过 pValue 返回寄存器值,需要事先声明一个 unsigned int 变量,初始化为我们想设置的值,并将地址 传给 unsigned int* pValue。成功返回 ACQUISITION_CARD_SUCCESS。 失败返回 ACQUISITION_CARD_FAILED。

8.int CPCIAcquisitionCardSoftReset(unsigned intdeviceIndex)
全局复位,参数deviceIndex为要复位的采集卡编号。

9.int CPCIAcquisitionCardReadRegister(unsigned int deviceIndex, unsigned int offset, unsigned int* pValue);
读寄存器值,FPGA 内部每个寄存器长度均为 32bit。写寄存器,参数 deviceIndex 为采集卡编号,offset 为寄存器偏移(具体参见寄存器具体含义),从 0 开始,通过 pValue 返回寄存器值,需要事先声明一个 unsigned int 变量,初始化为我们想设置的值,并将地址 传给 unsigned int* pValue。
成功返回 ACQUISITION_CARD_SUCCESS。
失败返回 ACQUISITION_CARD_FAILED。

  1. int CPCIAcquisitionCardPrepareRead(unsigned int deviceIndex)
    准备读即采集使能,参数 deviceIndex 为采集卡编号,通过设置第 0个寄存器(从 0 编号,则编号 为 15)的第 1bit 即 record_en 信号(从 0 开始编号)为 1,通知 FPGA 打开设备(比如 ADC) 数据接口,此时设备(比如 ADC)数据可以输入到 FPGA 内部缓存或者 DDR3 缓存。该 API 内部通过 CPCIAcquisitionCardWriteRegister 来实现。
    成功返回 ACQUISITION_CARD_SUCCESS。
    失败返回 ACQUISITION_CARD_FAILED。

11.int CPCIAcquisitionCardReleaseRead(unsigned int deviceIndex)
停止采集,参数 deviceIndex 为采集卡编号,通过设置第 16 个寄存器(从 0 编号,则编号 为 15)的第 1bit 即 record_en 信号(从 0 开始编号)为 1,关闭设备(比如 ADC)相关数据 接口。该 API 内部通过 CPCIAcquisitionCardWriteRegister 来实现。成功返回 ACQUISITION_CARD_SUCCESS。 失败返回ACQUISITION_CARD_FAILED。

12.int CPCIAcquisitionCardRead(unsigned int deviceIndex, int ch, BYTE*buffer, LARGE_INTEGER addr, unsigned int *Length)
参数 deviceIndex 为采集卡编号,int ch 为通道号,buffer为用户分配的接收8M数据缓存。addr为需要读取的数据地址,Length为返回读取的数据大小。
成功返回 ACQUISITION_CARD_SUCCESS。
失败返回 ACQUISITION_CARD_FAILED。

13.int CPCIAcquisitionCardWrite(unsigned int deviceIndex, char* pBuf, unsigned int* pLen)
参数 deviceIndex 为采集卡编号,int ch 为通道号,pBuf为用户输入需写入的8M数据缓存。pLen为返回写入的数据大小。
成功返回 ACQUISITION_CARD_SUCCESS。
失败返回 ACQUISITION_CARD_FAILED。

(3)采集上位机软件DEMO
基于C++的高效性能,在设计中软件采用C++编写。在高速信号采集中,传输带宽一般比较高,为了满足性能,本设计中采用双缓冲形式对上传数据进行处理。
在这里插入图片描述

总结

此次设计在应用中也碰到一些问题,通过实战应用中都得到了解决。当然开发不易珍惜每一分原创和劳动成果,同时注意平时开发过程中的经验积累总结。该工程已经在现有的工程项目中得到了应用和验证,如有需要了解详细的设计可以联系 QQ:309967512

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值