0 引言
1994年,Compaq、Intel、Microsoft、NEC等7家世界著名的计算机和通讯公司成立了USB论坛。1995年11月正式制订了USB通用串行总线(universal serial Bus)规范。USBl.1主要应用在中低速外部设备上,它支持的传输速率有低速1.5 Mbps和全速12 Mbps。1999年初在Intel的开发者论坛大会上,介绍了USB2.0规范。最新的USB2.0支持3种速率:低速1.5 Mbps、全速12 Mbps和高速480 Mbps。这3种速率可以满足目前大部分外设接口的需要。本文介绍了目前使用较多的USB2.0控制器CY7C68013与FPGA接口的VHDL实现。本系统可扩展,完全可用于其他高速数据采集、高速数据通信系统中,可以支持宽带数字摄像设备及下一代扫描仪、打印机及存储设备等。
1 CY7C68013简介
CYPRESS开云棋牌官网在线客服公司的EZ-USB FX2系列芯片是最早符合USB2.0协议的微控制器之一,以其良好的性能和独特的设计在USB接口开发领域占有重要的地位。CY7C68013是EZ-USB FX2系列芯片中的一款高性能USB2.0微控制器,它提供了全面的USB2.0外围设备解决方案。
CY7C68013将USB外围接口设备所需的各种功能集成在一个单片电路上,通过集成的USB收发器连接到USB总线的D+和D一端;串行接口引擎(SIE)进行译码、编码、错误纠正和位填充,变换USB所需的信号电平;最终,从USB接口SIE发送和接收数据。USB2.0控制器CY7C68013数据传输速率快,可支持移动硬盘、ATA、FPGA和DSL调制解调器等接口。CY7C68013主要具有如下特性:
(1)芯片内有480 Mb/s的收发器(PLL和智能SIE),包含全部USB2.O物理层(PHY);
(2)2、3、4倍增缓冲端点FIFO,以适应480 Mb/s的USB2.O传输速率;
(3)内部嵌入可运行在48 MHz频率的增强型8051内核;
(4)4个接口FIFO:它们都可以由外部和内部来提供时钟,端点FIFO与接口FIFO两者相结合可以实现缩短USB和外部逻辑电路数据传输的时间;
(5)通用可编程接口(CPIF)作为一种编码状态设备,可实现时序管理,使得CY7C68013 FIFO达到无缝连接。CY7C68013集成了很多功能,设计时无需考虑外部物理层(PHY),从而大大降低了成本,并减少了芯片间高速信号布线的困难。
2 系统的设计实现
系统结构如图l所示,本设计中,应用程序是用户界面;USB驱动用于连接用户和底层硬件;USB2.O控制器68013用于FPGA和PC间的数据交互。
2.1 硬件结构
本系统硬件连接主要是由FPGA和USB2.0控制器,如图2所示。同时也可以根据实际系统的需要,用FPGA实现预定功能,硬件接口模式有Slave FIFO和GPIF两种接口模式。本方案采用Slave FIFO模式,当EZ-USB FX2工作于Slave FIFO时,外围电路可像普通FIFO一样对FX2中的端点2、端点4、端点6、端点8的数据缓冲区进行读写。图2展示了这种模式下FX2和外围电路的典型连接,其中,IFCLK为接口时钟,可由芯片CY7C68013产生(30 MHz/40 MHz),也可由外部输入(5MHz/48 MHz);FLAGA-FLAGD为FIFO标志管脚,用于映射FIFO的当前状态;SLCS#为从属FIFO的片选信号,低电平有效;FD[15∶O]为16位双向数据总线;FIFOADDR[1∶O]用于选择和FD连接的端点缓冲区;SLOE用于使能数据总线FD的输出;SLRD和SLRWR可分别作为FIFO的读写选通信号;外围电路可通过使能PKTEND管脚向USB发送一个IN数据包,而不用考虑该包的长度。
2.2 系统软件
系统软件设计主要包括3部分:VHDI代码、USB固件程序(Firmware)以及应用程序。
2.2.1 VHDL程序设计
FPGA是通过Slave FIFO的方式和USB控制器CY7C68013相连的。FPGA读取数据,通过查询CY7C68013中FIFO的状态来判断是否可以进行读数据,主要是查询状态标志位FLAGC。读数据程序状态转移图如图3所示。
状态1:在空闲时,接到命令,发起传输,使地址指向用于下传数据的FIFO。进入状态2;
状态2:查询读状态的FIFO标志FLAGC,如果为FIFO为空,则继续等待,如果有数据则进入状态3;
状态3:使读数据信号线有效,接收数据,接收完数据后进入状态4;
状态4:如果FIFO中还有数据需要接收,则进如状态2,否则进入空闲状态。
FPGA在上传数据时,原理基本相同,方向相反,采用不同的FIFO和查询状态标志位。
2.2.2 固件编程
固件编程就是对USB设备的各类寄存器进行配置的过程。固件程序是指运行在设备CPU中的程序,只有在固件程序运行时,外设才称之为具有给定功能的外部设备。固件要完成以下主要工作:
(1)初始化工作;
(2)对设备进行重新列举(ReNumeration);
(3)响应中断,并对中断作相应的处理;
(4)数据的接收与发送;
(5)外围电路的控制。
为了简化固件编程,CYPRESS提供了开发固件库和固件编程框架,只需在此基础上添加少量代码就可以完成固件编程。USB建立固件编程框架的文件见表1,在实际编程过程中,根据自定义,只需要修改Periph.c和Dscr.a51两个文件。固件代码固化到一片EEPROM中,设备加电后由FX2通过I2C总线自动加载到片内RAM后自动执行。设备功能、工作方式等均可以通过改写固件程序,重新配置。
2.2.3 应用程序
应用程序是系统与用户的接口,设备驱动程序提供应用程序访问底层硬件的接口。驱动程序采用了CyPress公司的通用驱动程序ezusb.-sys,完全能够满足本系统设计的要求。在驱动程序被系统加载后,它的许多进程处于Idle状态,需要应用程序去调用激活。应用程序利用Win32 API直接调用驱动程序,实现应用程序和驱动程序的信息交互。
应用程序实现了数据下载和数据上传两个功能,在Windows操作系统中,只需要通过调用几条简单的文件操作API函数,就可以实现与驱动程序中USB设备通信。 Win32应用程序调用WDM驱动程序的Win32 API函数有5个:CreateFile(创建设备)函数;CloseFile(关闭设备)函数;ReadFile(从设备读取数据)函数;WriteFile(对设备写入数据)函数;DeviceContronl(设备控制)函数。对于DeviceloControl()函数的调用,驱动程序根据I/O控制命令来决定该如何获取应用程序的缓冲区地址。
本设计就采用DeviceloControl函数来进行应用程序和WDM设备驱动程序间的通信。以下是DevicelIoControl的声明:
DeviceIoControl(
HANDLE hDevice;设备返回的句柄
DWORD dwIoControlCode;驱动程序的控制命令
LPVOID lpInBuffer;应用程序发给驱动程序的缓冲区地址
DWORD nInBufferSize;应用程序发给驱动程序的缓冲区大小
LPVOID lpOutBuffer;驱动发给应用程序的缓冲区地址
DWORD lpOutBuffer;驱动发给应用程序的缓冲区大小
LPDWORD lpBytesReturned;存放驱动程序实际返回字节数
LPOVERLAPPED lpOverlapped;同步时置为NULL)
3 测试结果
3.1 PC下传数据
FPGA采用系统时钟为50 M,为便于计算传输效率和传输可靠性,在应用程序中加载计时函数,下传数据每次发送100M,发送数据为位宽8 b的循环递增数列,结果显示下传数据最大速率为42.1 MB/s,在FPGA中用嵌入式逻辑分析仪查看接收的数据,如图4所示。每个u_slrd读脉冲,FPGA读取一个16 b数据,由于发送时是按照8 b发送,接收数据是16 b,所以每次接收到的16位数据,是2个8位数的组合。从图4中可以看出FPGA接收数据准确,无丢失数据的情况。
3.2 PC接收数据
在接收数据时,同理,应用程序每次接收100 M,将读取的数据以文件bin的形式存储在应用程序工程目录下,结果显示bin文件中数据准确。测得最大传输结果为 38.4MB/s,利用FPGA嵌入式逻辑分析仪分析结果如图5所示,每个u_slwr读脉冲,FPGA发送一个16 b数据。
4 结束语
本系统通过FPGA控制USB2.O控制器CY7C68013达到高速数据传输的目的,具有硬件结构简单、软件扩展性强、传输数据准确性高等特点,目前下传和上传速度分别为42.1MB/s和38.4 MB/s,完全可以应用于高速数据采集、高速数据通信、数字摄像设备及存储设备等。