[Craftor原创]EZUSB与FPGA的通信接口设计

声明:Craftor原创,转载请注明出处。

使用芯片:CY7C68013A(Cypress)与XC3S50AN(Xilinx)

一、原理图

FPGA与EZ-USB通过异步FIFO方式连接,以下截图来自于Cypress的手册EZ-USB_TRM.pdf。

将图9-19和9-22两图中的信号合并在一起,与FPGA连接即可。

本例子中使用了以下信号: FIFOADR[7:0](只用了8位总线)、SLRD、SLOE、SLWR、FLAGA(配置成EP6 FULL)、FLAGB(配置成EP2 EMPTY)、PKTEND(常1)、SLCS#(常0)

wps_clip_image-21948

wps_clip_image-28363

二、FPGA读写SlaveFIFO时序

wps_clip_image-10588

异步写,在FULL不为0的时候,SLWR下降沿的时候将写的数据放到总线上,保持一个周期即可将数据写入。

wps_clip_image-30689

异步读,在EMPTY不为0的时候,将SLOE和SLRD拉低,过半个周期读总线上的数即可。

-->附件中有原理图可以参考

三、FPGA代码

工程结构如下图,在Xilinx ISE中。

wps_clip_image-9046

1)usb_bmd.v为顶层测试文件,测试上行和下行的数据。

2)RX_FIFO为下行数据缓存FIFO,TX_FIFO为上行数据缓存FIFO。

本工程中直接例化了FPGA内部的FIFO,可根据实际情况适当加大或减小FIFO,最小深度不得低于512。

3)usb_trx为FPGA与CY7C68013A通信的核心模块,包括:rx_engine.v下行接口,tx_engine上行接口,clk_div.v分频模块(控制FPGA读写SlaveFIFO的频率,不高于48M)。

可以根据实际电路情况调高或降低分频系数,但不建议修改,源代码中的分频系数已经为实测最佳情况,双面板没有做任何阻抗匹配的情况下,可以稳定传输数据。如果PCB阻抗做的比较好,可又适当调高试试。

4)S3an.ucf为管脚约束文件,可又根据自己的FPGA管脚进行修改。

-->附件中有Verilog源代码

二、固件程序,见附件CFR-FIFO-1.1.iic

通过CyConsole下载到外部的EEPROM中即可(在学习笔记[1]中有说明如何下载)。

该固件中使用了异步SlaveFIFO模式,使用端点EP2和EP6,512B 大小,4倍缓冲。

-->该固件仅供学习使用,源代码不公开,也不需要公开。

三、测试

1)使用EZ-USB CyConsole,选择Endpoint 6 IN,接收到的数为00~FF。

因为在usb_bmd.v代码中,不断向TX_FIFO中写入8位的cnt,从0开始。如下图

wps_clip_image-26326

2)使用CyBulkLoop程序,进行闭环测试。数据包长度为512,从0开始累加,测试结果如下图。

细心的读者可以发现,实际在usb_bmd代码中做了手脚,上传的数据并不是真正下发的数据,而是自己上传的00~FF。

因为如果将代码中的RX和TX进行闭环,是下行一个数据(8b)立即上传一个数据的。而USB的SlaveFIFO是512B的,每次上行数据最小是512B,而且必须是512B的整数倍。在实际应用中需要注意。

wps_clip_image-27117

附件:

http://dl.dbank.com/c04h9fkkbu

原文地址:https://www.cnblogs.com/craftor/p/2236870.html