一种基于VivadoHLS实现的CABAC流水线编码方法与流程

文档序号:12697110阅读:842来源:国知局
一种基于Vivado HLS实现的CABAC流水线编码方法与流程

本发明涉及的是图像处理技术领域,具体的说是一种基于Vivado HLS实现的CABAC流水线编码方法。



背景技术:

以X264、openh_264为代表的软件版H.264标准编码器已经非常成熟,而实时的硬件视频压缩实现上技术还不够成熟,目前,以海思为代表的H.264视频压缩专用芯片已经走向市场,而这些芯片存在的问题的是应用定制性过强,应用不够灵活,实时压缩环节往往是作为图像处理系统的一个子模块,这些处理芯片要么是不好与整个系统兼容,专用芯片需要单独设计电路与其它系统互联,要么是成本过高,一个小型的图像处理系统整体造价都没有一个芯片的成本高,往往会更好。



技术实现要素:

本发明的目的在于针对现有技术的缺陷和不足,提供了一种基于Vivado HLS实现的CABAC流水线编码方法,基于FPGA平台设计开发了H.264标准熵编码的关键环节CABAC模块,可以根据不同的需要灵活修改配置,调整资源,以适应各种情况下的视频压缩熵编码需求。

为实现上述目的,本发明采用的技术方案是:

一种基于Vivado HLS实现的CABAC流水线编码方法,其步骤如下:

1、初始化算术编码变量与上下文模型;

2、常规编码阶段划分,常规编码阶段划分为6步:上下文模型的读取、编码区间的划分、上下文模型的更新、正规化过程、字节码流的生成、码流输出;

3、编码阶段按流水线布置;

4、在Vivado HLS上实现设计;

5、为编码过程添加指令;

6、编写测试用例;

7、高级综合;

8、C与RTL级联合仿真。

进一步,所述上下文模型的读取步骤是:根据上下文模型的索引值从数组pState[460]中读取上下文模型,它的概率状态为pStateIdx,最大概率符号为valMPS,最小概率符号为1-valMPS。

进一步,所述区间划分的步骤是:取上次编码结果codIRange的前3位,与pStateIdx一起构成的坐标,查表得到当发生LPS时,编码区间宽度值codIRangeLPS,默认输入的binVal等于valMPS,并执行发生MPS时的操作:令codIRange减去codIRangeLPS,然后再判断输入的binVal是否等于上下文模型中的MPS,如果等于,则区间划分结束,如果不等于,则执行发生LPS时的操作:令上次编码的结果codILow叠加当前的codIRange,再给codIRange赋以新值codIRangeLPS。

进一步,所述上下文模型的更新步骤是:CABAC事先设计好了概率状态转移表,以当前的概率状态为坐标,查表即可得到新的概率状态,将新的概率状态赋给对应的上下文模型。

进一步,所述正规化过程的步骤是:判断区间划分结果是否在预先设置的合理区间范围内,如果在,则不执行任何操作,如果不在,则计算需要扩大的倍数,这里扩大的倍数都是2的幂次,所以只用对codIRange和codILow进行左移操作即可,左移的位数累加到变量firstbitflag中。

进一步,所述字节码流的生成步骤是:判断firstbitflag是否大于等于8,如果是,则截取codILow的高8位(有时可能是高9或10位)作为码字,并且firstbitflag减8(或者9,10),继续累加下次正规化过程的移位数,如果不是,则跳过接下来的码流输出环节。

进一步,所述码流输出的步骤是:判断上一步生成的码字是否等于255,如果是,则bitOutstanding累加1,如果不是,则bitOutstanding赋值为0,由于算术编码过程中,当前生成的码流可能超过8位,需要向上一个生成的8位字节码流进位,所以在输出码字的过程中,我们单独设置一个缓冲字节,存放当前生成的码字,使其在码流输出阶段不必输出,等待下一次生成新的码字,叠加新码字的进位再输出,然后输出bitOutstanding个溢出码流再叠加进位之后的码字,最后新的码字将再次放入这个缓冲字节中。

本发明的有益效果为:

1、CABAC编码速度快,可以实现2个时钟周期处理一个二进值bin。

2、节省资源,FPGA芯片的平均LUT使用情况为7000左右。

3、开发周期时间短,算法效果在FPGA上运行的效果很快就能得到,无需编写专门的RTL级硬件描述语言。

4、应用灵活,容易移植,不用过多考虑与其他模块兼容特性。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明的常规编码流程图;

图2是本发明的六阶流水线阶段布置示意图;

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及具体实施方式,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施方式仅用以解释本发明,并不用于限定本发明。

一种基于Vivado HLS实现的CABAC流水线编码方法,其步骤如下:

1、初始化算术编码变量与上下文模型。判断输入的CABAC初始化信号是否有效,有效则执行初始化命令,具体操作为,设置编码区间下界为0,编码区间宽度为510,设置编码区间的合理范围为[28,29),码流生成有效位数为-1,码流溢出情况统计为0,输出码流字节数为0,根据输入的量化值为460个上下文模型分配初始的概率状态,并存放在一个数组中pState[460];

2、常规编码阶段划分。常规编码阶段划分。CABAC的编码处理过程分为两条路径:常规编码和旁路编码,通常所说的编码提速主要针对的是常规编码,编码过程如图1所示,我们将常规编码阶段划分为6步:上下文模型的读取(context fetch,CF),编码区间的划分(interval division,ID),上下文模型的更新(context update,CU),正规化过程(renormalization,RN),字节码流的生成(byte generation,BG),码流输出(byte output,BP)。

各个编码步骤具体实施如下:

(1)、上下文模型的读取。根据上下文模型的索引值从数组pState[460]中读取上下文模型,它的概率状态为pStateIdx,最大概率符号为valMPS,最小概率符号为1-valMPS;

(2)、区间划分。取上次编码结果codIRange的前3位,与pStateIdx一起构成的坐标,查表得到当发生LPS时,编码区间宽度值codIRangeLPS,默认输入的binVal等于valMPS,并执行发生MPS时的操作:令codIRange减去codIRangeLPS,然后再判断输入的binVal是否等于上下文模型中的MPS,如果等于,则区间划分结束,如果不等于,则执行发生LPS时的操作:令上次编码的结果codILow叠加当前的codIRange,再给codIRange赋以新值codIRangeLPS;

(3)、上下文模型的更新。CABAC事先设计好了概率状态转移表,以当前的概率状态为坐标,查表即可得到新的概率状态,将新的概率状态赋给对应的上下文模型;

(4)、正规化过程。判断区间划分结果是否在预先设置的合理区间范围内,如果在,则不执行任何操作,如果不在,则计算需要扩大的倍数,这里扩大的倍数都是2的幂次,所以只用对codIRange和codILow进行左移操作即可,左移的位数累加到变量firstbitflag中;

(5)、字节码流的生成。判断firstbitflag是否大于等于8,如果是,则截取codILow的高8位(有时可能是高9或10位)作为码字,并且firstbitflag减8(或者9,10),继续累加下次正规化过程的移位数,如果不是,则跳过接下来的码流输出环节;

(6)、码流输出。判断上一步生成的码字是否等于255,如果是,则bitOutstanding累加1,如果不是,则bitOutstanding赋值为0,由于算术编码过程中,当前生成的码流可能超过8位,需要向上一个生成的8位字节码流进位,所以在输出码字的过程中,我们单独设置一个缓冲字节,存放当前生成的码字,使其在码流输出阶段不必输出,等待下一次生成新的码字,叠加新码字的进位再输出,然后输出bitOutstanding个溢出码流再叠加进位之后的码字,最后新的码字将再次放入这个缓冲字节中。

3、编码阶段按流水线布置。上下文模型的读取、编码区间划分、上下文模型的更新与正规化过程是算术编码的关键路径,CABAC本身具有的循环嵌套特性使得输入任意多个bin不可能并行编码,只能依次执行编码,然而,不同的编码阶段可以并行执行操作,于是可以将不同的编码阶段按流水线排布成如图2所示的编码过程,下一个bin的上下文模型的读取与上一个bin的编码区间划分操作不相干,可以并行执行,下一个bin的上下文模型的更新与上一个bin的正规化操作不相干,也可以并行执行,正规化操作将生成的码流位移到编码的区间下界codILow的高位,码流生成有效位只有大于等于8时才构成码流输出条件,此时输出一个字节的码流,由于正规化操作每次可以生成的码流位数最多为6位,而且BG与BP操作执行时间较长,所以可以每隔一个bin的编码安排一次字节码流生成与码流输出操作。

4、在Vivado HLS上实现设计;建立相应的工程,设置顶层函数,选择合适的芯片,设定时钟频率,用HLS提供的模板hls::stream为编码设计输入输出接口,hls::stream<>是一种类似fifo的结构,在一个工程中只能执行单向操作,即只能读取,或只能写入,并且执行完读取操作后,被读取的数就从该结构中移出,hls::stream<>可以具有无限深度,在RTL级综合阶段默认深度为1,输入接口,我们设计的hls::stream位宽为16位,从右往左数,第1至第9位存放460种上下文模型索引值,第10位存放二进值;输出接口,我们设计位宽为8,正好输出一个字节的码流;

5、为编码过程添加指令;为了达到预期的流水线编码的目的,为编码函数添加指令PIPELINE,它的作用是强制执行流水线操作,减小循环或函数接受输入的初始间隔,也就是提高吞吐量,为编码操作指定吞吐量为2;

6、编写测试用例;为整个工程写一个C环境下的独立测试环境,设置输入输出hls::stream,以及输入输出文件,输入文件来自一副完整图像经过变换量化以及熵编码的二值化后得到的二进值与上下文模型组合而成的16位无符号数的数据文件,用hls::stream写入操作写进输入接口中,中间调用对工程定义的顶层函数,由于编码的所有结果都写入了输出接口的hls::stream中,在测试用例中依次读取输出接口中的8位无符号数,写成数据文件;

7、高级综合;点击执行综合指令,将C语言编写的算法转换成RTL级硬件描述语言Verilog和VHDL,并生成综合报告,详细说明综合结果。

8、C与RTL级联合仿真;HLS根据测试用例验证工程在C与RLT级功能的正确性,生成输出文件,和RTL级运行情况报告。

对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。

此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1