FPGA纯verilog实现RIFFA的PCIE测速实验,提供工程源码和QT上位机
1、前言
PCIE是目前速率很高的外部板卡与CPU通信的方案之一,广泛应用于电脑主板与外部板卡的通讯,PCIE协议极其复杂,想要掌握不容易,所以Xilinx和Altera等FPGA厂商直接推出了相关IP供用户使用,比如Xilinx的XDMA,这种IP直接集成了PCIE通信的所有内核资源,并已封装为AXIS接口,用户在使用时只需要按照AXIS流数据格式收发即可,相当于傻瓜式使用PCIE,但是,如果你想装个杯,想要自己研究甚至手写一个PCIE收发器呢?那本文就适合你的胃口了。。。
本文详细描述了RIFFA的实现设计方案,使用Xilinx的PCIE IP作为桥接工具,实现PCIE和电脑主机的简单通信,并在电脑端运行测试测试的QT上位机,工程代码编译通过后上板调试验证,文章末尾有演示效果,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
2、RIFFA理论基础
关于RIFFA理论基础,前面我已经写了一篇文章,详细描述过,请参考之前的文章链接RIFFA
3、vivado工程详解
点击查看RIFFA
本设计根据前面的工程修改而来,但与前面的工程有如下不同:
1、前面的工程中,我们将RIFFA代码封装成了自定义IP,有的兄弟反馈说这样不好看代码,所以本工程不再封装IP;
2、前面的工程是PCIEX4,为了和后面的PCIE采集视频的工程兼容,我们选择PCIEX2的板子作为实验对象,因为之前PCIEX4的板子没有视频输入接口,而有视频输入接口的板子仅做到了PCIEX2,所以本工程的PCIE IP需要修改为PCIEX2;
3、为了和之前的图像处理和网络通信的工程vivado版本兼容,将开发环境改回到Vivado2019.1;
开发板:Xilinx xc7a100tfgg484-2
开发环境:Vivado2019.1;
输入输出:PCIEX2;QT上位机显示收发速率;
工程代码架构如下:
由于没有封装自定义IP,所以也就没有BD部分了;
将PCIE 的位宽 X4 修改为 X2;设置 PCIE 通道为 X2,两个通道,链路速度选择为 5GT/s,AXI 时钟选择为 125M,位宽设置为 64bit,如下图:
在 Core Capability 页将事务层最大负载数据修改为 512 字节,最大可支持到 1024 字节,不过负载数据变大,需要增加 BRAM 资源来缓冲数据,因此不能设置太大,如果太小,则影响 PCIE 的传输效率,因此常规选择 512KB。
细节:将头文件 functions.vh 文件设置为全局头文件,否则综合会报错,如下图:
FPGA资源消耗和功耗预估如下:
4、上板调试验证并演示
打开电脑的设备管理器,查看 PCIE 设备是否处于工作状态,如果不处于正常工作或者有感叹号,则需要重装驱动,关于驱动部分,请参考之前的文章链接RIFFA
打开PCEI 测速助手,如果检测到 PCIE 板卡插入,会显示可进行读写速度测速,如果未插入 PCIE 板卡,则显示,为插入 PCIE。
QT上位机位置如下:
点击测速,即可进行 PCIE 测速,速度显示如下图所示,笔者测量办法是写一短数据的时间与读一段数据的时间进行大概估算读写速度。
QT上位机源代码
QT上位机源代码如下:
说明如下:
1、gaugecar.h 是仪表盘程序,可进行仪表盘显示数据等操作。
2、 main.cpp 是程序入口
3、 widget 为测速与逻辑控制程序。
4、 widget.ui 为图形化界面.
5、程序主要逻辑是在 widget.cpp 文件
QT源代码解析
程序如果找到设备就显示读写速度测试,如果未找到设备,显示未检测到设备,如果按下测速按键,则先获取当前时间 1,发送 1080x1920x60 个 32 位数据后,再获取时间 2,通过时间 1 与时间 2 计算写入速度;然后读取发送的数据,在 fpga 源码里面会将原本数据原原本本的发回电脑,因此接收数据后,获取当前时间 3,即可通过时间 3 与时间 2 计算读取数据时间进而计算读取速度。然后将读写速度通过仪表盘进行显示。
具体看源代码。
5、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
网盘资料内容如下:已压缩,方便大家下载。。。
相关文章
- WebClient 增删改查一文搞定
- 免费高分辨率遥感卫星数据(5m)下载
- Splunk系列:Splunk数据接入篇(二)
- mysql服务器cpu爆满解决办法
- 清理文本数据
- 分布式数据库如何平衡一致性和读写延迟?
- 通过优化 S3 读取来提高效率和减少运行时间
- MySql事务未提交导致锁等待如何解决?
- 为什么 128 KB 的魂斗罗可以实现那么长的剧情?
- 肿瘤全面分析数据库:oncomine使用介绍
- CancerSCEM | 肿瘤单细胞表达分析数据库
- 技术分享 | MySQL 如何适配 AppArmor
- 新技能GET!在前端表格中花式使用异步函数的奥义
- 量化交易中,如何快速把股票代码转换成Int整形?
- jdbc
- 腾讯云Elasticsearch跨集群复制原理及最佳实践
- 全网最优质的Base64 编码和解码教程,附6个示例!
- sockfwd 一个数据转发的小工具
- 架构解决方案
- Golang中的map数据类型