一种新型高速数据采集系统的设计与实现

分享到:
点击量: 212994

  在雷达接收机的测试和维护中,经常需要对数据进行采集,然后将采集到的数据送入计算机进行分析处理。鉴于对数据实时采集的需求,对采集系统提出三方面的要求:**,接口简单灵活且有较高的数据传输率;**,采集的数据能够快速处理并能方便提取原始数据;第三,数据采集装置具备多路数据采集能力。对于一些特殊应用,甚至需要整个数据采集系统能够方便携带。

  传统的数据采集系统大多通过PCI总线完成数据的传输,但PCI总线存在严重缺陷:受限于计算机插槽数量和中断资源;不便于连接与安装;易受机箱内电磁环境的影响。这些问题遏制了基于PCI总线的数据采集系统的进一步开发和应用。因此,需要一种更为简便通用的方式来完成采集系统和计算机的数据的交互。

  考虑到现代计算机上大都配备了USB接口,且USB支持即插即用,安装方便,易于扩展,USB2.0能够达到480Mb/s的理论传输速度,非常适合在高速数据采集系统中应用。因此,通过USB接口来完成数据传输是一个很好的替代方案。出于上述考虑,笔者设计了一个基于USB2.0接口的高速数据采集系统,通过实际测试,该系统可以很好的完成数据采集的功能。

  数据采集系统电路设计

  高速数据采集系统框图如图1所示。系统整体的设计思路如下:计算机将采集指令(包括数据格式,数据长度,FPGA控制指令等)送给USB控制芯片,USB控制芯片通过固件程序对指令进行简单的格式判定,然后将判定后正确的指令送给FPGA,FPGA对指令进行译码,获得需要采集的数据的长度,以及采集的地址和控制信号,控制RAM来完成数据的采集存储。雷达接收机送过来的数据和时钟信号经过长线接收器组以后,由差分信号变为普通的数字信号,时钟信号送入FPGA,经过处理后,用来控制数据的采集时刻,数据先存入RAM,待完成所需数目的采集以后,再通过USB控制芯片送给计算机,完成数据的后期处理和显示。

  

 

  图1 高速数据采集系统框图

  图2为FPGA与USB控制芯片的连接图,电路中FPGA选用EP1C3T144C8,USB控制芯片选用Cypress 公司的CY7C68013。USB_Ready 为USB芯片状态标志,低电平有效;FPGA_Ready为FPGA芯片状态标志,低电平有效;USB_Clk为USB向FPGA传送指令的指令时钟,USB_Data 为USB传送给FPGA的控制指令;FD[15:0]为USB 与FPGA交互的数据。

  

 

  图2 FPGA与USB控制芯片的电路连接图

  FPGA与USB芯片之间的通信流程如下:

  1、FPGA发送FPGA_Ready信号给USB控制芯片,表示FPGA准备好;

  2、USB控制芯片发送USB_Ready信号给FPGA,表示在USB_Ready为低电平期间将有控制指令传送;

  3、USB控制芯片由Send_CLK发送时钟信号,同时由Send_DATA发送控制指令给FPGA,控制指令在时钟信号上升沿有效;

  4、FPGA收到控制指令,执行相应动作。FPGA发送各种控制时序信号和RAM地址,把I路、Q路数据存在RAM里,而后将数据读到FPGA,再通过FD[15:0]以字的形式传给USB控制芯片的从属FIFO端点EP8缓冲区,由PC机读取。

  数据采集系统软件设计

  系统软件主要分为FPGA 模块设计程序,USB 固件程序,以及上层应用软件程序。

  FPGA模块编程

  系统采用Altera 公司的Cyclone系列的FPGA芯片,采用Verilog HDL 作为开发语言,开发环境采用Quartus II 5.0。

  在系统的FPGA软件设计过程中,根据功能的需要,将整个系统分为了三个大的模块来设计,分别为:时钟、控制指令输出模块,数据采集、存储模块,USB数据传输模块。时钟、控制指令输出模块对输入的时钟进行整形,形成数据采集时钟,同时,输出22位控制电平信号;数据采集、存储模块对输入的数据进行采集并存储在存储器里;USB数据传输模块读取存储器里的数据并把数据输出至USB的FIFO里。

  USB 固件程序

  固件程序即为写入USB单片机中的程序,它是设备运行的控制**.Cypress公司提供了固件架构,用户可以利用这一架构简化固件开发。固件设计架构是由Keil C51编译器与其整合开发工具编写和构建的.在程序开始时,固件架构会执行下列步骤:

  1) 设置所有内部状态变量的初始值。

  2) 调用用户的初始设置函数TD_Init( ),待返回后,固件架构就会将USB接口设置为未配置的状态。

  3) 在1s的时间间隔内,开始重新进行设备列举,直到设置封包收到端点0为止。

  4) 当SETUP封包被检测到后,固件架构就会启动工作分配器,而这个工作分配器就会按顺序重复地执行下面的工作:

  A: 调用用户函数TD_Poll( )。

  B: 是否决定标准设备请**未定(或等待决定)的。如果已决定,它将会分析所收到的命令请求,并且加以响应。

  C: 是否决定USB核心已经报告了USB中止(Suspend)事件。如果已决定,它会调用用户函数TD_Suspend()。

  若取得成功的返回,则测试回复(Resume)事件。反之,如果未检测到,将会把微处理器放人中止模式中。当回复事件被检测到时,将调用用户函数TD_Resume( ),并且连续地跳回至步骤C。

  D: 若从TD_Suspend()函数中未收到成功的返回,再连续地跳至步骤C。

  实际上Cypress公司提供的这个固件框架已经能够使USB芯片正常的工作,但是,它并不能满足本系统的需要。需要添加自己的控制代码来控制USB芯片,使之能够完成需要的工作。

  框架程序中为提供了两个函数TD_Init( ),TD_Poll( ),根据上面的分析发现,这两个函数分别完成了系统的初始化工作和系统的用户期望工作。在此采集系统中,只需要修改这两个函数,添加自己的功能函数,即可完成系统需要的功能。

  在TD_Init( )中,需要添加自己的代码来完成系统的初始化,因为系统采用了2端点和6端点的批量读写功能,所以,将2端点配置单缓冲区512字节,两倍缓冲区,作为In端点,将6端点配置为单缓冲区512字节,两倍缓冲区,作为Out端点,配置系统为异步Slave FIFO 模式。

  在TD_Poll( )中,通过检测2端点和6端点缓冲区数据的状态,来及时的读取这两个缓冲区中的数据,然后调用自己定义的函数DecodeInst( ), ImplementInst( )来完成对于控制指令的译码和执行工作。

  驱动程序

  基于EZ-USB FX2的二次枚举的特性,需要编制两个驱动程序:一个驱动程序loader.sys,它将在主机上编写好的固件程序在主机系统启动时下载至FX2的RAM中;另一个驱动程序USBBULK.sys为实际安装的驱动程序。另外,为实现在系统启动时,自动安装两次驱动程序,还需编写自己的ezloader.inf文件实现。loader.sys需要自己编写生成,USBBULK.sys可使用CYPRESS公司的通用驱动程序。

  用户程序

  用户程序是系统与用户的接口,它通过通用驱动程序完成对外设的控制和通信。在编写用户程序时,首先要建立与外设的连接,然后才能实施数据的传输。启动采样后,为了保证不丢失数据,用户程序应建立一个新的工作线程专门获取外设传来的数据。程序中主要用到两个API函数:CreateFile()和DeviceIoControl()。CreateFile()取得设备句后,DeviceIoControl()根据该句柄完成数据传输。

  系统通过DeviceIoControl()完成的工作如下:

  数据批量读,数据批量写。

  结语

  为了验证本系统采集数据的准确性,利用信号源产生的正弦波信号对系统进行验证。测试结果如图3所示。

  

 

  图3 测试结果

  通过实际测量,该系统测量数据与实际情况完全符合,单通道采样速率*高可达到10Mbps。

  整个采集系统由USB2.0数据传输、FPGA、逻辑电路、和计算机等组成,通过对该系统的硬件电路设计和软件编程分析,以及实际测量结果的比较,证明了该系统的可行性。由于采用高速USB2.0接口,本系统具有即插即用、高速采集等特点,具有很好的扩展性。该采集系统已经在雷达接收机的测试系统中得到应用。