FPGA纯verilog代码实现H265视频压缩 支持4K30帧分辨率 提供工程源码和技术支持

news2024/11/20 21:28:07

这里写目录标题

  • 1、前言
  • 2、我这里已有的视频图像编解码方案
  • 3、H265--视频压缩理论
  • 4、H265--视频压缩--性能表现
  • 5、H265--视频压缩--设计方案
  • 6、H265--视频压缩--时序
  • 7、Vivado工程详解
  • 8、移植上板应用
  • 9、Vivado功能仿真
  • 10、福利:工程代码的获取

1、前言

H265视频压缩与解码在FPGA图传领域应用广泛,Xilinx高端器件已经内嵌了H265加速器,在Linux系统下调用API即可使用,但对于需要定制私有算法或者协议的H264视频压缩与解码应用或者学习研究者而言,纯verilog代码实现H264视频压缩依然具有实用价值,本设计采用纯verilog代码实现H265视频压缩,没有使用任何IP,具有参考价值;

本文详细描述了FPGA纯verilog代码实现H265视频压缩的设计方案,工程代码可综合编译上板调试,但目前只做到了仿真层面,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像压缩领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

2、我这里已有的视频图像编解码方案

我这里有图像的JPEG解压缩、JPEG-LS压缩、H264编解码、H265编解码以及其他方案,后续还会出更多方案,我把他们整合在一个专栏里面,会持续更新,专栏地址:
直接点击前往

3、H265–视频压缩理论

请参考这篇文章,感觉写得挺好:https://blog.csdn.net/qq_39969848/article/details/129003896

4、H265–视频压缩–性能表现

性能表现如下:
输入视频格式:YUV4:2:0;
输出视频码流:h265视频流;8位;伴随数据有效信号;
支持分辨率:最大4K@30Hz;
GOP:I/P;即帧内帧间预测算法;
多达35种预测模式;
CTU:64x64;
CU:8x8~64x64;
PU:4x4~64x64;
TU:4x4/8x8/16x16/32x32;
1/4 Sub-pixel;
Search range:64;
CABAC熵编码;
SAO(Sample Adaptive Offset);
SKIP/MERGE;

5、H265–视频压缩–设计方案

在这里插入图片描述
视频压缩编码的基本过程可以概括如下 :
1、 利用某种方式对当前处理图像块像素进行预测 ;
2、 将原始的像素值与预测出来的像素值相减得到残差值 ;
3、 将残差进行变换及量化处理,得到输出的残差系数再进过熵编码形成最后的压缩码流 ;
4、残差系数经过反量化及反变换处理,再与之前得到的预测像素相加得到重建像素,存储作为预测的参考像素。

H264视频压缩代码顶层接口如下:

module helai_h265_encode_2023(
  input                         clk                   ,	//系统时钟,最大支持 400MHz
  input                         rstn                  ,	//系统复位--低电平有效 
  //初始化配置
  //db -->Deblocking filter 块滤波器
  //sao-->sample adaptive offseta 自适应采样偏移  
  input                         i_h265_start          ,	//输入--开启h265压缩--高电平有效
  output                        o_h265_ec_OK          ,	//输出--h265压缩完成标志--高电平有效
  input  [`PIC_WIDTH -1 :0]     i_yuv_width           , //输入--压缩视频总宽度
  input  [`PIC_HEIGHT-1 :0]     i_yuv_height          , //输入--压缩视频总高度
  input  [5             :0]     i_init_QP             , //输入--初始化QP值--例程给的27
  input                         i_DataRate_type       , //输入--码流类型: 0-->Intra ; 1-->Inter
  input                         i_IinP_en             , //输入--enable I block in P frame
  input                         i_db_en               ,	//输入--块滤波器使能
  input                         i_sao_en              ,	//输入--SAO使能--SAO(Sample Adaptive Offset)
  input  [5-1:0]                i_blok4x4bit          ,	//输入--4X4模块则填入4                               
  input   [32-1:0]              i_skip_cost_thre_08   ,	//输入--skip开销阈值;例程设置为0
  input   [32-1:0]              i_skip_cost_thre_16   ,
  input   [32-1:0]              i_skip_cost_thre_32   ,
  input   [32-1:0]              i_skip_cost_thre_64   ,
  // RC(Rate control) 配置
  // roi(region of interest_--图像感兴趣区域
  output [32             -1 :0] o_rc_mod64_sum        ,	//输出--mod64校验
  input  [32             -1 :0] i_rc_bitnum           ,	//输入--cabac编码bit数,一般为10000
  input  [16             -1 :0] i_rc_k                ,	//输入--rc k 值,一般给0
  input  [6              -1 :0] i_rc_roi_height       ,	//输入--roi 高度
  input  [7              -1 :0] i_rc_roi_width        ,	//输入--roi 宽度
  input  [7              -1 :0] i_rc_roi_x            ,	//输入--roi 起始 X 轴坐标
  input  [7              -1 :0] i_rc_roi_y            ,	//输入--roi 起始 Y 轴坐标
  input                         i_rc_roi_en           ,	//输入--roi 使能
  input  [10             -1 :0] i_rc_L1_frame_byte    , //输入--一级流水线处理帧数
  input  [10             -1 :0] i_rc_L2_frame_byte    , //输入--二级流水线处理帧数
  input                         i_rc_lcu_en           ,	//输入--LCU 使能
  input  [6              -1 :0] i_rc_QP_max           ,	//输入--QP最大值
  input  [6              -1 :0] i_rc_QP_min           ,	//输入--QP最小值
  input  [6              -1 :0] i_rc_QP_delta         ,	//输入--roi QP值
  //IME 配置                                           
  input  [CMD_NUM_WIDTH  -1 :0] i_IME_cmd_num         ,	//输入--IME指令
  input  [CMD_DAT_WIDTH  -1 :0] i_IME_cmd_data        ,	//输入--IME数据
  //外部缓存包括(原始输入视频缓存--重构缓存)   
  //ori-->original : ori_yuv_mem-->原始输入视频缓存器
  //rb -->rebuild  : rb_pix_mem -->像素重构缓存器
  output [1-1              : 0] o_rb_pix_mem_video_vs ,	//输出--告诉像素重构缓存开始接收,相当于VGA时序的vs
  input  [1-1              : 0] i_rb_pix_mem_video_OK ,	//输入--像素重构缓存告诉h265压缩模块,接收一帧视频结束
  output [5-1              : 0] o_ext_mem_do_mode     ,	//输出--告诉外部缓存操作指示,详情请看文章
  output [6+`PIC_X_WIDTH -1: 0] o_ext_mem_x_position  ,	//输出--告诉外部缓存当前视频的 X 坐标
  output [6+`PIC_Y_WIDTH -1: 0] o_ext_mem_y_position  ,	//输出--告诉外部缓存当前视频的 Y 坐标
  output [8-1              : 0] o_ext_mem_video_width ,	//输出--告诉外部缓存--视频总宽度
  output [8-1              : 0] o_ext_mem_video_height,	//输出--告诉外部缓存--视频总高度
  input                         i_ori_yuv_mem_video_de,	//输入--原始输入视频缓存--输入的 yuv4:2:0 视频数据有效
  input  [16*`PIXEL_WIDTH-1: 0] i_ori_yuv_mem_video   ,	//输入--原始输入视频缓存--输入的 yuv4:2:0 视频数据
  input                         i_rb_pix_mem_video_de ,	//输入--像素重构缓存告诉h265压缩模块--我需要像素数据
  output [16*`PIXEL_WIDTH-1: 0] o_rb_pix_mem_video    ,	//输出--给像素重构缓存灌的像素数据 
  // h265 output
  output                        o_h265_video_de       ,	//输出--压缩后的 h265 视频数据有效	
  output  [7               : 0] o_h265_video           	//输出--压缩后的 h265 视频数据
  );

6、H265–视频压缩–时序

输入输出操作时序图请参考资料包里的vivado工程里的仿真波形图,料包里有仿真教程;
输入部分时序如下:
在这里插入图片描述
在这里插入图片描述
输出部分时序如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、Vivado工程详解

建立Vivado工程,将源码复制进去,目的是进行功能仿真和综合;
开发板FPGA型号:xc7k410tffg676-2;
输入:测试激励YUV 4:2:0视频流文件;
应用:功能仿真和综合;
在这里插入图片描述
FPGA资源消耗如下:
资源消耗比较大,请参考自己的FPGA是否满足资源要求;
在这里插入图片描述

8、移植上板应用

由于我这里只做到了仿真层面,还没上板调试,但你可以拿去移植上板,移植上板只需解决两个问题,1是输入时序,2是预估FPGA资源;
输入时序请参考vivado工程的仿真文件和仿真波形,查看仿真输入激励文件和波形就能了解驶入时序,然后对应着灌入数据即可;FPGA资源消耗请看上面的“7、Vivado工程详解中的FPGA资源消耗”;另外,移植上板可提供技术支持;

9、Vivado功能仿真

由于仿真过程比较复杂,我专门做了一个PPT教程,详细讲述了仿真流程,手把手教程,PPT教程一并在资料包里给出;位置如下:
在这里插入图片描述
正确仿真的结果如下:
在这里插入图片描述
在这里插入图片描述

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十大排序算法之冒泡排序、快速排序的介绍

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 目录 冒泡排序冒泡排序代码冒泡排序优化 快速排序快速排序代码 冒泡排序 说起来冒泡排…

推荐8款在win11上还能用的“古董级”软件

前几天花重金1.3个w买了一台新电脑华为一体机MateStation X 2023,用了近10年的华硕迷你电脑终于要下岗了。这么多年来一直在用win7操作系统,现在直接迭代到win11了,以前几个用得称手的工具软件不舍得扔,拷到新电脑上居然还能用&am…

前端之CSS常用选择器分享~

目录 1. 标签选择器 2. 类选择器 3. id选择器 4. 后代选择器 5. 子代选择器 6. 并集选择器 7. 兄弟选择器 1. 标签选择器 ● 基本格式 : 标签名{属性1: ; 属性2: ; 属性3: ;....} ● 示例代码 <body><style>div {width: 100px;height: 100px;background-co…

【微报告】行泊一体低、中、高算力平台,谁能率先突围?

行泊一体是大势所趋&#xff0c;且正分层发展&#xff0c;这是业内已有的共识。但对身处其中的竞争者&#xff0c;更重要且更难的显然为踏准市场节奏&#xff0c;从而用既有的资源取舍布局&#xff0c;最终吃下窗口期爆发红利&#xff0c;在细分赛道中脱颖而出。 高工智能汽车…

[Hadoop]数据仓库基础与Apache Hive入门

目录 大数据导论与Linux基础 Apache Hadoop、HDFS 大数据导论与Linux基础 数据仓库基本概念 数据仓库概念 数据仓库主要特征 数据仓库主流开发语言--SQL Apache Hive入门 Apache Hive概述 场景设计&#xff1a;如何模拟实现Hive功能 Apache Hive架构、组件 Apache H…

Python实现ACO蚁群优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

深入理解 go sync.Waitgroup

本文基于 Go 1.19。 go 里面的 WaitGroup 是非常常见的一种并发控制方式&#xff0c;它可以让我们的代码等待一组 goroutine 的结束。 比如在主协程中等待几个子协程去做一些耗时的操作&#xff0c;如发起几个 HTTP 请求&#xff0c;然后等待它们的结果。 WaitGroup 示例 下面…

CH32V3xx USART 空闲中断+DMA接收

目录 1、CH32V3xx USART简介2、测试程序2.1 USART 初始化配置2.1 发送函数2.1 接收中断1、CH32V3xx USART简介 CH32V3xx系列MCU包含3个同步异步收发器(USART1、2、3)和5个通用异步收发器(UART4、5、6、7、8)。USART模块支持DMA功能,DMA可以实现快速连续收发。使用DMA发送时…

windows安装pcl

文章目录 vcpkg方式安装默认安装x86默认没安装cloud_viewer.h AllInOne安装pcl的官方例程 vcpkg方式安装 官方建议在windows下&#xff0c;采用vcpkg的方式来安装&#xff1a; 安装vcpkg的&#xff0c;可以看这里&#xff1a;【WIN安装vcpkg】 默认安装x86 要注意的是 vcpkg…

品牌线上推广:如何进行电商控价?

随着电商平台的迅速崛起&#xff0c;电商控价已经成为了一个十分重要的话题。所谓电商控价&#xff0c;是指在电子商务平台上&#xff0c;品牌方针对自己的产品进行价格的控制&#xff0c;以确保产品的售价不被平台和第三方商家恶意砍价而影响品牌形象和盈利。那么&#xff0c;…

iptables 防火墙(二)SNAT/DNAT

目录 一&#xff1a;SNAT原理与应用 1.SNAT介绍 2.SNAT 应用环境 3.SNAT原理 二&#xff1a;SNAT配置 第一步&#xff1a;设置各个端口的网卡 1.先准备客户机、web服务器、网关服务器 2.网关服务器设置 &#xff08;1&#xff09;添加网卡 &#xff08;2&#xff09;修…

10分钟!Python写一个角色扮演带上下文功能的chatgpt聊天机器人!上篇!

大家都在网页上玩ChatGPT玩的不亦乐乎&#xff0c;但是很多时候我们需要打造个人专属的GPT&#xff0c;比如我是律师&#xff0c;我是医生&#xff0c;我是营养师&#xff0c;我是财会&#xff0c;我是猎头&#xff0c;我需要专属的某个领域的GPT&#xff0c;其实也不难。 今天…

加密解密软件VMProtect教程(八)许可制度之管理许可证

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…

加密解密软件VMProtect入门使用教程(八)许可制度之许可系统功能

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…

‘Light轻食初试版’小程序制作到发布过程中遇到的问题

目录 前言技术栈开发经验布局字体问题图片问题协作开发 发布时遇到的问题接口问题分包、图片显示问题小程序与公众号关于测试版本 总结 前言 学完小程序方面的知识后&#xff0c;我花四天时间做了一个简单的微信小程序——轻食Light说。这个小程序目前叫作“Light轻食说初始版…

【R模型】R语言线性回归之简单线性回归模型 (一)

&#x1f482; 个人信息&#xff1a;酷在前行&#x1f44d; 版权: 博文由【酷在前行】原创、需要转载请联系博主&#x1f440; 如果博文对您有帮助&#xff0c;欢迎点赞、关注、收藏 订阅专栏&#x1f516; 本文收录于【R模型】&#xff0c;该专栏主要介绍R语言各类型机器学习…

ORA-01555-快照过旧问题处理

背景 通过监控发现ETL报错 如何处理 ORA-01555 是 Oracle 数据库的一个错误代码&#xff0c;表示出现了“快照太旧”的错误。这个错误通常是由于数据库中的回滚段不够大&#xff0c;导致无法满足当前事务的需&#xff0c;从而导致事务回滚失败。 具体来说&#xff0c;ORA-0…

如何知道调用电商API是否成功返回数据?查看错误码解释

在API调用过程中&#xff0c;系统可能会返回一些错误码。错误码能够帮助开发者快速准确地了解出现的异常情况。错误码的含义通常涉及到请求参数不合法、认证失败、服务器内部错误等各种问题&#xff0c;它们提供了有关API调用失败的信息和上下文&#xff0c;在错误排查和修复时…

【案例教程】环境影响与碳排放生命周期评估应用及案例分析实践技术

生命周期分析是一种分析工具&#xff0c;它可帮助人们进行有关如何改变产品或如何设计替代产品方面的环境决策&#xff0c;即由更清洁的工艺制造更清洁的产品。例如&#xff0c;生命周期分析的结果表明&#xff0c;某种产品能耗低&#xff0c;寿命长&#xff0c;不含有毒化学物…

Java实现识别发票信息

Java实现调用第三方接口识别发票信息 需求&#xff1a;对每个发票图片文件进行重命名&#xff0c;名称为发票号固定信息&#xff0c;主要处理增值税发票 这里需要用到第三方接口&#xff0c;OCR识别功能&#xff0c;这里我用的是百度云接口&#xff0c;所以你需要注册百度云账…