基於FPGA的5寸LCD顯示屏的顯示控制

基於FPGA的5寸LCD顯示屏的顯示控制

1,圖像處理基礎知識

數字圖像處理是指將圖像信號轉換成數字信號並利用計算機對其進行處理的過程。圖像處理最先出現於 20 世紀 50 年代,當時的電子計算機已經發展到必定水平,人們開始利用計算機來處理圖形和圖像信息。數字圖像處理做爲一門學科大約造成於 20 世紀 60 年代初期。早期的圖像處理的目的是改善圖像的質量,它以人爲對象,以改善人的視覺效果爲目的。圖像處理中,輸入的是質量低的圖像,輸出的是改善質量後的圖像,經常使用的圖像處理方法有圖像加強、復原、編碼、壓縮等。
數字圖像處理經常使用方法:web

1 )圖像變換:

因爲圖像陣列很大,直接在空間域中進行處理,涉及計算量很大。所以,每每採用各類圖像變換的方法,如傅立葉變換、沃爾什變換、離散餘弦變換等間接處理技術,將空間域的處理轉換爲變換域處理,不只可減小計算量,並且可得到更有效的處理(如傅立葉變換可在頻域中進行數字濾波處理)。目前新興研究的小波變換在時域和頻域中都具備良好的局部化特性,它在圖像處理中也有着普遍而有效的應用。微信

2 )圖像編碼壓縮:

圖像編碼壓縮技術可減小描述圖像的數據量(即比特數),以便節省圖像傳輸、處理時間和減小所佔用的存儲器容量。壓縮能夠在不失真的前提下得到,也能夠在容許的失真條件下進行。編碼是壓縮技術中最重要的方法,它在圖像處理技術中是發展最先且比較成熟的技術。網絡

3 )圖像加強和復原:

圖像加強和復原的目的是爲了提升圖像的質量,如去除噪聲,提升圖像的清晰度等。圖像加強不考慮圖像降質的緣由,突出圖像中所感興趣的部分。如強化圖像高頻份量,可以使圖像中物體輪廓清晰,細節明顯;如強化低頻份量可減小圖像中噪聲影響。圖像復原要求對圖像降質的緣由有必定的瞭解,通常講應根據降質過程創建「降質模型」,再採用某種濾波方法,恢復或重建原來的圖像。svg

4 )圖像分割:

圖像分割是數字圖像處理中的關鍵技術之一。圖像分割是將圖像中有意義的特徵部分提取出來,其有意義的特徵有圖像中的邊緣、區域等,這是進一步進行圖像識別、分析和理解的基礎。雖然目前已研究出很多邊緣提取、區域分割的方法,但尚未一種廣泛適用於各類圖像的有效方法。所以,對圖像分割的研究還在不斷深刻之中,是目前圖像處理中研究的熱點之一。學習

5 )圖像描述:

圖像描述是圖像識別和理解的必要前提。做爲最簡單的二值圖像可採用其幾何特性描述物體的特性,通常圖像的描述方法採用二維形狀描述,它有邊界描述和區域描述兩類方法。對於特殊的紋理圖像可採用二維紋理特徵描述。隨着圖像處理研究的深刻發展,已經開始進行三維物體描述的研究,提出了體積描述、表面描述、廣義圓柱體描述等方法。編碼

6 )圖像分類(識別):

圖像分類(識別)屬於模式識別的範疇,其主要內容是圖像通過某些預處理(加強、復原、壓縮)後,進行圖像分割和特徵提取,從而進行判決分類。圖像分類常採用經典的模式識別方法,有統計模式分類和句法(結構)模式分類,近年來新發展起來的模糊模式識別和人工神經網絡模式分類在圖像識別中也愈來愈受到重視。
隨着計算機技術的發展,圖像處理技術已經深刻到咱們生活中的方方面面,其中,在娛樂休閒上的應用已經深刻人心。圖像處理技術在娛樂中的應用主要包括:電影特效製做、電腦電子遊戲、數碼相機、視頻播放、數字電視等。
電影特效製做:自從 20 世紀 60 年代以來,隨着電影中逐漸運用了計算機技術,一個全新的電影世界展示在人們面前,這也是一次電影的革命。愈來愈多的計算機制做的圖像被運用到了電影做品的製做中。其視覺效果的魅力有時已經大大超過了電影故事的自己。現在,咱們已經很難發如今一部電影中沒有任何的計算機數碼元素。
電腦電子遊戲:電腦電子遊戲的畫面,是近年來電子遊戲發展最快的部分之一。從 1996 年到如今,遊戲畫面的進步簡直能夠用日新月異來形容,隨着圖像處理技術的發展,衆多在幾年前沒法想象的畫面在今天已經成爲了平日常常的東西。
數碼相機:所謂數碼相機,是一種可以進行拍攝,並經過內部處理把拍攝到的景物轉換成以數字格式存放圖像的特殊照相機。與普通相機不一樣,數碼相機並不使用膠片,而是使用固定的或者是可拆卸的半導體存儲器來保存獲取的圖像。數碼相機能夠直接鏈接到計算機、電視機或者打印機上。在必定條件下,數碼相機還能夠直接接到移動式電話機或者手持 PC 機上。因爲圖像是內部處理的,因此使用者能夠立刻檢查圖像是否正確,並且能夠馬上打印出來或是經過電子郵件傳送出去。
視頻播放與數字電視:家庭影院中的 VCD , DVD 播放器和數字電視中,大量使用了視頻編碼解碼等圖像處理技術,而視頻編碼解碼等圖像處理技術的發展,也推進了視頻播放與數字電視象高清晰,高畫質發展。spa

2,LCD顯示的基本原理

在這裏插入圖片描述

圖1 VGA的顯示時序
如圖1所示,LCD的顯示和VGA的顯示時序基本一致,都是從屏幕的左上角開始(從左往右,從上往下)通過Hor_sync_time和H_back_porch時間,屏幕開始顯示,到H_front_porch時間後結束一行的顯示,而後回到下一行左側,循環到屏幕的最後一行掃描。在豎直方向上,通過 ver_sync_time和v_back_porch時間豎直方向屏幕開始顯示,到ver_front_porch豎直方向顯示結束。一幀顯示完成。 當屏幕的刷新頻率快於人眼的視覺感知的頻率咱們將看不出屏幕的閃爍效果。 3,FPGA實現 本實驗目的: 本節目的是讓你們瞭解LCD屏的顯示原理,以及爲後期咱們的FPGA的數字圖像處理打下基礎。 模塊劃分:

在這裏插入圖片描述

圖2 TFT5寸顯示屏顯示FPGA模塊結構

在這裏插入圖片描述

圖3 綜合後FPGA的內部模塊以及接口

從圖2和圖3可知,LCD屏顯示控制有Key_filter、rgb_gen以及TFT_CTRL_800_480_16bit三大模塊組成。Key_filter完成按鍵的消抖,rgb_gen完成屏幕顯示的控制,TFT_CTRL_800_480_16bit模塊完成TFT5寸屏幕的驅動。
本實驗經過按鍵來完成對屏幕顏色輸出的控制。
RGB565能夠完成65536種顏色的輸出。
硬件平臺:
TFT5寸屏幕/或VGA顯示屏
FPGA開發板
FPGA源碼:code

Rgb_gen 模塊源碼:視頻

/* Module name: rgb_gen.v Description: rgb 顏色產生 */
`timescale 1ns/1ps
module rgb_gen(
       input clk,
		 input rst_n,
		 input [3:0] key_cnt,
		 
		 output reg [15:0] rgb_data,
		 input  [11:0] hcount,
       input  [11:0] vcount
       );
	parameter TFT_HS_end=10'd1,
				 hdat_begin=10'd46,
				 hdat_end=10'd846,
				 hpixel_end=12'd1056,
				 TFT_VS_end=10'd1,
				 vdat_begin=10'd24,
				 vdat_end=10'd504,
				 vline_end=10'd524;
	parameter h_8 = 10'd100;
	parameter v_8 = 10'd60;
always @(posedge clk or negedge rst_n) begin
  if(!rst_n)
    rgb_data <= 16'h0000;
  else 
    case(key_cnt)
      4'd0:rgb_data <= 16'hf800;    //red
		4'd1:rgb_data <= 16'h07e0;  //green
		4'd2:rgb_data <= 16'h001f;  //blue
		4'd3:rgb_data <= 16'hf81f;  //purple
		4'd4:rgb_data <= 16'hffe0;  //yellow
		4'd5:rgb_data <= 16'h07ff;  //cyan
		4'd6:rgb_data <= 16'hfc00;  //orange
		4'd7:rgb_data <= 16'hffff;   //white
		4'd8:rgb_data <= 16'h0000;  //black
		4'd9:begin
		  if((hcount[3] == 1'b1) ^ (vcount[3] == 1'b1))
		    rgb_data <= 16'hffff;
		  else 
		    rgb_data <= 16'h0000;               //Lattices image 1
		end
		4'd10:begin
		  if((hcount[6] == 1'b1) ^ (vcount[6] == 1'b1))
		    rgb_data <= 16'hffff;
		  else 
		    rgb_data <= 16'h0000;               //Lattices image 2
		end
		4'd11:begin
		  if(hcount == hdat_begin)
		    rgb_data <= 16'hf800;
		  else if(hcount == hdat_begin + h_8)
		    rgb_data <= 16'h07e0;
		  else if(hcount == hdat_begin + h_8*2)
		    rgb_data <= 16'h001f;
		  else if(hcount == hdat_begin + h_8*3)
		    rgb_data <= 16'hf81f;
		  else if(hcount == hdat_begin + h_8*4)
		    rgb_data <= 16'hffe0;
		  else if(hcount == hdat_begin + h_8*5)
		    rgb_data <= 16'h07ff;
		  else if(hcount == hdat_begin + h_8*6)  //color bar h
		    rgb_data <= 16'hfc00;
		  else if(hcount == hdat_begin + h_8*7)
		    rgb_data <= 16'hffff;
		  else
		    rgb_data <= rgb_data;
		end
		4'd12:begin
		  if(vcount == vdat_begin)
		    rgb_data <= 16'hf800;
		  else if(vcount == vdat_begin + v_8)
		    rgb_data <= 16'h07e0;
		  else if(vcount == vdat_begin + v_8*2)
		    rgb_data <= 16'h001f;
		  else if(vcount == vdat_begin + v_8*3)
		    rgb_data <= 16'hf81f;
		  else if(vcount == vdat_begin + v_8*4) //color bar v
		    rgb_data <= 16'hffe0;
		  else if(vcount == vdat_begin + v_8*5)
		    rgb_data <= 16'h07ff;
		  else if(vcount == vdat_begin + v_8*6)
		    rgb_data <= 16'hfc00;
		  else if(vcount == vdat_begin + v_8*7)
		    rgb_data <= 16'hffff;
		  else
		    rgb_data <= rgb_data;
		end
		4'd13:begin
		   rgb_data <= {5'b0,vcount[8:3],5'b0};  //Horizontal green gradual change
		end
		4'd14:begin
		   rgb_data <= {vcount[8:4],vcount[8:3],vcount[8:4]}; //vertical gray Gradient
		end
		4'd15:begin
		   rgb_data <= {hcount[8:4],11'b0};  //Horizontal red gradual change
		end
	 endcase
end

endmodule

TFT_CTRL_800_480_16bit模塊源碼:xml

module TFT_CTRL_800_480_16bit(
	Clk33M,	//系統輸入時鐘33MHZ
	Rst_n,	//復位輸入,低電平復位
	data_in,	//待顯示數據
	hcount,		//TFT行掃描計數器
	vcount,		//TFT場掃描計數器
	TFT_RGB,	//TFT數據輸出
	TFT_HS,		//TFT行同步信號
	TFT_VS,		//TFT場同步信號
	TFT_BLANK,
	TFT_VCLK,
	TFT_DE
);
			
	//----------------模塊輸入端口----------------
	input  Clk33M;          //系統輸入時鐘33MHZ
	input  Rst_n;
	input  [15:0]data_in;     //待顯示數據

	//----------------模塊輸出端口----------------
	output [11:0]hcount;
	output [11:0]vcount;
	output [15:0]TFT_RGB;  //TFT數據輸出
	output TFT_HS;           //TFT行同步信號
	output TFT_VS;           //TFT場同步信號
	output TFT_BLANK;
	output TFT_DE;
	output TFT_VCLK;

	//----------------內部寄存器定義----------------
	reg [11:0] hcount_r;     //TFT行掃描計數器
	reg [11:0] vcount_r;     //TFT場掃描計數器
	//----------------內部連線定義----------------
	wire hcount_ov;
	wire vcount_ov;
	wire TFT_DE;//有效顯示區標定

	//TFT行、場掃描時序參數表
	parameter TFT_HS_end=10'd1,
				 hdat_begin=10'd46,
				 hdat_end=10'd846,
				 hpixel_end=12'd1056,
				 TFT_VS_end=10'd1,
				 vdat_begin=10'd24,
				 vdat_end=10'd504,
				 vline_end=10'd524;
	assign hcount=hcount_r;
	assign vcount=vcount_r;
	
	assign TFT_BLANK = Rst_n;
	assign TFT_VCLK = Clk33M;

	//**********************TFT驅動部分**********************
	//行掃描
	always@(posedge Clk33M or negedge Rst_n)
	if(!Rst_n)
		hcount_r<=12'd0;
	else if(hcount_ov)
		hcount_r<=12'd0;
	else
		hcount_r<=hcount_r+12'd1;

	assign hcount_ov=(hcount_r==hpixel_end);

	//場掃描
	always@(posedge Clk33M or negedge Rst_n)
	if(!Rst_n)
		vcount_r<=12'd0;
	else if(hcount_ov) begin
		if(vcount_ov)
			vcount_r<=12'd0;
		else
			vcount_r<=vcount_r+12'd1;
	end
	else 
		vcount_r<=vcount_r;
		
	assign 	vcount_ov=(vcount_r==vline_end);

	//數據、同步信號輸出
	assign TFT_DE=((hcount_r>=hdat_begin)&&(hcount_r<hdat_end))
					&&((vcount_r>=vdat_begin)&&(vcount_r<vdat_end));
					
	assign TFT_HS=(hcount_r>TFT_HS_end);
	assign TFT_VS=(vcount_r>TFT_VS_end);
	assign TFT_RGB=(TFT_DE)?data_in:16'h000000;
		
endmodule

實驗結果:
在這裏插入圖片描述

圖3 Red

在這裏插入圖片描述

圖4 Green

在這裏插入圖片描述

圖5 Blue

在這裏插入圖片描述

圖6 Color_bar_h

在這裏插入圖片描述

圖6 Lattices image 1
經過按鍵進行不一樣的顯示切換。

本節旨在讓你們瞭解TFT顯示屏的顯示原理以及控制原理,爲後邊的圖像處理打下堅實的基礎。
歡迎關注微信公衆號:FPGA開源工做室
獲取更多學習資料。
FPGA開源工做室