anhuihbo

FPGA VHDL 驱动群创 TFT LCD AT070TN92

0
阅读(4671)

(1)AT070TN92 LCD的驱动时序,见手册。以下为VHDL源码。

--***********************************************************
--
-- TFT LOGIC
--
-- Author:HanBiao
-- Date:2011-11-26
--Version:V000B000D000
--
--***********************************************************


library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.numeric_std.all;

entity AT070TN92_DRV is

 port
 (
  --***************************************************
  --
  -- TFT LCD INTERFACE
  --
  --***************************************************
  R  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
  G  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
  B  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
  DE  : OUT STD_LOGIC;
  HS  : OUT STD_LOGIC;
  VS  : OUT STD_LOGIC;
  DCLK : OUT STD_LOGIC;
  MODE : OUT STD_LOGIC;
  LR  : OUT STD_LOGIC;
  UD  : OUT STD_LOGIC;
  DITHB : OUT STD_LOGIC;
  --***************************************************
  --
  -- TFT LCD INTERFACE
  --
  --***************************************************
  BEEN : OUT STD_LOGIC;
  TEST : OUT STD_LOGIC;
  PWM_LCD : OUT STD_LOGIC;
  K2  : IN STD_LOGIC;
  K3  : IN STD_LOGIC;
  K4  : IN STD_LOGIC;
  CLK  : IN STD_LOGIC;
  RESET : IN STD_LOGIC 
 );

end entity;

architecture rtl of AT070TN92_DRV is

 signal   clk_div_5mhz : std_logic;
 signal   clk_div_10mhz : std_logic;
 signal   pol_temp  : std_logic;
 signal   vsp_temp  : std_logic;
 signal   vck_temp  : std_logic;
 
 signal  HS_temp   : std_logic;
 signal  VS_temp   : std_logic;
 signal  DE_H   : std_logic;
 signal  DE_V   : std_logic;
 
 signal  h_data   : std_logic_vector(23 downto 0);
 signal  v_data   : std_logic_vector(23 downto 0);
 signal  lcd_data  : std_logic_vector(23 downto 0);
 
 signal  SW_data   : integer range 0 to 8;
 signal  pwm    : std_logic;
 
 constant thpw   : integer := 22; 
 constant thb    : integer := 22; 
 constant thd    : integer := 800; 
 constant thfp   : integer := 22; 
 constant th    : integer := thpw + thb + thd + thfp; --1064
 
 constant tvpw   : integer := 11; 
 constant tvb    : integer := 11; 
 constant tvd    : integer := 480; 
 constant tvfp   : integer := 11; 
 constant tv    : integer := tvpw + tvb + tvd + tvfp; --528
 
 signal x_cnt  : integer range 0 to th + 100;
 signal y_cnt  : integer range 0 to tv + 100;
 
begin
 
 DCLK <= CLK;
 BEEN <= '1';
 TEST <= clk_div_10mhz;
 HS <= HS_temp;
 VS <= VS_temp;
 MODE <= '0';
 LR <= '0';
 UD <= '1';
 DITHB <= '0';
 DE <= DE_H and DE_V;
 R <= h_data(23 downto 16);
 G <= h_data(15 downto 8);
 B <= h_data(7 downto 0);
 PWM_LCD <= pwm;

 --***************************************************
 --
 -- TFT LCD LOGIC
 --
 --***************************************************
 process(CLK,RESET)is
  variable pwm_cnt : integer range 0 to 90000;
 begin
  if(RESET = '0') then 
   x_cnt <= 0;
   y_cnt <= 0;
   pwm_cnt := 0;
  elsif(CLK'event and CLK = '0') then
   x_cnt <= x_cnt + 1;
   if(x_cnt = th) then
    x_cnt <= 0;
    y_cnt <= y_cnt + 1;
    if(y_cnt = tv) then
     y_cnt <= 0;
    end if;
   end if;
   pwm_cnt := pwm_cnt + 1;
   if (pwm_cnt = 90000) then
    pwm <= not pwm;
    pwm_cnt := 0;
   end if;
  end if;
 end process;
 
 --***************************************************
 --
 -- TFT LCD  LOGIC
 --
 --***************************************************
 process(CLK,RESET)is
  begin
   if(RESET = '0') then
    DE_H <= '0';
    DE_V <= '0';
   else
    if(x_cnt >= thb + thpw) and (x_cnt <= thb + thpw + thd)then
     DE_H <= '1';
    else
     DE_H <= '0';
    end if;
    if(y_cnt >=  tvb + tvpw) and (y_cnt <=  tvb + tvpw + tvd)then
     DE_V <= '1';
    else
     DE_V <= '0';
    end if;
   end if;
 end process;
 
 
 --***************************************************
 --
 -- TFT LCD  LOGIC
 --
 --***************************************************
 process(CLK,RESET)is
  begin
--   if(CLK'event and CLK = '1') then
   if(RESET = '0') then
    HS_temp <= '1';
    VS_temp <= '0';
   else
    if(x_cnt >= thpw) then
     HS_temp <= '1';
    else
     HS_temp <= '0';
    end if;
    if(y_cnt >= tvpw) then
     VS_temp <= '1';
    else
     VS_temp <= '0';
    end if;
   end if;
--   end if;
 end process;
 
 
 --***************************************************
 --
 -- TFT LCD  H Data LOGIC
 --
 --***************************************************
 process(CLK,RESET)is
  begin
   if((x_cnt > thb + thpw) and (x_cnt <= thb + thpw + 100)
    and (y_cnt >= tvb + tvpw) and (y_cnt <= tvb + tvpw + tvd))then
    h_data <= "000000001111111111111111";
   elsif((x_cnt > thb + thpw + 100) and (x_cnt <= thb + thpw + 200)
    and (y_cnt >= tvb + tvpw) and (y_cnt <= tvb + tvpw + tvd))then
    h_data <= "111111110000000011111111";
   elsif((x_cnt > thb + thpw + 200) and (x_cnt <= thb + thpw + 300)
    and (y_cnt >= tvb + tvpw) and (y_cnt <= tvb + tvpw + tvd))then
    h_data <= "111111111111111100000000";
   elsif((x_cnt > thb + thpw + 300) and (x_cnt <= thb + thpw + 400)
    and (y_cnt >= tvb + tvpw) and (y_cnt <= tvb + tvpw + tvd))then
    h_data <= "000000000000000011111111";
   elsif((x_cnt > thb + thpw + 400) and (x_cnt <= thb + thpw + 500)
    and (y_cnt >= tvb + tvpw) and (y_cnt <= tvb + tvpw + tvd))then
    h_data <= "000000001111111111111111";
   elsif((x_cnt > thb + thpw + 500) and (x_cnt <= thb + thpw + 600)
    and (y_cnt >= tvb + tvpw) and (y_cnt <= tvb + tvpw + tvd))then
    h_data <= "000000001111111100000000";
   elsif((x_cnt > thb + thpw + 600) and (x_cnt <= thb + thpw + 700)
    and (y_cnt >= tvb + tvpw) and (y_cnt <= tvb + tvpw + tvd))then
    h_data <= "111111110000000011111111";
   elsif((x_cnt > thb + thpw + 700) and (x_cnt <= thb + thpw + thd)
    and (y_cnt >= tvb + tvpw) and (y_cnt <= tvb + tvpw + tvd))then
    h_data <= "111111110000000000000000";
   end if; 
 
--   if((x_cnt >= thb + thpw) and (x_cnt <= thb + thpw + thd)
--    and (y_cnt > tvb + tvpw) and (y_cnt <= tvb + tvpw + 100))then
--    h_data <= "000000001111111111111111";
--   elsif((x_cnt >= thb + thpw) and (x_cnt <= thb + thpw + thd)
--    and (y_cnt > tvb + tvpw + 100) and (y_cnt <= tvb + tvpw + 200))then
--    h_data <= "111111100000000111111111";
--   elsif((x_cnt >= thb + thpw) and (x_cnt <= thb + thpw + thd)
--    and (y_cnt > tvb + tvpw + 100) and (y_cnt <= tvb + tvpw + 300))then
--    h_data <= "111111111111111100000000";
--   elsif((x_cnt >= thb + thpw) and (x_cnt <= thb + thpw + thd)
--    and (y_cnt > tvb + tvpw + 100) and (y_cnt <= tvb + tvpw + 400))then
--    h_data <= "000000001111111111111111";
--   elsif((x_cnt >= thb + thpw) and (x_cnt <= thb + thpw + thd)
--    and (y_cnt > tvb + tvpw + 100) and (y_cnt <= tvb + tvpw + tvd))then
--    h_data <= "111111100000000111111111";
--   end if;    
  
 end process;
 
end rtl;
(2)驱动实物见图片!