摘要:在设计嵌入式信息终端时,常常会遇到LCD控制器与LCD屏的控制时序不匹配的问题,使用可编程逻辑电路实现LCD显示屏与控制器之间的接口是一种有效的解决方案,在本文中使用CPLD实现了PXA255的LCD控制器RGB565(5b红,6b兰,5b绿)到24位RGB888(8b红,8b兰,8b绿)A06QU01彩屏的时序转换,并利用LCD屏内部集成的电源控制器实现了LCD背光及LCD偏置的电源产生器。
关键词:LCD控制时序,数字倍频,RGB565,RGB888, CPLD
Abstract: When perform a LCD display design, the timing between LCD controller and the LCD display always not match. It is possible to implement such interface circuit by means of CPLD. In this design a CPLD is used to act as the timing converter between PXA255’s RGB565 LCD controller and an AUO A06QU01 LCD display, LCD backlight and bias power supply also introduced use the in chip power source controller.
Key Word: LCD timing, digital multiple frequency, RGB565, RGB888, CPLD
引言
在嵌入式设计中常常会使用LCD屏,现在常用的屏大部分都是高性能的TFT真彩屏,因为LCD屏的生产厂商很多,标准也不统一,LCD屏往往不能与LCD控制器无粘合连接。所以在使用LCD屏时,厂家还会推荐使用其专为LCD屏设计的时序芯片。例如Sharp 的LCD LQ035Q7DB02 配套的控制器为LZ9FC22,日本的LCD屏是16位色的,本身价格很高,控制器也贵得离谱,性能却不见得好。所以采用高性能的24位真彩色的屏更加理想,但接口逻辑需要重新设计。
RGB565到RGB888的转换
以由AUO生产和A06QU01[1]为例,这是一款24位的TFT真彩屏,分辨率为320X240,每个像素由RGB888表示,其控制时序由图1所示,LCD 要求的时序由帧同步(VSYNC),行同步(HSYSNC),比特时钟(DCLK)及数据(Data[0:7])构成,帧同步和行同步指示每一帧和每一行的开始,对于A06QU01每一个帧将有240行,每一行有320个像素,每个像素由依次产生的8b红,8b绿,8b兰,(R1,G2,B3,R4,G5,B6……)所以称为RGB888。
以PXA25x为代表的嵌入式处理器拥有一个LCD控制器,我们可以将这个控制器配置为最高16位的TFT LCD屏控制器,其控制时序由图1所示,LCD 要求的时序由帧同步(VSYNC),行同步(HSYSNC),点时钟(PCLK)及数据(Data[0:15])构成,帧同步和行同步指示每一帧和每一行的开始,对于A06QU01每一个帧将有240行,每一行有320个像素,每个像素由5b红,6b绿,5b兰构成16位数据,因为人眼对绿色更敏感所以用6b表示绿色,称为RGB565。
将RGB565与RGB888接口要解决3个问题
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1、 比特时钟3倍频
LCD控制器每一个像素用一个时钟一次送出16b数据,而LCD屏每一个像素需要3个时钟,每次8b获得。这样就需要产生一个3倍于控制器时钟的时钟。通常情况下,使用锁相环可以实现均匀的3倍频,在这个设计中,使用锁相环显得过于复杂,并且不容易解决3倍频时钟与RGB数据的同步问题,所以使用了数字的办法实现非均匀3倍频。具体方案是:使用一个大于6小于7倍于LCD屏比特时钟作为CPLD的主控制时钟,LCD屏的时钟大约为21M,所以选择CPLD的主控时钟为48M,
2、 如图1所示,pclk为控制器输出的点时钟,和pdata为RBG565数据。Pclkout和pdataout是送往LCD的信号。在pclk上升沿将pdata存入缓冲器pdatabuf,并将内部状态位datavalid置位,在x7pclk的上升沿,如果检测到datavalid为高,则使pclkout为低,将缓冲器中的数据取出高5位红色信号,补零后送到pdataout,并将datavalid置为低。使用这种方法依次将绿色及兰色信号送出。完成RGB555到RGB888的转换。从图中可以看出,虽然数字3倍频信号pclkout不是均匀的,但只要其时序能满足LCD屏要求的占空比40%~60%就不会影响功能。同步信号可以由软件驱动程序编程产生适合的极性和宽度的脉冲信号。
LCD背光及LCD偏置的电源产生器
LCD屏需要使用LED作为背光,以及-10V的偏置电压,本文使用的LED屏是2路各4个白光LED串联,每路需要的供电电压约为10V,电流20mA。这些电源利用LCD控制器内部的电源控制器实现。如图2所示,由L4 、Q1构成升压型DC-DC转换器,Q1由脉冲宽度调制信号控制,经过D4,C19和C39整流滤波后得到大约10V的正电压,经过C20隔直流后再整流滤波得到-10V的LCD偏置电压。注意电容C42的极性。LED电流限制使用图3所示电路,Q3和Q5为LED驱动管,Q2为电流采样管。这三个三极管的基级相连,因而基极电压相等,并且基极到射极电压近似相等,于是R42、R43、R40上的电压相等,这样R43、R42上的电流被转换为R40上的反馈电压,送到LCD电源控制器的反馈端,控制器自动调整LCD_供电电压,实现通过LED的电流稳定在22mA。 。
调试
RGB565到RGB888转换器使用XC9536实现。使用ISE WEBPACK开发。如果连接无误,上电后,加载带有TFT屏驱动的Linux内核,一般都能看到企鹅图案,只是可能位置和色彩不太对,这时需要根据实际看到的图像调整LCD驱动程序LCD控制寄存器中的时序设置,实现正确的显示。
结论
由于接口标准不统一,将一个新型号的LCD屏接口到信息终端会比较困难,需要仔细分析LCD控制器及LCD屏的时序和驱动方式,使用低价可编程逻辑电路,可以实现接口的时序转换。LCD屏需要的背光电源及偏置电源可以按本文所述方法利用LCD屏内部集成的电源控制器实现,也可以外接专用的LCD背光电源和LCD偏置。
参考文献:
1、 AUO 友达光电 'Product Specification 3.6〞Color TFT-LCD Module' MODEL NAME: A036QN01 V0 2004 AU p18
2、 Intel PXA255 Processor Design Guide, March 2003 p3-5
图2 背光驱动电源及LCD偏置电源产生器
图3 LED背光电流限制
附录:转换器编码
//--------------------------------------------------------------------------------------------------
// Title : lcddrv1
// Design : lcd
// Author : Luohao
// Company : Sinovee Microsystems
// File : lcddrv1.v
// Generated : Fri Feb 18 15:20:16 2005
//-------------------------------------------------------------------------------------------------
// Description :
// for xscale pxa255 lcd driver to auo a036qn01
//-------------------------------------------------------------------------------------------------
`timescale 1ps / 1ps
module lcddrv1 ( x7pclk ,pdataout ,pclkout ,pdata ,pclk ,vsyncout ,vsync ,hsyncout ,hsync );
input x7pclk ;
wire x7pclk ;
input [15:0] pdata ;
wire [15:0] pdata ;
input pclk ;
wire pclk ;
input vsync ;
wire vsync ;
input hsync ;
wire hsync ;
output [7:0] pdataout ;
reg [7:0] pdataout ;
output pclkout ;
reg pclkout ;
output vsyncout ;
wire vsyncout ;
output hsyncout ;
wire hsyncout ;
reg [15:0] pdatabuf; // buffer to save the input
reg datavalid; // flag to convert the data
reg rstdatavalid;
reg [2:0] outstate;
always @ (posedge pclk)
begin
pdatabuf = pdata;
end
// to get the data valide flag
always @(posedge pclk or posedge rstdatavalid)
begin
if (rstdatavalid)
datavalid = 1'b0;
else
datavalid = 1'b1;
end
always @(posedge x7pclk)
begin//red
if(datavalid)
begin
rstdatavalid = 1'b1;
outstate = 3'b000;
pclkout = 1'b0;
pdataout = {pdatabuf[15:11],3'b000};
end
//red
else
begin
case(outstate)
3'b000:
begin
outstate = 3'b001;
pclkout = 1'b1;
end
//green
3'b001:
begin
outstate = 3'b010;
pclkout = 1'b0;
pdataout = {pdatabuf[10:5],2'b00};
end
3'b010:
begin
outstate = 3'b011;
pclkout = 1'b1;
end
//blue
3'b011:
begin
outstate = 3'b100;
pclkout = 1'b0;
pdataout = {pdatabuf[4:0],3'b000};
end
3'b100:
begin
rstdatavalid = 1'b0; // data is not valid any more
outstate = 3'b101;
pclkout = 1'b1;
end
default:rstdatavalid = 1'b0; // data is not valid any more
endcase;
end
end
assign hsyncout = hsync;
assign vsyncout = vsync;
endmodule
southcreek 2006-10-26 11:06
原文在刊物上不全,
这是最全的.