文献标识码:A
文章编号: 0258-7998(2010)09-0112-03
实时数据的采集以及显示等都会涉及到PC机和下位机间的数据传输,而传输数据中的丢点问题是实时数据采集中必须解决的问题。传统的数据采集系统由于传输速度低或者安装不方便等问题已不能满足科研和生产过程的需求。输入的实时数据是带有帧头的8位串行数据流,直接与CY7C68013A的GPIF(General programmable interface)接口对接不能保证数据完整不丢失,并且无法在数据中加入帧识别信息。在这种情况下采用FPGA完成此部分逻辑功能。通过FPGA对实时数据进行相应的调整再交给CY7C68013A传送到上位机中。
1 系统硬件电路设计
1.1 系统结构和数据流程
本系统采用FPGA xc2s50-144完成整个系统的数据采集的处理,采用具有微处理器的USB接口CY7C68013A,通过USB接口将FPGA处理后的数据实时地传输到计算机上。当PC机发出数据采集、读取数据等控制命令时,控制命令通过CY7C68013A传送给FPGA,由FPGA启动A/D芯片进行A/D转换。A/D转换后将串行数据流和时钟发送到FPGA中,FPGA通过判断帧头截取有效数据并将数据转换成8位的并行数据并缓存至FPGA内部设计的FIFO中,由上位机通过USB接口芯片CY7C68013A以GPIF主控模式将数据传送至上位机中。系统总体设计图如图1所示。
1.2 USB接口芯片
CY7C68013A是Cypress公司的FX2系列产品,可提供480 Mb/s的传输速率。CY7C68013A提供了一种独特架构,使USB接口和应用环境直接共享FIFO,而且微控制器可以不参与数据传输,但允许它以FIFO或RAM的方式访问这些共享FIFO,CY7C68013A的内部FIFO缓冲区中有四个端点,它们可以通过设置相应的EPxFIFOCFG(x是端点号)寄存器被配置为2倍、3倍或4倍缓冲区。双缓冲区可以允许一个数据包在被8051访问的同时,另一个进行USB数据传输。3或4缓冲区则允许在2个或3个缓冲区被访问的同时,由另一个进行USB数据传输。这样就可以把数据包可用的时间延迟减至最小,从而增加带宽的吞吐量。CY7C68013A共有三种工作模式:分别为普通端口模式、GPIF模式和从属FIFO模式。这三种工作模式由寄存器选择决定。本设计中采用GPIF主控模式,GPIF在连接到外部逻辑设备时,可充当“内部”控制,可以作为CY7C68013A端点FIFO的内部主控制器。
1.3 硬件连接图
使用GPIF方式对FIFO芯片进行读写工作并使用PORTB双向FIFO数据线,使外围电路像普通FIFO一样对FX2中端点2、4、6、8的数据缓冲区进行读写。当CY7C68013A工作在GPIF模式时,由PC机上发出控制命令给USB,CY7C68013A提供FPGA的片选、读数据时钟等信号。接口连线图如图2所示。
2 软件设计
2.1 固件程序的设计
固件的作用是辅助硬件来完成预期的设备功能,固件主要工作如下:
(1)寄存器初始化工作,按照需要设置特殊功能寄存器的初值;
(2)辅助硬件完成设备的枚举过程,对主机的设备请求作出适当的响应;
(3)完成中断处理、数据接收和发送以及对外围电路的控制。
在固件程序中,按照FIFO的时序图完成GPIF波形设计,并生成波形描述符文件GPIF.c供设备功能程序main.c调用。生成的GPIF.c会初始化波形设计用到的寄存器,包括配置接口的设计,在TD_Init()中初始化函数,配置好使用的端点类型,传输数据包的大小。在TD_Poll()中设置好GPIF的读数据传输,通过main.c中对TD_Poll()的重复调用,完成USB的大数据量传输。
2.2 GPIF波形图
根据FPGA编写的时序,利用Cypress公司配置的GPIF Designer画出相应的时序图,如图3所示。
在数据读时序状态设计中,在S3状态,让读使能REN低电平有效。在S4中判断FPGA内FIFO 的空标志是否有效,有效后开始进行FIFO的读传输,OE用来控制数据出现在数据总线上的时间。数据总线在S5时拉高是数据有效(activate),GPIF按字节将数据读到FIFO中,同时TC计数器会减一。在状态6时,以计数器的值来判断一帧数据是否完成传输。如果没有完成,则不断循环,读完所有数据为止;如果读完了所有数据后,则不再经过中间其他任何状态,直接跳到状态7(IDLE),表示完成一帧数据的传输。设计中在S4、S6设定决策点。
2.3 USB驱动设计
USB功能驱动程序采用Cypress公司的通用驱动程序ezusb.sys,ezusb.sys驱动的开发工具为DDK,驱动程序开发工作包括:开发环境设置(VC编译环境)、驱动程序设计、安装文件(INF文件)设计。驱动程序减少了USB设备硬件处理数据的细节,为应用程序访问USB硬件设备提供相应接口。
用户编写应用程序只要调用它提供的接口函数及其所需要传递的参数来实现所需的功能。应用程序用CreateFile()函数打开设备并且创建与设备的连接,然后用DeviceIoControl()函数或ReadFile()与WriteFile()函数从驱动程序中读写数据和向驱动程序写入数据。当应用程序退出时,用CloseHandle()函数关闭设备。这一过程将产生对应于此设备对象的IRP与驱动程序设备类成员函数,如表1所示。
2.4 应用程序设计
应用程序是系统与用户的接口,它通过动态链接库调用通用驱动程序完成对外设的控制和通信。本系统的应用程序开发使用的是Visual Basic6.0中文版本。本系统的工作过程为:首先是查找设备打开设备句柄,然后调用动态链接库发送控制命令启动系统,当检测到设备后进行数据的读取命令,调用动态链接库的函数关闭设备句柄。系统的应用程序界面如图4所示。
3 系统整体检测
3.1 FPGA逻辑正确性检测
利用FPGA内部累加器模拟ADC转换后的串行数据以及相应的时钟,利用Cypress公司提供的Control Panel 发出控制命令直接给接口芯片,并读取FPGA内部产生的数据,观察其中的数据与设定的FPGA中发出的数据是否相同,以验证FPGA内部逻辑的正确性。相应地利用示波器监测FPGA内部的时钟信号,验证其正确性。
3.2 数据传输数据检测
数据传输检测中增加FPGA内部累加器产生的数据包的数量,采用Bus Hound 记录总线状态变化,在得到的结果中观察Bus Hound中的数据形式并查看VB读数软件中的数据文件,观察得到的数据文件数据总量以及大小都正确,再打开应用程序中的数据文件所示的波形,从而验证了数据传输的正确性。
4 本系统中对传输速度改进方面的分析
本系统中主要需要体现数据的实时性传输,在数据的处理部分与USB部分提高数据传输速度。主要通过以下方面使速度得到提高:
(1)在数据处理部分利用FPGA截取数据的有效部分,并将串行数据变成并行数据,以利于数据更快、更准确的传输。
(2)为了保证数据不丢失,在FPGA内部增加内部FIFO,使数据在提交的同时也可以传输。
(3)在USB的固件部分,使用AUTO传输方式,数据直接经过USB2.0核、FIFO、GPIF Master以及NandFlash这条高速路径传输,而不经过低速的8051核,从而可以达到较高数据传输速度。
(4)在固件的端点设置中,使用多缓冲机制,通过改变EPxCFG配置寄存器中的BUF0、BUF1位的值,就可以设置缓冲数。
(5)使用GPIF方式进行传输,在GPIF波形的延时,提高GPIF波形的执行频率,也可以提升读取速度。
在进行系统整体性能的测试中,发现如果加快FPGA的数据输出速度,则在读出的波形中会有部分丢包的现象,经过分步重新测试,发现在FPGA的内部FIFO中,如果写时钟与读时钟的差距太大,就会造成丢点或者错点的现象,所以USB的GPIF产生的读波形应该与FPGA的写入速度相平衡,整体重新进行调试后,满足了实时显示并且稳定的条件。
本文利用FPGA和USB接口芯片CY7C68013实现了采样数据的高速传输。特别是在调试过程中为了保证数据的正确性,提出了适合于通用驱动程序的块传输同步控制信号。在上下位机的协调控制下数据能够高速有效地传输。多次试验证明,此系统运行稳定,能够满足工作环境复杂、传输速度要求高的场合。
参考文献
[1] EZ-USB FX2 technical reference manual version 2.0 [M/CD].Cypress Semionductor Corp data book,2001.
[2] 钱峰.EZ-USB FX2 单片机原理、编程及应用[M].北京:北京航空航天大学出版社,2005.
[3] 时向卫.Win2000/XP USB 设备驱动程序研究与设计[J]. 计算机工程与设计,2008,29(21):5563-5564.
[4] 赵卉.基于USB接口的无线数据传输系统设计[J].微计算机信息,2008,24(8-2):107-108.
[5] 王伟.基于USB2.0 的高速数据采集与传输系统的研究[D].长春:吉林大学,2007.