本(běn)文(wén)为(wèi)明(míng)德揚原創文(wén)章(zhāng),轉(zhuǎn)载請注明(míng)出(chū)处!
1.1 總(zǒng)體(tǐ)設計(jì)
1.1.1 概述
液晶顯示器是(shì)一(yī)-種(zhǒng)通(tòng)过(guò)液晶和(hé)色(sè)彩过(guò)濾器过(guò)濾光(guāng)源,在(zài)平面(miàn)面(miàn)板上(shàng)産生(shēng)图(tú)像的(de)數字(zì)顯示器。LCD 的(de)構造是(shì)在(zài)两(liǎng)片(piàn)平行的(de)玻璃基板當中(zhōng)放(fàng)置液晶盒,下(xià)基板玻璃上(shàng)設置薄膜晶體(tǐ)管(guǎn),.上(shàng)基板玻璃上(shàng)設置彩色(sè)濾光(guāng)片(piàn),通(tòng)过(guò)薄膜晶體(tǐ)管(guǎn)上(shàng)的(de)信(xìn)号(hào)與(yǔ)電(diàn)壓改變(biàn)来(lái)控制液晶分(fēn)子的(de)轉(zhuǎn)動(dòng)方(fāng)向(xiàng),從而(ér)达(dá)到(dào)控制每个(gè)像素點(diǎn)偏振光(guāng)出(chū)射與(yǔ)否而(ér)达(dá)到(dào)顯示目的(de)。與(yǔ)傳統的(de)陰极(jí)射線(xiàn)管(guǎn)相比,LCD具有(yǒu)占用(yòng)空間(jiān)小,低功耗,低輻射,无閃爍,降低視覺疲勞等优點(diǎn)。現(xiàn)在(zài)LCD已漸替代(dài)CRT成(chéng)为(wèi)主(zhǔ)流,價格也(yě)已經(jīng)下(xià)降了(le)很多(duō),并已充分(fēn)的(de)普及(jí)。
1.1.2 設計(jì)目标(biāo)
在(zài)7寸(cùn)LCD顯示屏上(shàng)实現(xiàn)图(tú)片(piàn)顯示。
其中(zhōng),在(zài)顯示屏左(zuǒ)上(shàng)角(jiǎo)顯示明(míng)德揚的(de)LOGO图(tú)标(biāo),在(zài)顯示屏的(de)中(zhōng)間(jiān)居中(zhōng)顯示字(zì)母“E”。
1.1.3 系(xì)統結構框图(tú)
系(xì)統結構框图(tú)如(rú)下(xià)所(suǒ)示:
图(tú)一(yī)
1.1.4模块(kuài)功能(néng)
PLL模块(kuài)实現(xiàn)功能(néng)
1. 将輸入(rù)的(de)50MHz时(shí)鐘(zhōng)分(fēn)頻輸出(chū)40MHz时(shí)鐘(zhōng)。
ROM模块(kuài)实現(xiàn)功能(néng)
1. FPGA_rom存儲明(míng)德揚LOGO的(de)图(tú)像數據(jù);
2. e_rom存儲字(zì)母“E”的(de)图(tú)像數據(jù)。
LCD驅動(dòng)模块(kuài)实現(xiàn)功能(néng)
1、 産生(shēng)驅動(dòng)LCD屏顯示的(de)时(shí)序
2、 读(dú)取(qǔ)ROM里(lǐ)存儲的(de)數據(jù)并輸出(chū)顯示
1.1.5頂层信(xìn)号(hào)
|
信(xìn)号(hào)名
|
|
|
|
|
|
|
|
系(xì)統工作时(shí)鐘(zhōng) 50M
|
|
|
|
|
系(xì)統複位信(xìn)号(hào),低電(diàn)平有(yǒu)效
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LCD 數據(jù)輸入(rù)使能(néng)信(xìn)号(hào)
|
|
|
|
|
LCD RGB信(xìn)号(hào),RGB格式为(wèi)使用(yòng)24位来(lái)表(biǎo)示一(yī)个(gè)像素,RGB分(fēn)量(liàng)都用(yòng)8位表(biǎo)示,取(qǔ)值範圍为(wèi)0-255。
|
|
|
|
|
LCD 數據(jù)采樣(yàng)时(shí)鐘(zhōng)
|
1.1.6參考代(dài)碼
-
module top_mdyLcdPicOverlay(
-
clk ,
-
rst_n ,
-
hys ,
-
vys ,
-
lcd_de ,
-
lcd_rgb ,
-
lcd_dclk
-
);
-
-
parameter PICTURE_W = 24 ;
-
-
input clk ;
-
input rst_n ;
-
output hys ;
-
output vys ;
-
output lcd_de ;
-
output [PICTURE_W-1:0] lcd_rgb ;
-
output lcd_dclk ;
-
-
-
wire clk_0 ;
-
-
wire hys ;
-
wire vys ;
-
wire lcd_de ;
-
wire [PICTURE_W-1:0] lcd_rgb ;
-
wire lcd_dclk ;
-
-
-
//40MHz
-
pll_40m u_pll_40m(
-
.areset (~rst_n ),
-
.inclk0 (clk ),
-
.c0 (clk_0 )
-
);
-
-
-
lcd_driver u2(
-
.clk (clk_0 ),//40MHz
-
.rst_n (rst_n ),
-
-
.hys (hys ),
-
.vys (vys ),
-
.lcd_de (lcd_de ),
-
.lcd_rgb (lcd_rgb ),
-
.lcd_dclk (lcd_dclk )
-
);
-
-
endmodule
1.2 PLL模块(kuài)設計(jì)
1.2.1接口(kǒu)信(xìn)号(hào)
下(xià)面(miàn)为(wèi)PLL的(de)接口(kǒu)信(xìn)号(hào):
|
信(xìn)号(hào)名
|
|
|
|
|
|
|
|
PLL複位信(xìn)号(hào),高(gāo)電(diàn)平有(yǒu)效
|
|
|
|
|
PLL輸入(rù)时(shí)鐘(zhōng) 50MHz
|
|
|
|
|
PLL輸出(chū)时(shí)鐘(zhōng) 40MHz
|
1.2.2 設計(jì)思(sī)路(lù)
本(běn)模块(kuài)主(zhǔ)要(yào)用(yòng)于(yú)産生(shēng)LCD驅動(dòng)时(shí)序所(suǒ)需要(yào)的(de)时(shí)鐘(zhōng),關(guān)于(yú)PLL的(de)使用(yòng)詳细(xì)介紹請看(kàn)下(xià)方(fāng)鍊(liàn)接:
1.3 ROM模块(kuài)設計(jì)
1.3.1接口(kǒu)信(xìn)号(hào)
1.3.2設計(jì)思(sī)路(lù)
本(běn)模块(kuài)主(zhǔ)要(yào)用(yòng)于(yú)存儲需要(yào)顯示的(de)图(tú)像數據(jù),關(guān)于(yú)ROM的(de)使用(yòng)詳细(xì)介紹請查看(kàn)IP核右(yòu)上(shàng)角(jiǎo)數據(jù)手(shǒu)册“Documentation”。
1.4 LCD驅動(dòng)模块(kuài)設計(jì)
1.4.1接口(kǒu)信(xìn)号(hào)
|
信(xìn)号(hào)名
|
|
|
|
|
|
|
|
模块(kuài)工作时(shí)鐘(zhōng) 40MHz
|
|
|
|
|
系(xì)統複位信(xìn)号(hào),低電(diàn)平有(yǒu)效
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LCD 數據(jù)輸入(rù)使能(néng)信(xìn)号(hào)
|
|
|
|
|
LCD RGB信(xìn)号(hào),RGB格式为(wèi)使用(yòng)24位来(lái)表(biǎo)示一(yī)个(gè)像素,RGB分(fēn)量(liàng)都用(yòng)8位表(biǎo)示,取(qǔ)值範圍为(wèi)0-255。
|
|
|
|
|
LCD 數據(jù)采樣(yàng)时(shí)鐘(zhōng)
|
1.4.2設計(jì)思(sī)路(lù)
産生(shēng)驅動(dòng)LCD顯示的(de)行场时(shí)序信(xìn)号(hào),其計(jì)數器架構如(rú)下(xià)图(tú)所(suǒ)示:
行計(jì)數器h_cnt:該計(jì)數器用(yòng)来(lái)計(jì)算行同(tóng)步信(xìn)号(hào)的(de)幀长。加一(yī)条(tiáo)件(jiàn)为(wèi)1,表(biǎo)示一(yī)直(zhí)在(zài)計(jì)數。結束(shù)条(tiáo)件(jiàn)为(wèi)數1056个(gè),也(yě)就(jiù)是(shì)一(yī)行有(yǒu)1056个(gè)像素。
场計(jì)數器v_cnt:該計(jì)數器用(yòng)来(lái)計(jì)算场同(tóng)步信(xìn)号(hào)的(de)幀长。加一(yī)条(tiáo)件(jiàn)为(wèi)end_h_cnt,即行計(jì)數器的(de)計(jì)數器的(de)結束(shù)条(tiáo)件(jiàn),表(biǎo)示每計(jì)數完一(yī)行像素就(jiù)加一(yī)。結束(shù)条(tiáo)件(jiàn)为(wèi)數525个(gè),也(yě)就(jiù)是(shì)一(yī)共(gòng)有(yǒu)525行像素。
其中(zhōng),在(zài)從存儲图(tú)像“E”的(de)ROM里(lǐ)读(dú)取(qǔ)數據(jù)的(de)时(shí)候,有(yǒu)一(yī)个(gè)操作就(jiù)是(shì)读(dú)取(qǔ)的(de)地(dì)址從第(dì)8位開(kāi)始,也(yě)就(jiù)是(shì)说(shuō)18位數據(jù)地(dì)址,低三(sān)位不(bù)读(dú),读(dú)取(qǔ)的(de)是(shì)e_rom_addr[16:3]。有(yǒu)这(zhè)樣(yàng)一(yī)个(gè)操作的(de)話(huà)就(jiù)能(néng)实現(xiàn)对(duì)存儲的(de)图(tú)像進(jìn)行8倍的(de)放(fàng)大顯示。
1.4.3參考代(dài)碼
-
module lcd_driver(
-
clk ,//40MHz
-
rst_n ,
-
-
hys ,
-
vys ,
-
lcd_de ,
-
lcd_rgb ,
-
lcd_dclk
-
);
-
-
input clk ;
-
input rst_n ;
-
-
output hys ;
-
output vys ;
-
output lcd_de ;
-
output [23:0] lcd_rgb ;
-
output lcd_dclk ;
-
-
reg hys ;
-
reg vys ;
-
reg lcd_de ;
-
reg [23:0] lcd_rgb ;
-
wire lcd_dclk ;
-
-
//1056
-
parameter THPW = 20 ;
-
parameter THB = 46 ;
-
parameter THD = 800 ;
-
parameter THFP = 210 ;
-
-
//525
-
parameter TVPW = 10 ;
-
parameter TVB = 23 ;
-
parameter TVD = 480 ;
-
parameter TVFP = 22 ;
-
-
parameter HDE_CENTRE = THD/2 ;//400
-
parameter VDE_CENTRE = TVD/2 ;//240
-
-
parameter LOGO_X0 = (0 + (THB-1)) ;
-
parameter LOGO_X1 = (120 + (THB-1)) ;
-
parameter LOGO_Y0 = (0 + (TVB-1)) ;
-
parameter LOGO_Y1 = (55 + (TVB-1)) ;
-
-
parameter E_X0 = ((HDE_CENTRE-200) + (THB-1)) ;
-
parameter E_X1 = ((HDE_CENTRE+200) + (THB-1)) ;
-
parameter E_Y0 = ((VDE_CENTRE-150) + (TVB-1)) ;
-
parameter E_Y1 = ((VDE_CENTRE+150) + (TVB-1)) ;
-
-
reg [ 10:0] h_cnt ;
-
wire add_h_cnt ;
-
wire end_h_cnt ;
-
reg [ 9:0] v_cnt ;
-
wire add_v_cnt ;
-
wire end_v_cnt ;
-
-
-
wire active_area ;
-
reg logo_rom_area ;
-
reg [15:0] logo_rom_addr ;
-
wire [7:0] logo_rom_data ;
-
reg e_rom_area ;
-
reg [17:0] e_rom_addr ;
-
wire [7:0] e_rom_data ;
-
reg [2:0] e_rom_addr_low ;
-
reg e_sel ;
-
-
-
-
always @(posedge clk or negedge rst_n) begin
-
if (rst_n==0) begin
-
h_cnt <= 0;
-
end
-
else if(add_h_cnt) begin
-
if(end_h_cnt)
-
h_cnt <= 0;
-
else
-
h_cnt <= h_cnt+1 ;
-
end
-
end
-
assign add_h_cnt = 1;
-
assign end_h_cnt = add_h_cnt && h_cnt == (THB + THD + THFP)-1 ;
-
-
-
-
always @(posedge clk or negedge rst_n) begin
-
if (rst_n==0) begin
-
v_cnt <= 0;
-
end
-
else if(add_v_cnt) begin
-
if(end_v_cnt)
-
v_cnt <= 0;
-
else
-
v_cnt <= v_cnt+1 ;
-
end
-
end
-
assign add_v_cnt = end_h_cnt;
-
assign end_v_cnt = add_v_cnt && v_cnt == (TVB + TVD + TVFP)-1 ;
-
-
/*******************************************************/
-
//dclk
-
assign lcd_dclk = clk;
-
-
//hsync
-
always @(posedge clk or negedge rst_n)begin
-
if(rst_n==1'b0)begin
-
hys <= 0;
-
end
-
else if(add_h_cnt && h_cnt==THPW-1)begin
-
hys <= 1;
-
end
-
else if(end_h_cnt)begin
-
hys <= 0;
-
end
-
end
-
-
-
//vsync
-
always @(posedge clk or negedge rst_n)begin
-
if(rst_n==1'b0)begin
-
vys <= 0;
-
end
-
else if(add_v_cnt && v_cnt==TVPW-1)begin
-
vys <= 1;
-
end
-
else if(end_v_cnt)begin
-
vys <= 0;
-
end
-
end
-
-
-
//lcd_de
-
always @(posedge clk or negedge rst_n)begin
-
if(rst_n==1'b0)begin
-
lcd_de <= 0;
-
end
-
else if(active_area)begin
-
lcd_de <= 1;
-
end
-
else begin
-
lcd_de <= 0;
-
end
-
end
-
-
-
/********************************************************************/
-
-
-
-
assign active_area = h_cnt>=(THB-1) && h_cnt<(THB+THD-1) && v_cnt>=(TVB-1) && v_cnt<(TVB+TVD-1);
-
-
-
always @(*)begin
-
logo_rom_area = h_cnt >=LOGO_X0 && h_cnt < LOGO_X1 && v_cnt >= LOGO_Y0 && v_cnt < LOGO_Y1;
-
end
-
-
always @(*)begin
-
e_rom_area = h_cnt >=E_X0 && h_cnt < E_X1 && v_cnt >= E_Y0 && v_cnt < E_Y1;
-
end
-
-
-
-
always @(posedge clk or negedge rst_n)begin
-
if(rst_n==1'b0)begin
-
lcd_rgb <= 0;
-
end
-
else if(active_area)begin
-
if(logo_rom_area)
-
lcd_rgb <= {logo_rom_data[7:5],5'b11111,logo_rom_data[4:2],5'b11111,logo_rom_data[1:0],6'b111111};
-
else if(e_rom_area)
-
lcd_rgb <= {24{e_sel}};
-
else
-
lcd_rgb <= {24{1'b1}};
-
end
-
else begin
-
lcd_rgb <=0;
-
end
-
end
-
-
-
-
-
always @(*)begin
-
logo_rom_addr = (h_cnt-LOGO_X0) + 120*(v_cnt-LOGO_Y0);
-
end
-
-
always @(*)begin
-
e_rom_addr = (h_cnt-E_X0) + 400*(v_cnt-E_Y0);
-
end
-
-
-
-
always @(posedge clk or negedge rst_n)begin
-
if(rst_n==1'b0)begin
-
e_rom_addr_low <= 0;
-
end
-
else begin
-
e_rom_addr_low <= e_rom_addr[2:0];
-
end
-
end
-
-
-
always @(*)begin
-
e_sel = ~e_rom_data[7-e_rom_addr_low];
-
end
-
-
-
fpga_rom u_fpga_rom(
-
.address (logo_rom_addr),
-
.clock (clk ),
-
.q (logo_rom_data));
-
-
e_rom u_e_rom(
-
.address (e_rom_addr[16:3] ),
-
.clock (clk ),
-
.q (e_rom_data ));
-
-
-
endmodule
1.5 效果(guǒ)和(hé)總(zǒng)結
以(yǐ)下(xià)为(wèi)工程上(shàng)板後(hòu)的(de)現(xiàn)象(xiàng)效果(guǒ)图(tú):
mp801開(kāi)發(fà)板
ms980試验(yàn)箱