基於FPGA的VGA顯示靜態圖片


    之前學習了半年的圖像處理,所以計划將自己學過的幾個圖像處理的基礎算法,做過的設計記錄下來,在OpenHW論壇上發表,計划是這樣的,用VGA做顯示,使用PC端上位機通過串口發送一幅圖片數據到FPGA開發板,FPGA接收數據並做處理最終發送給VGA顯示屏顯示,計划要寫的算法有彩色圖像轉灰度、均值/中值濾波、Sobel邊緣檢測等。那么現在這是第一篇,先來寫VGA顯示的驅動、以及將一幅圖片顯示到VGA顯示屏上。

  第一步是硬件平台的選取,我身邊正好有一塊Xilinx的ZYNQ開發板,ZYNQ算是Xilinx的一款比較高端的板子了,上面有以太網接口、USB2.0/OTG、HDMI雙向接口,SD卡槽,而且板子內部還嵌入了雙核ARM Cortex-A9處理器,上面可以跑linux,價格也不菲。ZYNQ是一款全可編程邏輯開發板(All Programmable)。什么是全可編程邏輯開發板,就是可以用硬件描述語言變成,可用C語言、Python等軟件編程語言編程。這款開發板有PS(Processor Subsystem)和PL(Programmable Logic)兩部分,當然我這里這回用到PL部分資源。通過查閱手冊和實驗確定ZYNQ在PL(Programmable Logic)模式下,開發板引腳L16連接系統時鍾晶振為125Mhz,VGA為16位RGB565顯示。

         VGA掃描顯示其實就是兩條線,一個是行掃描,一個是場掃描,在行有效和場有效的時候把數據發送給VGA即可顯示了。顯示標准就是行分辨率x列分辨率@60hz即一秒屏幕刷新60次,拿640x480@60HZ做例子,即行為640個像素,場為480個像素。

         VGA顯示其實就是兩條線,一個是行掃描,一個是場掃描,在行有效和場有效的時候把數據發送給VGA即可顯示了。顯示標准就是@60hz即一秒屏幕刷新60次,拿640x480@60HZ做例子,即行為640個像素,場為480個像素。

顯示器掃描方式分為逐行掃描和隔行掃描:逐行掃描是掃描從屏幕左上角一點開始,從左像右逐點掃描,每掃描完一行,電子束回到屏幕的左邊下一行的起始位置,在這期間,CRT對電子束進行消隱,每行結束時,用行同步信號進行同步;當掃描完所有的行,形成一幀,用場同步信號進行場同步,並使掃描回到屏幕左上方,同時進行場消隱,開始下一幀。隔行掃描是指電子束掃描時每隔一行掃一線,完成一屏后在返回來掃描剩下的線,隔行掃描的顯示器閃爍的厲害,會讓使用者的眼睛疲勞。

 

圖 – VGA屏幕掃描原理

         行消隱(HBlank)在將光信號轉換為電信號的掃描過程中,掃描總是從圖像的左上角開始,水平向前行進,同時掃描點也以較慢的速率向下移動。當掃描點到達圖像右側邊緣時,掃描點快速返回左側,重新開始在第1行的起點下面進行第2行掃描,行與行之間的返回過程稱為水平消隱。一幅完整的圖像掃描信號,由水平消隱間隔分開的行信號序列構成,稱為一幀。掃描點掃描完一幀后,要從圖像的右下角返回到圖像的左上角,開始新一幀的掃描,這一時間間隔,叫做垂直消隱,也稱場消隱(VBlank)。我們稱行同步、場同步。

         行場消隱信號:是針對老式顯像管的成像掃描電路而言的。電子槍所發出的電子束從屏幕的左上角開始向右掃描,一行掃完需將電子束從右邊移回到左邊以便掃描第二行。在移動期間就必須有一個信號加到電路上,使得電子束不能發出。不然這個回掃線會破壞屏幕圖像的。這個阻止回掃線產生的信號就叫作消隱信號,場信號的消隱也是一個道理。

圖 – 行掃描

圖 – 場掃描

圖 – VGA掃描時序

        那么掃描時鍾是多少呢?這個其實是可以計算出來的,根據一幀(即掃描一次屏幕需要60分之1秒)需要的時間可以計算出每一個像素點需要的時間。我這里就不計算了直接用官方給出的數據就行了,我這里直接給出官方手冊,可以自己查閱。如圖所示的一些參數和其幾種顯示格式的顯示參數還有RGB的幾種顏色的顯示組合,我都會給出來,

  我這里選用的是640X480@60HZ分辨率顯示,ZYBO的板子晶振是125Mhz,所以首先要先進行分頻,我這里直接用Vivado調用PLL。還沒有過用Vivado調用PLL的博客,現在總結一下吧,以防后面忘記。

點擊IP catalog進行IP設置

為了快速找到想要的IP,在右上角直接搜索Clocking,然后就會出現如圖所示界面,雙擊clocking wizard,進行PLL的配置

彈出如圖所示界面后,一次按上圖進行配置,在component name中寫下IP的名字,把show disabled ports勾選為空,在primitive中選擇MMCM,在input clock information中選擇輸入時鍾。這里的MMCM我查了一下就是他包含了PLL,所以我們直接選擇MMCM。但是有時候如果選擇PLL也會出現錯誤,所以一般首選MMCM。

這里設置輸出時鍾,還可以設置相位和占空比。

選擇復位為低電平觸發、選擇locked

這里可以自定義端口名

點擊OK,Generate,即可生成PLL IP Core

點擊IP source、找到后綴為.veo的文件,雙擊打開

里面的內容就是可以直接實例化調用的端口生成。

         這樣便完成了VGA驅動時鍾的生成,這里我把其他幾種顯示格式的參數和RGB顯示的參數貼出來,這樣便省去了不少事情。然后就是把你要顯示的數據在行掃描有效和場掃描有效的時候輸出,即可在顯示屏顯示了。其實這個顯示並不難,那我為什么要專門寫篇博客記錄呢?因為以前老是看別人的代碼,看的多了,自己的能力還是沒有多大提升,但這部分顯示圖片是完全我自己分析時序顯示出來的,所以有很大的成就感。學習這個東西還是得有人教導,從我學習FPGA以來,都是自己一個人瞎琢么,學習了一年了還沒有一個好的畫時序圖的習慣,到仿真的時候再湊出時序圖,還是要從基礎抓起,不能只會敲代碼。時序設計是關鍵,設計思想必須有。

         要顯示一個彩色條紋也是比較簡單的,例如在前一百五十行給VGA的數據為白色的,中間180行給VGA的數據為綠色,后面相同的方法。我這里要做的實驗是在顯示屏的左上角開一個200x200的框,最后將一幅200x200的圖片顯示進去,首先開一個200x200的正方形框,實現的方法就是控制行有效計數器計到需要顯示正方形框的時候紫色的數據給lcd_data,行計數器為0-200,其他情況還是前面顯示條紋的數據,同樣的場有效計數器也從0-200計數時顯示紫色數據帶lcd_data,這樣就會在顯示屏左上角形成一個正方形的框。如下圖所示。

         要顯示一張圖片到VGA就需要調用RAM IP Core,我這里需要調用一個單口RAM IP,使用軟件將圖片生成十六進制的數據,可以用MATLAB,我這里推薦一款軟件,是一個業界名人寫的十分好用,如下圖所示,只需要將8位或24位位圖加載進去,就可以生成你想要的圖像數據格式了,這里要注意生成的圖像數據RGB的位寬,一定要和你板子的VGA顯示位寬一致,否則顯示不出來的。

  使用這個軟件轉化之前,除了閱讀板子手冊看你的板子RAM的容量能裝下多大的圖像數據,需要找一張合適的圖片,這里小提示一下,可以用windows自帶的畫圖軟件將圖片打開,右鍵重新調整大小去掉保持縱橫比,選擇像素,這樣就可以任意修改圖像大小了!RAM配置可參考我前面的相關博文:基於Vivado調用ROM IP core設計DDS

注:Xilinx是.coe文件、Intel (Altera)是.mif文件,這兩種文件只是格式不同但本質上是一樣的。

  RAM/ROM讀取有延時,要在掃描第一個點的前兩個時鍾周期讀取RAM/ROM,我這里用的是雙口RAM,在Vivado這里顯示的是有兩個時鍾的周期的延時,也就是當你給讀命令時,RAM會把讀出來的數據緩存兩級在才會輸出給你想給數據的地方。

  我這里將RAM讀取設置為always enable, RAM數據出來的端口是一直有數據的,而且我最終顯示出來的靜態圖片也是完整的,沒有觀察到像素點的缺失,所以先不管這兩個時鍾周期的延時。

         這次的基於FPGA的圖像顯示部分代碼,完全是我自主設計,雖然不是很高的技術含量,但是總算擺脫了抄別人代碼的魔咒了,最后所有工作都做好后,下載板子就會呈現下面這一幅圖的樣子,這樣看來顯示效果還挺不錯的呢!(lena美女很漂亮,這里看不出是200x200的圖片是因為,顯示器自動調節合適的顯示寬度)

  這次的基於FPGA的圖像顯示部分代碼,完全是我自主設計,雖然不是很高的技術含量,但是總算擺脫了抄別人代碼的魔咒了,最后所有工作都做好后,下載板子就會呈現下面這一幅圖的樣子,這樣看來顯示效果還挺不錯的呢!

  如果你想獲得本文的所有課件和工程代碼,請關注本人的個人微信訂閱號:開源FPGANingHeChuan或掃描下方二維碼關注訂閱號,在后台回復圖像處理,即可獲得本文的所有課件、資料、和工程源碼哦!

 

轉載請注明出處:NingHeChuan(寧河川)

個人微信訂閱號:開源FPGANingHeChuan

如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關注個人微信訂閱號

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.cnblogs.com/ninghechuan/p/7260383.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM