当前位置:首页 > 心得体会 > 利用智原科技A320 SoC 平台开发2D图像加速器(上) 利用人的慧打造物的智
 

利用智原科技A320 SoC 平台开发2D图像加速器(上) 利用人的慧打造物的智

发布时间:2019-02-16 04:46:22 影响了:

   市面上的机顶盒, GPS,手机或PMP的多媒体主控芯片,很多都要求具有2D图像显示功能。利用智原A320 SoC 平台开发2D图像加速器,可以加速2D图形显示效果。本文首先说明2D图像加速器的功能要求和作用;然后在介绍FPGA测试方式时也对智原科技所提供给的A320 SoC 平台,做一些说明。
  
  12D图像加速器的
  功能要求和作用介绍
  
   全硬件2D图形加速引擎包含完整的BitBLt功能,影像混合调整(alpha-blending)、图形扩大缩小与旋转功能。除此之外,更针对GPS的特殊应用而设计了画线(line draw),字型反锯齿(text anti-aliasing)与渐层着色(Gradient fill),而且可以针对每一个像素做处理。2D 图像加速器包含了一个32比特 BLT引擎以及Line Draw引擎用以提供针对许多视窗操作所需要的硬件加速。微软视窗定义了像素(pixel)是最小可寻址的屏幕元素,而线(line)跟图像都是由像素利用种种的变化组成的。像素是所有计算机图像的基本元素,它也是计算机显示器上的一点亮光,用来展现出不同的颜色。2D图像引擎是用来减轻CPU在图像处理上过多的负担,以及在像素数据搬动和画线时加速图形的处理,同时也加快了计算图形时的逻辑操作以提升SoC整体的性能。
   2D图像加速器的功能定义如下:
   ● AHB 主/从 接口完全符合ARM AMBA 2.0规范
   ● 在UMC 0.13工艺且在内置FIFO的条件下,AHB总线速度高达200MHz以上
   ● 2D图像加速器内核的同步时钟操作频率在83MHz
   ● 实时显示支持最大图像分辨率高达1024 x 768,其中分辨率是指像素在显示器上的行与列的数目。
   ● 支持标准微软256三元光栅操作码(ternary raster operation codes - ROPs)
   ● 支持针对来源(source)/目的(destination)RGB空间alpha-blending(按照“Alpha”混合向量的值来混合源像素和目的像素)的图像覆盖,让2D对象产生透明感的技术,追求透明光影效果
   ● 支持在BLTs 和Bresenham 画线的透明以及剪辑(Clip)的功能,Bresenham画线算法通过采用运行速度快的加减和移位运算来完成画线。
   ● 支持RGB-565, RGB-888, ARGB-1555, ARGB-8888等格式如下图1。
  
   2D图像加速器的模块图如图2所示,加速器是基于一个AHB 主以及一个AHB 从接口的AHB总线,未来在FPGA开发板上用来与A320上的AHB 连接器进行结接。我们就AHB总线进行一个粗略的带宽估算:
   针对800X600而且格式为ARGB-8888 (4字节/像素)的图片:
  
   800*600*2*30*3*(1/0.6)*4 = 144M *4 =576 (MB/秒)
   => 也就是说SDRAM 时钟速度至少要到144MHz. 这个速度要求建议SDR SDRAM控制器在0.13um或更先进工艺实现, 或者是DDR SDRAM控制器在0.18um或更先进工艺实现。
   解释: “2” 是针对较大的BG所增加的分辨率因数(通常用在画制背景图)。
   “30” 代表30 帧/秒实时显示的要求。
   “3” 意谓在正常的图形描绘2-读和1-写的时候。
   “0.6” 是指总线效率因数, 考虑到DRAM反应时间(latency)和AHB总线仲裁器(arbiter)所造成的延迟。
   2D图像加速器中会提供某些功能如ROPs, Line drawing, Tranpancy, Alpha blending等等以达到图形描绘 (Rendering)的目的, 模块的流水线示意图如图3所示。
  
   1.1 数据块传送(BitBLt)
   可以把整个视频显示器看作是一幅大位图(bitmap)。在屏幕上见到的像素由储存在视频显示卡上内存中的位置来描述。任何视频显示的矩形区域也都是一个位图,其大小是它所包含的行列数目。将图像从视频显示的一个区域复制到另一个区域,这个是由强大的BitBLt函数来完成的。理解图像最重要的一点是,图像总是矩形的。这不只是方便了人们的理解,其原因是底层的技术。所有的现代显示卡都内置了硬件,可以非常高效地把像素块从内存的一个地方复制到另一个地方。假定像素块表示一个矩形区域,这个硬件加速操作可以虚拟为一个操作,而且执行速度非常快。实际上,这是现代高性能图像的关键。这个操作称为位图块传输(或者BitBLt)。
  BitBLt是从实际视频显示内存传输图像,而不是从系统菜单图标的其它图像传输。如果移动BitBLt窗口以使部分系统菜单图标移出屏幕,然后调整BitBLt窗口的尺寸使其重画,这时将发现BitBLt显示区域中显示的是菜单图示的一部分。BitBLt函数不再存取整个图像。
   在2D计算机图形处理, BitBLt引用DMA对在相同或不同的内存位置上的像素数据作数据块传送。BitBLt命令实现了被微软所定义的所有的256光栅操作(ROPs).
   这些三种光栅操作码定义BitBLt如何在逻辑上从来源(source)操作数, 模式(pattern) 操作数, 以及目的(destination) 操作数进行比特的运算。光栅操作总是在BitBLt以及必须被使用者加载一个适当的值的时候起作用的。
  并不是每一种ROP码都要用到全部3种原始数据,有的甚至连1种也用不到,例如全黑或者全白的ROP码。块传送函数使用的ROP码总共有256种,它们是3种原始数据进行不同位操作(取反、与、或和异或)的组合,但有些ROP码对应的操作结果实在是太难想象了,比如ROP码0e20746对应的操作是((目标像素 xor 画刷) and 源像素) xor 目标像素),凭这个算式的确比较难以想象最后得到的位图是什么样子的。在实际使用中很多算法组合也并不是那么有用,所以微软视窗只对15种最常用的ROP码定义了预定义的助记代码,
  如表1所示,对于这些ROP码,在程序中可以直接使用助记码,对于表中没有列出的ROP码,可以直接使用16进制数值。
  
  BitBLt函数的用法是:
   invoke BitBLt,hDcDest,destX,destY,dwWidth,dwHeigt,
   hDcSrc,srcX,srcY,dwROP
  这个函数将源hDcSrc中以(srcX,srcY)为左上角的一个矩形区域传送到目标hDcDest中以(destX,destY)为左上角的地方去,如图四所示,数据块传送将相同大小的矩形内的像素从来源到目的,在复制时可以使用StretchBlt函数拉伸或者压缩图像尺寸。矩形的宽度为dwWidth,高度为dwHeight,当然目标DC中的最后结果是由dwROP中的ROP码定义的源、目标和画刷三者数据的组合。
  灵活使用ROP码可以实现很多的功能,比如在一个背景图片上叠加一个非矩形的位图,游戏程序中人物在背景上面的移动就是这样的一个例子。
  
   BitBLt函数的最后一个参数指定了一个光栅操作(ROP),它明确定义了如何将来源数据、目的数据和模式(由现在选出的刷子画笔定义)的位组合去形成一个目标文件。因为一个位图只是一个位值的集合,光栅操作(ROP)只是一个在比特操作的布尔等式。相应使用的设备,位图中的代表不同的事物。
   ● 在多色设备上,每个象素由一个位集合代表,他们要么形成一个指向颜色的索引,要么直接代表一种颜色。
   ● 在单色设备上,每个象素由一个位来代表,0表示黑色而1代表白色。
   BitBLt 操作被用于各种各样的的功能如下列所示:
   ● 矩形的块像素在内存不同位置间的运动。
   ● 矩形块中单一颜色(solid color), 单模式(mono pattern)或颜色模式(color pattern)的图形描绘。
   ● 256 ROP逻辑操作的履行。
   ● 在所有BitBLt的操作期间内部或外部的剪辑。
   BitBLt操作直接的加速了在显示内存或帧缓冲(frame buffer)之间的2D 像素数据传送。帧缓冲用于光栅扫描系统(Raster Scan System)中来储存像素的亮度(Intensity),屏幕内容的刷新也是靠帧缓冲内所储存的信息。我们可以把帧缓冲当作是一个二维阵列,在单色显示器中,每一个像素在帧缓冲内就是一个比特来实现。
   一般来说, BitBLt 命令在DMA矩形的块搬移期间,针对所有256个可能的ROPs,操作在三个操作数: 模式, 来源和目的。 当它是彩色的数据或当它是单色数据但可能来自内部模式掩模(pattern mask)寄存器时,8×8模式操作数可能已经存在于显示内存。来源操作数是彩色数据而且存在于显示内存。
   目的操作数通常存在于显示内存。输出结果,也就是目的数据由BitBLt所描绘通常被写回相同的显示内存, 也就是所谓的read-modify-write 操作,图五表示RGB 数据格式以及BitBLt操作。
   这里提到的彩色数据在计算机图形学里就是红,绿以及蓝等三原色。在彩色系统里, 每个在帧缓冲的像素都由RGB三个一组的值来表示,对VGA显示器这种低分辨率的系统, 彩色分辨率通常用8个比特来代表,8比特系统在任何特定的时间能够代表256种颜色。现在的系统大都是24比特(各是8比特给红,绿以及蓝色)或更高的分辨率,24比特系统能立刻显示16个百万的颜色。有时我们加入一个额外的8比特称为alpha通道,我们在后面会提到。
  
   图形处理的过程会需要大量的存储器存取的动作如帧缓冲的存取,存储器如果使用外部的SDRAM会导致系统效率的大大降低。但如果芯片内部的SRAM没有节制会造成芯片成本过高,而且在不进行图形处理时, 大量的SRAM因没有使用到而被闲置。所以我们在设计的时候可以想办法让其它不同的硬件加速设计如MPEG4或H.264解码器能够共享这些SRAM。
  
   DMA在这里可以大量减轻CPU的负担, 主要负责在内存间搬移画面的工作。加速器不需要帧缓冲,它将一个帧分成每16像素一个区块,当命令一下达,DMA会自己去算地址抓数据,然后处理完再放回外部内存,直到整个帧做完就会发中断通知用户。图6说明命令剖析器(Command Parser), BitBLt, LineDraw以及DMA控制器之间的数据流方向。图7画出BitBLt DMA读请求的时序图,当读请求BitBLt_request信号与DMA数据准备完毕dma_drdy信号先后拉高,DMA 爆发(burst)数据就一笔一笔的写进来了。
  
   1.2 模式BLT
   模式BLT用于加速利用任意大小的一块单色或彩色模式重复的填充一块区域, 而256 ROP中的任何一个如果需要都会被包括进来。模式的大小是8×8像素,以便和微软视窗兼容。所有的模式始终排列对齐显示内存的上-左角落。单色模式是由内部寄存器生成, 而彩色模式也必须对齐显示内存或帧缓冲的一个边界。
  
   8×8 模式可以是彩色或单色。如果是彩色的,主机必须预先准备好想得到的模式以线性的地址排列到帧缓冲上的离屏(off-screen)存储器。当模式BitBLt执行时, 我们的加速器从屏幕外存储器取来相应的行(row)模式然后重复地拷贝到目的的区域。
   举个例子, 单色模式BitBLt,如图8所示。
  
   1.3 颜色/字形扩展BLT
   单色到彩色的转换。
   透明仿真也牵涉到基于微软视窗的单色位图到彩色位图的转换机制,反之亦然。基于微软视窗的文本前景色和背景色的概念被用于在两种格式之间进行转换。在对一彩色目标文件进行位传递操作的时候,一个单色的源位图(和/或当可应用时一个画刷)在实际的光栅操作(ROP)中在这一位上实现之前被转换成背景色。相反的,当目标文件是单色时,微软视窗把彩色源转换成单色。在这种情况下,彩色位图中所有和背景色一致的象素都变成1,其它的象素都被转换成0。因为下面所要涉及到的例子都使用单色屏蔽,所以对一个应用程序而言,在执行块操作之前正确地设置背景色和前景色是非常重要的。
   来源或模式都能是单色的,BLT引擎具有能力利用所谓“颜色扩展(color expansion)”的方法,将单色图形数据转换为彩色后为图形数据块着色。因为目的通常是在帧缓冲上一部分同屏(on-screen)的一个特定区域,假定任何的像素数据已经在目的将有适当的色彩深度。当模式是单色的,使用BitBLt 命令。当来源是单色的,使用“颜色扩展“命令。这里所提到的on screen存储器是指LCD控制器内的帧缓冲, 通常在内存空间0x, off screen 存储器的资料一般不放到在LCD上头。
  
   在下了颜色/字形扩展命令的时候,软件程序员可能首先写单色的来源位图到帧缓冲的离屏存储器,然后提出一个颜色/字形扩展命令。在这种BLT,图像加速器由帧缓冲上的离屏存储器取来单色的来源数据,扩张成彩色像素,然后将他们写到想得到的目的或目标区域。所有在来源位图将被扩展到一个前景颜色的像素,而所有的零不是扩展成一个背景色的像素就是成了透明的。
  
   1.4 透明的(Transparent) BLT
   位图透明性一种处理,这种处理通常指的是取出一幅位图,并使位图中的一种颜色变为透明,从而当位图被块传递到屏幕时,目标文件可以通过位图的透明色被看见。一个应用程序可以通过构造一个合适的屏蔽和使用在前面“真正的屏蔽方法”和“使源文件变黑的方法”中描述过的屏蔽技术来模仿这种操作。下面描述了如何为不能执行透明块传递的显示设备模仿位图透明性构造一个屏蔽。
   从彩色位图中构造一个单色屏蔽相当容易,因为位块传递的内置彩色单色转换自动完成所有这些工作。目标是一个所有不透明元素都设置为0和所有透明元素都设置为1的屏蔽。把背景色设置为透明色恰好做到了这一点。没有必要设置文本前景色因为他不能用于彩色单色转换(所以的非背景色素都被设置成0),下面的代码完成了这项工作:
  SetBkColor(hdcSrc, rgbTransparent);
  BitBLt(hdcMask, 0, 0, dx, dy, hdcSrc, x0, y0, SRCCOPY);
   代码构造了一个源文件相当于透明色时为1和其它地方为0的屏蔽。这复制了上面使用过的屏蔽。
   在一个BLT操作之内, 某一个目的的区域可以成为透明的虽然其余的区域是不透明的(opaque)。单色的透明和有色彩的透明两种都支持。
   如果是单色透明的情形,单色的来源或单色的模式位图数据都可以利用全部被扩展成一个前景色的像素和所有的零成为透明来控制透明度。
   如果是单色模式的情形,主机首先写入想得到的单色模式到内部的8字节模式寄存器。图像加速器接着重复拷贝到目的区域, 利用所有在模式内的都被扩展成一个前景色的像素而所有的零不是被扩展成一个背景色的像素就是成透明了。
   如果是单色来源的情形,我们称之为颜色/字形扩展BLT操作,软件程序员可以先写入单色位图到帧缓冲内的离屏存储器,然后提出一个颜色扩展命令。图像加速器由帧缓冲内的离屏存储器取来单色来源数据,扩展到像素,然后将他们写入所想要的目的或目标区域。所有在来源的将被扩展到一个前景色的像素而所有的零不是被扩展成一个背景色的像素就是成透明了。
   如果是色彩透明度的情形, 来源透明度和目的透明度都被支持, 但只有唯一一个色彩在一个图形描绘的时间上生效。使用者应该要定义透明色彩钥匙的范围(上界和下界) 以及配置“overwrite”或 “do_not_overwrite”等设定在色彩透明BLT期间来控制写回到背景目的。
  
   1.5Bresenham Line Draw 算法
   坐标是一组数字用来描述一条线, 或一个球体表面上点对点的关系。最常用来绘制二维或三维数据的坐标系统是笛卡尔坐标系统。在这套系统,每个像素能被唯一地经由自身的(x,y)
   坐标被辨认。Bresenham line drawing算法利用屏的坐标(x1, y1)到(x2, y2)来画一个像素宽的,实心的或字体(材质) 的线。要画一条实线,前景颜色用来指定线的颜色。要画一条样式(style)线, 一条24比特的线样式用于指定线的模式,而所有相同样式都被展开成前景颜色的一个像素,所有的零也被展开成背景颜色的一个像素或是透明。
   已知的两个端点(Ax, Ay)和(Bx, By)以及作为起点的( x(k), y(k) ),这完全是任意的选择。从起点开始到线上的下一个像素我们有八种可能的选择,我们需要隔离这八种选择到唯二。如果我们限制斜率 (0>8)) | (GMask & (((*source & GMask) * *alpha + (*dest & GMask) * ialpha) >>8)) | (BMask & (((*source & BMask) * *alpha + (*dest & BMask) * ialpha) >>8));
   在我们设计的角度来思考,Alpha blending包括结合来源位图与目的位图利用更早的计算alpha通道的成分来创建透明度。Alpha blending用来作为绘制覆盖图(overlaying), 通常覆盖图的两个8比特alpha深度混和因数是必要的。
   假设对来源像素指定8比特 alpha值Ks, 而相对指定Kd为目标像素的8比特alpha 值, 通常Ks + Kd 等于255.
   blending方程式为:
   [Ps × Ks + Pd × Kd]/255, 这里的Ps 代表来源像素而Pd 代表目标像素。
  如同Microsoft GDI BLENDFUNCTION所定义的,依赖SourceConstantAlpha和AlphaFormat的设定为何,有很多不同的方程式应该被遵循。
   SourceConstantAlpha值是代表一个alpha透明度值被用于整个来源位图。SourceConstantAlpha 值是结合来源位图的任意per-pixel alpha 值。如果你设置 SourceConstantAlpha 为0, 这是假定你的图像是透明的。当你只想要使用per-pixel alpha值可以设置 SourceConstantAlpha值为 255 (不透明物)。

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3