<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 屏幕保護系統設計

屏幕保護系統設計

作者: 時(shí)間:2023-12-18 來(lái)源:電子森林 收藏
  • 任務(wù):基于底板 完成設計并觀(guān)察調試結果
  • 要求:通過(guò)底板上的VGA接口驅動(dòng)液晶顯示器在800×600@60Hz的模式下顯示,實(shí)現經(jīng)典屏幕保護的界面效果,讓小腳丫Logo不斷反彈移動(dòng)。
  • 解析:將小腳丫Logo取模得到128×128像素的圖片數據,通過(guò)FPGA編程驅動(dòng)VGA液晶顯示器,實(shí)現現經(jīng)典屏幕保護的界面效果。

在圖片顯示系統實(shí)驗中我們學(xué)習過(guò)圖片取模的方法,根據取模數據創(chuàng )建ram模塊,本實(shí)驗我們要學(xué)習VGA接口液晶顯示器的驅動(dòng)原理及方法,結合圖片ram數據,最終實(shí)現的總體設計。VGA接口顯示有固定的模式,本實(shí)驗800×600@60Hz模式需要40MHz的時(shí)鐘主頻,可以按照簡(jiǎn)易電壓表實(shí)驗中的方法例化PLL的IP核實(shí)現。

本文引用地址:http://dyxdggzs.com/article/202312/453983.htm
  • 了解VGA接口時(shí)序及相關(guān)原理
  • 學(xué)習VGA接口驅動(dòng)方法,完成VGA驅動(dòng)設計
  • 完成設計實(shí)現

根據前面的實(shí)驗解析我們可以得知,該設計總體可以拆分成如下功能模塊實(shí)現,

  • pll:pll IP核模塊例化,倍頻產(chǎn)生40MHz VGA主頻時(shí)鐘
  • VgaModule:VGA接口驅動(dòng)模塊,屏保顯示控制 * steprom:圖片取模數據存儲器

Top-Down層次設計

 

模塊結構設計

VGA接口介紹

VGA(Video Graphics Array)是IBM在1987年隨PS/2機一起推出的一種視頻傳輸標準,具有分辨率高、顯示速率快、顏色豐富等優(yōu)點(diǎn),在彩色顯示器領(lǐng)域得到了廣泛的應用,VGA接口定義如下:

VGA接口(左側為公口,右側為母口)

VGA接口定義如下:

VGA接口定義

一個(gè)標準的VGA接口硬件連接應該有以下端口:

  • 紅綠藍三色信號(RGB)
  • 行場(chǎng)同步信號(HSVS)

其中三色信號(RGB)都是模擬信號,行場(chǎng)同步信號(HSVS)都是數字信號。

對于VGA的接口模擬電壓(RGB),為0~0.714V范圍峰峰值,0代表無(wú)色,0.714代表滿(mǎn)色,一些非標準的顯示器使用的是1Vpp的滿(mǎn)色電平。三基色信號源端和終端匹配電阻均為75歐姆,如下圖所示:

VGA三基色匹配電阻示意

FPGA為數字邏輯器件,想要得到0~0.714V范圍電壓主要有兩種方法,DAC轉換方式和電阻分壓方式,我們的擴展板卡上就是采用的電阻分壓的方式,因VGA顯示器端有75歐的下拉電阻,為了得到0.714V的電壓我們給RGB信號線(xiàn)上串入270歐姆的電阻,3.3V*75/(270+75)=0.717V。如下圖所示:

VGA電阻分壓方式示意

當FPGA驅動(dòng)輸出高電平(3.3V)時(shí),模擬分壓為0.714V,為滿(mǎn)色,當FPGA驅動(dòng)輸出低電平(0V)時(shí),模擬分壓為0V,為無(wú)色,這樣RGB三基色都對應兩種狀態(tài)輸出,共有2^3=8種顏色輸出。

VGA 接口時(shí)序是對其實(shí)現驅動(dòng)與控制的關(guān)鍵所在,也是難點(diǎn)所在。難不光難在時(shí)序的產(chǎn)生,更多的是在于處理速度上的問(wèn)題。VGA掃描顯示其實(shí)就是兩條線(xiàn),一個(gè)是行掃描,一個(gè)是場(chǎng)掃描,在行有效和場(chǎng)有效的時(shí)候把數據發(fā)送給VGA即可顯示了。顯示標準就是行分辨率x列分辨率@60hz即一秒屏幕刷新60次,以800×600@60Hz模式為例,即行為800個(gè)像素,場(chǎng)為600個(gè)像素。

VGA 800×600@60Hz模式示意

顯示器掃描一般采用逐行掃描的方式實(shí)現:逐行掃描是掃描從屏幕左上角一點(diǎn)開(kāi)始,從左像右逐點(diǎn)掃描,每掃描完一行,電子束回到屏幕的左邊下一行的起始位置,在這期間,CRT對電子束進(jìn)行消隱,行與行之間的返回過(guò)程稱(chēng)為水平消隱,也稱(chēng)行消隱(HBlank),每行結束時(shí),用行同步信號進(jìn)行同步;當掃描完所有的行,形成一幀,掃描點(diǎn)掃描完一幀后,要從圖像的右下角返回到圖像的左上角,開(kāi)始新一幀的掃描,這一時(shí)間間隔,叫做垂直消隱,也稱(chēng)場(chǎng)消隱(VBlank),用場(chǎng)同步信號進(jìn)行場(chǎng)同步。

VGA行場(chǎng)消隱示意

VGA掃描時(shí)序圖

VGA顯示常用模式列舉如下:

VGA顯示模式

VGA模塊硬件連接

以下是底板上的VGA模塊電路,其電路圖如下:

VGA模塊電路

底板上的VGA顯示電路與1.8寸串行彩色液晶屏電路復用部分FPGA管腳,兩者不能同時(shí)使用,當使用VGA接口模塊電路時(shí),FPGA直接驅動(dòng)VGA接口完成VGA液晶顯示器控制即可。VGA硬件采用電阻分壓方式連接,每個(gè)基色智能顯示無(wú)色或滿(mǎn)色,所以顯示效果最多有2^3=8種顏色顯示(包含黑色)。

VGA模塊驅動(dòng)設計

端口列表中三基色控制管腳定義為vga[2:0],高位到低位依次接紅綠藍,那么8中顏色對應的數據如下:

output reg [2:0] vga;    // vga,MSB~LSB = {R,G,B}
localparam  RED = 3'b100, GREEN = 3'b010, BLUE = 3'b001;
localparam  YELLOW = 3'b110, CYAN = 3'b011, PURPLE = 3'b101;
localparam  WHITE = 3'b111, BLACK = 3'b000;

本實(shí)驗使用800×600@60Hz的VGA顯示模式,首先將該VGA顯示模式下的參數定義,在40MHz的主頻下,參數如下:

水平方向


同步脈沖 Thp后廊 Thb有效線(xiàn)數 Thd前廊 Thf
1288880040

垂直方向


同步脈沖 Thp后廊 Thb有效線(xiàn)數 Thd前廊 Thf
4236001

將參數定義,更改VGA顯示模式時(shí),只需要更改下面參數,參數定義如下:

//-- Horizonal timing information
`define HSYNC_A   16'd128   // 128
`define HSYNC_B   16'd216   // 128 + 88
`define HSYNC_C   16'd1016  // 128 + 88 + 800
`define HSYNC_D   16'd1056  // 128 + 88 + 800 + 40
//-- Vertical  timing information
`define VSYNC_O   16'd4     // 4 
`define VSYNC_P   16'd27    // 4 + 23
`define VSYNC_Q   16'd627   // 4 + 23 + 600
`define VSYNC_R   16'd628   // 4 + 23 + 600 + 1

根據VGA掃描的時(shí)序,在40MHz主頻時(shí)鐘下,每一行需要1056個(gè)主頻時(shí)鐘周期的時(shí)間,而每一幀需要628行掃描時(shí)間,我們定義兩個(gè)計數器,分別對主頻時(shí)鐘和行掃描進(jìn)行計數,程序實(shí)現如下:

reg [15:0] x_cnt,y_cnt;
always @ (posedge clk or negedge rst_n)  // Count for HSYNC
    if(!rst_n) x_cnt <= 16'd1;
    else if(x_cnt == `HSYNC_D) x_cnt <= 16'd1;else x_cnt <= x_cnt + 1'b1; 
    always @ (posedge clk or negedge rst_n) // Count for VSYNC
    if(!rst_n) y_cnt <= 16'd1;
    else if(x_cnt == `HSYNC_D) begin
        if(y_cnt == `VSYNC_R) y_cnt <= 16'd1;
        else y_cnt <= y_cnt + 1'b1;
    end else y_cnt <= y_cnt;

當行計數器xcnt計數到1056且場(chǎng)計數器ycnt計數到628時(shí),就是VGA掃描一幀的時(shí)間,行計數和場(chǎng)計數開(kāi)始的時(shí)候為同步信號,行場(chǎng)同步信號端口輸出,根據時(shí)序要求程序實(shí)現如下:

output  reg         sync_v;     // sync_v
output  reg         sync_h;     // sync_h 
always @ (posedge clk or negedge rst_n) // HSYNC signal
    if(!rst_n) sync_h <= 1'b1;
    else if(x_cnt <= `HSYNC_A) sync_h <= 1'b0;
    else sync_h <= 1'b1;  
    always @ (posedge clk or negedge rst_n) // VSYNC signal
    if(!rst_n) sync_v <= 1'b1;
    else if(y_cnt <= `VSYNC_O) sync_v <= 1'b0;
    else sync_v <= 1'b1;

行同步和場(chǎng)同步的信號有了,接下來(lái)就是三基色數據的控制了,如果整個(gè)掃描過(guò)程中三基色端口一直輸出紅色數據,那么我們就可以看到整個(gè)顯示器顯示紅色,整個(gè)掃描過(guò)程分為消隱區和顯示區,只有在顯示區的數據才能顯示出來(lái),落在消隱區的顏色數據沒(méi)有任何意義,顯示區就是當行場(chǎng)計數器都在對應有效線(xiàn)數的區間。即是說(shuō),如果我們讓三基色端口只在行計數器xcnt計數在216~1056之間且場(chǎng)計數器ycnt計數在27~627之間時(shí)輸出紅色數據,依然可以看到整個(gè)顯示器顯示紅色。

圖片坐標軌跡區間

屏幕保護實(shí)驗需要小腳丫Logo圖片顯示并反彈移動(dòng),圖片顯示在液晶顯示器上我們需要知道圖片所在顯示區的坐標,圖片寬度和高度已知,我們以圖片左上角的像素點(diǎn)作為基點(diǎn),就可以知道圖片ram數據中每個(gè)數據對應的坐標,假設我們知道了圖片基點(diǎn)的坐標為(xset,yset)。圖片的顯示程序實(shí)現如下:

注:這里講的坐標是是以行計數器xcnt和場(chǎng)計數器ycnt為基準的。

`define P_WIDTH 8'd128  // 圖片像素的水平寬度
`define P_DEPTH 8'd128  // 圖片像素的垂直高度
always @ (posedge clk or negedge rst_n) // rom address
    if(!rst_n) rom_addr <= 1'b0;
    else if((x_cnt>=x_set)&(x_cnt<(x_set+`P_WIDTH))&(y_cnt>=y_set)&(y_cnt<(y_set+`P_DEPTH)))
        rom_addr <= y_cnt - y_set;else rom_addr <= rom_addr; 
        always @ (posedge clk or negedge rst_n) // rom data display
    if(!rst_n) vga <= BLACK;
    else if((x_cnt>=x_set)&(x_cnt<(x_set+`P_WIDTH))&(y_cnt>=y_set)&(y_cnt<(y_set+`P_DEPTH)))
        if(rom_data[x_cnt - x_set]) vga <= color;
        else vga <= BLACK;
    else vga <= BLACK;

圖片可能顯示在屏幕的任何位置,那么基點(diǎn)(xset,yset)的移動(dòng)軌跡范圍為上圖中紅色虛線(xiàn)框區域,只要控制基點(diǎn)移動(dòng)和反彈就可以實(shí)現圖片的移動(dòng)和反彈,這里需要考慮兩個(gè)參數:移動(dòng)速度和反彈方向。

移動(dòng)速度

移動(dòng)速度就是基點(diǎn)(xset,yset)變化的速度,我們設置一個(gè)計數器延遲來(lái)控制基點(diǎn)的變化速度,cnt的計數周期為2^19 * 1000ms / 12000000 = 44ms,基點(diǎn)坐標每秒移動(dòng)次數為1s / 44ms = 23次,計數程序實(shí)現如下:

reg         [18:0]  cnt;
always @ (posedge clk or negedge rst_n)  // delay count
    if(!rst_n) cnt <= 1'b0;
    else cnt <= cnt + 1'b1;

反彈方向

屏幕保護圖片碰到顯示器邊沿會(huì )反彈,反彈效果同鏡面反射一樣,與邊沿平行方向不變,垂直方向反向,所以行方向和場(chǎng)方向的反彈控制是相互獨立的,實(shí)現方法相同,這里我們以行(水平)方向的控制為例,程序實(shí)現如下:

always @ (posedge clk or negedge rst_n) //水平方向反彈標志
    if(!rst_n) x_flag <= 1'b1;
    else if(x_set == `HSYNC_B) x_flag <= 1'b1; 
    else if(x_set == (`HSYNC_C - `P_WIDTH)) x_flag <= 1'b0;
    else x_flag <= x_flag; 
    always @ (posedge clk or negedge rst_n) //根據水平方向反彈標志移動(dòng)基點(diǎn)
    if(!rst_n) x_set <= `HSYNC_B;
    else if(!cnt)  //控制基點(diǎn)行坐標x_set的變化速度
        if(x_flag) x_set <= x_set + 1'b1; //根據水平方向反彈標志移動(dòng)基點(diǎn) 
        else x_set <= x_set - 1'b1;
    else x_set <= x_set;

系統總體實(shí)現

例化pll IP核得到40MHz時(shí)鐘信號,提供給VGA驅動(dòng)模塊做時(shí)鐘信號,例化配置方法在簡(jiǎn)易電壓表實(shí)驗中有講解,這里不再重復。

屏幕保護圖片數據的ram模塊,提供小腳丫Logo圖片數據,圖片顯示系統實(shí)驗中也有相關(guān)內容,調整一下圖像分辨率的寬度和高度就可以直接使用。

綜合后的設計框圖如下:

RTL設計框圖

  1. 雙擊打開(kāi)Quartus Prime工具軟件;
  2. 新建工程:File → New Project Wizard(工程命名,工程目錄選擇,設備型號選擇,EDA工具選擇);
  3. 新建文件:File → New → Verilog HDL File,鍵入設計代碼并保存;
  4. 設計綜合:雙擊Tasks窗口頁(yè)面下的Analysis & Synthesis對代碼進(jìn)行綜合;
  5. 管腳約束:Assignments → Assignment Editor,根據項目需求分配管腳;
  6. 設計編譯:雙擊Tasks窗口頁(yè)面下的Compile Design對設計進(jìn)行整體編譯并生成配置文件;
  7. 程序燒錄:點(diǎn)擊Tools → Programmer打開(kāi)配置工具,Program進(jìn)行下載;
  8. 觀(guān)察設計運行結果。

將程序加載到FPGA中,使用VGA線(xiàn)連接液晶顯示器和FPGA底板,觀(guān)察顯示現象。小腳丫Logo圖片在顯示屏上移動(dòng),到達邊沿后反彈,每次反彈都會(huì )顏色改變,共有6中顏色。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>