1、 概述
首先,我們來看一下Xilinx Application Note中經常出現的一副結構圖,圖1所示,當然不可能所有圖都一樣,在結構上大同小異吧。這是一個比較典型的圖像、視頻處理平臺的結構圖。
1.1、捕獲
視頻通過HDMI接口進來,然后經Video Input模塊做格式變換,送入VDMA,該VDMA的作用是把數據送入在DDR3中所開辟的幀存中去。
另一種是通過攝像頭等設備獲取視頻源,經PS/PL將數據送入DDR3。就我目前的水平而言,個人感覺從PL部分將視頻流送入DDR3最簡單的方法是通過VDMA的axi4-stream接口,換句話說,將視頻流轉換為axi4-stream會降低處理難度,這種轉換和Video Input模塊的工作是類似的。
1.2、處理
該部分包含兩個VDMA和一個視頻處理模塊,一個VDMA負責從幀存中取數據,然后交給處理模塊,處理完畢的結果經另一個VDMA送回幀存
1.3、顯示
主要是顯示控制模塊,負責將數據按照標準時序輸出送至顯示器。
圖1 視頻處理、顯示平臺架構
從圖1可以看出,整個架構的核心是VDMA這個IP,所以搭建平臺的關鍵是掌握VDMA的使用。
2、 VDMA的使用
2.1、基本情況
我們來看一下VDMA的結構框圖,了解一下VDMA的基本情況。
?
圖2 VDMA框圖
如圖2所示,VDMA的主要接口有3個,分別為AXI4 Memory Map、AXI4-Lite、AXI4-Stream。
AXI4-Lite:
這個接口詳細是最常用的接口了,用于讀寫VDMA內部寄存器,從而實現對VDMA的控制和狀態獲取。
AXI4-Stream:
寫通道(s2mm):VDMA獲取來自axis接口的數據并將之寫入幀存
讀通道(mm2s):VDMA從幀存讀取數據,然后送至axis接口輸出
AXI4 Memory Map:
這個接口手冊沒有講具體作用,其實這個接口是用于操作DDR的,通過互聯模塊連接至Zynq的HP接口。
2.2、使用方法:
這部分有點像廢話,和其他IP一樣用就是了。
i、 新建工程
ii、 新建block design
iii、 打開IP Catalog,輸入關鍵字檢索到VDMA,或者按類別找到IP核
iv、 雙擊VDMA IP,添加IP至block design
v、 如有需要,再對IP進行參數配置。
2.3、VDMA的配置
關于VDMA的詳細參數配置,請參考pg020,Product Guide,這里把我認為比較重要的地方說一下。
i、 GenLock mode
genlock模式有4中選擇,分別為:Master、Slave、Dynamic Master、Dynamic Slave。選擇不同的模式對模塊的端口連接有不同的要求,所以這里要注意,改變模式,端口連接也要修改,如圖3、圖4所示。
?
圖3
?
?
圖4
ii、 Line Buffer Depth
Line Buffer設置不合理的話,會影響顯示效果,甚至會造成無顯示。
iii、 關于時鐘
剛開始上手時,建議把AXI4-Lite、AXI4、AXI-Stream這三個接口的時鐘統一為像素時鐘。上手之后,可以嘗試三個接口使用不同的時鐘。要注意AXI4接口時鐘一定要大于等于AXI-Stream接口的時鐘,否則會造成數據丟失。
2.4、VDMA初始化流程
1. Write control information to the channel VDMACR register (Offset 0x00 for MM2S and
0x30 for S2MM) to set interrupt enables if desired, and set VDMACR.RS=1 to start the
AXI VDMA channel running.
2. Write valid video frame buffer start address to the channel START_ADDRESS register 1 to
N where N equals Frame Buffers (Offset 0x5Cup to 0x98for MM2S and 0xACup to
0xE8for S2MM). Set the REG_INDEX register if required.
3. Write a valid Frame Delay (valid only for Genlock Slave) and Stride to the channel
FRMDLY_STRIDE register (Offset 0x58for MM2S and 0xA8for S2MM).
4. Write a valid Horizontal Size to the channel HSIZE register (Offset 0x54for MM2S and
0xA4for S2MM).
5. Write a valid Vertical Size to the channel VSIZE register (Offset 0x50for MM2S and
0xA0for S2MM). This starts the channel transferring video data.
上述寄存器的作用在圖5中可以找到,某個寄存器每個bit的功能,請參考pg020,VDMA的Product Guide,第2章 Product Specification的Register Space小節。
?
圖5 VDMA寄存器偏移地址及作用
3、 設計舉例
3.1、邏輯設計
有了上文所做的鋪墊,相信搭建出一個顯示平臺就不是非常難了,下面,我給出一個具體的框圖,如圖6所示。(本來想用頂層的block design截圖,發現IP布局、連線比較亂,看不清楚)。另外,大家還可以參考xapp792,大同小異,我之前的博客也提過如何搭建HDMI的顯示平臺,不過最近還是有網友提問如何搭建平臺。其實,官網給出的資料往往是很具參考價值的,大家可以多多留意。
圖6 邏輯設計舉例
這是一個圖形繪制和顯示平臺,不是視頻處理平臺,視頻處理平臺稍有不同,一般而言,視頻處理用到genlock和我這里不一樣。圖中所有信號和連接情況都和實際設計一樣,能夠體現出設計思路。
vdma、axis2vout、vtc這三個IP,Vivado都是提供的,當然也可以自己設計,難度不大,這里就不說了。
3.2、軟件設計
軟件流程圖如下:
圖7 軟件流程圖
從流程圖可以看出軟件部分是很簡單,這是由于顯示是PL負責的,兩者的交集在幀存,讀寫不發生沖突就可以了。當前PL讀取的顯示畫面,總是PS繪制的上一幀內容。如想減少PS負擔,可以將清幀存的任務交由PL完成。
評論
查看更多