FPGA纯verilog实现RIFFA的PCIE通信,提供工程源码和软件驱动

目录

  • 1、前言
  • 2、RIFFA简介
    • RIFFA概述
    • RIFFA架构
    • RIFFA驱动
  • 3、vivado工程详解
  • 4、上板调试验证并演示
  • 5、福利:工程代码的获取

1、前言

PCIE是目前速率很高的外部板卡与CPU通信的方案之一,广泛应用于电脑主板与外部板卡的通讯,PCIE协议极其复杂,想要掌握不容易,所以Xilinx和Altera等FPGA厂商直接推出了相关IP供用户使用,比如Xilinx的XDMA,这种IP直接集成了PCIE通信的所有内核资源,并已封装为AXIS接口,用户在使用时只需要按照AXIS流数据格式收发即可,相当于傻瓜式使用PCIE,但是,如果你想装个杯,想要自己研究甚至手写一个PCIE收发器呢?那本文就适合你的胃口了。。。

本文详细描述了RIFFA的实现设计方案,使用Xilinx的PCIE IP作为桥接工具,实现PCIE简单通讯,工程代码编译通过后上板调试验证,文章末尾有演示效果,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;

本工程只是验证RIFFA在FPGA上的可行性,并没有进行项目层面上的大批量数据通信,后面我会出几篇基于RIFFA的测速和视频采集例程,那才是真正具有项目意义的例程,敬请期待。

提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

2、RIFFA简介

RIFFA概述

RIFFA(Reusable Integration Framework for FPGA Accelerators)即是 FPGA 加速器的一种可重用性集成框架,是一个第三方开源 PCIE 框架。RIFFA 是一个通过 PCI Express 总线实现 cpu 和 FPGA 数据通信的简单框架,该框架要求具备一个支持 PCIe 的工作站和一个带有PCIe 连接器的 FPGA 板卡。RIFFA 支持 Windows,Linux,Altera 和 Xilinx,可以通过 C / C ++、Python、MATLAB 或Java 驱动来实现数据的发送和接收。驱动程序可以在 Linux 或Windows 上运行,每一个系统最多支持 5 个 FPGA 设备。在用户端有独立的发送和接收端口,用户只需编写几行简单代码即可实现与 FPGA IP 内核通信。

RIFFA 不依赖于 PCIe Bridge,因此不受桥连实现的限制。RIFFA 使用直接存储器访问(DMA)传输和中断信号传送数据。这实现了 PCIe 链路上的高带宽,运行速率可以达到PCIe 链路饱和点。

下图显示了使用 32 位,64 位和 128 位接口的设计性能。实线为理论最大带宽值,虚线为可实现最大带宽值。PCIe Gen 1 和 2 使用 8 位/ 10 位编码,将最大可实现带宽限制为理论值的 80%。 我们的实验表明,在几乎所有情况下,RIFFA 可以实现理论带宽的 80%。128 位接口达到理论最大值的 76%。
在这里插入图片描述

RIFFA架构

RIFFA架构如下:
在这里插入图片描述
在硬件方面,简化了接口,以便通过 FIFO 简便的将数据取出和存入。数据的传输由RIFFA 的 RX 和 TX DMA Engine 模块用分散收集聚合方法来实现。RX Engin 模块收集上位机传来的有效数据,收集完成发给 Channel 模块,TX Engin 收集 Channel 模块传来的数据,打包发给 PCI Express 端点。根据 PCIe 链路配置,RIFFA 接口支持 32 位,64 位和 128位宽度,计划为 PCIe Gen3 端点的 256 位接口提供支持。

PC 接收 FPGA 板卡数据是用户应用程序调用库函数 fpga_recv,然后由 FPGA 端启动。用户应用程序线程进入内核驱动程序,然后开始接收上游 FPGA 的读请求,将数据分包发送,如果没收到请求,将会等待它达到。

启动发送函数后,服务器将建立一个散列收集元素的列表,将数据存储地址和长度等信息放入其中,将其写入共享缓冲区。用户应用程序将缓冲区地址和数据长度等信息发送给 FPGA。FPGA 读取散射收集数据,然后发出相应地址的数据写入请求,如果散列收集元素列表的地址有多个,FPGA 将通过中断发出多次请求。

TX 搬移的数据全部写入缓存区后,驱动程序读取 FPGA 写入的字节数,确认是否与发送数据长度一致。这样就完成了传输。其过程如下图所示。
在这里插入图片描述
PC 机发送数据到 FPGA 板卡过程与 PC 机接收 FPGA 板卡数据过程相似,下图说明了该流程。刚开始也是用户应用程序调用库函数 fpga_send,传输线程进入内核驱动程序,然后 FPGA 启动传输。

启动 fpga_send,服务器将申请一些空间,将要发送的数据写入其中,然后建立一个分散收集列表,将存储数据的地址和长度放入其中,并将分散收集列表的地址和要发生的数据长度等信息发给 FPGA。FPGA 收到列表地址后,读取该列表的信息,然后发出相应地址和长度的读请求,然后将数据存储,最后一起发给 FPGA 板卡。
在这里插入图片描述

RIFFA驱动

提供Winwods和Linux驱动源码,源码包括c++、java、python等语言,Winwods驱动支持X86和X64架构,Linux驱动支持20以下版本,驱动文件夹如下:
在这里插入图片描述
说明如下:
1、 c_c++ 是 c 语言的测试程序与驱动程序源码,在 driver 中也有一份。
2、 java 是 java 语言的测试程序与驱动程序源码,在 driver 中也有一份。
3、 matlab 是 matlab 语言的测试程序与驱动程序源码,在 driver 中也有一份。
4、 python 是 python 语言的测试程序与驱动程序源码,在 driver 中也有一份。
5、README.md 文件是项目说明,是一种使用 markdown 语法写的文件。
6、如果要对 riffa 框架进行深入研究,请读者认真细读研究内部的文件,包括驱动程序。
在这里插入图片描述
在这里插入图片描述

3、vivado工程详解

开发板:Xilinx xc7a100tfgg484-2
开发环境:Vivado2020.2;
输入输出:PCIEX4;
工程BD如下:
在这里插入图片描述
RIFFA配置界面如下,可根据需要自行修改:
在这里插入图片描述
调用了Xilinx的PCIE桥接IP,注意,非XDMA;
在这里插入图片描述
综合后的工程代码架构如下:
在这里插入图片描述
红框标出了RIFFA的verilog源码,这部分是重点,感兴趣的兄弟应该仔仔细细研读这部分代码。如果只看个框图或者大概没有意义,把这部分代码看懂了,月薪20k绝对不成问题。。。

FPGA资源消耗和功耗预估如下:
在这里插入图片描述

4、上板调试验证并演示

Windows10系统简单测试效果如下:
在这里插入图片描述

5、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1436.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】基本指令介绍

前言从今天开始,我们一起来学习Linux的相关知识,今天先来介绍怎么登录Linux,并且介绍一些Linux的基本指令。使用 XShell 远程登录 Linux很多同学的 Linux 启动进入图形化的桌面. 这个东西大家以后就可以忘记了. 以后的工作中 没有机会 使用图…

蓝桥杯刷题冲刺 | 倒计时21天

作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.迷宫1.迷宫 题目 链接: 迷宫 - 蓝桥云课 (lanqiao.cn) 本题为填空题,只…

Three.js——learn02

Three.js——learn02Three.js——learn02通过轨道控制器查看物体OrbitControls核心代码index2.htmlindex.cssindex2.jsresult添加辅助器1.坐标轴辅助器AxesHelper核心代码完整代码2.箭头辅助器ArrowHelper核心代码完整代码3.相机视锥体辅助器CameraHelper核心代码完整代码Three…

近期投简历、找日常实习的一些碎碎念(大二---测试岗)

嘿嘿嘿,我又回来了,相信不少兄弟已经发现我似乎已经断更了好久,哈哈,我是尝试去找实习,投简历面试去了。 先说一下背景。 目录 背景 求职进行中 简历 投递和沟通 收获和感受 背景 博主,大二软件工程…

Arthas工具的基本使用

介绍 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。Arthas支持JDK 6,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰…

Python截图自动化工具

1、展示部分源码(写的比较乱,哈哈) 2、功能展示 1)首页 2)按钮截图(用于自动翻页) 3)保存位置按钮(选择图片保存的位置) 4)重复次数,就是要截取多少次 5)定位截屏(截取的内容&#x…

[数据分析与可视化] Python绘制数据地图1-GeoPandas入门指北

本文主要介绍GeoPandas的基本使用方法,以绘制简单的地图。GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口。GeoPandas扩展了Pandas的数据类型,并使用matplotlib进行绘图。GeoPandas官方仓库地址为:GeoP…

尚融宝06-ECMAScript基本介绍和使用

目录 一、ECMAScript 1、ECMA 2、ECMAScript 3、什么是 ECMA-262 4、ECMA-262 历史 5、ECMAScript 和 JavaScript 的关系 二、基本语法 1、let声明变量 2、const声明常量 3、解构赋值 4、模板字符串 5、声明对象简写 6、定义方法简写 7、参数的默认值 8、对象拓…

QT常用位置函数区别

目录1、引言2、实验代码3、位置函数3.1 x()3.2 y()3.3 frame()3.4 pos()3.5 geometry()3.6 width()3.7 height()3.8 rect()3.9 size()1、引言 QT有众多图形绘制函数,包括x()、y()、frame()、pos()、geometry()、width()、height()、rect()、size(),它们…

【Java学习笔记】多线程与线程池

多线程与线程池一、多线程安全与应用1、程序、进程与线程的关系2、创建多线程的三种方式(1)继承Thread类创建线程【不推荐】(2)实现Runnable接口创建线程(3)Callable接口创建线程3、线程的生命周期4、初识线…

基础入门 HTTP数据包Postman构造请求方法请求头修改状态码判断

文章目录数据-方法&头部&状态码请求requestResponse状态码案例-文件探针&登录爆破工具-Postman自构造使用数据-方法&头部&状态码 请求request 1、常规请求-Get 2、用户登录-Post •get:向特定资源发出请求(请求指定页面信息&#x…

为什么这么NB?huatuo革命Unity热更新

最近huatuo(华佗)热更新解决方案火爆了unity开发圈,起初我觉得热更新嘛,不就是内置一个脚本解释器脚本语言开发,如xLua, ILRuntime, puerts。Huatuo又能玩出什么花样,凭什么会这么NB,引起了那么多程序员的关注与称赞呢&#xff1f…

单片机——IIC协议与24C02

1、基础知识 1.1、IIC串行总线的组成及工作原理 I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 1.2、I2C总线的数据传输 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟…

Linux实操之进程管理

文章目录一、基本介绍二、显示系统执行的进程基本介绍三、ps详解四、终止进程kill和killall介绍:●基本语法常用选项五、查看进程树pstree基本语法常用选项一、基本介绍 1.在LINUX中,每个执行的程序都称为一个进程。每一个进程都分配一个ID号(pid,进程号…

【SCL】实现简单算法--冒泡排序

使用SCL语言实现一个冒泡排序的简单算法 文章目录 目录 文章目录 前言 二、实现排序 1.读取存储器地址(PEEK)指令 2.编写程序 总结 前言 本文我们来一起使用SCL来实现一个简单的算法——冒泡排序;它可以对少量数据进行从小到大或从大到小排序…

【Linux】GDB的安装与使用

安装安装gdb的具体步骤如下:1、查看当前gdb安装情况rpm -qa | grep gdb如果有,则可以先删除:rpm -e --nodeps 文件名如果没有,则进行下一步。2、下载gdb源码包或者直接apt安装。apt命令安装:sudo apt install gdb源码包…

Qt之QPainter绘制多个矩形/圆形(含源码+注释)

一、绘制示例图 下图绘制的是矩形对象,但是将绘制矩形函数(drawRect)更改为绘制圆形(drawEllipse)即可绘制圆形。 二、思路解释 绘制矩形需要自然要获取矩形数据,因此通过鼠标事件获取每个矩形的rect数…

一个完整的渗透学习路线是怎样的?如何成为安全渗透工程师?

前言 1/我是如何学习黑客和渗透? 我是如何学习黑客和渗透测试的,在这里,我就把我的学习路线写一下,让新手和小白们不再迷茫,少走弯路,拒绝时间上的浪费! 2/学习常见渗透工具的使用 注意&…

SpringBoot集成 SpringSecurity安全框架

文章目录一、CSRF跨站请求伪造攻击二、项目准备三、认识 SpringSecurity3.1 认证🎀①直接认证🎀②使用数据库认证3.2 授权🍡①基于角色授权🍡②基于权限的授权🍡③使用注解判断权限3.3 "记住我"3.4 登录和注…

【JavaEE】如何将JavaWeb项目部署到Linux云服务器?

写在前面 大家好,我是黄小黄。不久前,我们基于 servlet 和 jdbc 完善了博客系统。本文将以该系统为例,演示如何将博客系统部署到 Linux 云服务器。 博客系统传送门: 【JavaEE】前后端分离实现博客系统(页面构建&#…