admin 发表于 2019-3-30 22:05:54

小梅哥USB学习笔记【20190331更新】

20190330
附件为基于AC6102的USB3.0 Slave FIFO StreamOUT模式传输的Verilog代码。


虽然之前也做过这个实验,但是之前使用的是Cypress官方提供的Verilog代码,使用的是三段式状态机,对于我个人来说并不是很好理解,而且那个代码仅仅做了数据读取,没有做其他任何功能,也没有支持写入FIFO或RAM的接口,因此这个例子中我加入了写入FIFO的local接口,可以把从USB接收到的数据写入FPGA的FIFO或者RAM中。而且,由于USB3.0传输非常快,FPGA中如果使用SDRAM、DDR等存储器实时接收存储数据,需要在FPGA中主动控制整个PC到USB芯片的数据传输速率,引出增加了一个local_en端口,只有FPGA中使能该端口时,才能读取USB芯片Slave FIFO数据,所以能够控制整个传输速度。
另一方面,为了方便进行板级测试,将该信号接到了开发板的S3按键上,由于S3默认就是高电平,按下低电平,因此在程序中将该信号取反后使用,以实现按下按键S3使能传输的测试,实验还是按照AC6102 USB 3.0开发教程中的方法进行测试,使用signaltap ii进行数据抓取。

说个自己调试过程中遇到的坑,在最开始调试时候,每次FPGA开始读取USB SLAVE FIFO中的数据后,总是无法读取完,就好像USB芯片中有无穷尽的数据,cs和rd一直为低,也无法读空数据,后来才发现是pktend信号搞的鬼,因为是从Salve FIFO读数据,用不到pktend信号,因此程序中没有管这个信号,没有对其赋值,结果导致该引脚在程序运行过程中一直为低电平(低电平代表了该信号有效),因为USB芯片的固件是同时支持IN 和OUT的,导致USB的固件程序一直在处理PKTEND有效的程序中,从而无暇去处理USB传输内容,才出现了这种现象。最后在程序里强制将该信号置一,就解决了。


20190331
附件为基于AC6102的USB3.0 Slave FIFO StreamOUT模式传输数据写入到DDR2中,然后由TFT控制器读出,显示在5寸800*480分辨率显示屏上的工程。

传输图片使用的是小梅哥自己开发的一个USB上位机,见下述附件

传输的图片是使用LcdImage软件生成的16位的bin格式的文件,这里提供两个测试文件,如下述附件所示,使用时先解压得到bin文件哦:

使用时,需要给AC6102开发板的USB芯片烧写SF_StreamOUT固件
将小梅哥FPGA配套的5寸触摸显示屏插接到AC6102开发板上
下载FPGA工程的sof文件到AC6102开发板中
下载完成后应该能看到显示屏呈现雪花状态。
使用XLH_USB_Console软件,选择下传数据,选择需要传输的图像文件,然后输入传输大小为752KB,点击开始传输就可以看到图像已经显示在开发板显示屏上了。如下图所示



说个调试过程中遇到的问题和处理方法
最开始,一直使用cypress的control center软件传输bin文件,每次都能传输成功,但是图像就是最下面几行一直出不来,,传两次图像能够显示完。经过分析,确认是丢失了部分数据,这部分数据算不上丢失,而是因为没有满足一个传输包的大小,所以一直无法读取。
经过简单计算:
800*480*16bit的图像大小为768000字节
768000字节除以Slave FIFO一次传输的长度16384字节,结果为46.875,为小数,既一副图像大小并不是刚好是Slave FIFO每次传输长度的整数倍。导致最后有16384*0.875 = 14336字节数据因为不满一包,没有成功被FPGA读走。
既然这样,那就在传输的时候,传输47个包就行了,图像文件数据不够47*16384字节大小的的部分补0即可。
47*16384 = 752KB,所以可以看到,在上述上位机软件中,传输的大小指定为752KB
另外,为了避开传输多余的数据,导致DDR2中存储的数据每次位移,在指定写入DDR的长度时,也进行了修改,变为了47*16384 /2 = 800*480+1024。

wx_yq1uz522 发表于 2019-4-17 13:44:04

写的非常汗,赞赞赞。支持支持紫河车

yfg 发表于 2023-8-11 14:33:19

请问小梅哥这个源代码有吗?可以发一下让我们学习一下吗?




CrazyFish 发表于 2023-8-17 23:42:41

不错的帖子

RichardChang 发表于 2023-12-26 15:38:03

赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
页: [1]
查看完整版本: 小梅哥USB学习笔记【20190331更新】