TFT显示图像

项目名称

TFT显示图像

具体要求

在tft液晶屏上显示一幅图像

设计说明

这个项目笔者做了两天,其实不是很难,但是因为缺乏经验,具体的原因是bmp转mif文件的软件是有问题的,笔者一直用这个软件转的mif文件,导致图像一直倾斜,一直没有发现是软件的问题,这个软件在转4:3标准分辨率的mif文件是好的,但是涉及到其他分辨率就会出现图像数据与像素比不对应。

涉及架构如下,将图片数据存储在rom中,在tft屏幕上显示,图片分辨率大小为160*120

TFT显示图像_第1张图片

 代码设计

先创建生成9M时钟和rom的ip核,图片数据位宽为16位,深度为160*120。

tft驱动代码设计

module TFT_driver(
	input						clk_9m,
	input						rst_n,
	input			[15:0]	data_in,
	output		[9:0]		vcnt,
	output		[9:0]		hcnt,
	output	reg[15:0]	TFT_RGB,
	output					TFT_VS,
	output					TFT_HS,
	output					TFT_CLK,
	output					TFT_DE,
	output					TFT_PWM,
	output 	reg	[14:0]	addr
);

//行列扫描参数定义
parameter	TFT_HS_END=40;
parameter	hdat_begin=42;
parameter	hdat_end=522;
parameter	hpixel_end=524;

parameter	TFT_VS_END=9;
parameter	vdat_begin=11;
parameter	vdat_end=283;
parameter	vline_end=285;

//行扫描计数
reg [9:0] hcnt_r;
always@(posedge clk_9m or negedge rst_n)
	if(!rst_n)
		hcnt_r<=0;
	else if(hcnt_r==hpixel_end)
		hcnt_r<=0;
	else
		hcnt_r<=hcnt_r+1;

//场扫描计数
reg [9:0] vcnt_r;
always@(posedge clk_9m or negedge rst_n)
	if(!rst_n)
		vcnt_r<=0;
	else if(hcnt_r==hpixel_end)begin
		if(vcnt_r==vline_end)
			vcnt_r<=0;
		else
			vcnt_r<=vcnt_r+1;
	end
	else
		vcnt_r<=vcnt_r;
		
//行同步和场同步信号
assign TFT_HS=(hcnt_r>TFT_HS_END)?1:0;
assign TFT_VS=(vcnt_r>TFT_VS_END)?1:0;


//实时扫描位置输出
assign hcnt=hcnt_r-hdat_begin-1;
assign vcnt=vcnt_r-vdat_begin-1;
//显示区标志信号
wire dat_act;
assign dat_act=((hcnt>=0)&&(hcnt<480))&&((vcnt>=0)&&(vcnt<272));
//确定图片显示区域
wire image_imshow;
assign  image_imshow=((hcnt>=50)&&(hcnt<210))&&((vcnt>=50)&&(vcnt<170));





always@(posedge clk_9m or negedge rst_n)
	if(!rst_n)begin
		addr<=0;
		TFT_RGB<=0;
	end
	else if(dat_act)begin
		if(image_imshow)begin
			if(addr<19199)begin
				addr<=addr+1;
				TFT_RGB<=data_in;
			end
			else
				addr<=0;
		end
		else
			TFT_RGB<=0;
	end
	else
		TFT_RGB<=0;

assign TFT_CLK=clk_9m;
assign TFT_DE=dat_act;
assign TFT_PWM=rst_n;

		
endmodule

顶层文件设计

module TFT_TOP(
	input			clk,
	input			rst_n,
	output		[15:0]	TFT_RGB,
	output					TFT_VS,
	output					TFT_HS,
	output					TFT_CLK,
	output					TFT_DE,
	output					TFT_PWM	
);

wire clk_9m;
wire locked;
wire [14:0] addr;
wire [15:0] data_in;
wire [9:0] vcnt;
wire [9:0] hcnt;

 pll_9m  pll_9m(
	.areset(!rst_n),
	.inclk0(clk),
	.c0(clk_9m),
	.locked(locked)
);

im_picture  im_picture(
	.address(addr),
	.clock(clk_9m),
	.q(data_in)
);

TFT_driver  TFT_driver(
	.clk_9m(clk_9m),
	.rst_n(locked),
	.data_in(data_in),
	.vcnt(vcnt),
	.hcnt(hcnt),
	.TFT_RGB(TFT_RGB),
	.TFT_VS(TFT_VS),
	.TFT_HS(TFT_HS),
	.TFT_CLK(TFT_CLK),
	.TFT_DE(TFT_DE),
	.TFT_PWM(TFT_PWM),
	.addr(addr)
);
endmodule

实验结果

TFT显示图像_第2张图片

 

你可能感兴趣的:(fpga实战小项目)