《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > 基于FPGA的LCD&VGA控制器设计

基于FPGA的LCD&VGA控制器设计

2008-11-05
作者:朱耀东 经亚枝 张焕春

    摘  要: 介绍了基于FPGA的图形式LCD&VGA控制器的设计,详细讨论了用VHDL设计行场扫描时序的方法,这种设计方法" title="设计方法">设计方法稍作改动便可产生任意行场扫描时序,具有很好的可重用性。该控制器已成功地在某型飞机座舱图形显示系统" title="显示系统">显示系统中使用。 

    关键词: 仪表装置  LCD  VHDL  FPGA  VGA

 

    飞机座舱图形显示系统已发展到第六代,即采用有源矩阵彩色液晶显示器AMLCD(Active Matrix Liquid Crystal Display)。当前高分辨率的军用AMLCD显示模块" title="显示模块">显示模块还只能依靠进口,且控制电路板须安装在该显示模块提供的机箱内。这种安装方式对AMLCD控制电路板的尺寸要求高,要求尽可能减少所设计电路板的尺寸。在笔者设计的新一代飞机座舱图形显示系统中使用了大规模现场可编程门阵列FPGA(Field Programmable Gate Array),这种设计方式可以将以前需要多块集成芯片的电路设计到一块大规模可编程逻辑器件中,大大减少了电路板的尺寸,增强了系统的可靠性和设计的灵活性。本文详细介绍了已在实际项目中应用的基于FPGA的图形式AMLCD控制器设计,这种设计方法稍作修改即可应用于常见VGA视频接口电路的设计。 

1 图形显示系统简介

    图1是飞机座舱图形显示系统结构框图。图中处理器采用AD公司的ADSP21061芯片,AMLCD采用Korry公司的KDM710全彩色液晶显示模块,该模块为5×5英寸、600×600分辨率彩色液晶显示模块,24位数字RGB输入。两个帧存A和B采用IDT公司的71V424高速异步静态RAM,系统采用两个帧存轮流操作的方法:当DSP向其中一个帧存写象素时,由FPGA构成的帧存控制器将另一个帧存中的象素顺序读出送给AMLCD,反之亦然。图形显示系统通过IDT公司的71V04双口RAM接收主机的显示信息。图1中的帧存控制器和视频控制器由Xilinx公司的SpartanII芯片XC2S50实现。 

 

 

2 KMD710显示模块 

    如图1所示,美国Korry公司提供的KDM710全彩色液晶显示模块接口信号主要有如下几组:3个8位RGB数字信号、同步信号" title="同步信号">同步信号数据使能信号DATA_EN和点时钟输入DCLK。根据AMLCD数据手册所要求的时序,确定扫描时序和相应的时序参数如图2所示。一般,图形终端显示器扫描制式与广播电视的标准有点不同,须根据显示模块所提供的时间要求来确定扫描时序,其中的行场同步的前后肩,可以根据需要进行微调,一般为了防止每行的第一个象素丢失,要求行同步的后肩C与行同步脉冲宽B尽量相等。图2中的点时钟为20MHz,行周期为650个时钟周期,场周期为615个行周期(场频为50Hz)。 

 

 

3 LCD&VGA控制器设计 

    设计行场扫描时序,一般有两种方式:查找表" title="查找表">查找表方式和编程逻辑方式。查找表方式主要由存储芯片构成,如SRAM、EPROM、PORM等。使用时,先根据所要产生的时序在存储单元写入相应的数值,查表时再从表内读出对应存储单元的数值,以形成扫描时序。扫描时序查找表分为行扫描时序查找表和场扫描时序查找表。场扫描时序查找表的输入时钟由行同步脉冲提供。用查找表形成时序的方法存在体积大、计算烦琐的缺点。随着大规模逻辑芯片的出现,利用编程逻辑方法产生行场扫描时序是一个发展方向。这种方法具有电路简单、功能强、修改方便、可靠性高等优点。图3为LCD控制器的框图。

 

 

    在本设计中,点时钟DCLK由处理器DSP的系统时钟40MHz经数字锁相环二分频得到。点时钟驱动行时序生成器,产生图2所示的行同步信号和行消隐信号。为避免毛刺,控制器设计采用同步设计方法,如图3所示,行同步信号通过一个微分电路,产生一个点时钟周期宽的场时序生成器使能信号。在使能信号有效时,场时序生成器开始计数,并产生场同步信号和场消隐信号。行消隐信号和场消隐信号相与后即为数据使能信号DATA_EN。该数据使能信号作为产生帧存地址计数器的计数使能,以保证DATA_EN信号为高时,将象素送给AMLCD显示。在DCLK的上升沿,帧存地址计数器加一,帧存SRAM经过一段延时后,象素数据出现在总线上。在DCLK的下降沿AMLCD将数据读入。该LCD控制器的设计方法很容易用于VGA视频接口。在VGA接口电路的设计中,不需点时钟电路,只须将行同步信号与场同步信号输出,将数据使能信号作为复合消隐信号输入即可。产生行场扫描时序的VHDL描述如下: 

entity seq_gen is  

port( clk_seq  : in std_logic; 

rst_seq       : in std_logic; 

lcd_hs_out    : out std_logic; 

lcd_dataen    : out std_logic; 

lcd_vs_out    : out std_logic; 

pix_clk       : out std_logic  ); 

end seq_gen; 

architecture rtl_seq_gen of seq_gen is  

signal  lcd_hb : std_logic; 

signal  lcd_hs :  std_logic; 

signal  lcd_vb : std_logic; 

signal  lcd_vs :  std_logic; 

signal  clken_vcount : std_logic; 

begin   

hcount:  block 

signal hcountreg :std_logic_vector(9 downto 0); 

signal   hz_temp    : std_logic; 

signal   lcd_hz : std_logic; 

begin 

process (clk_seq, lcd_hz ) 

begin 

if (lcd_hz = ‘1’ )  then 

hcountreg <= (others => ‘0’); 

elsif clk_seq'event and clk_seq = ‘1’ then 

hcountreg <= hcountreg +1; 

end if; 

end process; 

lcd_hb <= ‘0’ when hcountreg >=600 and hcountreg < 650 else ‘1’; 

lcd_hs <= ‘0’ when hcountreg >=610 and hcountreg <  630   else ‘1’; 

hz_temp <= ‘1’ when hcountreg = 650 else ‘0’; 

lcd_hz <= hz_temp or rst_seq; 

end block hcount; 

diff :  block 

signal   inputrega  :  std_logic; 

signal   inputregb  :  std_logic; 

begin 

process(clk_seq) 

begin 

if clk_seq'event and clk_seq=‘1’ then 

inputregb <= inputrega; 

inputrega  <=  not lcd_hs;  

end if; 

end process; 

clken_vcount <= not inputregb and inputrega; 

end block diff;  

vcount : block 

signal   vcountreg :    std_logic_vector(9 downto 0); 

signal   vz_temp :      std_logic; 

signal   lcd_vz :      std_logic; 

begin 

process (clk_seq, lcd_vz) 

begin 

if (lcd_vz=‘1’)  then 

vcountreg <= (others => ‘0’); 

elsif clk_seq'event and clk_seq = ‘1’ then  

if clken_vcount = ‘1’ then 

vcountreg <= vcountreg +1; 

end if; 

end if; 

end process; 

lcd_vb <= ‘0’ when vcountreg >=600 and vcountreg < 615 else ‘1’; 

lcd_vs <= ‘0’ when vcountreg >=607 and vcountreg <  610   else ‘1’; 

vz_temp <= ‘1’ when vcountreg = 615 else ‘0’; 

lcd_vz <= vz_temp or rst_seq; 

end block vcount; 

pix_clk <= clk_seq; 

lcd_dataen <= lcd_hb and lcd_vb; 

lcd_hs_out <= lcd_hs; 

lcd_vs_out <= lcd_vs; 

end rtl_seq_gen; 

    这种用VHDL产生扫描时序的方法简单、易读,并且易于修改。在代码中只须修改一些时序参数就能产生任意时序的波形,具有很好的可重用性。用FPGA Express 3.5将VHDL代码综合后,通过Foundation 3.1i进行布局和布线,用Foundation提供的门级仿真工具产生的行扫描时序仿真图如图4所示。

 

 

    采用FPGA技术设计的AMLCD控制器,大大减少了电路板的尺寸,同时增加了系统可靠性和设计灵活性。这种用VHDL语言实现行场扫描时序生成器的方法,具有简便。易读和可重用性强的特点。该AMLCD控制器已用Xilinx公司的SpartanII系列器件XC2S50实现,并在飞机座舱图形显示系统中实际应用。 

参考文献 

1 The programmable Logic Data Book 2000. USA:Xilinx Corp,2000 

2 杜海涛.现代飞机座舱显示系统研究. 南京航空航天大学博士论文,1999 

3 苏光大.微机图像处理系统. 北京:清华大学出版社, 2000:21~38 

4 候伯亭,顾 新.VHDL硬件描述语言与数字逻辑电路设计(修订版).西安:西安电子科技大学出版社,1999

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。