天天看點

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

文章目錄

  • 說明
  • VGA原理
  • vga子產品代碼設計
  • rom_start_ctrl子產品代碼設計
  • C語言産生mif檔案
  • 顯示效果
  • 福利

說明

由于最近有很多同學對基于FPGA的貪吃蛇遊戲很感興趣,趁着最近有時間,特将之前貪吃蛇遊戲重新設計一遍,并給出詳細的設計步驟,友善大家學習!一共分2期,本期教程主要解決VGA顯示圖檔問題,主要教大家如何寫VGA驅動,如何用C語言生成mif檔案。本教程還是需要有一定基礎的,至少會綁定引腳,會使用軟體産生pll、rom等常用的ip。

VGA原理

VGA原理比較簡單,主要參考《VGA時序标準》。首先需要說明的是,VGA時序有4種,如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利
貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利
貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

是以當你看到有些教程的時序不一樣,不要慌,他們都是對的,這四種時序都是可以的,本教程選用第一種時序,如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

從時序圖中可以看出,VGA時序的關鍵信号是行同步信号(HSync)和場同步信号(VSync),共有6個參數,分别為Sync,Back Porch,Left Border(針對行同步信号)/Top Border(針對場同步信号),Addr Time(資料有效時間,分辨率就是看這個參數),Right Border(針對行同步信号)/Bottom Border(針對場同步信号),Front Porch。這些參數在《VGA時序标準》中都會詳細給出。需要主要的是,圖1-2隻是說明場同步信号和行同步信号的6個參數都是類似的,說明他們都有這6個參數,正因為參數是類似的,是以将他們畫在一起了,場同步信号與行同步信号實際的相對關系如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

從圖1-3可以看出,VGA真正顯示的區域是VSync的Addr Time和HSync的Addr Time同時有效區域(低有效)。如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

圖1-1到圖1-4務必要全部搞懂,這個自己花點時間琢磨一下,搞懂這4個圖後VGA時序也就全搞明白了。

vga子產品代碼設計

本教程VGA選用640[email protected]分辨率,像素時鐘頻率為25MHz,其具體參數定義如圖1-6所示,在代碼中将這些參數定義好,如圖1-5所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利
貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

采用兩級計數器架構對行同步信号和場同步信号進行計數,如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利
貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

根據VGA時序參數和場同步、行同步計數器來産生場同步信号和行同步信号,VGA時序圖如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

從圖1-9可以看出,Vsync信号在場同步計數器計滿Ver_Sync_Time個數後拉低,計滿Ver_Total_Time個數後拉高。HSync信号在行同步信号計滿Hor_Sync_Time個數後拉低,計滿Hor_Total_Time個數後拉高。代碼如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利
貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

有了場同步信号和行同步信号,接下來就要整VGA的RGB資料了,本教程采用的RGB565格式。并且使用rom存儲圖檔,考慮到fpga内部存儲資源較小,本教程使用100100分辨率的圖像。rom的位寬設定為8,深度設定為10000,具體設定如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

需要注意的是,rom設定時,勾選了‘q’output port,是以rom的資料輸出會延遲兩拍,這個地方要注意,自己可以仿真看看現象。rom的讀使能與vga_hs的時序關系如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

可以看出rom_rd_en比Hor_Addr_Time區域提前了3個時鐘周期,是以rom_rd_data比Hor_Addr_Time區域隻提前了1個時鐘周期(rom輸出延時2拍)。然後vga_r/vga_g/vga_b擷取rom_rd_data資料需要消耗一拍,是以最終vga_r/vga_g/vga_b資料與Hor_Addr_Time區域正好對齊。fpga代碼編寫最重要的就是時序對齊,要精确到一個時鐘周期!代碼如下:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

由于本教程是在VGA顯示屏正中間顯示100*100分辨率圖檔,圖檔顯示位置如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

vga_r/vga_g/vga_b的實作比較簡單,代碼如下所示

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

rom_start_ctrl子產品代碼設計

rom_start_ctrl子產品比較簡單,隻要根據rom_rd_en信号産生rom_addr并且例化rom ip即可。代碼如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

C語言産生mif檔案

想要vga顯示自己想要的圖檔,就得對rom進行初始化,本教程使用mif檔案初始化,下面将教大家如何制作mif檔案。

(1) 自己可以在網上去找一幅圖檔(也可以自己畫),然後用電腦自帶的畫圖軟體,将他的分辨率調整到100*100,并且重新儲存為24位bmp格式的圖像,命名為“啟動界面.bmp”。

(2) 将“啟動界面.bmp”放到我提供的上位機中。如下所示:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

(3) 輕按兩下“ImageShow.exe”即可産生mif檔案和coe檔案。C語言産生mif代碼如下,有興趣的可以自己試試:

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

顯示效果

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利

福利

本教程的所有verilog源碼以及上位機源碼都會公布,百度雲連結:

連結:VGA顯示圖檔教程源碼下載下傳鍊

提取碼:zpnk

微信公衆号裡的圖檔是有壓縮過的,看着有點模糊,我在壓縮包裡提供了pdf教程,那裡都是高清的圖檔哦。**下載下傳後,解壓需要密碼,掃描下面的二維碼并在公衆号回複“密碼”即可擷取密碼。**也希望大家轉發支援哦,後續還會有第二期~

貪吃蛇-VGA顯示圖檔說明VGA原理vga子產品代碼設計rom_start_ctrl子產品代碼設計C語言産生mif檔案顯示效果福利