FPGA纯verilog代码实现H.264/AVC视频解码,提供工程源码和技术支持

news2025/1/15 12:43:35

目录

  • 1、前言
  • 2、硬件H.264/AVC视频解码优势
  • 3、vivado工程设计架构
  • 4、代码架构分析
  • 5、vivado仿真
  • 6、福利:工程代码的获取

1、前言

本设计是一种verilog代码实现的低功耗H.264/AVC解码器(baseline ),硬件ASIC设计,不使用任何GPP/DSP等内核,完全有可综合的verilog代码实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;
本文详细描述了纯verilog实现设计方案,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的视频解码领域;提供完整的、跑通的工程源码和技术支持;
本设计只做到了仿真层面并验证通过,并没有实际应用于真实项目,但理论上讲是可行的,作为研究FPGA实现H.264的学习性参考资料很完美,既有verilog源码又有仿真文件,作为工程应用可能需要自行搭建使用平台,我也可以提供技术支持;
H.264和AVC是两个不同机构定义的不同名称,其实质是同一个东西,也就是视频压缩和解压的算法,由于叫的人多了,也就习惯叫H.264了,不必纠结这些名称性的东西。
关于H.264编解码的理论知识,请看官自行搜索,CSDN也有很多大佬写得很详细,我就不写这部分了,我们详细讲讲用verilog实现的过程和本工程的组成结构。

2、硬件H.264/AVC视频解码优势

本H.264/AVC解码器(baseline)具有以下特点:
一个字:牛逼,表现如下:
1:Verilog-HDL实现,没有任何IP核,学习性和阅读性达到天花板;
2:目前只支持QCI分辨率(176X144)的实时H.264/AVC解码,但可修改代码以适应更高分辨率视频;
3:由于使用verilog代码实现,所以具有流水线操作和并行操作的特点,解码速度直接拉满;
4:帧间和帧内自适应流水线设计;
5:分层内存组织设计,减少外部内存访问;
6:低开销的帧内预测单元;
7:优化的帧间预测单元(运动补偿);
8:最大频率200MHz,可提供高达980kMB/s的吞吐量;
9:QCIF 30fps的实时解码仅需约1.5MHz时钟,只有169k个逻辑门,实测功耗低至293µW;
10:移植性达到天花板,Xilinx、Altera和国产FPGA之间自由移植;
以Virtex-4 xc4vlx200的FPGA实现本解码器的资源消耗如下:
在这里插入图片描述
用专用ASIC实现本解码器的资源消耗如下:
在这里插入图片描述

3、vivado工程设计架构

vivado工程设计架构如下:
在这里插入图片描述
代码运行仿真流程如下:
1:使用10个300帧的QCIF视频序列作为输入源,它们由JM94软件编码产生位TXT文件,生成的模拟视频流文件放在仿真文件夹下,如图:
在这里插入图片描述
2:测试视频RAM:负责将读取视频流文件送到H264解码器进行解码,该模块由H264解码器的视频流控制模块控制,只作为仿真应用,在实际使用中并不需要;模块很简单,源码如下:

module Beha_BitStream_ram(
	input             clk               ,
	input             BitStream_ram_ren ,
	input [16:0]      BitStream_ram_addr, 
	output reg [15:0] BitStream_ram_data
);
	
	reg [15:0] BitStream_ram[0:`Beha_Bitstream_ram_size];  

	initial	
		begin
			$readmemh("akiyo300_1ref.txt",BitStream_ram);
		end
		
	always @ (posedge clk)
		if (BitStream_ram_ren == 0) BitStream_ram_data <= #2 BitStream_ram[BitStream_ram_addr];	
			
endmodule

3:H264解码器:当测试视频RAM深度填充至一半时,开始发送测试视频流给到H264解码器;H264解码器由视频流控制器和数据重构解析器组成;如下:
在这里插入图片描述
其中的4×4/16×16混合流水线机制如下:
在这里插入图片描述
关于H264解码器具体代码级详情,请联系我看源码,不是我不愿具体写,而是代码量实在有点大,写不完也装不下,如果具体写的话估计得出5本书。。。
H264解码器顶层接口如下:

module helai_h264_decode (
	input         clk                   ,
	input         reset_n               ,
	input [15:0]  BitStream_buffer_input,
	input         pin_disable_DF        ,
	input         freq_ctrl0            ,
	input         freq_ctrl1            ,	
	output        BitStream_ram_ren     ,
	output [16:0] BitStream_ram_addr    ,
	output [5:0]  pic_num               ,
	//---ext_frame_RAM0---
	output        ext_frame_RAM0_cs_n   ,
	output        ext_frame_RAM0_wr     ,
	output [13:0] ext_frame_RAM0_addr   ,
	input  [31:0] ext_frame_RAM0_data   ,
	//---ext_frame_RAM1---
	output        ext_frame_RAM1_cs_n   ,
	output        ext_frame_RAM1_wr     ,
	output [13:0] ext_frame_RAM1_addr   ,
	input  [31:0] ext_frame_RAM1_data   ,
	
	output [31:0] dis_frame_RAM_din     ,
	output        slice_header_s6       
	);

4:乒乓RAM:设置了两个乒乓RAM,一个用来缓存一帧数据,作为H264解码器解析用,比如帧预测;另一个作为输出显示的缓存;当其中一个RAM完成自己的任务时,H264解码器控制二者角色互换;RAM顶层接口如下:
H264解码器通过片选信号ext_frame_RAM0_cs_n达到控制二者乒乓效果;

module ext_frame_RAM0_wrapper (
	input             clk                , 
	input             reset_n            ,
	input             ext_frame_RAM0_cs_n,
	input             ext_frame_RAM0_wr  ,
	input [13:0]      ext_frame_RAM0_addr,
	input [31:0]      dis_frame_RAM_din  ,
	input [5:0]       pic_num            ,
	input             slice_header_s6    ,
	output reg [31:0] ext_frame_RAM0_data
);

5:视频输出
H264解码器解码后的视频颜色空间为YUV4:2:0,需要转换为YUV4:4:4或者RGB8:8:8再输出显示,框图如下:
在这里插入图片描述

4、代码架构分析

总体代码架构如下:
在这里插入图片描述
下面我们重点看看H264解码器代码级组成:
视频流控制器完整verilog代码组成如下:
在这里插入图片描述
在这里插入图片描述
数据重构解析器完整verilog代码组成如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关于H264解码器具体代码级详情,请联系我看源码,不是我不愿具体写,而是代码量实在有点大,写不完也装不下,如果具体写的话估计得出5本书。。。

5、vivado仿真

仿真后,H264解码器会输出两个文件,文件位置如下:
在这里插入图片描述
h264_display.txt:存放H264解码器输出的像素数据,可以将此文件转成图片显示;
h264_MB_output_debug.txt:存放H264解码器输出的debug数据,可清晰看到输出过程,如下:
在这里插入图片描述

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

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

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

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

相关文章

最新Python异步编程详解

我们都知道对于I/O相关的程序来说&#xff0c;异步编程可以大幅度的提高系统的吞吐量&#xff0c;因为在某个I/O操作的读写过程中&#xff0c;系统可以先去处理其它的操作&#xff08;通常是其它的I/O操作&#xff09;&#xff0c;那么Python中是如何实现异步编程的呢&#xff…

Python每日一练(20230223)

目录 1. 合并区间 2. 单词接龙 3. N皇后 附录&#xff1a;回溯算法 基本思想 一般步骤 1. 合并区间 难度&#xff1a;★★ 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回…

【虚拟仿真】Unity3D中实现鼠标的单击、双击、拖动的不同状态判断

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 这篇文章分享一下虚拟仿真项目中经常碰到鼠标事件控制代码。 …

某直聘tp_token解析

尊重版权&#xff0c;请勿盗版&#xff0c;不放代码。截至2023-02-23更新---------------------------------------检测windows属性总数大于150 改成大于15 > 150检测了document属性大于50检测了navigate属性检测了navigate.plugins 属性值检测moudle nodejs是否存在&#x…

Java 异常处理,超详细整理,适合新手入门

目录 前言 抛出异常 捕获异常 处理异常 finally块 总结 前言 当Java程序中出现错误或异常时&#xff0c;通常会抛出一个异常。Java的异常处理机制使得我们可以在程序运行过程中捕获这些异常并采取相应的措施&#xff0c;以便程序能够正常运行或者优雅地停止。 抛出异常 在…

德馨食品再战IPO,“卖水人“还有新故事吗?

新茶饮供应链企业迎来上市潮。2月13日&#xff0c;浙江德馨食品科技股份有限公司&#xff08;下称“德馨食品”&#xff09;更新招股书&#xff0c;再次冲刺深交所。此前&#xff0c;原料果汁速冻果块制造商田野创新股份有限公司&#xff08;下称“田野股份”&#xff0c;83202…

华为OD机试真题 用 C++ 实现 - 字符串加密 | 多看题,提高通过率

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

16行代码采集原神官网角色全图+全语音

嗨害大家好鸭&#xff01;我是小熊猫~ 本来是不玩原神的&#xff0c; 但是实在是经不住诱惑鸭~ 毕竟谁能拒绝可以爬树、炸鱼、壶里造房子、抓小动物、躲猫猫的对战游戏捏~ 准备工具 源码资料电子书:点击此处跳转文末名片获取 准备模块 import requests import re import ex…

安卓开发 AlertDialog mesaage太长显示不全 下面按钮不显示 bug解决

简单解决 去掉下面这行即可 <item name"android:windowTranslucentStatus">true</item>但是状态栏不够沉浸&#xff0c;只定义dialog的style &#xff08;推荐&#xff01;&#xff09; <style name"MyDialog" parent"ThemeOverlay.…

Blender 导出fbx模型到 untiy

文章目录导出模型的基本设置将导出的模型放到Untiy里材质问题导出模型的基本设置 导出模型前先 ctrla 应用全部变换&#xff0c;模型原点应该根据需要放在物体中心或底部 1 路径模式&#xff1a;复制 &#xff0c;这会把模型引用的纹理复制一份到选定的文件夹下&#xff0c;用…

华为OD机试真题 用 C++ 实现 - 括号检查

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Homekit智能家居DIY一智能触摸面板开关

触摸开关&#xff0c;即通过触摸方式控制的墙壁开关&#xff0c;其感官场景如同我们的触屏手机&#xff0c;只需手指轻轻一点即可达到控制电器的目的&#xff0c;随着人们生活品质的提高&#xff0c;触摸开关将逐渐将换代传统机械按键开关。 触摸开关控制原理 触摸开关我们把…

模电学习7. 三极管特性曲线与静态工作点

模电学习7. 三极管特性曲线与静态工作点一、三极管的伏安特性曲线1. 三极管的伏安特性曲线2. 三极管的静态工作点二、合适的静态工作点选择1. 合适静态工作点条件2. 静态工作点的确定三、使用立创EDA仿真查看静态工作点1. 搭建如下图所示测试电路2. 点击菜单仿真、仿真设置3. 运…

图遍历详解

图遍历 在 Neo4j 中&#xff0c;关系的唯一性始终得到遵守。即两个节点之间永远不会有两个相同类型和方向的关系。这使 Neo4j 能够避免图形遍历中的循环或无限循环。使用多个 Match 子句和多个模式的查询性能分析 PROFILE 加入PROFILE的查询语句将占用更多的资源&#xff0c;所…

华为OD机试真题 用 C++ 实现 - 任务总执行时长

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

部署跨云容灾的五大难点

为什么企业需要跨云容灾&#xff1f; 据统计&#xff0c;全球已有70%的企业使用云计算服务。上云帮助企业更高效地管理数据资产&#xff0c;但它并非绝对安全。如停电、漏水等机房事故&#xff1b;地震、火灾等自然性灾害&#xff1b;亦或是人为失误&#xff0c;都有可能造成数…

使用WordPress快速搭建外贸网站教程

一、下载安装 1、首先前往官方下载wordPress框架&#xff0c;下载地址&#xff1a;Download | WordPress.org 2、把下载好的安装包上传到我们的服务器&#xff0c;解压 3、我使用的搭建环境是宝塔Linux CentOS 7.9&#xff08;Apache2.4mysql5.6php7.4&#xff09;&#xf…

肖臻公开课(三)——比特币中的数据结构

本笔记对应北京大学肖臻老师《区块链技术与应用》公开课第三课。 0.前言 在本节中&#xff0c;肖老师先是简单介绍了哈希指针的概念&#xff0c;然后着重介绍了比特币中的两个重要的数据结构&#xff1a;block chain和merkle tree。 1.哈希指针 谈到比特币中的数据结构&#…

AD360身份管理自动化

自动化 IAM 的需求 对于组织来说&#xff0c;通过部署用户友好的 IAM 自动化解决方案来保持其安全性非常重要&#xff0c;该解决方案将消除人为错误并确保合规性&#xff0c;同时降低成本和管理工作负载。 AD360 是一种自动化身份管理解决方案&#xff0c;提供管理用户身份、…

这7条数据分析思路与技巧,让分析结果更可靠、完整!

大家好。在和一些新人数据分析师聊天时&#xff0c;经常听到大家说“工作时没有自己的分析思路&#xff0c;常常是机械地完成老板布置的任务&#xff0c;无法形成自己的数据分析方法论。” 的确&#xff0c;作为一名数据分析师我也能理解初入行的同学的烦恼&#xff0c;我们在…