博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Craftor原创]EZ-USB与FPGA的通信接口设计
阅读量:5276 次
发布时间:2019-06-14

本文共 1340 字,大约阅读时间需要 4 分钟。

 

声明: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中即可(在中有说明如何下载)。

该固件中使用了异步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

附件:

转载于:https://www.cnblogs.com/craftor/archive/2011/11/05/2236870.html

你可能感兴趣的文章
对SPI、IIC、IIS、UART、CAN、SDIO、GPIO的解释
查看>>
Thymeleaf模板格式化LocalDatetime时间格式
查看>>
网卡最大传输单位MTU和巨型帧(Jumbo frame)设置
查看>>
jquery bind()方法与live()方法的区别
查看>>
linux安装FFMpeg
查看>>
Python3之format
查看>>
【转】HTML5 API——无刷新更新地址 history.pushState/replaceState 方法
查看>>
USACO / Magic Squares(经典BFS+Cantor展开hash)
查看>>
POJ 2115 C Looooops (扩展欧几里德解同余方程 Ax = B(mod C) )
查看>>
c/c++优秀博文
查看>>
emms指令在MMX指令中的作用
查看>>
Android NDK 交叉编译C++代码生成.so共享库详细步骤
查看>>
1282 回文数猜想
查看>>
notifyDataSetChanged() 动态更新ListView 通过 Handler AsyncTask两种方式
查看>>
poj 1151
查看>>
利用深度学习的点云语义分割(一)
查看>>
hadoop安装笔记
查看>>
vim退出后终端保留 退出前的内容
查看>>
流程预览 ?
查看>>
git中的基本命令
查看>>