周莹 邹连英
【摘要】 本文介绍了基于USB2.0的EZ-USB FX2系列接口芯片之一CY7C68013,为解决PC与FPGA的高速数据传输,利用芯片的SlaveFIFO主从模式将CIS传感器采集的纸币数据准确无损地传给PC机,利用verilog HDL语言在FPGA中产生相应的控制信号,最终实现对数据的快速传输,在上位机得到CIS采集的清晰的纸币画面。
【关键词】 FPGA CY7C68013 SlaveFIFO模式 USB 纸币图像数据
一、引言
USB全称为通用串行总线,是一种作为外围设备与计算机之间通信的标准接口,具有可热插拔、即插即用、快速、双向、以及价格低廉等特性,获得了越来越多用户的接受。本文使用支持USB2.0协议的CY7C68013接口芯片,作为FPGA与PC之间的传输接口。
二、系统总设计
本文利用FPGA芯片作为系统的逻辑控制核心,控制CIS传感器采集纸币数据,并通过A/D将数字信号最终存入SDRAM。USB接口与上位机通信,只需将SDRAM中的数据通过USB传输到上位机显示。整体设计如图1所示:
2.1 USB枚举过程
当集线器端口悬空时,被电阻下拉,当设备插入到集线器时,接了上拉电阻那条数据线的电压对集线器来说,是一个高电平信号,集线器检测到此状态后,报告给USB主控制器,此时便检测到设备。USB的枚举过程是主机获取USB设备信息的过程。
(1)USB主机检测到有设备插入后对其复位,使用缺省地址发送获取设备描述符的标准请求,主机获取到一个数据包的设备描述符并确认无误后,开始进入设置地址阶段。(2)USB主机向缺省地址发送设置地址的请求,设备受到该请求后,直接进入到等待主机输入令牌包,主机确认收到后发送ACK,设备收到ACK之后开始启用新地址。以后主机就通过这个唯一的地址访问该设备。(3)主机使用新地址再次获取配置描述符。枚举完成。
2.2 USB批量传输
本文设备和主机的数据传输采用批量传输,批量传输由建立包、数据包、握手包构成事务。用在数据量大,对数据的实时性要求不高的场合。传输过程如图2所示:
2.3 系统硬件结构
本文采用了USB的slaveFIFO模式,利用FPGA产生CY7C68013的控制信号。USB与FPGA的接口信号FLAGB、FLAGC用来指示FIFO的空满状态,SLOE、SLRD、SLWR信号分别为输出使能信号、读写控制信号,FIFOADD[1:0]的4个位用于选择芯片内部的4个缓冲区之一。FD[15:0]为双向数据端口。
三、软件设计
系统的软件设计包括三部分:FPGA控制器的verilog程序,USB的固件程序、上位机的控制程序。
3.1 同步SlaveFIFO写的状态机如下
IDLE:空闲,此时写事件如果发生,转入状态1;
状态1:触发FIFOADD[1:0]指向IN FIFO,转向状态2;
状态2:如果FIFO满,则保持本状态,否则转向状态3;
状态3:驱动数据到总线上,触发SLWR有效,转向状态4;
状态4:若还有数据写,则转向状态2,否则转向IDLE;
3.2 USB的固件程序
USB固件是运行在CY7C68013芯片中的代码,只有将固件程序完整的下载入芯片中,芯片才可以被外围信号控制。SlaveFIFO模式中,USB内嵌的8051固件的功能只是配置SlaveFIFO相关的寄存器以及控制USB何时工作在SlaveFIFO模式下。一旦8051固件将相关的寄存器配置完毕,FPGA即可按照SlaveFIFO的传输时序,高速的与主机进行通讯,而在通讯过程中不需要固件的参与。在固件程序中,TD_Init函数只会在USB启动后调用一次。在这个函数里添加自己的初始化代码,也就是传输数据前要处理的,例如USB工作模式、CPU时钟频率、端点选择、端点传输方向、FIFO大小配置等。TD_Poll函数就是用户调度程序,USB会在空闲的时候反复调用该函数,所以我们把自己需要反复执行的代码放在这里。本文在初始化函数TD_Poll中,改动的部分如下:
Void TD_Init(void)
{...
IFCONFIG = 0x03;// 设置外部时钟源、同步传输、slave fifo模式
EP2CFG = 0xE2;//2端点IN、批量传输、512字节双缓冲
EP6CFG = 0xE2;//2端点IN、批量传输、512字节双缓冲
AUTOPTRSETUP |= 0x01 //使用自动指针,使用自动指针
....
}
3.3 上位机应用程序设计
上位机应用程序的作用就是提供一个人机交互的显示界面,体现系统的运行状态。这里采用MicrosoftVisual C++ 6.0 进行上位机应用程序的设计,程序中采用CYAPI 控制函数类。CyAPI 控制函数类为EZ-USB FX2LP系列USB接口芯片提供了十分精细的控制接口。在使用Cypress 公司提供的驱动程序基础上,只需在主机程序中加入头文件CyAPI.h 和库文件CyAPI.lib 即可调用相应的控制函数。
四、测试结果
主机与设备之间通过USB的数据传输,实现对SDRAM中纸币数据的上位机图像显示。显示如图3所示:
五、结束语
本文主要利用USB与FPGA的通信进行纸币数据采集的验证,能高速的将CIS采集的数据在上位机上进行显示,便于观察与调试。USB通信与其他串口扩展技术相比具有较大的优越性。其设置比较灵活,应用受限制少,在各种分布式控制领域部有推广使用的价值。