FPGA纯verilog代码实现H.264/AVC视频解码,提供工程源码和技术支持
目录
- 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);endalways @ (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名片。
网盘资料如下:
相关文章:

FPGA纯verilog代码实现H.264/AVC视频解码,提供工程源码和技术支持
目录1、前言2、硬件H.264/AVC视频解码优势3、vivado工程设计架构4、代码架构分析5、vivado仿真6、福利:工程代码的获取1、前言 本设计是一种verilog代码实现的低功耗H.264/AVC解码器(baseline ),硬件ASIC设计,不使用任何GPP/DSP等内核&#…...
通俗神经网络
经典的全连接神经网络 经典的全连接神经网络来包含四层网络:输入层、两个隐含层和输出层,将手写数字识别任务通过全连接神经网络表示,如 图3 所示。 图3:手写数字识别任务的全连接神经网络结构输入层:将数据输入给神经…...

网络工程(一) 简单的配置
网络工程 简单的配置 需求 两台交换机 两台路由器 两台PC AR1配置静态路由 system-view [HUAWEI]sysname ar1 [ar1]interface g 0/0/0 [ar1-G…0/0/0]ip address 192.168.2.1 24 [ar1-G…0/0/0]quit [ar1]interface g 0/0/1 [ar1-G…0/0/1]ip address 192.168.3.1 24 [ar1-G…...

深度剖析数据在内存中的存储(上)
目录 1. 数据类型介绍 1.1 类型的基本归类 2. 整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 2.3 一道小题 本章重点 1. 数据类型详细介绍 2. 整形在内存中的存储:原码、反码、补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 正文…...

CF Edu 130 A-D vp 补题
CF Edu 130 A-D vp 补题 数模也是终于结束了。开始恢复vp。今天这场vp发挥比上次好一些,三题rank3600。A,B题做的很顺利。C题标记没弄全多WA了两发。D题是个交互题,也是研究了一下。基本思路正确。 题目链接 A. Parkway Walk 贪心 题意&am…...

4707: 统计数字个数
描述给定一个非负整数a,求其中含有数字b的个数(0<a<2147483647,0<b<9)。如100001中含所有0的个数为4,1的个数为2。输入输入数据有多组,每组一行,每行为两个整数,即a和b&…...

ChatGPT 编写模式:如何高效地将思维框架赋予 AI ?
如何理解 Prompt ?Prompt Enginneeringprompt 通常指的是一个输入的文本段落或短语,作为生成模型输出的起点或引导。prompt 可以是一个问题、一段文字描述、一段对话或任何形式的文本输入,模型会基于 prompt 所提供的上下文和语义信息&#x…...

Leetcode力扣秋招刷题路-0099
从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 99. 恢复二叉搜索树 给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。 示例 1: 输入…...

消费升级趋势下,平台如何在广告电商模式中攫取新流量
如今电商平台飞速发展,越来越多的人加入电商运营的行列,同行竞争逐渐变得激烈起来,为了能够让平台有更多的展现机会,提升平台的商品转化率,大家都很重视平台的优化,因为一个好的平台可以给自身带来更多的流…...

华为OD机试真题 用 C++ 实现 - 众数和中位数 | 多看题,提高通过率
最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

Linux NOR 开发指南
Linux NOR 开发指南 1 简介 编写目的 此文档描述Sunxi NOR 模块的使用方法,为相关人员调试提供指导 适用范围 boot0: 适用于brandy-2.0u-boot: 适用于u-boot-2018kernel: 适用于linux-4.9/linux-5.4 内核 BSP 的开发人员、测试人员 2 模块介绍 2.1 模块功能…...

免费领取丨精算与金融建模行业解决方案白皮书,不要错过!
一、我国精算行业现状 精算学是对人类社会所面临的各种风险及其他客观事务进行量化分析和处理的一门科学。在保险、金融、投资和各类风险管理等许多领域得到广泛应用,尤其在保险和社会保障领域,已成为不可或缺的科学和技术,以保险公司为例&a…...

ideal创建maven项目
前置工作本机安装mavenIdea 设置使用本机maven 工具Settings--->Maven开始创建maven项目创建maven项目,勾选通过模板创建,选择 maven-archetype-webapp 模板GroupId: 公司名倒序ArtifactId: 项目名设置本地maven仓库配置项目文件显示名,和…...

ChatGPT是什么?为何会引爆国内算力需求?
过去十年中,通过“深度学习大算力”从而获得训练模型是实现人工智能的主流技术途径。由于深度学习、数据和算力这三个要素都已具备,全世界掀起了“大炼模型”的热潮,也催生了大批人工智能企业。大模型是人工智能的发展趋势和未来大模型&#…...

【Linux】进程间通信(万字详解)—— 匿名管道 | 命名管道 | System V | 共享内存
🌈欢迎来到Linux专栏~~进程通信 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤…...

【Database-02】达梦数据库 - DM Manager管理工具安装
1、简介 DM Manager是达梦数据库自带的图形化界面管理工具,在安装达梦数据库的时候就会自动安装。 Linux环境,默认安装路径为:达梦安装目录/tool/manager,如果Linux是安装GUI,那么就可以直接启动使用。 实际大部分使…...

剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和 难度:easy\color{Green}{easy}easy 题目描述 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums [-2,1,-3,4,-1,2,1,-5,4] 输…...

双指针 (C/C++)
1. 双指针 双指针算法的核心思想:将暴力解法的时间复杂度,通常是O(N*N),通过某种特殊的性质优化到O(N)。 做题思路:先想想暴力解法的思路,然后分析这道题的特殊性质,一般是单调性。然后得出双指针算法的思路…...

CVE-2023-23752 Joomla未授权访问漏洞分析
漏洞概要 Joomla 在海外使用较多,是一套使用 PHP 和 MySQL 开发的开源、跨平台的内容管理系统(CMS)。 Joomla 4.0.0 至 4.2.7 版本中的 ApiRouter.php#parseApiRoute 在处理用户的 Get 请求时未对请求参数有效过滤,导致攻击者可向 Joomla 服务端点发送包…...

单通道说话人语音分离——Conv-TasNet(Convolutional Time-domain audio separation Network)
单通道说话人语音分离——Conv-TasNet模型(Convolutional Time-domain audio separation Network) 参考文献:《Conv-TasNet: Surpassing Ideal Time-FrequencyMagnitude Masking for Speech Separation》 1.背景 在真实的声学环境中,鲁棒的语音处理通常…...

华为OD机试真题Python实现【环中最长子串】真题+解题思路+代码(20222023)
环中最长子串 题目 给你一个字符串s,首尾相连成一个环形, 请你在环中找出o字符出现了偶数次最长子字符串的长度. 备注: 1 <= s.lenth <= 5x10^5 s只包含小写英文字母 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输入 输入是…...

Netcat安装与使用(nc)
Netcat安装与使用1.Netcat简介1.1.Netcat安装1.1.1.安装整体流程1.1.1.1.安装依赖1.1.1.2.安装Netcat1.1.1.3.配置环境变量1.1.1.4.测试1.2.Netcat基本功能1.3.Netcat常用参数2.Netcat用法2.1.前期准备2.2.banner相关信息抓取2.3.端口扫描2.3.1.扫描指定端口2.3.2.扫描指定端口…...

蓝桥杯:聪明的猴子
题目链接:聪明的猴子https://www.lanqiao.cn/problems/862/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 运行限制 解题思路: 最小生成树 AC代码(Java): 课后练习: 题目描述 在一个热带雨林中生存…...

Spring Boot应用如何快速接入Prometheus监控
1. Micrometer简介Micrometer为Java平台上的性能数据收集提供了一个通用的API,它提供了多种度量指标类型(Timers、Guauges、Counters等),同时支持接入不同的监控系统,例如Influxdb、Graphite、Prometheus等。可以通过M…...

vscode远程调试python
目的 注意:这里我们想要实现的是:用vscode 使用remote ssh打开project,然后直接在project里面进行debug,而不需要 在本地vscode目录打开一样的project。 假设大家已经会使用remote ssh打开远程服务器的代码了,那么只…...

Spring Boot 框架 集成 Knife4j(内含源代码)
Spring Boot 框架 集成 Knife4j(内含源代码) 源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87480176 目录Spring Boot 框架 集成 Knife4j(内含源代码)源代码下载链接地址:[htt…...

什么蓝牙耳机适合打游戏?打游戏不延迟的蓝牙耳机
为了提升游戏体验,除了配置强悍的主机外,与之搭配蓝牙耳机等外设产品也尤为重要,今天就带大家来了解一下以下几款适合玩游戏,低延迟操作的蓝牙耳机。 第一款:南卡小音舱蓝牙耳机 参考价格:239元 推荐理由…...

【项目设计】高并发内存池(一)[项目介绍|内存池介绍|定长内存池的实现]
🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…...

初识MySQL下载与安装【快速掌握知识点】
目录 前言 MySQL版本 MySQL类型 MySQL官网有.zip和.msi两种安装形式; MySQL 下载 1、MySQL 属于 Oracle 旗下产品,进入Oracle官网下载 2、点击产品,找到MySQL 3、进入MySQL页面 4、点击Download(下载)&#x…...

如何终止一个线程
如何终止一个线程 是使用 thread.stop() 吗? public class ThreadDemo extends Thread{Overridepublic void run() {try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("this is demo thread :"Thre…...