FPGA- RGB_TFT显示屏原理及驱动逻辑

 下图是TFT显示屏的显示效果

该显示屏共分为 2 个版本,4.3 寸版本的 TFT4.3’’_V3.0 和 5.0 寸版本的 TFT5.0’’_V3.0。 两者 PCB 背板电路完全相同,接口脚位定义完全相同,接口时序完全相同,仅使用的显示屏 模组尺寸不同。设计两个尺寸的主要目的是适配不同的开发板使用,以获得较好的物理结构兼容性。

如下图:

排针连接开发板示意图:

FPC 接口连接开发板示意图:

连接注意事项:

触摸功能的话就是相较于电阻触摸屏,电容触摸屏的触摸坐标定位实现更加的复杂,一般都需要使用专用的电容触摸控制器来完成多点触摸信号的感应。所以大部分电容触摸模组都集成好了该电容控制器,对外提供标准的12C总线接口,使用时,只需要主机通过12C总线读取该触摸控制器芯片中存储的实时坐标即可,不需要做其他的操作,去读它这里面寄存器的值就可以了。也因此在电容触摸屏对外的接口上,只需要IIC的信号就可以了。

通用显示屏模组,通用显示屏模组采用的是4.3寸或者5寸的显示屏模组,这两种模组功能相同,接口相同,时序参数也都相同,且在FPC排线的物理位置上的区别,他们也通过不同的PCB板实现了兼容,所以最终使用的时候的程序和驱动完全通用。

RGB888->RGB565

该屏幕的颜色数据支持 24 位输入,即每种颜色(RGB)有 8 位表 示。但是在很多对颜色效果要求不高的系统中,为了节约存储器带宽和控制器的引脚数量, 会使用 16 位色(RGB565)进行图像显示。 

实现代码如FPGA-VGA实现是一样的 只需在输出中加入背光信号

代码如下:

`include "disp_parameter_cfg.v" 
//800x480
//H_Right_Borde = 0      V_Bottom_Bord   =  8
//H_Front_Porch = 40     V_Front_Porch   =  2
//H_Sync_Time   = 128    V_Sync_Time     =  2
//H_Back_Porch  = 88     V_Back_Porch    =  25
//H_Left_Border = 0      V_Top_Border    =  8
//H_Data_Time   = 800    V_Data_Time     =  480
//H_Total_Time  = 1056   V_Total_Time    =  525

module TFT_Ctrl(
    Clk_33M   ,
    Reset_n   ,
    Data_in   ,
    hcount    ,   //行扫描位置(显示图像行扫描地址)
    vcount    ,   //场扫描位置(显示图像场扫描地址)
    TFT_HS    ,   //行同步信号
    TFT_VS    ,   //场同步信号
    TFT_DE   ,   //有效数据输出 
    TFT_CLK   ,   
    TFT_DATA ,     //红绿蓝三色 分别8位量化 R[7:0]G[7:0]B[7:0]  
    TFT_BL
    );
    input            Clk_33M;
    input            Reset_n;
    input   [23:0]   Data_in;
    output  [11:0]   hcount;
    output  [11:0]   vcount;
    output           TFT_HS;
    output           TFT_VS;
    output           TFT_DE;
    output           TFT_CLK;
    output  [23:0]   TFT_DATA;  //红绿蓝三色 分别8位量化 R[7:0]G[7:0]B[7:0]  
    output           TFT_BL;
//    parameter  VGA_HS_end = 11'd127  ,
//                hdat_begin = 11'd216  ,
//                hdat_end   = 11'd1016 ,
//                hpixel_end = 11'd1055 ,
//                VGA_VS_end = 11'd1    , 
//                vdat_begin = 11'd35   ,
//                vdat_end   = 11'd515  ,
//                vline_end  = 11'd524  ;
    parameter TFT_HS_end = `H_Sync_Time-1  ;
    parameter hdat_begin = `H_Sync_Time + `H_Back_Porch +`H_Left_Border - 1'b1;
    parameter hdat_end = `H_Total_Time - `H_Right_Border -`H_Front_Porch - 1'b1;
    parameter vdat_begin = `V_Sync_Time + `V_Back_Porch +`V_Top_Border - 1'b1;
    parameter vdat_end = `V_Total_Time - `V_Bottom_Border -`V_Front_Porch - 1'b1;    
    parameter hpixel_end = `H_Total_Time -1 ;
    parameter TFT_VS_end = `V_Sync_Time-1  ;     
    parameter vline_end  = `V_Total_Time -1 ; 
                
    reg [11:0] hcount_r;
    reg [11:0] vcount_r;
    
    always@(posedge Clk_33M or negedge Reset_n)
    if(!Reset_n)
       hcount_r <= 11'd0; 
    else if(hcount_r == hpixel_end )
        hcount_r <= 11'd0;
    else
        hcount_r <= hcount_r + 1'd1;
        
    always@(posedge Clk_33M or negedge Reset_n)
    if(!Reset_n)
       vcount_r <= 11'd0; 
    else if(hcount_r == hpixel_end) 
            if(vcount_r == vline_end )
                vcount_r <= 11'd0;
            else
                vcount_r <= vcount_r + 1'd1;
    else
        vcount_r <= vcount_r;
    
    
    assign  TFT_DE   =  ((hcount_r >= hdat_begin) && (hcount_r < hdat_end)&&
                         (vcount_r >= vdat_begin) && (vcount_r < vdat_end)) ? 1'b1 : 1'b0;  
    assign  hcount   =   TFT_DE ? (hcount_r - hdat_begin) : 10'd0;  
    assign  vcount   =   TFT_DE ? (vcount_r - vdat_begin) : 10'd0;               
    assign  TFT_HS   =  (hcount_r > TFT_HS_end)? 1'b1 :1'b0;   
    assign  TFT_VS   =  (vcount_r > TFT_VS_end)? 1'b1 :1'b0;  
    assign  TFT_DATA =  (TFT_DE) ? Data_in : 24'h000000;
    assign  TFT_CLK  =  ~Clk_33M;
    assign  TFT_BL = 1;
    
endmodule

其中disp_parameter_cfg.v中定义了不同分辨率的参数:

//`define Resolution_480x272 1 //时钟为 9MHz
//`define Resolution_640x480 1 //时钟为 25.175MHz
//`define Resolution_800x480 1 //时钟为 33MHz
//`define Resolution_800x600 1 //时钟为 40MHz
//`define Resolution_1024x768 1 //时钟为 65MHz
//`define Resolution_1280x720 1 //时钟为 74.25MHz
`define Resolution_1920x1080 1 //时钟为 148.5MHz
//定义不同分辨率的时序参数
`ifdef Resolution_480x272
    `define H_Total_Time 12'd525
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd2
    `define H_Sync_Time 12'd41
    `define H_Back_Porch 12'd2
    `define H_Left_Border 12'd0
    `define V_Total_Time 12'd286
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd2
    `define V_Sync_Time 12'd10
    `define V_Back_Porch 12'd2
    `define V_Top_Border 12'd0
`elsif Resolution_640x480
    `define H_Total_Time 12'd800
    `define H_Right_Border 12'd8
    `define H_Front_Porch 12'd8
    `define H_Sync_Time 12'd96
    `define H_Back_Porch 12'd40
    `define H_Left_Border 12'd8
    `define V_Total_Time 12'd525
    `define V_Bottom_Border 12'd8
    `define V_Front_Porch 12'd2
    `define V_Sync_Time 12'd2
    `define V_Back_Porch 12'd25
    `define V_Top_Border 12'd8
`elsif Resolution_800x480
    `define H_Total_Time 12'd1056
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd40
    `define H_Sync_Time 12'd128
    `define H_Back_Porch 12'd88
    `define H_Left_Border 12'd0
    `define V_Total_Time 12'd525
    `define V_Bottom_Border 12'd8
    `define V_Front_Porch 12'd2
    `define V_Sync_Time 12'd2
    `define V_Back_Porch 12'd25
    `define V_Top_Border 12'd8
`elsif Resolution_800x600
    `define H_Total_Time 12'd1056
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd40
    `define H_Sync_Time 12'd128
    `define H_Back_Porch 12'd88
    `define H_Left_Border 12'd0
    `define V_Total_Time 12'd628
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd1
    `define V_Sync_Time 12'd4
    `define V_Back_Porch 12'd23
    `define V_Top_Border 12'd0
`elsif Resolution_1024x768
    `define H_Total_Time 12'd1344
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd24
    `define H_Sync_Time 12'd136
    `define H_Back_Porch 12'd160
    `define H_Left_Border 12'd0
    `define V_Total_Time 12'd806
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd3
    `define V_Sync_Time 12'd6
    `define V_Back_Porch 12'd29
    `define V_Top_Border 12'd0
`elsif Resolution_1280x720
    `define H_Total_Time 12'd1650
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd110
    `define H_Sync_Time 12'd40
    `define H_Back_Porch 12'd220
    `define H_Left_Border 12'd0
    `define V_Total_Time 12'd750
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd5
    `define V_Sync_Time 12'd5
    `define V_Back_Porch 12'd20
    `define V_Top_Border 12'd0
`elsif Resolution_1920x1080
    `define H_Total_Time 12'd2200
    `define H_Right_Border 12'd0
    `define H_Front_Porch 12'd88
    `define H_Sync_Time 12'd44
    `define H_Back_Porch 12'd148
    `define H_Left_Border 12'd0
    `define V_Total_Time 12'd1125
    `define V_Bottom_Border 12'd0
    `define V_Front_Porch 12'd4
    `define V_Sync_Time 12'd5
    `define V_Back_Porch 12'd36
    `define V_Top_Border 12'd0
`endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值