本文為明德揚原創文章,轉載請注明出處!1.1 總體設計
1.1.1 概述
液晶顯示器是一-種通過液晶和色彩過濾器過濾光源,在平面面板上產生圖像的數字顯示器。LCD 的構造是在兩片平行的玻璃基板當中放置液晶盒,下基板玻璃上設置薄膜晶體管,.上基板玻璃上設置彩色濾光片,通過薄膜晶體管上的信號與電壓改變來控制液晶分子的轉動方向,從而達到控制每個像素點偏振光出射與否而達到顯示目的。與傳統的陰極射線管相比,LCD具有占用空間小,低功耗,低輻射,無閃爍,降低視覺疲勞等優點。現在LCD已漸替代CRT成為主流,價格也已經下降了很多,并已充分的普及。本設計的主要任務是基于FPGA的LCD顯示控制器設計,兼顧程序的易用性,方便此后模塊的移植和應用。采用VHDL硬件描述語言在QUARTUS II軟件平臺上實現FPGA對LCD的控制,在LCD模塊上實現任意彩色圖片的顯示,與此同時還須實現實時刷新數據的功能。這將有助于采用FPGA的系列產品的開發,特別是需要用到LCD而采用FPGA的產品的開發。不但縮短了FPGA的開發周期,也使更多采用FPGA設計的產品上出現LCD,增加了人機之間的交互性。
1.1.2 設計目標
此設計通過fpga給lcd發送圖片信息,然后直接在LCD顯示矩形動畫,矩形的寬從2變化到600,矩形的高從2變化到400
1.1.3信號列表
1.1.4 設計思路
設計行顯示時序段和場顯示時序段,來確定矩形邊框的寬度,根據各種顏色的數值來確定lcd顯示屏顯示出的邊框顏色行時鐘計數器cnt_hys:用來計算行同步信號的幀長,加一條件是1,結束條件為數到1056個像素就結束場時鐘計數器cnt_vys:用來計算場同步信號的幀長,加一條件是場信號每數到1056個像素(即為一行結束的時刻),結束條件為數到525行就結束
1.1.5參考代碼
- module mdyLcdDispDynaRect(
- clk_50m ,
- rst_n ,
-
- lcd_hsync ,
- lcd_vsync ,
- lcd_de ,
-
-
- lcd_rgb ,
- lcd_dclk
- );
-
- input clk_50m ;
- input rst_n ;
- output lcd_hsync ;
- output lcd_vsync ;
- output lcd_de ;
-
- output [23:0] lcd_rgb ;
- output lcd_dclk ;
-
- reg [30:0] h ;
- reg [30:0] v ;
- reg lcd_hsync ;
- reg lcd_vsync ;
-
- reg [23:0] lcd_rgb ;
-
-
- parameter LINE_PR = 1056 ;
- parameter FRAME_PER = 525 ;
-
-
- parameter H_SYNC = 20 ;
- parameter V_SYNC = 10 ;
-
- parameter HDE_START = 46 ;
- parameter HDE_END = 846 ;
- parameter VDE_START = 23 ;
- parameter VDE_END = 503 ;
-
-
- reg [12:0] cnt_hsy ;
- reg [12:0] cnt_vsy ;
- reg hsync_de ;
- reg vsync_de ;
-
- wire display_area ;
- wire e_area ;
- wire add_cnt_hsy ;
- wire end_cnt_hsy ;
- wire add_cnt_vsy ;
- wire end_cnt_vsy ;
- reg [ 7:0] cnt0 ;
- wire add_cnt0 ;
- wire end_cnt0 ;
- reg [15:0] cnt1 ;
- wire add_cnt1 ;
- wire end_cnt1 ;
-
-
- assign clk = clk_50m ;
- assign lcd_dclk = ~ clk_50m ;
- assign lcd_de = hsync_de & vsync_de ;
-
-
- always @ (posedge clk or negedge rst_n)begin
- if(!rst_n)begin
- cnt_hsy <= 0;
- end
- else if(add_cnt_hsy)begin
- if(end_cnt_hsy)
- cnt_hsy <= 0;
- else
- cnt_hsy <= cnt_hsy + 1;
- end
- end
- assign add_cnt_hsy = 1;
- assign end_cnt_hsy = add_cnt_hsy && cnt_hsy == LINE_PR -1;
-
- always @ (posedge clk or negedge rst_n)begin
- if(!rst_n)begin
- cnt_vsy <= 0;
- end
- else if(add_cnt_vsy)begin
- if(end_cnt_vsy)
- cnt_vsy <= 0;
- else
- cnt_vsy <= cnt_vsy + 1;
- end
- end
- assign add_cnt_vsy = end_cnt_hsy;
- assign end_cnt_vsy = add_cnt_vsy && cnt_vsy == FRAME_PER - 1;
-
- always @ (posedge clk or negedge rst_n)begin
- if(!rst_n)begin
- lcd_hsync <= 1'b0 ;
- end
- else if(end_cnt_hsy)begin
- lcd_hsync <= 1'b0;
- end
- else if(add_cnt_hsy && cnt_hsy == H_SYNC-1 )begin
- lcd_hsync <= 1'b1;
- end
- end
-
- always @ (posedge clk or negedge rst_n)begin
- if(!rst_n)begin
- hsync_de <= 1'b0;
- end
- else if(add_cnt_hsy && cnt_hsy == HDE_START-1)begin
- hsync_de <= 1'b1;
- end
- else if(add_cnt_hsy && cnt_hsy == HDE_END-1)begin
- hsync_de <= 1'b0;
- end
- end
-
- always @ (posedge clk or negedge rst_n)begin
- if(!rst_n)begin
- lcd_vsync <= 1'b0 ;
- end
- else if(add_cnt_vsy && cnt_vsy == V_SYNC-1 )begin
- lcd_vsync <= 1'b1;
- end
- else if(end_cnt_vsy)begin
- lcd_vsync <= 1'b0;
- end
-
- end
-
- always @ (posedge clk or negedge rst_n)begin
- if(!rst_n)begin
- vsync_de <= 1'b0;
- end
- else if(add_cnt_vsy && cnt_vsy == VDE_START-1)begin
- vsync_de <= 1'b1;
- end
- else if(add_cnt_vsy && cnt_vsy ==VDE_END-1)begin
- vsync_de <= 1'b0;
- end
- end
-
-
- assign display_area = hsync_de && vsync_de;
-
-
- assign blue_area = (cnt_hsy >= HDE_START + 400-h) && (cnt_hsy<HDE_START+400+h) &&
- (cnt_vsy >= VDE_START + 240-v) && (cnt_vsy<VDE_START+240+v) ;
-
-
- always @(posedge clk or negedge rst_n)begin
- if(rst_n==1'b0)begin
- h<=1;
- end
- else if(end_cnt_vsy && h<300)begin
- h<=h+2;
- end
- end
-
- always @(posedge clk or negedge rst_n)begin
- if(rst_n==1'b0)begin
- v<=1;
- end
- else if(end_cnt_vsy && v<200)begin
- v<=v+1;
- end
- end
-
-
- always @ (posedge clk or negedge rst_n)begin
- if(!rst_n)begin
- lcd_rgb <= 0;
- end
- else if(display_area)begin
- if(blue_area)begin
- lcd_rgb <= 24'h00_00_ff ;
- end
- else begin
- lcd_rgb <= 24'hff_ff_ff ;
- end
- end
- else begin
- lcd_rgb <= 0;
- end
- end
-
-
-
- endmodule
復制代碼
1.2 效果和總結
本案例我們設計了藍色的矩形,藍色矩形的場信號是從2行變到400行、行信號是從2個像素變到600個像素;在這個設計案例中,至簡設計法和明德揚計數器模板發揮了至關重要的作用,使我能夠快速準確完成設計。希望有興趣的同學可以運用至簡設計法和明德揚模板嘗試一下拓展設計哦。
設計教學視頻和工程源代碼,請到明德揚論壇(www.fpgabbs.cn)學習:http://www.fpgabbs.cn/thread-1156-1-1.html