基于FPGA的CYUSB3014双向通信实验
文章目录
- 开发环境
- 准备工作
- 驱动
- 固件
- 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双向通信实验相关推荐
- 基于FPGA的cy7c68013a双向通信实验
基于FPGA的cy7c68013a双向通信实验 本实验是基于FPGA的cy7c68013a的USB双向通信实验,以前折腾过一段时间cy7c68013a,没有入门时感觉好难,入门了就会感觉很简单.本教程 ...
- 基于FPGA Uart串口通信实验
基于FPGA Uart串口通信实验 首先需要了解uart串口通信协议,根据个人专业需求不同,了解的层面可以不同. UART简介 通用异步收发传输器(Universal Asynchronous Rec ...
- 基于FPGA的VGA显示实验
VGA驱动原理 信号线 定义 HS 行同步信号(3.3V 电平) VS 场同步信号(3.3V 电平) R 红基色 (0~0.714V 模拟信号) G 绿基色 (0~0.714V 模拟信号) B 蓝基色 ...
- 实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
实验二 基于FPGA的分频器的设计 1. 实验目的: (1) 掌握QuartusⅡ软件的层次型设计方法: (2) 掌握元件封装及调用方法: (3) 熟悉FPGA实验平台,掌握引脚锁定及下载. 2. 实 ...
- 计算机组成 vhdl cpu 实验 西安交大,基于FPGA的VHDL计算机组成实验平台的设计与实现...
摘要: <计算机组成原理>是计算机系的一门核心课程.但是它涉及的知识面非常广,内容包括中央处理器,指令系统,存储系统,总线和输入输出系统等方面,学生在学习该课程时,普遍觉得内容抽象难于理解 ...
- 基于FPGA实现的流水灯实验
版权声明:如需转载,请注明出处 https://blog.csdn.net/chengfengwenalan/article/details/79606351 基于FPGA实现的流水灯实验 一.开发环 ...
- 基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发
<基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发> #任务要求: 要求用qt编写上位机程序,实现FPGA通过cyusb3014芯片完成数据的收发.下面是采用通过 ...
- 基于FPGA的两位按键控制LED数码管加减计数实验
两位按键控制LED数码管加减计数实验 这是一篇拖了一个多月的文章,主要是基于FPGA利用按键消抖原理与动态数码管驱动原理相结合,来实现一个利用两位按键来控制数码管实现0-99的加法计数或者减法计数功能 ...
- 基于FPGA开发板使用Verilog设计PWM呼吸灯实验
基于FPGA开发板使用Verilog设计PWM呼吸灯实验 1,实验原理 2,实验模块设计 2.1 RTL设计,呼吸灯模块设计 2.2,测试数据,下载到FPGA开发板板级的数据 2.3,两个模块综合的n ...
最新文章
- 跟踪workflow instance 状态
- 程序员提交代码的 emoji 指南——原来表情文字不能乱用
- 英飞凌AI越野组入门教程
- 面试题整理 4 合并两个排序的数组
- 契约式设计(DbC)感想(二)
- python处理excel案例_python操作excel例子
- react-redux模型图
- java内存管理之内存模型
- KNN回归python实现
- Docker学习笔记 - Docker容器的日志
- linux 索引,Linux学习笔记-索引类命令
- 一些NLP数据/语料下载
- 利用百度图像处理API接口实现人脸融合
- 如何使用谷歌验证码 kaptcha,详细使用步骤
- python使用openpyxl插入excel批注,同时修改excel批注框大小
- png格式转eps格式
- 【考研数学】六. 三重积分
- 微信小程序开发-语音录入与删除
- 数据库实验五:触发器
- matlab susan,SUSAN算法的matlab代码
热门文章
- Microsoft Edge浏览器上不了网,其他浏览器可以
- // #ifdef MP-WEIXIN微信小程序无效,不执行
- ICTCLAS的JNI调用接口说明
- onvif python 音视频_python3控制基于onvif的安防摄像头
- html如何实现统计访客功能,JS 实时网站访客(用户)统计
- Datatables表格插件学习
- 获取安卓模拟器的型号(品牌)
- 鼠标计算机无法识别,如何解决usb鼠标和键盘无法识别问题
- 学习ebpf_exporter项目搞懂prometheus client端的全调度
- sap 流程图 退货销售订单_销售订单_退货及退回客户(采用高级退货)