电子百科
图像的编解码技术是多媒体技术的关键,H.264/AVC是国际上最先进的视频压缩技术,其主要特点是采用小尺寸整数余弦变换、1/4像素的运动估计精度、多参考帧预测,基于上下文可变长度编码和环路内去块效应滤波器等技术。由于去块效应滤波器大约占整个解码器1/3的运算量,因此该部分的设计成为整个解码器设计的瓶颈,在此研究了一种新颖的环路内去块效应滤波器设计。设计中采用5阶流水线的去块效应模块,利用混合滤波顺序与打乱的存储更新机制的方法提高了流水线畅顺性,滤波一个16×16大小的宏块仅需要198个时钟周期。
1 H.264/AVC的去块效应
在基于块的视频编码方法中,各个块的编解码是互相独立的,由于预测、补偿、变化、量化等引起块与块之间的边界处会产生不连续,因此新版H.264/AVC标准采用了环路内去块滤波器来解决每个16×16宏块重建后的边界扭曲问题。去块效应滤波有两种方法:后处理去块效应滤波;环路内去块效应滤波。H.264/AVC采用环路内去块效应滤波(见图1),即滤波后的帧作为后面预测的参考帧。与之前的H.263或MPEG的滤波器相比较,新版H.264标准采用的滤波器基于更小的4×4的基本宏块,基本宏块的边界根据片级/宏块级的特性与根据像素穿过滤波边界的渐变度,对需要滤波的宏块边界进行有条件的滤波。重建帧的每个像素都需要从外部存储器中重调出来以进行滤波处理或作为相邻像素来判断当前像素是否需要进行滤波。显然,这些操作需要消耗巨大的存储器带宽,对像素值进行修改。
本文设计的去块效应滤波模块采用流水线技术来提高系统吞吐量。理想流水线的高效率实现基于相邻的滤波操作没有数据性。文献[3,4]采用了非流水线的架构,因此无法提高系统的吞吐量。而对于流水线架构,如若不优化滤波顺序与存储器访问次序,则所产生的数据与结构冒险也将大大降低流水线的效率。有人使用双端口的片上SRAM来减少片外存储器的带宽,增加了系统的吞吐量,但是双端口存储器面积较大且增加功耗。与流水线的滤波器相比,非流水线滤波器的操作(包括条件判断、查表、像素计算等)是顺序化的,即每个时钟仅处理一个操作类型,因此它所能达到的最大系统频率要低很多。
采用不同的边界滤波顺序,会大大的影响去块效应滤波器的性能。在H.264/AVC标准中,每个宏块的滤波顺序得到了描述,只要保持滤波数据依赖性,H.264/AVC标准所描述的滤波顺序可以被改进。其滤波顺序包括两类:顺序滤波和混合滤波。但是其滤波顺序以及相应的存储更新机制都是针对非流水线结构的,因此如果直接将之应用于本文的流水线设计,就有可能引发严重的竞争与冒险从而降低流水线的性能。
2 去块效应滤波器的存储管理与滤波算法
H.264/AvC标准基于4×4宏块作为滤波的基本宏块,它有5种滤波强度,分别是Bs=0,1,2,3,4。滤波方式分为强滤波、标准滤波和直通3种方式,其中强滤波影响边界两边的共6个像素,标准滤波影响边界两边的共4个像素,直通方式不修改边界两侧的像素。H.264/AVC标准规定先对垂直边界进行滤波,然后再对水平边界进行滤波,只有对垂直与水平边界全部滤波完成后,才可以对下一个宏块进行滤波。同一个宏块中,先对亮度部分进行滤波,再对色度部分进行滤波;色度部分滤波时,先对C6部分进行滤波,再对Cr部分进行滤波,对整个16×16宏块的滤波顺序如图2所示。
(1)边界滤波强度与像素滤波的存储器
按照H.264/AVC的标准,需要对被滤波的边界两侧的像素进行有条件的滤波。该条件决定于边界强度BS与像素穿越边界的倾斜度。边界强度BS:0,1,2,3或4,在进行滤波之前被赋给相应的边界。BS=4表示强滤波,BS=0表示不需要进行滤波,即直通方式;否则,BS=1,2,3表示中等强度的滤波,色度部分边界的滤波强度与对应亮度部分是相同的。滤波每条水平或垂直边界需要被提供边界两边的8个像素,p0~p3&q0~q3;需要更新的像素共6个或4个:p0~p2&q0~q2或声p0,p1&q0,q1。
对一个16×16宏块进行滤波需要提供左边相邻像素、右边相邻像素和本宏块的像素。对于宏块边界,比如最左边界与最右边界而言,p0~p3与q0~q3来自不同的模块(即分别来自相邻宏块的像素与本宏块的像素);对于非16×16宏块的边界滤波,像素p0~p3与q0~q3均来自16×16宏块本身,因此至少需要4个存储单元:左相邻像素存储单元、上相邻像素存储单元、本身模块的像素存储单元和转换缓冲单元,每个存储单元的带宽是32位。
当滤波从垂直边界向水平边界变换时,为了方便滤波过程中的存储器访问,这里利用额外的转换缓冲器BUF0~BUF3来缓存中间滤波数据,采用转换缓冲器后获取一行或一列像素的值(即p0~p3&q0~q3)只需要1个时钟周期,否则需要4个时钟周期。
(2)滤波算法
环路滤波的基本思想是:判断该边界是图像的真实边界还是编码所形成的块效应边界;对真实边界不滤波,对伪边界根据像素穿越边界的渐变度和编码方式进行滤波;根据滤波强度,选择不同的滤波系数对边界两侧像素进行滤波操作。滤波强度Bs=0的边界将不会进行滤波,而滤波强度Bs不为0的边界,依赖于获取的量化参数α与β,进行阈值判断,对邻近的像素进行有条件的滤波。当滤波强度Bs不是0,并且下面3个条件成立时,才对邻近像素进行滤波。
直接计算α,β是非常困难,而且消耗了很多硬件资源,因此通过查找表(LUT)获取α,β的操作。像素的计算可以被分成下述两种类型:
(1)Bs=4
如果以下的两个条件成立,一个非常强的4抽头或5抽头滤波器将被用来对邻近像素进行滤波,修改像素p0,p1,p2。
否则,若式(2)中有一个不成立,将不会对p1与p2进行滤波,只会对p0进行弱强度的滤波。对于色度部分边界的滤波,如果式(2)成立,只会对p0与q0进行滤波。
(2)Bs=1~3
亮度像素p0与q0的计算如下:
而d[_]0是在裁减操作中被定义的:
式中:c0来自于c1,而c1是通过查找两维的LUT表获取的。
像素p1仅在式(3)成立的时候进行修改,同p0与q0修改的方式相同;而像素p2与q2对于滤波强度Bs不为4的情况下,不进行滤波。在色度分量进行滤波时,只有对p0与q0进行滤波,滤波的方式与亮度滤波的方式相同。
3 流水线滤波架构
3.1 流水线分析
流水线技术适合于连续的批处理任务,当一个N阶流水线被灌满以后,系统在一个周期内可以并行处理N个任务,由此提高了整组任务的处理速度并增大了系统吞吐能力。如果相邻的滤波操作没有数据竞争,并且所有的阶段都被很好地进行了平衡,则滤波过程能够被进行流水线操作化并可将速度提高N倍数。然而,如若存在竞争与冒险问题,则无法实现。此时的主要任务是如何均衡流水线的各个阶段,如何把总的操作尽可能平均的分配给不同的流水线阶段,如何避免或消除竞争与冒险,以便获得一个比较平衡畅顺的流水线架构。按照去块效应滤波器模块的实现算法,大多数的关键路径位于以下操作中。
(1)查找表操作:取得α,β,c1参数。α,β参数均需在查找表操作之前进行基于量化参数与片级偏移参数的计算中使用。当Bs=1,2,3时,为获取c1进行LUT操作,该操作比获取α,β的LUT操作大3倍。
(2)当Bs=4时,需用4或5抽头的滤波器进行滤波,原来的p,q像素值需要进行移位、相加等操作,以得到最后的结果。
3.2 流水线架构
基于上述分析,这里提出了5阶流水线以提高吞吐量,见图3。由于整个任务被分配到不同的阶段实现,降低滤波的平均时间。
4 阶流水线每个阶段的任务
阶流水线每个阶段的任务为:获取像素与滤波强度;阈值判断;预滤波;二次滤波;回写。操作类型转换与可重新配置路径设计:首先进行操作类型的变换,使用加法与移位操作硬件替换了原来所有的乘法与除法硬件。当Bs=4时,滤波被3,4,5抽头的滤波器执行,尽管应用不同抽头数目的滤波器,仍考虑硬件复用以及输入数据路径重新配置。由于设计中的表达式采用两输入加法,因而可以公用加法的中间结果。此外,通过重新配置在不同滤波抽头系数时的加法器的输入,达到共享资源的目的。同理,当Bs=1,2,3时,通过输入路径的重新配置,同样达到共享加法与减法器,达到共享资源的目的,资源使用前后对比见表1。
5 流水线竞争与混合滤波顺序
5.1 流水线竞争的原因
(1)数据竞争:当目的结果需要用作源操作数时;
(2)结构竞争:由于有限的存储器带宽,大量而频繁的像素访问需要以及存储器的低效率管理而引起;
(3)控制竞争:相邻边界的滤波是相对独立的,当一条边界进入它的流水线阶段时,它不能够停止,直到它的第5阶段新像素值回写存储器操作结束。控制竞争,由于分支语句或延迟等待引起的。
5.2 一种新颖的混合滤波顺序
传统的设计按照H.264/AVC标准使用了基本的顺序滤波,没有考虑到相邻滤波边界的数据重用与数据相互依赖性以及存储器的读与写访问延时,因此这里提出了新颖的滤波方法。新颖的滤波顺序仍然遵守先左后右,先上后下的原则,但是考虑了相邻边界的数据依赖性与重用性,解决了数据冒险与结构冒险问题,避免了流水线的延迟。滤波包括亮度部分与色度部分,共48条边界,滤波顺序按照如图4所示的从小到大的数字进行。
5.3 新颖的存储更新策略
考虑到外部存储器的带宽是32位的,为了配合这里提出的边界滤波顺序,避免由于存储器的带宽限制而引起的结构竞争从而导致流水线出现延迟,这里提出了新颖的存储器更新机制,即给不同的4×4宏块分配不同的时隙进行像素回写。
去块效应模块被分配在整个解码模块的最后一步实现,而其它的重建步骤、像帧内滤波模块、帧间滤波模块均以4×4宏块为基本单位来进行流水线处理,但是由于去块效应滤波模块中不同边界之间的数据依赖关系,因而它是以整个16×16宏块为基本单位进行滤波的。此外,只有整个16×16宏块的像素重建完毕之后.才可以进行该宏块的滤波,因而使用了2个SRAM,一个为像素重建提供像素;另一个为像素滤波提供像素,当一个宏块被处理完毕,两个SRAM交换角色,这样避免在两个SRAM之间传递数据导致的时间与功耗开销。使用仿真工具对整个去块效应顶层模块DF[_]top进行了仿真,仿真部分结果如图5所示。
6 结 语
使用硬件描述语言完成了设计,并在FPGA平台上得到验证。设计采用流水线技术,混合滤波方法,配合新颖的存储器更新机制等方案,实时滤波频率上限约为200 MHz,吞吐量为滤波每个16×16宏块需要198个时钟周期。使用HJTC,CMOS工艺,使用Syn-opsys Co.的DC工具进行综合,时序分析以及功耗分析,结论是时序满足收敛要求,并且完成单个宏块的滤波消耗的能量大约为2μW,功耗得到了很大的降低。
H.264/AVC标准具有一系列优于 MPEG4和H.263的新特性,在相同的重建图像质量下,H.264比H.263节约50%左右的码率。但是节约码率的代价是增加了算法复杂度。由于仅 用软件已经无法实现实时地解码过程。所以必须利用硬件加速,这正是本解码器设计的初衷。
虽然H.264相较同质量的H.263图像,码率节约 一半,但是由于本解码器的目标是解决H.264的高清图像(1080i)的解码工作,同时也要适用于普遍的视频外设,所以选用的接口既需要完成高速的码流 源文件的传输工作也要易于插拔。而USB接口恰好符合这两个条件。高质量的源码文件数据量较大,对传输接口要求较高。并且在FPGA的仿真环境下,USB 接口还要担负起向PC上位机回传解码结果的任务。这就要求传输速度至少要保证超越解码速度。和USB 1.1接口相比,USB 2.0接口的传输更加符合本设计的要求。
经过计算可知,传输接口需要至少30MB/s的传输速率,才能保证对1080i的图像进行解码。
器件选型
使用FPGA进行仿真和验证基本已成为IC设计过程中必不 可少的环节,尤其对于大规模的设计。本解码器IC的设计使用Virtex II FPGA作为仿真环境。对于本设计,利用FF1517 BGA封装的XC2V6000已经充分满足设计要求。在考虑设计成本的前提下,该款FPGA是相对高性价比的选择。
Cypress公司的EZ-USB FX2是一款集成了USB 2.0的微处理器,它集成了USB 2.0收发器、SIE(串行接口引擎)、增强的8051微控制器和可编程的外围接口。FX2的这种优化设计,几乎能达到56MB/s的数据传输率,而 USB 2.0允许的最大带宽是480Mb/s,即60MB/s。该芯片在对传输带宽影响很小的前提下,增加了许多集成的控制功能。GPIF和Slave FIFO模式为外部的FPGA、DSP和ATA等提供了简单和无缝的连接接口。
系统构架
本设计的主体如图1所示,在FPGA的仿真平台中, Virtex II包括了解码器主体和FPGA的接口模块。USB 2.0芯片68013A作为独立部分,负责FPGA和PC之间的USB数据传输。FPGA片外的SRAM与DRAM作为FPGA的扩展存储设备,用于存放 解码器所需的源码文件,解码后的文件以及解码器中用到的软件程序文件。 本设计中,解码器端具备强大的功能,内嵌有一个CPU。可以进行主动识别命令的功 能。所以PC端和解码器处于对等的地位。PC端的工作包括发送命令头,发送命令,发送码流,接收回传解码结果等;FPGA端的工作包括接收并识别命令头与 PC命令,接收并向SRAM和DRAM中存储码流,读取SRAM和DRAM中的解码结果并且回传给PC端。
USB 2.0芯片的工作方式及固件编写
1 芯片工作方式的确定
在设计中,存在两个过程涉及到大批量的数据文件传输:PC 向下传输源码文件,FPGA向上位PC传输解码结果文件。其对USB传输要求最高。如果当传输的源码文件无法适应解码速度时,会导致解码器停顿;如果当回 传解码结果滞后时,会造成未被传输的解码结果被覆盖。任何一种情况的出现,都将直接导致解码器工作失败。
在传输要求甚高的情况下,选用EZ-USB FX2提供的Slave FIFO的BULK(批量传输)模式,能很好的满足传输要求。在这种模式下,USB芯片内存单元中划分出6个端点(endpoint),以下简称为EP。 EP0和EP1被保留作为芯片配置FIFO。EP2、4、6、8可作为用户传输,并且4个EP采用双重FIFO(double FIFO)的方式组织构成。
举例来说,如图2所示,USB执行OUT传输,将 EP2端点设成512字节双重FIFO。在外部器件看来,USB端只要有1个512字节的FIFO为“半满”,就可以继续发送数据。当操作的FIFO写 “满”时,FX2自动将其转换到外部接口端,排除等候读取;并将USB接口队列中下一个为“空”的FIFO转移到USB接口上,供其继续写数据。外部接口 端与此类似,只要有1个FIFO为“半满”,就可以继续读取数据。当前操作的FIFO读“空”时,FX2自动将其转换到USB接口端,排除等候写并将外部 接口队列中下一个为“满”的FIFO转移到接口上,供外部器件使用。
为双重FIFO的工作过程。当一个512字节的 FIFO满时,FPGA可以取出里面的数据,同时PC可以向另一个FIFO写入数据(一组实箭头)。当一个512字节的FIFO空时,PC可以写入数据。 同时FPGA可以读取另一个仍然有数据的FIFO(一组虚箭头)。
双重EP运作模式
2 固件程序设计
在通过编写固件程序初始化USB设备过程中,以下重要的配置寄存器需要设置。
IFCONFIG;设置USB时钟由外部提供,并且选用Slave FIFO模式。
EPXCFG(X=2,4,6,8);配置4个EP(端点FIFO)的模式。
EPXFIFOCFG(X=2,4,6,8);配置4个EP的自动传输模式以及传输位宽。
其他一些寄存器,根据实际的需要可以单独配置。本设计中配置EP2用于传输命令头,EP4用于传输源码文件,EP6用于传输命令,EP8用于传输解码结果文件。
在完成固件程序的设计之后,可以利用FX2自带的Control Panel将固件程序的编译结果下载到68013A的芯片中,或者存放在外部的I2C中,以便下次复位时,芯片自己读取。
3 电路设计原理图
电路设计原理图
图4为本设计的电路设计原理图,原件按左起以及上起顺序分别为:CY7C68013A芯片、电源耦合电容组、USB 2.0标准接口、标准RS232串行口、外部晶体振荡器和HIN232串口芯片。本设计是按照这一电路原理图制作电路板图,完成USB 2.0的功能的。
FPGA上解码器与USB接口模块的设计
SLAVE FIFO的模式下,FPGA可以主动决定是否有必要读取USB内部FIFO中的数据,而不仅仅是被动的接受PC发送的数据。如图5所示,控制方式: SLOE、SLRD和SLWR作为EP的读写信号与使能控制信号。FIFOADR[1:0]作为4个EP的选择信号,即选择当前操作的目标EP。 PKTEND是FPGA主动命令USB芯片向上位PC发送数据的控制端。FLAGX(X=A,B,C,D)表示当前选中的FIFO的空满信息。FD(8位 或者16位)为双向的数据传输口。FPGA接口控制这些端口,达到对USB进行操作的目的。
解码器与USB接口
FPGA接口中,本设计还定义了一个深度为256,宽度为32位的FIFO(内部 FIFO)。原因在于:本设计中SRAM和DRAM部分要不断地被解码器调用,这样就导致存储单元被占用。此时USB是无法对存储单元操作的。所以在 FPGA接口中,先将多个USB传输的数据FD(8位或者16位)拼接成32位数据存入内部FIFO,当SRAM和DRAM空闲时,再向其传输。这样的处 理,使得USB传输不依赖于存储单元的工作状态,进一步提高了USB传输的速度,以满足传输的要求。
设计验证及结果分析
当开发完Windows操作系统下的USB驱动程序后,本设计成功的利用EZ- USB芯片与Virtex II FPGA完成了视频数据的传输工作。并且在FPGA工作的66MHz以下的频率时,完成了对H.264格式视频的实时传输、解码。传输速率的检测中, USB对大批量数据的传输可以达到33MB/s以上的速度,完全适应解码器的要求。
设计分析:本设计利用了两级的FIFO,充分的发挥了USB 2.0的速度优势。设计方案解除了传输与解码过程中的瓶颈,实现了无缝连接。不足之处是由于USB芯片的Slave FIFO模式限制,PC与解码器直接必须使用命令交互的方式进行通信,占用了一定的带宽。在命令过于频繁的状态下,效率不高,但对大批量数据传输影响很 小。
结束语
验证平台下成功,并且实际通过多种压缩率的源码文件测试,实现了平均33MB/s,最高40MB/s的速率。完成并且超过了设计要求。
1. OUT输出的交流电压取决于IN输入的交流电压.出厂是为220V;O/C是常开或常闭的继电器输出.接线后,就常开可以控制输出12V电压的开和关,通断.地址码是二进制,把第N路减一,转换成二进制即可。
2. 小于(100米)用RS-232相连;100~1000米以下则要用RS-422方式进行控制,必须用232转485的转接器.总线可负载最多64个解码器.与计算机相连,COM口连接3正,5负的发码线。
3. 解码器故障:1.是否电源没连接好;2.芯片是否压反或没压紧;3.地址码是否拨对;4.COM口是否屏蔽;5.协议设置是否正确。
4. 译码器是控制解码器和智能球等.它是连接收码线2正,5负的。
5. 如何接一体球:译码器的RS-232接主机的COM;T+接一体球的T-,T-接一体球的T+;,如果要连接好几个一体球,直接把译码器的RS-232并联起来就可以了.译码器的地址码是第N路减1的二进制.而一体球的地址码是第N路的二进制。
6. 当与主机相连接时用解码器3.5针相连接的发码线.当与一体球相连接时用译码器2.5针相连接的收码线。
7. 当解码器里的灯闪烁不正常时,可将电源断电,然后重新上电即可。
8. 当用422转接头时,注意正负极,如果转接头这边是接负,那么解码器那边就接正,如果转接头这边接正,那么解码器那边接负。