基于AHB接口的高性能LCD控制器IP设计
扫描二维码
随时随地手机看文章
本文将说明高性能LCD控制器IP的模块化设计概念(如图一)。FTLCDC200 通过SDRAM控制器跟SoC内部总线通信,控制器把图像数据从SDRAM读到TFT显示屏。CPU来控制整个系统的初始化与数据的流向,包括每个控制器内部的配置寄存器、更新SDRAM中帧缓存区的内容。通过传递辅助端口输出的数据流,这套系统还可以为电视相关的终端提供视频信号,这需要另外搭配TV 编码器与三通道视频DAC才能实现与TV的连接。
AHB 接口模块的设计概念
AHB 接口可以分为两个部分:一个是AHB 从接口,另一个是AHB 主接口。AHB 从 接口连接FTLCD200和AMBA AHB总线,并且允许系统中的AHB主接口的读写访问,此时AHB只能进行OK的响应和字(WORD)位宽的传输。AHB 主接口可以把帧缓冲区中的图像数据取出后放入到LCD控制器的FIFO中。AHB接口可以处理长度不确定的字符串,也能够在处理出错的时候发出主接口出错断言。当一个重试的应答收到后,第二次操作将开始被处理。
FIFO控制器和FIFO模块的设计概念
数据被AHB主接口从外都存储器读取后会被放入FIFO。除了YCbCr420模式下,其他模式都只需要一个控制器/FIFO。Y、Cb、Cr需要有三个单独的通道,因为每一个会放于不同的存储单元。FIFO为32-bit位宽,深度则是可配置的。FIFO的输入端连接在AHB 主接口的输出端;FIFO的输出端则被连接到了像素数据解包控制器。如果总线不能提供给像素流足够的带宽,那么一些图像就会出现失真现象。因此,FIFO控制器会提供一个称为“欠运行中断”的信号,来通知微控制器解决总线阻塞的问题。
图1 FTLCDC200的模组化方块图
像素数据解包
存储在FIFO中的数据都是32-bit,但可以按照不同的格式打包,如24位、16位、8位、4位、2位和1位,这取决于像素格式的设定。当处于YCbCr420 和YcbCr422模式,像素格式是预先设定的且不能修改。根据操作模式,像素数据可以被用来对调色板RAM区进行寻址,或者构成初始的色彩值而被直接应用到LCD的面板上。下面的表格有一个例子来描述数据包的格式。FLCD200 提供了1位, 2位, 4位, 8位, 16位, 和24位BPP(每像素比特数),并且支持以下几种格式:大端(也称为大尾)字节和大端像素、小端(也称为小尾)字节和大端像素、小端字节和小端像素。
数据模式
一、 原始的RGB模式
这种模式下有两个类型:16bpp和24bpp,每一种都适用于初始数据RGB模式。数据流不需要任何处理,但必须根据不同的LCD面板的分辨率进行排序。
二、 YCbCr422模式
该模式中只允许16bpp。
三、 YCbCr420模式
该模式中只允许8bpp。Y,Cb,Cr每个分量都被放到单独的存储单元中。这三个图像帧缓冲区的基地址在寄存器中都可以单独配置。当YCbCr420数据从各自的FIFO中被读出后,必须在行数据消失之前生成色度值。行缓冲器里面存储着以前的数据,经过垂直插值后,可以得到缺失的色度值。这样就可以把YCbCr420转换成YCbCr422,然后输出数据流,进行下一步的处理。
四、 RGB调色板模式
为了加强应用的灵活性,本控制器提供了“重新映射”的操作模式。该技术可以让我们能够在色彩的丰富度和存储器带宽两个选择之间进行切换。有四种类型可以选择:8、4、2、1bpp。调色板存储器里面存储着一个查找表,用来重新生成所需要的RGB各个分量。因为物理上它的容量为128x32位,因此调色板存储器最多可以保留256x16位的色彩值。从输入FIFO而来的像素数据被用来对一个独立的调色板单元进行寻址。1位像素数据可以寻址到最前端的两个存储空间,2位的像素数据可以寻址最前端的4个存储空间,4位的可以寻到最前端的16个存储空间。8位的可以寻遍整个256个存储空间。在16位和24位的模式下调色板存储器不被使用,通过配置可以把它去除以减小硬件开销。
颜色管理
颜色管理模块完成图像增强功能,它可以使图像看起来更清晰,该模块的主要功能如下:
1、 对比度控制
该功能可以使图像亮的区域更亮,暗的区域更暗。该模块通过选出屏幕上需要处理区域的颜色,然后进行对比度计算后,再显示在屏幕上,来实现整个对比度处理过程。
2、 亮度控制
整个屏幕对被调节得更亮或者更暗。
3、 锐化
锐化能够画面的边缘更加清晰。
4、 色调和饱和度
FTLCDC200能提供更大的灵活性,让用户根据自己的爱好来调节图像的色调和饱和度。
5、 伽玛校正
伽玛校正模块通过对伽玛曲线的修正来完成对TFT 液晶面板特性的补偿。三通道的伽玛校正能够对RGB的三种颜色单独进行调整。
6、 抖动控制
当像素为8位深度时,而每个颜色分量的解析度却有6位或者5位的时候,可配置的抖动控制可以使图像看起来更加平滑。
图像控制
一、 画中画(PIP)
FTLCDC200能够支持两个PIP画面。加上主画面,在一块显示面板上用户最多可以看到三个画面。PIP画面的尺寸最大能够放大到主画面的大小。一个4位的可配置透明度控制使得三个画面可以更加容易的重叠(overlay)。当透明功能被启用,直接存储器访问(DMA)必须读入所有需要进行重叠的像素。AHB的带宽就是三个画面所有像素的总和。当PIP启动,所有的画面只能为以下的某种格式:RGB888, RGB565, RGB555, RGB444, 或者YCbCr422.
FTLCDC200的带宽需求能够用以下的公式来计算(除了PIP之外的任何功能) :
水平输入分辨率x垂直输入分辨率x帧刷新率x bpp x 1.2 (仲裁) / 带宽当使用PIP功能, 带宽的评估如下:
imag0的带宽+image1的带宽+img2的带宽
二、 多画面(POP)
FTLCDC200能够合并四个四分之一大小的画面到一个屏幕上。其中每个画面的大小都被限制在四分之一屏幕大小。四画面的每一个图像通道,FTLCDC200都能够把原图像进行“1/2 X 1/2”的图像缩小。当POP模式启动后,所有的四个画面都只能是以下的某种格式:RGB888, RGB565, RGB555, RGB444或YCbCr422。事实上在PIP或POP模式下,所用到的图像格式必须是同一种, 而且必须是RGB888, RGB565, RGB555, RGB444或 YCbCr422里面的一种。
1.要实现PIP功能(2幅图),不能1幅RGB888,另外1幅是YCbCr422模式。
2.要实现PIP或POP模式,不能输入YUV420格式的图像。
复杂OSD模块的设计概念
一、 OSD ROM/RAM 接口
该模块包含了一些多路选择器,他会从OSD控制单元模块输出ROM/RAM的地址总线。目前OSD能够支持的字符存储容量为512个,每一个由12位组成。OSD的属性随机存储器也支持512个字符的容量,不同的是每一个由18位组成。
二、 OSD 控制单元
该模块是OSD的核心单元。它包含像素/行计数器、OSD窗口地址控制、两个有限状态机——用来控制对字符和属性存储器的访问。
三、 OSD 混效器
该模块的作用是计算OSD字符或者某些窗口特殊操作,譬如OSD窗口透明、字符缩放、字符加边框/阴影和窗口加边框/阴影特效。出现这些操作时,有标志位会注明当前使用的窗口、窗口特效、字符和字符特效中的哪些指令,OSD 混效器会根据这标志来选择合适的调色板。
四、 OSD 调色板
根据寄存器的设置,OSD 调色板模块输出经过映射后的前景色、背景色、窗口边框色、窗口阴影色、字符边框色、字符阴影色。
特别强调这里的简单?OSD 功能只支持一层重叠。复杂OSD 功能 可以支持四层OSD 并且可以配置层数。
Scalar模块的设计概念
图2为Scalar 模块的方块图,以下就其各个子模块作介绍, 这里的设计特点在只是用了(1024+2048)x24大小的行缓冲区, 大幅减小了IP的面积。
一、 滤波器
这是个128抽头的滤波器,使用线性插值算法来对水平方向的像素数据进行第一步的缩小操作,系数可选:1/2,1/3,1/4……. ,1/128。
二、 1024x24 行缓冲区
该行缓冲区来存储被滤波器处理过的一行数据。
三、 1024x24 行缓冲区控制器
该控制器控制着缓冲区数据的访问。缓冲区中被读出的数据会反馈到输入端口,跟第二行的像素数据进行线性插值,也就是垂直插值的处理。
四、 2048x24 行缓冲区
这个行缓冲区是一个乒乓结构的存储器,它由两个1024x24位的单端口SRAM组成。因为我们放大的处理是基于双线性算法,所以垂直放大系数被限制在2,乒乓结构可以提供同时进行读/写操作的机制,使得我们能够把行缓冲区存储器的大小压缩到仅仅一行像素数据的规模。
五、 2048x24 行缓冲区控制器
该控制器提供必需的地址线和控制信号给乒乓结构的行缓冲区,以确保RGB像素数据能够同时正确的被写入和读出。除了这个基本的控制功能以外,它也提供了一个可靠的外部LCD控制器访问接口。
六、 垂直Scalar滤波器
该垂直Scalar滤波器是2抽头,它执行一个“加-乘”混合计算(y[n] = a * x[n] + (1-a) * x[n-1])。x[n]是当前行的像素数据,x[n-1]是上一行的像素数据,y[n]是滤波器的输出。a和(1-a)都是滤波器因子。由于R/G/B各数据是独立进行处理的,所以每一种色彩像素数据处理需要两个8x9位的乘法器和一个17位的加法器。
七、 垂直Scalar系数产生器
该发生器分为放大系数产生器和缩小系数产生器。他们都会产生一个9位的系数,MSB代表整数部分,其余的都是小数部分。这个系数为输入图像垂直分辨率和输出图像垂直分辨率的比值。
八、 Scalar数据FIFO
该数据FIFO的存储深度为8,垂直缩放模块输入数据到FIFO,水平缩放模块读出数据用来处理后续的水平像素数据。
九、 水平Scalar滤波器
该滤波器也是2抽头,它执行一个“加-乘”混合计算(y[n] = a * x[n] + (1-a) * x[n-1]),x[n]是当前的像素数据,x[n-1]是上一个的像素数据,y[n]是滤波器的输出。a和(1-a)都是滤波器因子。由于R/G/B各数据是独立进行处理的,所以每一种色彩像素数据处理需要两个8x9位的乘法器和一个17位的加法器。
十、 水平Scalar系数发生器
该发生器分为放大系数产生器和缩小系数产生器。他们都会产生一个9位的系数,MSB代表整数部分,其余的都是小数部分。这个系数为输入图像水平分辨率和输出图像水平分辨率的比值。
Scalar的up scaling阶段能够任意的定量在1x1 和 2x2之间,也就是它scale up功能可以达到如1.5x1.8等。Scaling down分成两级,第一级可以按比例缩减1/2*1/2, 1/4*1/4, 1/8*1/8, 1/16*1/16, 1/32*1/32, 1/64*1/64或1/128*1/128;而第二级可以从1*1~1/2*1/2做任意比例的缩减动作,也就是第二级可以有小数点,不过最低只能到1/2*1/2。因此,可以由第一级+第二级来搭配产生所想要的缩减比例。
例如:1/2.5 * 1/4 => 第一级做1/2*1/2,然后第二级做4/5*1/2 就可以达到你所想要的scaling ratio。有关第二级scale down给个Scal_ver_num /Scal_hor_num的例子, 如果我们想要scale由 100x200 down to 90x160.
Scal_ver_num = [mod((ver_no_in+1)/ver_no_out)]x256/ver_no_out
Scal_hor_num = [mod((hor_no_in+1)/hor_no_out)]x256/hor_no_out
Scal_ver_num = mod[ (100) / 90 ] x 256 / 90 = 28.44 --> 28
Scal_hor_num = mod[ (200) / 160 ] x 256 / 90 = 113.77 --> 114
中断控制器
该控制器有四个内部中断源,AHB Master出错中断、FIFO欠载中断、垂直同步中断和帧基地址改变中断,这几个中断信号经过组合形成一个全局中断信号,只要这四个中断源中的任意一个出现中断,全局中断信号就会出现断言。这四个中断源可以通过寄存器的修改来开启和关闭
STN面板控制信号
以下是LCD控制器和STN面板的接口信号
* LC_DATA[7:0]:LCD数据总线,发送给STN面板上面需要被显示的像素数据。根据STN所选择的模式,数据直接加载到该总线上
* LC_VS(FLM):LCD的帧同步信号,表明了一个新的帧的开始。在一帧的最后一个行脉冲结束后,FLM 变为有效并一直保持到下一行脉冲,FLM才撤销断言,并保持无效直到下一帧。FLM是高电平有效还是低电平有效是可以通过软件配置的。
* LC_HS(LP):LCD的行同步信号,被用来锁存STN面板上的行数据。LP是高电平有效还是低电平有效是可以通过软件配置的。
* LC_DE(ACD):LCD数据使能信号。该信号可以配置成每一帧切换或者每隔N行切换。
* LC_PCLK:LCD输出的移位时钟,是让STN面板用来同步LCD输出的数据。LC_PCLK是高电平有效还是低电平有效是可以通过软件配置的。
STN面板的接口时序
LCD控制器通过LCD的数据总线持续的传送像素数据到LCD面板。总线的时序由LC_PCLK、LC_HS、LC_VS组成。LC_PCLK信号把像素数据打入到LCD面板内部的移位寄存器。LC_HS指示每一行的开始,LC_VS则指示帧的第一行的开始。本LCD控制器可以支持绝大部分的单色LCD屏。图3解释了1位、2位、4位、8位LCD数据总线的接口时序。LC_HS信号再加上LC_VS信号表明了当前帧第一行的结束。在真实显示行中插入哑元行可以调节帧率。用户可以自己配置哑元行的数量。
图3 STN在8位, 4位, 2位以及1位数据宽度的接口时序
LCD屏的宽度(PL)和高度(LF)寄存器里面定义了LCD面板的尺寸。LCD控制器将会以“LCD屏开始地址寄存器”(LCDImage0FrameBase)中的值为首地址来扫描显存,因此,被打上影音的区域将会最终显示在LCD面板上。
LCD虚拟页面宽度参数指定了最大显示页面宽度。通过修改LCDImage0FrameBase,可以使得真实显示的窗口大小和位置在虚拟页面边界的范围内变化。然后,对于编程人员来说,在软件设置定义显存扫描起地址的时候,是不能超多虚拟页面的高度和宽度,否则,屏幕上可能会有一些意想不到的景象。
这个IP在LCD屏的接口上还比一般的LCD控制器多了对串口RGB屏的支持,我们在FPGA开发板上就是使用AUO A036QN01串口RGB屏来验证。A036QN01的规格书上没有Dummy data(LCD Serial panel pixel Parameters: offset=0200H),但我们的design是有dummy data跟没有dummy data的可以支持的。
IP内部的接口时钟关系
以上就这个IP的原理与子模块作了充分的说明, 再接着介绍IP内部的接口时钟关系。
FTLCDC200包含了三个时钟域分别为HCLK, LC_SCALER_CLK以及LC_CLK。HCLK时钟使用于AHB接口而且这个时钟与AHB接口是一致的。AHB必须为SoC上的LCD控制器提供足够的带宽用以由帧缓存区捕获足够的数据。
LC_SCALER_CLK提供时钟给scaler模块同时对scaler模块也要足够快来处理数据。LC_CLK用于产生像素时钟。像素时钟(LC_PCLK是由LC_CLK产生并且除以1, 2, 3等等。
此外, 这三个时钟域必须按照下面的两个原则才能运行顺畅:
? 1. HCLK ≥ LC_SCALER_CLK ≥ LC_CLK (频率)
? 2. LC_SCALER ≥ HCLK/16 (频率)
LC_CLK的频率变化依靠LCD屏的选择与使用。使用这个IP在频率上必须根据所选用的LCD屏的规格,下面两个例子介绍选择时钟频率的方法
范例1.
假设输入的分辨率是640x480, 每个在帧缓存区内的像素是16-bpp, AHB总线的带宽是32 bits, LCD屏的分辨率是320x240而显示的帧刷新率是30帧每秒。
在这个范例, scaling-down功能必须打开并且操作在1/2x1/2的步骤。
HCLK必须大于640x480 (输入的分辨率) x 16 (bpp) x 30 (帧刷新率)/32 (总线带宽) = 4.6 MHz
LC_SCALER_CLK必须大于640x480 (最大的 {输入的分辨率, 输出的分辨率}) x 30 (帧刷新率) = 9.2 MHz
LC_CLK必须大于320x240 (输出的分辨率) x 30 (帧刷新率) x 1.2 (门廊的空白) = 2.8MHz
因此, 针对这个范例, 使用者能选择以下的两个条件
HCLK ≥ LC_SCALER_CLK ≥ 9.2 MHz
LC_CLK ≥ 2.8 MHz
范例2.
假设输入的分辨率是640x480, 每个在帧缓存区内的像素是16-bpp, AHB总线的带宽是32 bits, LCD屏的分辨率是1280x960而显示的帧刷新率是30帧每秒。
在这个范例, scaling-down功能必须打开并且操作在2x2的步骤。
HCLK必须大于640x480 (输入的分辨率) x 16 (bpp) x 30 (帧刷新率)/32 (总线带宽) = 4.6 MHz
LC_SCALER_CLK必须大于1280x960 (最大的{输入的分辨率, 输出的分辨率}) x 30(帧刷新率) = 36.8 MHz
LC_CLK必须大于1280x960 (输出的分辨率) x 30 (帧刷新率) x 1.2 (门廊的空白) = 44.2 MHz
因此, 针对这个范例, 使用者能选择以下的条件
HCLK ≥ LC_SCALER_CLK ≥ LC_CLK ≥ 44.2 MHz
在我们的FPGA上验证配置FTLCDC200以显示图象的参数条件如下
FTLCDC200 ngo 以45 MHz的综合条件来产生。
HCLK = 40 MHz
LC_CLK = 24 MHz
LC_SCALER_CLK = 24 MHz
如果有影像失真, 一般来说都是LC_CLK太快而违反了综合的条件,放慢LC_CLK的时钟就能解决问题。如果客户使用的LCD 屏最慢的时钟频率是21MHz (46.5 ns) ,然而, LC_CLK是24 MHz 以及 divNo配置为 3所以最终LC_CLK 输入LCD屏的时钟频率大约是8MHz, 这跟LCD屏的规格是不符的。