文章目录

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

开发环境

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

准备工作

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

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

驱动

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

    固件

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

    GPIF II Designer

    Cypress官方提供了一个软件,可以用来设置gpif接口信号(包括标志信号),本教程只针对slave fifo,其他的模式自己去查看文档。

  • 打开GPIF II软件

    点击红色圈的地方
  • 想要编辑更多的信息,点击 File->Save project as Editable…

    左边编辑区按上图设置,右边的框图主要是设置标志信号FLAGA/FLAGB/FLAGC/FLAGD.双击右边的标志,各标志设置如下所示:



  • 四个标志都设置为低有效!!!初始值倒无所谓,并且都设置为专用标志
  • 设置完后,只需要编译一下就可以了生成我们需要的头文件了。
  • 将这个.h文件放到固件的工程中,替换固件相应的.h文件即可。
  • 这些我都已经做好了,如果你没有说明特别的需要,就直接使用我的固件工程即可,就不需要自己再去设计GPIF接口了。

写标志

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

读标志

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

CyU3PGpifSocketConfigure设置水印值

  • 打开ezUsbSuite.exe
  • 导入本教程提供的固件工程



  • 设置水印值很简单,使用CyU3PGpifSocketConfigure()函数即可。

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

测试

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

下载固件

在调试期间,先将引导方式设置为usb引导

打开control center软件

读测试

打开本教程提供的fpga程序,设置slrd下降沿触发。



因为读缓冲区的大小是16k字节,而我们发送数据一般都是一些指令,数据量比较小,所以我在数据结构做了个调整,前4个字节是你要发送的数据的长度(32位),在fpga中,有cmd_flag和cmd_data信号,根据这两个信号就知道读的数据了。具体自己看我的代码。

写测试


写测试就简单了,点击transfer data-in,pc就会读取16k数据。数据为0-16‘h0000_0FFF,

测速

打开streamer软件



可以看出读写速度都差不多在338MB/s左右。性能还是不错的咯

固件固化到CYUSB3014

  • 前面调试完了后,就可以将固件通过SPI的方式固化了
  • 再usb引导方式下,选择 program->FX3->SPI,选择release目录下的固件。注意SPI烧写固件需要几秒钟的,不要过早断电了,看到成功后再断电!!!
  • 将板子断电,将引导方式切换到SPI即可

总结

  • 前面介绍了有点过于详细了,基本都是“傻瓜式教学”,其实如果你没有说明特殊要求的话,是可以直接使用本教程的固件的,固件信息如下:
  • 系统时钟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双向通信实验相关推荐

  1. 基于FPGA的cy7c68013a双向通信实验

    基于FPGA的cy7c68013a双向通信实验 本实验是基于FPGA的cy7c68013a的USB双向通信实验,以前折腾过一段时间cy7c68013a,没有入门时感觉好难,入门了就会感觉很简单.本教程 ...

  2. 基于FPGA Uart串口通信实验

    基于FPGA Uart串口通信实验 首先需要了解uart串口通信协议,根据个人专业需求不同,了解的层面可以不同. UART简介 通用异步收发传输器(Universal Asynchronous Rec ...

  3. 基于FPGA的VGA显示实验

    VGA驱动原理 信号线 定义 HS 行同步信号(3.3V 电平) VS 场同步信号(3.3V 电平) R 红基色 (0~0.714V 模拟信号) G 绿基色 (0~0.714V 模拟信号) B 蓝基色 ...

  4. 实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)

    实验二 基于FPGA的分频器的设计 1. 实验目的: (1) 掌握QuartusⅡ软件的层次型设计方法: (2) 掌握元件封装及调用方法: (3) 熟悉FPGA实验平台,掌握引脚锁定及下载. 2. 实 ...

  5. 计算机组成 vhdl cpu 实验 西安交大,基于FPGA的VHDL计算机组成实验平台的设计与实现...

    摘要: <计算机组成原理>是计算机系的一门核心课程.但是它涉及的知识面非常广,内容包括中央处理器,指令系统,存储系统,总线和输入输出系统等方面,学生在学习该课程时,普遍觉得内容抽象难于理解 ...

  6. 基于FPGA实现的流水灯实验

    版权声明:如需转载,请注明出处 https://blog.csdn.net/chengfengwenalan/article/details/79606351 基于FPGA实现的流水灯实验 一.开发环 ...

  7. 基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发

    <基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发> #任务要求: 要求用qt编写上位机程序,实现FPGA通过cyusb3014芯片完成数据的收发.下面是采用通过 ...

  8. 基于FPGA的两位按键控制LED数码管加减计数实验

    两位按键控制LED数码管加减计数实验 这是一篇拖了一个多月的文章,主要是基于FPGA利用按键消抖原理与动态数码管驱动原理相结合,来实现一个利用两位按键来控制数码管实现0-99的加法计数或者减法计数功能 ...

  9. 基于FPGA开发板使用Verilog设计PWM呼吸灯实验

    基于FPGA开发板使用Verilog设计PWM呼吸灯实验 1,实验原理 2,实验模块设计 2.1 RTL设计,呼吸灯模块设计 2.2,测试数据,下载到FPGA开发板板级的数据 2.3,两个模块综合的n ...

最新文章

  1. 跟踪workflow instance 状态
  2. 程序员提交代码的 emoji 指南——原来表情文字不能乱用
  3. 英飞凌AI越野组入门教程
  4. 面试题整理 4 合并两个排序的数组
  5. 契约式设计(DbC)感想(二)
  6. python处理excel案例_python操作excel例子
  7. react-redux模型图
  8. java内存管理之内存模型
  9. KNN回归python实现
  10. Docker学习笔记 - Docker容器的日志
  11. linux 索引,Linux学习笔记-索引类命令
  12. 一些NLP数据/语料下载
  13. 利用百度图像处理API接口实现人脸融合
  14. 如何使用谷歌验证码 kaptcha,详细使用步骤
  15. python使用openpyxl插入excel批注,同时修改excel批注框大小
  16. png格式转eps格式
  17. 【考研数学】六. 三重积分
  18. 微信小程序开发-语音录入与删除
  19. 数据库实验五:触发器
  20. matlab susan,SUSAN算法的matlab代码

热门文章

  1. Microsoft Edge浏览器上不了网,其他浏览器可以
  2. // #ifdef MP-WEIXIN微信小程序无效,不执行
  3. ICTCLAS的JNI调用接口说明
  4. onvif python 音视频_python3控制基于onvif的安防摄像头
  5. html如何实现统计访客功能,JS 实时网站访客(用户)统计
  6. Datatables表格插件学习
  7. 获取安卓模拟器的型号(品牌)
  8. 鼠标计算机无法识别,如何解决usb鼠标和键盘无法识别问题
  9. 学习ebpf_exporter项目搞懂prometheus client端的全调度
  10. sap 流程图 退货销售订单_销售订单_退货及退回客户(采用高级退货)