基于FPGA的视频颜色空间转换电路设计
本文作者:admin
点击:
2006-08-10 00:00
前言:
在视频图像处理的过程中为了保证实时性,对系统的处理速度要求很高。视频图像处理一般都是用数字信号处理器(Digital Signal Processor, DSP)来完成的。但采用多DSP或DSP阵列的方法使系统在成本、重量、功耗等方面都会快速升高。随着大规模可编程器件的发展,现代大容量高速度的FPGA以及相应的SOPC技术的出现,为图像处理提供了一种新的解决方案。用FPGA来实现图像处理可以很好的解决并行性和顺序性的矛盾,直至速度问题,而且其灵活的可配置特性,使得FPGA构成的图像处理系统非常易于修改,易于测试。
YCbCr和RGB是视频图像的两种色彩空间,YCbCr由于易于实现压缩、方便传输和处理,被广泛应用于广播电视系统以及计算机视频和图像处理中,可是现有的显示设备都采用RGB驱动,因此在应用中经常需要使用YCbCr与RGB彩色空间的相互变换。本文采用单片FPGA实现高速的YUV与RGB颜色空间的相互转换电路,运算速度达到了高清晰度电视HDTV的速率74.25MHz。
颜色空间转换原理
● RGB和YUV的相互关系
RGB 色彩空间,自然界中任何一种色光都可由红(R)、绿(G)、蓝(B)三基色按不同的比例混合而成,它们构成了一个三维的RGB矢量空间。任一种颜色和这3种颜色之间的的关系可用下面的式子来描述:任一颜色=R(红色光的百分比)+G(绿色光的百分比)+B(蓝色光的百分比)。R、G、B每个元素的范围从0到255(8bit),3个元素均为0时,产生黑色;均为255时产生白色。RGB颜色空间由于其设备的独立性,被广泛应用于计算机图形、成像系统和彩色电视中。
YCbCr也是一种色彩空间。其中Y指颜色的明亮度(Luminance),即图像的灰度值,是彩色作用于人眼引起的明亮程度的感觉,CbCr表示色度(Chrominance),反映颜色的类别,分别称为蓝色色度和红色色度。明亮度Y是通过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一起,而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异,而Cr则反映的RGB输入信号红色部分与RGB信号亮度值之间的差异。YcbCr有许多取样格式,如4:4:4,4:2:2,4:1:1和4:2:0,本文采用4:4:4取样格式。由于易于实现压缩、方便传输和处理,YCbCr被广泛应用于广播电视系统以及计算机视频和图像处理中,如JPEG、MPEG均采用此格式作为存储像素的格式。
RGB和YUV之间可以相互转化,它们的对应关系如下:
● RGB和YUV转换定点数的实现
在可编程逻辑电路中定点运算比较容易实现,因此RGB到YCbCr颜色空间的转换矩阵的系数可以通过有限字长的定点无符号二进制数来表示。转换矩阵的系数原来都是范围从-1到1的实数。采用宽度为n位的无符号二进制数表示转换系数的绝对值。设转换矩阵的某个系数为c,则其定点表示为c×2n的四舍五入取整数。把(1)(2)两式乘以28,就可以得到Y×28、Cb×28、Cr×28、R×28、G×28、B×28,根据得到的值,截去低8位即可完成RGB与YCbCr之间的相互转换。
系统设计
●系统框图
由于输入输出均为8位的二进制数,而输入量在做乘法、加法运算后的得到的是16位的二进制数,故在输出之前截去低8位,仅仅输出高8位即可得所需的8位输出。
●流水线结构设计
该设计的难点是保证运算速度要大于高清晰度电视HDTV的速率74.25MHZ。为了提高运算速度,可以采用流水线结构。流水线结构充分利用了硬件内部并行性,增加数据处理能力。这种流水线作业是在几个步骤中执行运算的功能单元的序列。每个功能单元接受输入,生成的输出则是缓冲器存储的输出。在流水线作业中,一级的输出变成下一级的输入,从而使所有各级的输入输出都是并行运行的。这种配置可以很大程度上提高运算速度。
实现流水线结构的方法很简单,只要在每个运算部件(包括乘法和加减法器)的输出以及系统的输入输出之间加上寄存器缓存即可。以YCbCr到RGB的转换为例(如图2所示),系统共需做9次乘法,6次加减法,根据FPGA可做并行运算的特点,可将系统分为9条流水线并行执行,每条流水线做一次减法(例[Y-16]),一次乘法(例[Y-16]×298),一次3个数的加法。这样,系统运算所需的时间即为一条流水线执行所需的时间。为了减小输入与输出之间组合逻辑电路的规模,提高系统时钟,在流水线的每次运算(加减法或乘法器)之后,加寄存器缓存。这样,从输入到输出只需一个时钟周期就可完成运算,但是由于加了3次寄存器缓存,所以要延迟3个周期才能得到结果。
●系统VHDL语言的实现
VHDL硬件描述语言可以采用自下而上的设计方法,首先写出系统常用的模块,例如乘法器,加法器,减法器,再在顶层的.bdf文件中调用已经写好的模块,并按照框图连线即可。由于加减法器的程序比较简单,在此就不再赘述。下面给出了乘法器的实体的原程序:
entity const_mult is
generic(cst_mult: integer:=66 --常数乘数
);
port(clock :in std_logic; --时钟
clockenable:in std_logic; --时钟使能
reset : in std_logic; --系统复位
color : in std_logic_vector(7 downto 0); --输入变量乘数
color_out: out std_logic_vector(15 downto 0) --乘法器输出
);
end const_mult;
architecture rtl of const_mult is
begin
process(clock,reset)
begin
if(reset='0') then
color_out<=(others=>'0');
elsif(clock'event and clock='1') then
if(clockenable='1') then
color_out<=conv_std_logic_vector(conv_unsigned(cst_mult,8)*unsigned(color),16);
end if;
end if;
end process;
end rtl;
顶层在调用乘法器模块的时候,只要根据框图中乘数系数的不同,给cst_mult赋不同的值即可。
系统仿真及性能分析
●最高时钟频率仿真
采用Altera的FPGA EPF10K10LC84-3 实现图1、2所示逻辑结构,通过MaxplusⅡ的utilities菜单的Analyze Timming选项可以知道系统可以达到的最大时钟为125MHz,超过了设计要求。
●提高系统速度的方法
在设计中如果所得到的时钟频率低于设计要求,就需要知道造成时钟频率不能提高的瓶颈,即需要知道是那条路径延迟最大,这时只需单击图3所示的List Paths按钮,即可得到系统寄存器和寄存器之间的延迟路径情况。提高速度的方法是确定最大延迟路径的位置,然后想办法减少该路径延迟。
改进设计的重点在于减小最大延迟路径的延迟时间。改进方法有:
(1) 把大的组合逻辑电路拆分为小的组合逻辑,在这些小的组合逻辑之间加寄存器缓存。
(2) 组合逻辑输出端该位寄存器缓存输出。
(3) 简化寄存器个数。
结语
随着集成电路技术的发展,FPGA因其灵活性与并行性,越来越多的在现代电子系统设计中使用。本文介绍的这一用FPGA实现高速颜色空间转换的实例,已通过下载验证,结果表明该设计是正确有效的。文中讨论的基于模块调用的从下而上的设计,以及提高系统速度的方法对于类似设计有一定的借鉴意义。