【從零開(kāi)始走進(jìn)FPGA】 玩轉VGA

發(fā)布時(shí)間:2016-1-29 10:23    發(fā)布者:designapp
關(guān)鍵詞: VGA , FPGA
  一、VGA的誘惑
  首先,VGA的驅動(dòng),這事,一般的單片機是辦不到的;由于FPGA的速度,以及并行的優(yōu)勢,加上可現場(chǎng)配置的優(yōu)勢,VGA的配置,只有俺們FPGA可以勝任,也只有FPGA可以隨心所欲地配置(當然ARM也可以,應用比較高吧)。
  初學(xué)者就是喜歡看炫的效果,往往會(huì )忍不住想玩。尤其玩FPGA的,沒(méi)玩VGA就感到跟單片機沒(méi)啥提升,因此VGA的驅動(dòng)也不得不講。Bingo當年也是如此。擋不住VGA的誘惑,初學(xué)者問(wèn)Bingo VGA問(wèn)題的人也是灰常的多,也許一般教科書(shū)理論太強,實(shí)際應用不是很身后,在此Bingo用淺顯易懂的語(yǔ)言來(lái)講述VGA的驅動(dòng)原理,以及通過(guò)設計一個(gè)可移植模塊的應用來(lái)講述。
  二、VGA驅動(dòng)原理
  此處Bingo不參考任何資料,用當年已學(xué)的知識,用淺顯易懂的語(yǔ)言講述。
  1、VGA接口
  


  最主要的幾根線(xiàn):
  


  更詳細的資料,請看 http://baike.baidu.com/view/10346.htm
  2、VGA時(shí)序
  VGA其實(shí)就是相當于一塊芯片,跟單片機驅動(dòng)IC一樣,滿(mǎn)足一定的時(shí)序,便能驅動(dòng)起來(lái)。
  (1)掃描軌跡
  VGA的掃描其實(shí)很簡(jiǎn)單,大致軌跡如下所示:
  


  沒(méi)掃描完一行,從新開(kāi)始下一行;每掃完一場(chǎng),重新開(kāi)始下一場(chǎng)。相信你應該看的懂。
  (2)行場(chǎng)掃描
  以下是行掃描,場(chǎng)掃描HS,VS時(shí)序圖
  


  如上如所示:VGA一直在掃描,沒(méi)一場(chǎng)的掃描包括了若干行掃描,如此循環(huán)。
  (3)VS時(shí)序深入分析
  VS時(shí)序如下所示:
  


  可見(jiàn)時(shí)序的循環(huán),可被劃分為a,b,c,d4個(gè)時(shí)期。這四個(gè)時(shí)期定義如下:
  A~B:場(chǎng)消隱期 即同步,相當于還原掃描坐標吧
  B~C:場(chǎng)消隱后肩 相當于準備開(kāi)始掃描吧
  C~D:場(chǎng)顯示期 掃描中,數據有效區域
  D~E:場(chǎng)消隱前肩 完成掃描,相當于準備同步
  (4)HS時(shí)序深入分析
  可見(jiàn)時(shí)序的循環(huán),可被劃分為a,b,c,d4個(gè)時(shí)期。這四個(gè)時(shí)期定義如下:
  A~B:行消隱期 即同步,相當于還原掃描坐標吧
  B~C:行消隱后肩 相當于準備開(kāi)始掃描吧
  C~D:行顯示期 掃描中,數據有效區域
  D~E:行消隱前肩 完成掃描,相當于準備同步
  


  綜上描述,我們只要知道每個(gè)時(shí)期的時(shí)間,便可以表示出VGA的時(shí)序。而FPGA的工作是由固定頻率的時(shí)鐘觸發(fā)的,因此某固定時(shí)間可以用n次觸發(fā)來(lái)表示。因此我們很容易就想到了FPGA常用的計數方法:比如說(shuō)行掃描,我們計數0~H_total-1。用另一個(gè)進(jìn)程將其劃分為4個(gè)時(shí)期,安標注分配。其實(shí)這相當于狀態(tài)機。
  以下是固定分辨率1024*768 60fps下HS,VS的標準:
  


  用代碼表示4個(gè)時(shí)期,如下:
  // VGA_1024_768_60fps_65MHz
  // Horizontal Parameter( Pixel )
  parameter H_DISP = 11'd1024,
  parameter H_FRONT = 11'd24,
  parameter H_SYNC = 11'd136,
  parameter H_BACK = 11'd160,
  parameter H_TOTAL = 11'd1344,
  // Virtical Parameter( Line )
  parameter V_DISP = 10'd768,
  parameter V_FRONT = 10'd3,
  parameter V_SYNC = 10'd6,
  parameter V_BACK = 10'd29,
  parameter V_TOTAL = 10'd806
  3、VGA電路
  (1)三原色
  VGA接口:R,G,B三通道,直接賦給數字信號,RGB,最多產(chǎn)生8種色彩。這是最基本的。電路如下所示:
  


  (2)真彩顯示
  a) 電阻網(wǎng)絡(luò )
  考慮到成本意識實(shí)現的簡(jiǎn)易方案,用R-2R電阻網(wǎng)絡(luò )分流模擬DAC替換ADV7123視頻轉換芯片。見(jiàn)以下幾個(gè)方案:
  


  DE1 VGA模擬電路
  


  小馬哥電路圖
  具體設計參考Bingo當年總結:
  http://www.cnblogs.com/crazybingo/archive/2010/07/31/1789323.html
  或者參考小馬哥設計:
  http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3582675&bbs_page_no=1&search_mode=2&search_text=VGA&bbs_id=9999
  b) 專(zhuān)用視頻轉換芯片
  利用專(zhuān)用視頻轉換芯片,ADV7120等,將數字信號轉換為VGA RGB的模擬信號。ADV7120為高速D/A芯片,將數字信號轉換為模擬信號輸給VGA,電路如下:
  


  三、可移植VGA模塊設計
  Bingo玩VGA也算是比較早了,當年也是視覺(jué)的誘惑,以及唯FPGA獨尊的優(yōu)勢。于是之后一發(fā)而不可收拾。本章Bingo將自己這些年最終優(yōu)化的VGA驅動(dòng)模塊,發(fā)布至此。本模塊所有代碼均Bingo獨家創(chuàng )造,請尊重版權哈。
  本設計已經(jīng)封裝成模塊,只要修改時(shí)序參數、掃描時(shí)鐘參數以及在vga_display.v中添加顯示電路,即可。方便移植,希望對大家有用。
  1、模塊劃分
  


  (1)vga_design.v
  工程頂層文件,例化各個(gè)模塊。
  (2)sys_ctrl.v
  PLL時(shí)鐘分配電路。
  (3)vga_display.v
  顯示電路,根據時(shí)序,用于描述VGA的顯示電路。
  (4)vga_driver.v
  VGA驅動(dòng)電路,對時(shí)序,狀態(tài)的約束。
  RTL圖如下所示:
  


                               
                2、代碼設計
  Bingo例程以16bit RGB VGA驅動(dòng)為例,不同位數的顯示只要改一下vga_data即可。
  前文以及代碼講述了那么多,此處不再貼完整代碼,而是對代碼中部分結構進(jìn)行解析。
  代碼下載地址:http://blog.chinaaet.com/detail/21606.html
  (1)vga_driver.v代碼分析
  a) 參數例化列表
  #(
  // VGA_1024_768_60fps_65MHz
  // Horizontal Parameter ( Pixel )
  parameter H_DISP = 11'd1024,
  parameter H_FRONT = 11'd24,
  parameter H_SYNC = 11'd136,
  parameter H_BACK = 11'd160,
  parameter H_TOTAL = 11'd1344,
  // Virtical Parameter ( Line )
  parameter V_DISP = 10'd768,
  parameter V_FRONT = 10'd3,
  parameter V_SYNC = 10'd6,
  parameter V_BACK = 10'd29,
  parameter V_TOTAL = 10'd806
  )
  這樣寫(xiě)的目的是為了軟件封裝性,能夠在例化的時(shí)候修改法分辨率,同時(shí)電路結構保持不變。
  DISP,FRONT ,SYNC,BACK,TOTAL分別為顯示期,消隱前肩,消音期,消隱后肩,總時(shí)間,各自對應各自的行場(chǎng)信號。
  b) 行同步信號設計
  //------------------------------------------
  // 行同步信號發(fā)生器
  reg [10:0] hcnt;
  always @ (posedge clk_vga or negedge rst_n)
  begin
  if (!rst_n)
  hcnt = H_DISP+H_FRONT-1'b1) && (hcnt VGA時(shí)序不是完全吻合。但是VGA時(shí)序是一個(gè)循環(huán),順推H_BACK個(gè)時(shí)終域便可以得到以上時(shí)期劃分,但是這樣更方便后續坐標計數,因為Bingo此處這樣設計,當然實(shí)際證明是完全可行的。
  注意:(hcnt >= H_DISP+H_FRONT-1'b1) && (hcnt = 0 && vga_xpos = (H_DISP>>3)*1 && vga_xpos


  本來(lái)可空鎖相環(huán)PLL設計,Bingo想單獨成章來(lái)講述的,但覺(jué)得可能別的地方實(shí)際應用價(jià)值不是很大,最后便在此處闡明這樣設計的原因。
  由于VGA不同分辨率的掃描時(shí)鐘不同,因此分辨率變化的時(shí)候,PLL的輸出時(shí)鐘是必要跟隨著(zhù)變化。但是Bingo覺(jué)得好麻煩,于是想了偷懶的一招:PLL IP定義,無(wú)非是用Quartus II GUI對PLL參數的設定,最后生成pll.v這個(gè)文件。而這個(gè)文件相當于是鎖相環(huán)的驅動(dòng)電路,故勢必包含著(zhù)參數的定義。實(shí)際如下:
  altpll_component.clk0_divide_by = 1,
  altpll_component.clk0_duty_cycle = 50,
  altpll_component.clk0_multiply_by = 1,
  如上圖所示,每次修改參數,這三個(gè)變量會(huì )相應的發(fā)生變化。因此,何不把這三個(gè)參數作為例化的參數,可以再頂層直接修改代碼來(lái)實(shí)現固定頻率的輸出?這樣豈不是很方便?
  因此設計參數例化接口如下:
  #(
  parameter DUTY_CYCLE = 50,
  parameter DIVIDE_DATA = 1,
  parameter MULTIPLY_DATA = 1
  )
  理論上是完全行得通的,這樣設計的另一個(gè)好處就是電路的封裝性更好Bingo實(shí)踐證明,完全可行,因此在此處說(shuō)明,要學(xué)會(huì )正確的偷懶呵呵。
  (4)Vga_design.v頂層文件代碼解析
  a) Vga接口定義
  //vga interface
  output vga_adv_clk,
  output vga_blank_n,
  output vga_sync_n,
  output vga_hs,
  output vga_vs,
  output [15:0] vga_rgb
  如上所示,上面三個(gè)信號線(xiàn)是在使用adv712x視頻轉換芯片的時(shí)候才會(huì )出現,一般的電阻模擬電路,或者直接RGB3線(xiàn)驅動(dòng),可以直接刪除相關(guān)信號以及電路。
  b) 進(jìn)一步偷懶法則
  根據常用的幾種分辨率,Bingo進(jìn)行了總結,以下三種應用較多,因此進(jìn)一步偷懶法則,圍繞他們三者來(lái)(不在這三種以?xún)鹊脑?huà),自己模仿著(zhù)再寫(xiě)一個(gè)):
  VGA_640_480_60FPS_25MHz
  VGA_800_600_72FPS_50MHz
  VGA_1024_768_60FPS_65MHz
  Verilog語(yǔ)法也有define的用法,是否還記得C語(yǔ)言中,大工程的調試經(jīng)常對相關(guān)變量的注釋?zhuān)N(xiāo)來(lái)調整整個(gè)工程變量的應用,因此此處Bingo套用這種思維模式,定義以上三種模式的變量,通過(guò)修改注釋define便可以輕松修改全局。具體如下所示:
  //----------------------------------------
  //vga parameter define
  //`define VGA_640_480_60FPS_25MHz
  //`define VGA_800_600_72FPS_50MHz
  `define VGA_1024_768_60FPS_65MHz
  `ifdef VGA_640_480_60FPS_25MHz
  parameter DUTY_CYCLE = 50;
  parameter DIVIDE_DATA = 2;
  parameter MULTIPLY_DATA = 1;
  parameter H_DISP = 11'd640;
  parameter H_FRONT = 11'd16;
  parameter H_SYNC = 11'd96;
  parameter H_BACK = 11'd48;
  parameter H_TOTAL = 11'd800;
  parameter V_DISP = 10'd480;
  parameter V_FRONT = 10'd10;
  parameter V_SYNC = 10'd2;
  parameter V_BACK = 10'd33;
  parameter V_TOTAL = 10'd525;
  `endif
  `ifdef VGA_800_600_72FPS_50MHz
  parameter DUTY_CYCLE = 50;
  parameter DIVIDE_DATA = 1;
  parameter MULTIPLY_DATA = 1;
  parameter H_DISP = 11'd800;
  parameter H_FRONT = 11'd56;
  parameter H_SYNC = 11'd120;
  parameter H_BACK = 11'd64;
  parameter H_TOTAL = 11'd1040;
  parameter V_DISP = 10'd600;
  parameter V_FRONT = 10'd37;
  parameter V_SYNC = 10'd6;
  parameter V_BACK = 10'd23;
  parameter V_TOTAL = 10'd666;
  `endif
  `ifdef VGA_1024_768_60FPS_65MHz
  parameter DUTY_CYCLE = 50;
  parameter DIVIDE_DATA = 10;
  parameter MULTIPLY_DATA = 13;
  parameter H_DISP = 11'd1024;
  parameter H_FRONT = 11'd24;
  parameter H_SYNC = 11'd136;
  parameter H_BACK = 11'd160;
  parameter H_TOTAL = 11'd1344;
  parameter V_DISP = 10'd768;
  parameter V_FRONT = 10'd3;
  parameter V_SYNC = 10'd6;
  parameter V_BACK = 10'd29;
  parameter V_TOTAL = 10'd806;
  `endif
  四、Display方案以及效果
  1、彩條
  (1)代碼
  always@(posedge clk or negedge rst_n)
  begin
  if(!rst_n)
  vga_data = 0 && vga_xpos >3))
  vga_data = (H_DISP>>3)*1 && vga_xpos >3)*2)
  vga_data = (H_DISP>>3)*2 && vga_xpos >3)*3)
  vga_data = (H_DISP>>3)*3 && vga_xpos >3)*4)
  vga_data = (H_DISP>>3)*4 && vga_xpos >3)*5)
  vga_data = (H_DISP>>3)*5 && vga_xpos >3)*6)
  vga_data = (H_DISP>>3)*6 && vga_xpos >3)*7)
  vga_data = (H_DISP


  2、花型矩陣
  (1)代碼
  wire [19:0] vga_result = vga_xpos * vga_ypos;
  always@(posedge clk or negedge rst_n)
  begin
  if(!rst_n)
  vga_data

                               
               
本文地址:http://selenalain.com/thread-160517-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页