您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

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

发布日期:2011-05-07

    先容了基于FPGA的图情势LCD&VGA控制器的计划,细致讨论了用VHDL计划行场扫描时序的要领,这种计划要领稍作窜改便可孕育产生恣意行场扫描时序,具有很好的可重用性。该控制器已告成地在某型飞机座舱图形表现体系中利用。

    飞机座舱图形表现体系已生长到第六代,即采取有源矩阵彩色液晶表现器AMLCD(Active Matrix Liquid Crystal Display)。当前高辨别率的军用AMLCD表现模块还只能寄托入口,且控制电路板须安置在该表现模块提供的机箱内。这种安置方法对AMLCD控制电路板的尺寸请求高,请求尽大概淘汰所计划电路板的尺寸。在笔者计划的新一代飞机座舱图形表现体系中利用了大范围现场可编程门阵列FPGA(Field Programmable Gata 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芯片XS2S50实现。 

   
2 KMD710表现模块 

    如图1所示,美国Korry公司提供的KDM710全彩色液晶表现模块接口信号重要如下几组:3个8位RGB数字信号、行同步信号HSYNC、场同步信号VSYNC、数据使能信号DATA_EN和点时钟输入DCLK。根据AMLCD数据手册所需求的时序,确定扫描时序和相应的时序参数如图2所示。一样平常,图形终端表现器扫描制式与广播电视的标准有点差别,须根据表现模块所提供的时间请求来确定扫描时序,此中的行场同步的前后肩,可以根据必要举行微调,一样平常为了防备每行的第一个象素丢失,请求行同步后肩C与行同步脉冲宽B只管即便相称。图2中的点时钟为20MHz,行周期为650个时钟周期,场周期为615个行周期(场频为50Hz)。




    3 LCD&VGA控制器计划 

    计划行场扫描时序,一样平常有两种方法:查找表方法和编程逻辑方法。查找表方法重要由存储芯片构成,如SRAM、EPROM、PORM等。利用时,先根据所要孕育产生的时序在存储单位写入相应的数值,查表时再从表内读出时应存储单位的数值,以形成扫描时序。扫描时序查找表分为行扫描时序查找表和场扫描时序查找表。场扫描时序查找表的输入时钟由行同步脉冲提供。用查找表形成时序的要领存在体积大、谋略啰嗦的缺点。随着大范围逻辑芯片的出现,利用编程逻辑要领孕育产生行场扫描时序是一个生长方向。这种要领具有电路大略、成果强、修改方便、可靠性高等好处。图3为LCD控制器的框图。





    在本计划中,点时钟DCLK由处理惩罚器DSP的体系时钟40MHz经数字锁相环二分频得到。点时钟驱动行时序天生器,孕育产生图2所示的行同步信号HS和行消隐信号HB。为克制毛刺,控制器计划采取同步计划要领,如图3所示,行同步信号HS通过一个微分电路,孕育产生一个点时钟周期宽的场时序天生器使能信号。在使能信号有效时,场时序天生器开始计数,并孕育产生场同步信号VS和场消隐信号VB。行消隐信号HB和场消隐信号VB相与后即为数据使能信号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 vcounreg < 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实现,并在飞机座舱图形表现体系中实现应用。