基于FPGA的CYUSB3014双向通信实验

文章目录

  • 开发环境
  • 准备工作
    • 驱动
    • 固件
      • GPIF II Designer
      • 写标志
      • 读标志
      • CyU3PGpifSocketConfigure设置水印值
  • 测试
    • 下载固件
    • 读测试
    • 写测试
    • 测速
    • 固件固化到CYUSB3014
  • 总结
  • 福利

开发环境

  • 小梅哥AC6102开发板(内含CYUSB3014芯片)
  • quartus prime17.1
  • win10
  • 带usb3.0接口的电脑
    只要带CYUSB3014芯片的fpga开发板都可以参考本教程

准备工作

基于FPGA的CYUSB3014双向通信实验_第1张图片

  • 缓冲区可以通过固件来配置,上图是2缓存,每个缓冲区是1kB,为了提高性能,我在固件中设置的是4缓存,每个缓冲区16KB.数据总线32位宽,时钟100MHz,实测上下行通信都能达到338MB/s

基于FPGA的CYUSB3014双向通信实验_第2张图片

  • CYUSB3014芯片与fpga连接还是和usb2.0的一样,使用的是GPIF接口,我们只需要把CYUSB3014当成fifo来使用即可。

驱动

  • 先安装FX3_SDK_Windows_v1.3.3,这个软件安装目录,下面有简称为SDK
  • 在SDK目录中,有提供很多文档、固件实例和相应的驱动
  • 在进行试验前要先安装好cypress提供的usb驱动,插上usb后,电脑就会检测到未识别的设备,这时打开设备管理器,右键未识别的usb,然后手动选择驱动。
    基于FPGA的CYUSB3014双向通信实验_第3张图片

    固件

    • 对于固件这块,有兴趣的同学可以自己去研究一下,如果只是使用的话,就可以直接使用我写好的固件。使用本实例的固件,你就可以基本可以把当成usb2.0一样使用了,因为他们都是slave fifo模块。
    • 如果自己想折腾一下的话,需要注意的就是标志信号的设置,usb标志信号比较灵活。下面主要讲解一下标志信号的设置。

    GPIF II Designer

    Cypress官方提供了一个软件,可以用来设置gpif接口信号(包括标志信号),本教程只针对slave fifo,其他的模式自己去查看文档。
    基于FPGA的CYUSB3014双向通信实验_第4张图片
  • 打开GPIF II软件
    基于FPGA的CYUSB3014双向通信实验_第5张图片
    点击红色圈的地方
    基于FPGA的CYUSB3014双向通信实验_第6张图片
  • 想要编辑更多的信息,点击 File->Save project as Editable…
    基于FPGA的CYUSB3014双向通信实验_第7张图片
    左边编辑区按上图设置,右边的框图主要是设置标志信号FLAGA/FLAGB/FLAGC/FLAGD.双击右边的标志,各标志设置如下所示:
    基于FPGA的CYUSB3014双向通信实验_第8张图片
    基于FPGA的CYUSB3014双向通信实验_第9张图片
    基于FPGA的CYUSB3014双向通信实验_第10张图片
    基于FPGA的CYUSB3014双向通信实验_第11张图片
  • 四个标志都设置为低有效!!!初始值倒无所谓,并且都设置为专用标志
  • 设置完后,只需要编译一下就可以了生成我们需要的头文件了。
  • 基于FPGA的CYUSB3014双向通信实验_第12张图片
  • 基于FPGA的CYUSB3014双向通信实验_第13张图片
  • 将这个.h文件放到固件的工程中,替换固件相应的.h文件即可。
  • 基于FPGA的CYUSB3014双向通信实验_第14张图片
  • 这些我都已经做好了,如果你没有说明特别的需要,就直接使用我的固件工程即可,就不需要自己再去设计GPIF接口了。

写标志

  • flag_a和flag_b设置成线程0(P2U,即FPGA往CYUSB3014写)专用标志,flag_b为有水印值标志,
  • 当写满时,正常的flag_a会拉低,但是拉低的时间有点迟了,导致fpga检测到flag_a为低时,已经写溢出了,而flag_b的水印值可以使标志提前拉低,以便fpga检测到flag_b为低,不会发生写溢出。
    基于FPGA的CYUSB3014双向通信实验_第15张图片
  • 因为我们slwr信号是要根据flag来驱动的,假如没有水印值标志,使用flag_a,检测到flag_a == 0时,再将slwr拉高,是不是就会发生写溢出了。通过上图不难发现只需要将flag_a提前4个周期拉低就可以满足我们的要求了。所以我们设置水印值为4.到时候看看signal_tap抓的图就知道了
    基于FPGA的CYUSB3014双向通信实验_第16张图片

读标志

  • flag_c 和 flag_d 设置成线程3(U2P,即FPGA从CYUSB3014读)专用标志,flag_d为有水印值标志,
  • 当读空时,正常的flag_c会拉低,但是拉低的时间有点迟了,导致fpga检测到flag_a为低时,已经读空了,而flag_d的水印值可以使标志提前拉低,以便fpga检测到flag_b为低,不会发生读空。
    基于FPGA的CYUSB3014双向通信实验_第17张图片
  • 和写操作类似,slrd信号是要根据flag来驱动的,假如没有水印值标志,使用flag_c,检测到flag_c == 0时,再将slrd拉高,是不是就会发生读空了。通过上图不难发现只需要将flag_c提前3个周期拉低就可以满足我们的要求了。所以我们设置水印值为3.到时候看看signal_tap抓的图就知道了
  • 另外需要主要的地方是fifo_addr到数据有效有3个周期延迟

CyU3PGpifSocketConfigure设置水印值

  • 打开ezUsbSuite.exe
    基于FPGA的CYUSB3014双向通信实验_第18张图片
  • 导入本教程提供的固件工程
    基于FPGA的CYUSB3014双向通信实验_第19张图片
    基于FPGA的CYUSB3014双向通信实验_第20张图片
    基于FPGA的CYUSB3014双向通信实验_第21张图片
    基于FPGA的CYUSB3014双向通信实验_第22张图片
  • 设置水印值很简单,使用CyU3PGpifSocketConfigure()函数即可。
    基于FPGA的CYUSB3014双向通信实验_第23张图片

基于FPGA的CYUSB3014双向通信实验_第24张图片

  • 最后再提醒一下,fifo的大小是16k,P2U的缓冲区设置为8个,U2P缓冲区设置为4个,这种配置可以最大的提高传输速度。需要注意的是,不管是写还是读,都是以16k为单位的,也就是说即便你只是想发送一个4字节的指令,你也要发送16k字节,多余发0就可以了。
    基于FPGA的CYUSB3014双向通信实验_第25张图片
  • 设置完后,就可以编译了,画重点了,使用debug编译的速度大概在252MB/s,使用release编译的速度大概在338MB/s.

测试

本教程提供的固件,是同时支持读写的。

下载固件

在调试期间,先将引导方式设置为usb引导
基于FPGA的CYUSB3014双向通信实验_第26张图片
打开control center软件
基于FPGA的CYUSB3014双向通信实验_第27张图片
基于FPGA的CYUSB3014双向通信实验_第28张图片

读测试

打开本教程提供的fpga程序,设置slrd下降沿触发。
基于FPGA的CYUSB3014双向通信实验_第29张图片
基于FPGA的CYUSB3014双向通信实验_第30张图片
基于FPGA的CYUSB3014双向通信实验_第31张图片
因为读缓冲区的大小是16k字节,而我们发送数据一般都是一些指令,数据量比较小,所以我在数据结构做了个调整,前4个字节是你要发送的数据的长度(32位),在fpga中,有cmd_flag和cmd_data信号,根据这两个信号就知道读的数据了。具体自己看我的代码。

写测试

基于FPGA的CYUSB3014双向通信实验_第32张图片
写测试就简单了,点击transfer data-in,pc就会读取16k数据。数据为0-16‘h0000_0FFF,

测速

打开streamer软件
基于FPGA的CYUSB3014双向通信实验_第33张图片

基于FPGA的CYUSB3014双向通信实验_第34张图片
基于FPGA的CYUSB3014双向通信实验_第35张图片
可以看出读写速度都差不多在338MB/s左右。性能还是不错的咯

固件固化到CYUSB3014

  • 前面调试完了后,就可以将固件通过SPI的方式固化了
  • 再usb引导方式下,选择 program->FX3->SPI,选择release目录下的固件。注意SPI烧写固件需要几秒钟的,不要过早断电了,看到成功后再断电!!!
    基于FPGA的CYUSB3014双向通信实验_第36张图片
  • 将板子断电,将引导方式切换到SPI即可
    基于FPGA的CYUSB3014双向通信实验_第37张图片

总结

  • 前面介绍了有点过于详细了,基本都是“傻瓜式教学”,其实如果你没有说明特殊要求的话,是可以直接使用本教程的固件的,固件信息如下:
  • 系统时钟100MHz
  • 总线位宽32位
  • P2U缓冲区大小为16k,个数位8
  • U2P缓冲区大小为16k,个数位4
  • 读写都要以16k为单位
  • flag_a:线程0专用的满标志
  • flag_b:线程0水印值为4的专用局部标志
  • flag_c:线程3专用的空标志
  • flag_d:线程3水印值为3的专用局部标志
  • FPGA状态机编写参考我的就可以了,核心部分基本不用改

福利

为了能及时回复大家,现在获取源码方式如下:
微信扫描下面的二维码关注【春哥笔记】公众号,回复"usb3"即可Get源码的获取方式:
基于FPGA的CYUSB3014双向通信实验_第38张图片

你可能感兴趣的:(FPGA,USB,CYUSB3014)