基于FPGA的5寸LCD顯示屏的顯示控制
掃描二維碼
隨時(shí)隨地手機(jī)看文章
基于FPGA的5寸LCD顯示屏的顯示控制
1,圖像處理基礎(chǔ)知識
數(shù)字圖像處理是指將圖像信號轉(zhuǎn)換成數(shù)字信號并利用計(jì)算機(jī)對其進(jìn)行處理的過程。圖像處理最早出現(xiàn)于 20 世紀(jì) 50 年代,當(dāng)時(shí)的電子計(jì)算機(jī)已經(jīng)發(fā)展到一定水平,人們開始利用計(jì)算機(jī)來處理圖形和圖像信息。數(shù)字圖像處理作為一門學(xué)科大約形成于 20 世紀(jì) 60 年代初期。早期的圖像處理的目的是改善圖像的質(zhì)量,它以人為對象,以改善人的視覺效果為目的。圖像處理中,輸入的是質(zhì)量低的圖像,輸出的是改善質(zhì)量后的圖像,常用的圖像處理方法有圖像增強(qiáng)、復(fù)原、編碼、壓縮等。
數(shù)字圖像處理常用方法:
1 )圖像變換:由于圖像陣列很大,直接在空間域中進(jìn)行處理,涉及計(jì)算量很大。因此,往往采用各種圖像變換的方法,如傅立葉變換、沃爾什變換、離散余弦變換等間接處理技術(shù),將空間域的處理轉(zhuǎn)換為變換域處理,不僅可減少計(jì)算量,而且可獲得更有效的處理(如傅立葉變換可在頻域中進(jìn)行數(shù)字濾波處理)。目前新興研究的小波變換在時(shí)域和頻域中都具有良好的局部化特性,它在圖像處理中也有著廣泛而有效的應(yīng)用。
2 )圖像編碼壓縮:圖像編碼壓縮技術(shù)可減少描述圖像的數(shù)據(jù)量(即比特?cái)?shù)),以便節(jié)省圖像傳輸、處理時(shí)間和減少所占用的存儲器容量。壓縮可以在不失真的前提下獲得,也可以在允許的失真條件下進(jìn)行。編碼是壓縮技術(shù)中最重要的方法,它在圖像處理技術(shù)中是發(fā)展最早且比較成熟的技術(shù)。
3 )圖像增強(qiáng)和復(fù)原:圖像增強(qiáng)和復(fù)原的目的是為了提高圖像的質(zhì)量,如去除噪聲,提高圖像的清晰度等。圖像增強(qiáng)不考慮圖像降質(zhì)的原因,突出圖像中所感興趣的部分。如強(qiáng)化圖像高頻分量,可使圖像中物體輪廓清晰,細(xì)節(jié)明顯;如強(qiáng)化低頻分量可減少圖像中噪聲影響。圖像復(fù)原要求對圖像降質(zhì)的原因有一定的了解,一般講應(yīng)根據(jù)降質(zhì)過程建立“降質(zhì)模型”,再采用某種濾波方法,恢復(fù)或重建原來的圖像。
4 )圖像分割:圖像分割是數(shù)字圖像處理中的關(guān)鍵技術(shù)之一。圖像分割是將圖像中有意義的特征部分提取出來,其有意義的特征有圖像中的邊緣、區(qū)域等,這是進(jìn)一步進(jìn)行圖像識別、分析和理解的基礎(chǔ)。雖然目前已研究出不少邊緣提取、區(qū)域分割的方法,但還沒有一種普遍適用于各種圖像的有效方法。因此,對圖像分割的研究還在不斷深入之中,是目前圖像處理中研究的熱點(diǎn)之一。
5 )圖像描述:圖像描述是圖像識別和理解的必要前提。作為最簡單的二值圖像可采用其幾何特性描述物體的特性,一般圖像的描述方法采用二維形狀描述,它有邊界描述和區(qū)域描述兩類方法。對于特殊的紋理圖像可采用二維紋理特征描述。隨著圖像處理研究的深入發(fā)展,已經(jīng)開始進(jìn)行三維物體描述的研究,提出了體積描述、表面描述、廣義圓柱體描述等方法。
6 )圖像分類(識別):圖像分類(識別)屬于模式識別的范疇,其主要內(nèi)容是圖像經(jīng)過某些預(yù)處理(增強(qiáng)、復(fù)原、壓縮)后,進(jìn)行圖像分割和特征提取,從而進(jìn)行判決分類。圖像分類常采用經(jīng)典的模式識別方法,有統(tǒng)計(jì)模式分類和句法(結(jié)構(gòu))模式分類,近年來新發(fā)展起來的模糊模式識別和人工神經(jīng)網(wǎng)絡(luò)模式分類在圖像識別中也越來越受到重視。
隨著計(jì)算機(jī)技術(shù)的發(fā)展,圖像處理技術(shù)已經(jīng)深入到我們生活中的方方面面,其中,在娛樂休閑上的應(yīng)用已經(jīng)深入人心。圖像處理技術(shù)在娛樂中的應(yīng)用主要包括:電影特效制作、電腦電子游戲、數(shù)碼相機(jī)、視頻播放、數(shù)字電視等。
電影特效制作:自從 20 世紀(jì) 60 年代以來,隨著電影中逐漸運(yùn)用了計(jì)算機(jī)技術(shù),一個(gè)全新的電影世界展現(xiàn)在人們面前,這也是一次電影的革命。越來越多的計(jì)算機(jī)制作的圖像被運(yùn)用到了電影作品的制作中。其視覺效果的魅力有時(shí)已經(jīng)大大超過了電影故事的本身。如今,我們已經(jīng)很難發(fā)現(xiàn)在一部電影中沒有任何的計(jì)算機(jī)數(shù)碼元素。
電腦電子游戲:電腦電子游戲的畫面,是近年來電子游戲發(fā)展最快的部分之一。從 1996 年到現(xiàn)在,游戲畫面的進(jìn)步簡直可以用突飛猛進(jìn)來形容,隨著圖像處理技術(shù)的發(fā)展,眾多在幾年前無法想象的畫面在今天已經(jīng)成為了平平常常的東西。
數(shù)碼相機(jī):所謂數(shù)碼相機(jī),是一種能夠進(jìn)行拍攝,并通過內(nèi)部處理把拍攝到的景物轉(zhuǎn)換成以數(shù)字格式存放圖像的特殊照相機(jī)。與普通相機(jī)不同,數(shù)碼相機(jī)并不使用膠片,而是使用固定的或者是可拆卸的半導(dǎo)體存儲器來保存獲取的圖像。數(shù)碼相機(jī)可以直接連接到計(jì)算機(jī)、電視機(jī)或者打印機(jī)上。在一定條件下,數(shù)碼相機(jī)還可以直接接到移動式電話機(jī)或者手持 PC 機(jī)上。由于圖像是內(nèi)部處理的,所以使用者可以馬上檢查圖像是否正確,而且可以立刻打印出來或是通過電子郵件傳送出去。
視頻播放與數(shù)字電視:家庭影院中的 VCD , DVD 播放器和數(shù)字電視中,大量使用了視頻編碼解碼等圖像處理技術(shù),而視頻編碼解碼等圖像處理技術(shù)的發(fā)展,也推動了視頻播放與數(shù)字電視象高清晰,高畫質(zhì)發(fā)展。
2,LCD顯示的基本原理
圖1 VGA的顯示時(shí)序
如圖1所示,LCD的顯示和VGA的顯示時(shí)序基本一致,都是從屏幕的左上角開始(從左往右,從上往下)經(jīng)過Hor_sync_time和H_back_porch時(shí)間,屏幕開始顯示,到H_front_porch時(shí)間后結(jié)束一行的顯示,然后回到下一行左側(cè),循環(huán)到屏幕的最后一行掃描。在豎直方向上,經(jīng)過 ver_sync_time和v_back_porch時(shí)間豎直方向屏幕開始顯示,到ver_front_porch豎直方向顯示結(jié)束。一幀顯示完成。
當(dāng)屏幕的刷新頻率快于人眼的視覺感知的頻率我們將看不出屏幕的閃爍效果。
3,FPGA實(shí)現(xiàn)
本實(shí)驗(yàn)?zāi)康模?/span>
本節(jié)目的是讓大家了解LCD屏的顯示原理,以及為后期我們的FPGA的數(shù)字圖像處理打下基礎(chǔ)。
模塊劃分:
圖2 TFT5寸顯示屏顯示FPGA模塊結(jié)構(gòu)
圖3 綜合后FPGA的內(nèi)部模塊以及接口
從圖2和圖3可知,LCD屏顯示控制有Key_filter、rgb_gen以及TFT_CTRL_800_480_16bit三大模塊組成。Key_filter完成按鍵的消抖,rgb_gen完成屏幕顯示的控制,TFT_CTRL_800_480_16bit模塊完成TFT5寸屏幕的驅(qū)動。
本實(shí)驗(yàn)通過按鍵來完成對屏幕顏色輸出的控制。
RGB565可以完成65536種顏色的輸出。
硬件平臺:
TFT5寸屏幕/或VGA顯示屏
FPGA開發(fā)板
FPGA源碼:
Rgb_gen 模塊源碼
/*
Module name: rgb_gen.v
Description:
Data: 2018/01/25
Engineer:
e-mail: 137194782@qq.com
微信公眾號: FPGA開源工作室
QQ資料群: 664712733
*/
`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模塊源碼:
module TFT_CTRL_800_480_16bit(
Clk33M,//系統(tǒng)輸入時(shí)鐘33MHZ
Rst_n,//復(fù)位輸入,低電平復(fù)位
data_in,//待顯示數(shù)據(jù)
hcount,//TFT行掃描計(jì)數(shù)器
vcount,//TFT場掃描計(jì)數(shù)器
TFT_RGB,//TFT數(shù)據(jù)輸出
TFT_HS,//TFT行同步信號
TFT_VS,//TFT場同步信號
TFT_BLANK,
TFT_VCLK,
TFT_DE
);
//----------------模塊輸入端口----------------
input Clk33M; //系統(tǒng)輸入時(shí)鐘33MHZ
input Rst_n;
input [15:0]data_in; //待顯示數(shù)據(jù)
//----------------模塊輸出端口----------------
output [11:0]hcount;
output [11:0]vcount;
output [15:0]TFT_RGB; //TFT數(shù)據(jù)輸出
output TFT_HS; //TFT行同步信號
output TFT_VS; //TFT場同步信號
output TFT_BLANK;
output TFT_DE;
output TFT_VCLK;
//----------------內(nèi)部寄存器定義----------------
reg [11:0] hcount_r; //TFT行掃描計(jì)數(shù)器
reg [11:0] vcount_r; //TFT場掃描計(jì)數(shù)器
//----------------內(nèi)部連線定義----------------
wire hcount_ov;
wire vcount_ov;
wire TFT_DE;//有效顯示區(qū)標(biāo)定
//TFT行、場掃描時(shí)序參數(shù)表
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驅(qū)動部分**********************
//行掃描
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);
//數(shù)據(jù)、同步信號輸出
assign TFT_DE=((hcount_r>=hdat_begin)&&(hcount_r
&&((vcount_r>=vdat_begin)&&(vcount_r
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
實(shí)驗(yàn)結(jié)果:
Red
Green
Blue
color_bar_h
Lattices image 1