1.VGA时序
2.不同分辨率的VGA参数
3.基于小梅哥5寸800x480TFT屏幕的显示驱动
3.1小梅哥TFT屏幕接口和意义
由表可知,驱动TFT屏幕需要输入RGB分量、TFT像素时钟、DISP显示开关、HSYNC、VSYNC行场同步信号、DE数据使能.
驱动代码为
/*
驱动显示屏需要给TFT屏幕的信号有:
时钟——与显示区域大小和帧率有关
复位
待显示数据
行同步信号——行同步期间低电平,其余时间高电平
场同步信号——场同步期间低电平,其余时间高电平
背光控制pwm
背光使能de——高电平为有光,低电平为无光
https://editor.youkuaiyun.com/md/?articleId=124541374
*/
module TFT_driver(
//system signals
input clk ,//时钟,与分辨率有关
input rst_n ,//复位
input [15:0] din ,
//VGA
output wire vga_clk ,//输出时钟,接显示屏
output wire vga_hs ,//行同步
output wire vga_vs ,//场同步
output wire [15:0] vga_rgb ,//像素信息
output reg vga_de ,//数据有效时间段
output wire vga_pwm ,//屏幕亮度
output wire vga_req ,//数据请求,提前vga_de一个时钟周期
output wire [15:0] vga_x ,//屏幕中H像素位置 1开始
output wire [15:0] vga_y //屏幕中v像素位置 1开始
);
localparam H_TOTAL_TIME = 1056 ,//行总周期
H_SYNC_TIME = 128 ,//行同步
H_BACK_PORCH = 88 ,//行后沿
H_LEFT_BORDER = 0 ,//行左边框
H_DATA_TIME = 800 ,//行数据有效期
H_RIGHT_BORDER = 0 ,//行右边框
H_FRONT_PORCH = 40 ;//行前沿
localparam V_TOTAL_TIME = 525 ,//场总周期
V_SYNC_TIME = 2 ,//场同步
V_BACK_PORCH = 25 ,//场后沿
V_TOP_BORDER = 8 ,//场上边框
V_DATA_TIME = 480 ,//场数据有效
V_BOTTOM_BORDER = 8 ,//场下边框
V_FRONT_PORCH = 2 ;//场前沿
localparam H_LEFT = H_SYNC_TIME + H_BACK_PORCH + H_LEFT_BORDER ,
V_LEFT = V_SYNC_TIME + V_BACK_PORCH + V_TOP_BORDER ;
reg [10:0] cnt_h ;
reg [10:0] cnt_v ;
assign vga_rgb = (vga_de) ? din : 16'b11111_000000_00000;
assign vga_clk = clk;
//行场计数
always@(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)
cnt_h <= 11'd0;
else if(cnt_h == H_TOTAL_TIME - 1'b1)
cnt_h <= 11'd0;
else
cnt_h <= cnt_h + 1'b1;
end
always@(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)
cnt_v <= 'b0;
else if(cnt_h == H_TOTAL_TIME - 1'b1 && cnt_v == V_TOTAL_TIME - 1'b1)
cnt_v <= 'b0;
else if(cnt_h == H_TOTAL_TIME - 1)
cnt_v <= cnt_v + 1'b1;
else
cnt_v <= cnt_v;
end
//行场同步信号
assign vga_hs = (cnt_h >= H_SYNC_TIME) ? 1'b1:1'b0;
assign vga_vs = (cnt_v >= V_SYNC_TIME) ? 1'b1:1'b0;
//像素坐标1~V_DATA 1~H_DATA
assign vga_x = (cnt_h >= H_LEFT & cnt_h < H_LEFT + H_DATA_TIME) ? cnt_h - H_LEFT + 1'b1: 1'b0;
assign vga_y = (cnt_v >= V_LEFT & cnt_v < V_LEFT + V_DATA_TIME) ? cnt_v - V_LEFT + 1'b1: 1'b0;
assign vga_pwm = clk;
//数据请求信号vga_req,比数据信号de快一个周期
assign vga_req = (((cnt_h >= H_LEFT - 1'b1) && (cnt_h < H_LEFT + H_DATA_TIME - 'd1))
&& ((cnt_v > V_LEFT - 1'b1) && (cnt_v <= V_LEFT + V_DATA_TIME - 1'b1)));
//数据请求信号打一拍得到数据有效信号
always @(posedge clk) begin
vga_de <= vga_req;
end
endmodule
仿真验证通过,驱动无误