整个系统框图如图所示:
其中需要三个子模块:时钟产生模块、tft_pic模块、tft_ctrl模块。
框图分别如下:
时序图如下图所示:
tft_pic以及tft_ctrl模块如下:
`timescale 1ns/1ns
module tft_pic
(
input wire tft_clk_33m , //输入工作时钟,频率33MHz
input wire sys_rst_n , //输入复位信号,低电平有效
input wire [10:0] pix_x , //输入TFT有效显示区域像素点X轴坐标
input wire [10:0] pix_y , //输入TFT有效显示区域像素点Y轴坐标
output reg [15:0] pix_data //输出像素点色彩信息
);
//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
parameter H_VALID = 11'd800 , //行有效数据
V_VALID = 11'd480 ; //场有效数据
parameter CHAR_B_H= 10'd272 , //字符开始X轴坐标
CHAR_B_V= 10'd208 ; //字符开始Y轴坐标
parameter CHAR_W = 10'd256 , //字符宽度
CHAR_H = 10'd64 ; //字符高度
parameter BLACK = 16'h0000, //黑色
GOLDEN = 16'hFEC0; //金色
//wire define
wire [10:0] char_x ; //字符显示X轴坐标
wire [10:0] char_y ; //字符显示Y轴坐标
//reg define
reg [255:0] char [63:0] ; //字符数据
//********************************************************************//
//***************************** Main Code ****************************//
//********************************************************************//
//字符显示坐标
assign char_x = (((pix_x >= CHAR_B_H) && (pix_x < (CHAR_B_H + CHAR_W)))
&& ((pix_y >= CHAR_B_V) && (pix_y < (CHAR_B_V + CHAR_H))))
? (pix_x - CHAR_B_H) : 11'h3FF;
assign char_y = (((pix_x >= CHAR_B_H) && (pix_x < (CHAR_B_H + CHAR_W)))
&& ((pix_y >= CHAR_B_V) && (pix_y < (CHAR_B_V + CHAR_H))))
? (pix_y - CHAR_B_V) : 11'h3FF;
//char:字符数据
always@(posedge tft_clk_33m)
begin
char[0] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
char[1] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
char[2] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
char[3] <= 256'h0000000000000000000000000000000000000000000000000000000000000000;
char[4] <= 256'h00000000003C0000000000000000000000000000000070000000000000000000;
char[5] <= 256'h0000000E003E00000000000000000000000000000000F0000000000000000000;
char[6] <= 256'h000000FF001F00000000000000000000000000000001F0000000000000400000;
char[7] <= 256'h000007FF000F00000000000000000000000010000001F8000000000000E00000;
char[8] <= 256'h00007FFE000F000000000000000000000003FE000001F8000000000000F