FPGA基于RIFFA实现PCIE采集HDMI传输,提供工程源码和QT上位机
目录
- 1、前言
- 2、RIFFA理论基础
- 3、设计思路和架构
- 4、vivado工程详解
- 5、上板调试验证并演示
- 6、福利:工程代码的获取
1、前言
PCIE是目前速率很高的外部板卡与CPU通信的方案之一,广泛应用于电脑主板与外部板卡的通讯,PCIE协议极其复杂,想要掌握不容易,所以Xilinx和Altera等FPGA厂商直接推出了相关IP供用户使用,比如Xilinx的XDMA,这种IP直接集成了PCIE通信的所有内核资源,并已封装为AXIS接口,用户在使用时只需要按照AXIS流数据格式收发即可,相当于傻瓜式使用PCIE,但是,如果你想装个杯,想要自己研究甚至手写一个PCIE收发器呢?那本文就适合你的胃口了。。。
本文详细描述了RIFFA的实现设计方案,使用Xilinx的PCIE IP作为桥接工具,实现PCIE和电脑主机的图像采集传输,将结合HDMI输入视频,将摄像头数据采集到 DDR3 内存中,然后通过上位机实验 PCIE 接口将摄像头图像采集到QT上位机中,做到实时显示图像,工程代码编译通过后上板调试验证,文章末尾有演示效果,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
本设计实际项目意义十分重要,他可以直接做成产品,比如某宝的这种产品
这种市面上常见的,一千多块钱的HDMI视频采集卡用本工程就可以实现,我们来解析一下这块板子:
输入是4路HDMI视频接口,经过4颗解码芯片解为RGB888视频,再用Artix7 FPGA做PCIE驱动即可完成,输出PCIEX4,这样一个板卡就做好了,看起来很高端,实则很简单,用这个工程就可以做。。。
2、RIFFA理论基础
前面已经写过两篇关于RIFFA理论的文章,请兄弟们线参考一下:
1、RIFFA与PCIE IP的FPGA架构,参考链接RIFFA
2、RIFFA与PCIE的测速实验,参考链接测速实验
3、RIFFA与PCIE的ov5640摄像头视频采集,参考链接PCIE ov5640
前面的2篇文章只是理论基础和在FPGA上实现了部署,属于学习和验证性质,从本文开始,我们正式进入项目实战阶段,使用RIFFA与PCIE架构采集视频,并在QT上位机上显示,后面还将出采集HDMI视频的工程,敬请期待。
3、设计思路和架构
设计思路和架构如下:
输入为HDMI视频,i2c配置为默认1920x1080的分辨率,输入分辨率是自动识别的;
图像采集:
HDMI采集使用silicon9011芯片完成,silicon9011需要i2c配置才能使用,关于silicon9011的配置和使用,请参考我之前的文章silicon9011
图像缓存:
经常看我文章的兄弟应该都熟悉,我的图像缓存架构一般喜欢用FDMA方案,关于FDMA方案可以参考我之前的文章FDMA方案
图像缓存:
图像缓存架构如下:
但本实验没有使用该方案,而是使用另一种基于AXI4-FULL的图像缓存方案,考虑到PCIE图传的延时性,只做到了2帧的图像缓存,高于2帧延迟就大了,项目不允许,所以采用乒乓架构实现图像2帧缓存,具体可看代码,后面我也会专门出一期讲解该方案的文章和验证工程;
RIFFA-PCIEX2架构
RIFFA-PCIEX2架构如下:
请参考我前面的2期文章,这里对原始工程的该架构部分做了修改,以适应图像传输的接口要求。
PCIE 的顶层模块与测速模块几乎一致,只是将用户端数据引出来,修改了部分接口。
右边接口为 PCIE 接口,未对其进行修改,左边接口为新增 fifo 接口,包括读 fifo 与写 fifo接口,用于将 pcie 的读写数据转接成 fifo 接口,以供其他模块使用。
RIFFA-PCIEX2模块顶层接口如下,标出了新增的端口:
module pcie_riffa #(parameter C_NUM_CHNL = 1, // Number of RIFFA Channelsparameter C_NUM_LANES = 2, // Number of PCIe Lanesparameter C_PCI_DATA_WIDTH = 64, // Settings from Vivado IP Generatorparameter C_MAX_PAYLOAD_BYTES = 512,parameter C_LOG_NUM_TAGS = 5,parameter PCIE_TX_LEN = 32'd307200
)(//增加端口开始//写端口output fifo_wr_clk, //pcie写数据到外部的时钟信号output fifo_we, //pcie写数据的使能信号output [C_PCI_DATA_WIDTH-1:0]fifo_wr_date, //pcie写数据到外部//读端口output fifo_rd_clk, //pcie从外部读取数据时钟output fifo_re, //pcie从外部读取数据使能input [C_PCI_DATA_WIDTH-1:0]fifo_rd_date, //pcie读数据input fifo_rd_date_valid, //外部数据可读有效//增加端口结束 output [(C_NUM_LANES - 1) : 0] PCI_EXP_TXP,output [(C_NUM_LANES - 1) : 0] PCI_EXP_TXN,input [(C_NUM_LANES - 1) : 0] PCI_EXP_RXP,input [(C_NUM_LANES - 1) : 0] PCI_EXP_RXN,//output [3:0] LED,input PCIE_REFCLK_P,input PCIE_REFCLK_N,input PCIE_RESET_N);
新增信号接口主要用于将 pcie 发送数据与接收数据以 fifo 接口引出,用户只需将其连接到 fifo 模块或者类似 fifo 模块即可,本工程将其读取数据连接到 ddr3 顶层模块,即可完成从 ddr3 中读取数据,将其通过 pcie 发送到上位机。
PCIE发送数据模块:
PCIE 数据模块为本工程的重点,PCIE 数据的提取将由此模块将 PCIE 数据装换为FIFO 数据接口,以完成数据的提取。chnl_tester.v 模块中的信号接口有接收数据端口与发送数据端口组成,里面有 1 个状态机组成,有 4 种状态,等待读状态,读数据,等待写状态,写数据这 4 个过程。此状态机当接收到上位机发送到 PCIE 的数据时进入读数据状态,随后将进入写数据过程,将数据完完整整的写会到上位机,因此测速模块发送和接收的数据都是从 1 到发送长度最大值的序列。
具体请看代码。。。
4、vivado工程详解
开发板:Xilinx xc7a100tfgg484-2
开发环境:Vivado2019.1;
输入:HDMI,分辨率1920x1080;
输出:PCIEX2;QT上位机显示收发速率;
工程代码架构如下:
PCIE IP配置如下:
FPGA资源消耗和功耗预估如下:
5、上板调试验证并演示
6、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
网盘资料内容如下:已压缩,方便大家下载。。。
相关文章:

FPGA基于RIFFA实现PCIE采集HDMI传输,提供工程源码和QT上位机
目录1、前言2、RIFFA理论基础3、设计思路和架构4、vivado工程详解5、上板调试验证并演示6、福利:工程代码的获取1、前言 PCIE是目前速率很高的外部板卡与CPU通信的方案之一,广泛应用于电脑主板与外部板卡的通讯,PCIE协议极其复杂,…...

SpringBoot解析指定Yaml配置文件
再来个文章目录 文章目录前言1、自定义配置文件2、配置对象类3、YamlPropertiesSourceFactory下面还有投票,帮忙投个票👍 前言 最近在看某个开源项目代码并准备参与其中,代码过了一遍后发现多个自定义的配置文件用来装载业务配置代替数据库…...
C++基础算法③——排序算法(选择、冒泡附完整代码)
排序算法 1、选择排序 2、冒泡排序 1、选择排序 基本思想:从头至尾扫描序列,每一趟从待排序元素中找出最小(最大)的一个元素值,然后与第一个元素交换值,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序…...
《高质量C/C++编程》读书笔记一
前言 这本书是林锐博士写的关于C/C编程规范的一本书,我打算写下一系列读书笔记,当然我并不打算全盘接收这本书中的内容。 良好的编程习惯,规范的编程风格可以提高代码的正确性、健壮性、可靠性、效率、易用性、可读性、可扩展性、可复用性…...
【完美解决】python flask如何直接加载html,css,js,image等下载的网页模板
python flask如何直接加载下载的网页模板问题解决办法问题 本人网页开发小白,刚学了用flask,下载了一套网页模板,启动一个网页的确很简单,但是发现无论怎么改这里的 static_folder值都无法找到CSS,JS,IMAGE,FONT等资源 app Flas…...

2023美赛C题【分析思路+代码】
以下内容为我个人的想法与实现,不代表任何其他人。 文章目录问题一数据预处理时间序列模型创建预测区间单词的任何属性是否影响报告的百分比?如果是,如何影响?如果不是,为什么不是?问题二问题三难度评估模型…...
考研复试6 编译原理
第一章 编译器简介 1. 编译器的核心功能 把源代码翻译成目标代码 2. 编译器设计两个原则: 语义相同;以某种可察觉的方式改进输入程序 3. 编译器内部结构 前端:依赖于源语言,与目标机器无关。将输入的代码映射到 IR。包括分析部…...

uni-app:登录与支付--用户信息
用户信息 实现用户头像昵称区域的基本布局 在 my-userinfo 组件中,定义如下的 UI 结构: <template><view class"my-userinfo-container"><!-- 头像昵称区域 --><view class"top-box"><image src"…...

Docker 部署 MySQL
1. 进入下面路径下 -v 使用相对路径的方式挂载的目录docker会自动创建,路径为:/var/lib/docker/volumes/ cd /var/lib/docker/volumes/ 2. 指定版本5.7启动容器mysql docker run -p 3316:3306 --name mysql-master \ -v mysql-master-log:/var/log/mys…...

警惕,3月20日WOS目录更新,50本SCI/SSCI被剔除,这个出版社多达18本
2023年3月SCI、SSCI期刊目录更新 2023年3月20日,Web of Science核心期刊目录再次更新!此次2023年3月SCIE & SSCI期刊目录更新,与上次更新(2023年2月)相比,共有50本期刊被剔除出SCIE & SSCI期刊目录…...

【 Linux入门 】之 手搓 命令行解释器 bash(带源码)
目的基本结构提取输入命令fgets的使用命令初步处理命令的本质创建子进程重要知识补充进程替换命令处理简单 bash 完成及演示优化bashls颜色输出颜色实现cd命令ecport 命令envecho $echo $?目的 主要目的在于进一步了解 Linux 系统下使用进程相关的系统调用 及 shel…...
【运维】运维常用命令
shell大全读取文件每一行内容文件是否存在数组定义和循环取值变量循环流程控制语句:case判断数值相等/大于/小于判断字符串相等awk求和、平均、最大、最小sed用法exprbc计算器读取文件每一行内容 while read line doecho $line done < a.txt文件是否存在 if [ …...
MYSQL常用命令大全
文章目录 基本语句链接数据库显示已有数据库创建数据库选择数据库显示数据库中的表显示当前数据库的版本信息,链接用户名删除数据库创建表表 增加将查询结果插入到新表中:表 删除表 修改表 查询in子查询between ~ and ~ 模糊查询模糊查询regexp中的OR:多个信息查询同义词:删…...
锚点定位方案
一 背景知识: 1.1 #号的作用 #代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,http://www.example.com/index.html#print 就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。 为网页…...

Flink学习--第一章 初识Flink
Flink是Apache基金会旗下的一个开源大数据处理框架,如今已被很多人认为是大数据实时处理的方向和未来,许多公司也都在招聘和储备掌握Flink技术的人才。 1.1 Flink的源起和设计理念 Flink起源于一个叫作Stratosphere的项目,它是由3所地处柏林的…...

电脑技巧:常见的浏览器内核介绍
浏览器是大家日常使用电脑必备的软件,网上查资料、听音乐、办公等等,都不离不开浏览器给我们提供的方便,今天小编来给大家介绍一下常见的浏览器内核,一起来学习一下吧!1、Chromium 内核Google Chrom内核:统…...

【数据分析之道①】字符串
文章目录专栏导读1、字符串介绍2、访问字符串中的值3、字符串拼接4、转义字符5、字符串运算符6、字符串格式化7、字符串内置函数专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《数据分析之…...

网络安全之防火墙
目录 网络安全之防火墙 路由交换终归结底是联通新设备 防御对象: 定义: 防火墙的区域划分: 包过滤防火墙 --- 访问控制列表技术 --- 三层技术 代理防火墙 --- 中间人技术 --- 应用层 状态防火墙 --- 会话追踪技术 --- 三层、四层 UTM …...

STM32之点亮一个LED小灯(轮询法)
目录 一、初始化GPIO口 二、按键点亮LED灯(轮询法) 一、初始化GPIO口 1、点亮LED小灯前,需要先初始化GPIO口 HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) GPIO_TypeDef *GPIOx: //指初始化GPIO…...

pandas读CSV、读JSON、Excel
学习让我快乐 pandas的数据读取基本操作 pandas是Python中非常流行的数据处理库,它提供了许多强大的工具来读取、处理和分析数据。在本文中,我们将介绍pandas中的一些基本数据读取操作。 读取CSV文件 CSV文件是最常见的数据文件格式之一,p…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...