(1)Visio视图:
(2)控制模块Verilog代码:
module tft_ctrl(
input clk_33M ,
input reset_n ,
input [23:0] data_in ,
output [9:0] hang ,
output [9:0] lie ,
output hsync ,
output vsync ,
output [23:0] rgb_tft ,
output tft_bl ,
output tft_clk ,
output tft_DE
);
reg [10:0] hang_cnt ;
reg [9:0] v_cnt ;
wire data_vaild ;
parameter H_SYNC = 128 ;
parameter H_BACK = 88 ;
parameter H_VAILD = 800 ;
parameter H_FRONT = 40 ;
parameter H_TOTAL = 1056 ;
parameter V_SYNC = 2 ;
parameter V_BACK = 33 ;
parameter V_VAILD = 480 ;
parameter V_FRONT = 10 ;
parameter V_TOTAL = 525 ;
//行计数器设计
always@(posedge clk_33M or negedge reset_n)
if(!reset_n)
hang_cnt <= 11'd0;
else if(hang_cnt == H_TOTAL - 11'd1)
hang_cnt <= 11'd0;
else
hang_cnt <= hang_cnt + 11'd1;
//场计数器设计
always@(posedge clk_33M or negedge reset_n)
if(!reset_n)
v_cnt <= 10'd0;
else if ((v_cnt == V_TOTAL - 10'd1) && (hang_cnt == H_TOTAL - 11'd1))
v_cnt <= 10'd0;
else if(hang_cnt == H_TOTAL - 11'd1)
v_cnt <= v_cnt + 10'd1;
else
v_cnt <= v_cnt;
//数据有效信号设计
assign data_vaild = (hang_cnt >= H_SYNC + H_BACK) && (hang_cnt < H_SYNC + H_BACK + H_VAILD)
&& (v_cnt >= V_SYNC + V_BACK) && (v_cnt < V_SYNC + V_BACK + V_VAILD);
//行、列信号设计
assign hang = ( data_vaild ) ? (hang_cnt - H_SYNC - H_BACK + 1'd1) : 10'd0;
assign lie = ( data_vaild ) ? (v_cnt - V_SYNC - V_BACK + 1'd1) : 10'd0;
//行同步、场同步信号设计
assign hsync = (hang_cnt >= H_SYNC);
assign vsync = (v_cnt >= V_SYNC);
//rgb_tft、tft_bl、tft_clk、tft_DE信号设计
assign rgb_tft = (data_vaild) ? data_in : 24'd0;
assign tft_bl = 1'd1;
assign tft_clk = clk_33M;
assign tft_DE = data_vaild;
endmodule
(3)仿真代码:
`timescale 1ns / 1ps
module tft_ctrl_tb;
reg clk ;
reg reset_n ;
wire [23:0] data_in ;
wire locked ;
wire clk_33M ;
wire [9:0] hang ;
wire [9:0] lie ;
wire hsync ;
wire vsync ;
wire [23:0] rgb_tft ;
wire tft_bl ;
wire tft_clk ;
wire tft_DE ;
initial clk = 1'd1;
always #10 clk = ~clk;
initial begin
reset_n <= 1'd0;
#15;
reset_n <= 1'd1;
#20_000_000;
$stop;
end
assign data_in = ((hang >= 10'd1) && (lie >= 10'd1)) ? 24'h111_111 : 24'd0 ;
PLL_33M PLL_33M_inst
(
.clk_33M (clk_33M ),
.resetn (reset_n ),
.locked (locked ),
.clk_in1 (clk )
);
tft_ctrl tft_ctrl_inst(
.clk_33M (clk_33M ),
.reset_n (locked ),
.data_in (data_in ),
.hang (hang ),
.lie (lie ),
.hsync (hsync ),
.vsync (vsync ),
.rgb_tft (rgb_tft ),
.tft_bl (tft_bl ),
.tft_clk (tft_clk ),
.tft_DE (tft_DE )
);
endmodule
(4)仿真波形:
- PLL仿真波形:
- 行计数器信号、行同步信号(我这里同步信号的设计与之前理论部分的不一样,是根据tft显示屏数据手册改的):
- 场计数器信号、场同步信号:
- 行信号、列信号:
第35列的第216个像素点是有效的第一行第一列数据。
- 数据输入信号和rgb_tft信号: