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

news/2024/11/24 19:07:25/

目录

  • 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名片。
网盘资料如下:
在这里插入图片描述


http://www.ppmy.cn/news/27260.html

相关文章

斗地主洗牌发牌-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)

【案例6-4】 斗地主洗牌发牌 【案例介绍】 1.任务描述 扑克牌游戏“斗地主”&#xff0c;相信许多人都会玩&#xff0c;本案例要求编写一个斗地主的洗牌发牌程序&#xff0c;要求按照斗地主的规则完成洗牌发牌的过程。一副扑克总共有54张牌&#xff0c;牌面由花色和数字组成…

git 的使用方法(上 - 指令)

目录前言&#xff1a;一、Git 是什么&#xff1f;二、SVN与Git的最主要的区别&#xff1f;三、Git 安装四、git 配置1. 创建仓库 - repository2. 配置3. 工作流与基本操作五、Git 的使用流程1. 仓库中创建 1.txt文件2. 查看工作区的文件状态3. 添加工作区文件到暂存区4. 创建版…

D1s RDC2022纪念版开发板开箱评测及点屏教程

作者new_bee 本文转自&#xff1a;https://bbs.aw-ol.com/topic/3005/ 目录 芯片介绍开发板介绍RT-Smart用户态系统编译使用感想引用 1. 芯片介绍 RISC-V架构由于其精简和开源的特性&#xff0c;得到业界的认可&#xff0c;近几年可谓相当热门。操作系统方面有RT-Thread&am…

numpy的常见数据类型

常见数据类型介绍Python 原生的数据类型相对较少&#xff0c; bool、int、float、str等。这在不需要关心数据在计算机中表示的所有方式的应用中是方便的。然而&#xff0c;对于科学计算&#xff0c;通常需要更多的控制。为了加以区分 numpy 在这些类型名称末尾都加了“_”。类型…

嵌入式常用知识

12、并发和并行的区别&#xff1f; 最本质的区别就是&#xff1a;并发是轮流处理多个任务&#xff0c;并行是同时处理多个任务。 你吃饭吃到一半&#xff0c;电话来了&#xff0c;你一直到吃完了以后才去接&#xff0c;这就说明你不支持并发也不支持并行。 你吃饭吃到一半&…

【HTML】我的花儿我做主~ 指定花瓣的数量,生成花朵~

效果图 前言&#xff08;赛时灵感&#xff09; 在比赛开始前&#xff0c;就一直没有灵感&#xff0c;不知道参与哪个赛道。也还不知道用啥去做。 直到比赛开始&#xff0c;还是没想到。 最后在比赛快要结束的第五天三更半夜的时候&#xff1b; 突然想到&#xff0c;既然要浪漫&…

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

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

01 软件基础22222

1 软件介绍 SWMM&#xff08;Storm Water Management Model&#xff09;是一款用于城市暴雨径流模拟和城市雨水管理的计算机软件。SWMM软件最初由美国环保局&#xff08;EPA&#xff09;开发&#xff0c;现在已经成为一个广泛使用的软件&#xff0c;用于设计、规划和管理城市排…