<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    【從零開始走進FPGA】 玩轉VGA

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


      最主要的幾根線:
      


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


      沒掃描完一行,從新開始下一行;每掃完一場,重新開始下一場。相信你應該看的懂。
      (2)行場掃描
      以下是行掃描,場掃描HS,VS時序圖
      


      如上如所示:VGA一直在掃描,沒一場的掃描包括了若干行掃描,如此循環。
      (3)VS時序深入分析
      VS時序如下所示:
      


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


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


      用代碼表示4個時期,如下:
      // 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,最多產生8種色彩。這是最基本的。電路如下所示:
      


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


      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) 專用視頻轉換芯片
      利用專用視頻轉換芯片,ADV7120等,將數字信號轉換為VGA RGB的模擬信號。ADV7120為高速D/A芯片,將數字信號轉換為模擬信號輸給VGA,電路如下:
      


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


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


                                   
                    2、代碼設計
      Bingo例程以16bit RGB VGA驅動為例,不同位數的顯示只要改一下vga_data即可。
      前文以及代碼講述了那么多,此處不再貼完整代碼,而是對代碼中部分結構進行解析。
      代碼下載地址: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
      )
      這樣寫的目的是為了軟件封裝性,能夠在例化的時候修改法分辨率,同時電路結構保持不變。
      DISP,FRONT ,SYNC,BACK,TOTAL分別為顯示期,消隱前肩,消音期,消隱后肩,總時間,各自對應各自的行場信號。
      b) 行同步信號設計
      //------------------------------------------
      // 行同步信號發生器
      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時序不是完全吻合。但是VGA時序是一個循環,順推H_BACK個時終域便可以得到以上時期劃分,但是這樣更方便后續坐標計數,因為Bingo此處這樣設計,當然實際證明是完全可行的。
      注意:(hcnt >= H_DISP+H_FRONT-1'b1) && (hcnt = 0 && vga_xpos = (H_DISP>>3)*1 && vga_xpos


      本來可空鎖相環PLL設計,Bingo想單獨成章來講述的,但覺得可能別的地方實際應用價值不是很大,最后便在此處闡明這樣設計的原因。
      由于VGA不同分辨率的掃描時鐘不同,因此分辨率變化的時候,PLL的輸出時鐘是必要跟隨著變化。但是Bingo覺得好麻煩,于是想了偷懶的一招:PLL IP定義,無非是用Quartus II GUI對PLL參數的設定,最后生成pll.v這個文件。而這個文件相當于是鎖相環的驅動電路,故勢必包含著參數的定義。實際如下:
      altpll_component.clk0_divide_by = 1,
      altpll_component.clk0_duty_cycle = 50,
      altpll_component.clk0_multiply_by = 1,
      如上圖所示,每次修改參數,這三個變量會相應的發生變化。因此,何不把這三個參數作為例化的參數,可以再頂層直接修改代碼來實現固定頻率的輸出?這樣豈不是很方便?
      因此設計參數例化接口如下:
      #(
      parameter DUTY_CYCLE = 50,
      parameter DIVIDE_DATA = 1,
      parameter MULTIPLY_DATA = 1
      )
      理論上是完全行得通的,這樣設計的另一個好處就是電路的封裝性更好Bingo實踐證明,完全可行,因此在此處說明,要學會正確的偷懶呵呵。
      (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
      如上所示,上面三個信號線是在使用adv712x視頻轉換芯片的時候才會出現,一般的電阻模擬電路,或者直接RGB3線驅動,可以直接刪除相關信號以及電路。
      b) 進一步偷懶法則
      根據常用的幾種分辨率,Bingo進行了總結,以下三種應用較多,因此進一步偷懶法則,圍繞他們三者來(不在這三種以內的話,自己模仿著再寫一個):
      VGA_640_480_60FPS_25MHz
      VGA_800_600_72FPS_50MHz
      VGA_1024_768_60FPS_65MHz
      Verilog語法也有define的用法,是否還記得C語言中,大工程的調試經常對相關變量的注釋,注銷來調整整個工程變量的應用,因此此處Bingo套用這種思維模式,定義以上三種模式的變量,通過修改注釋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://www.portaltwn.com/thread-160517-1-1.html     【打印本頁】

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

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷