1. 程式人生 > >-01- VDMA IP的GUI配置介紹【Xilinx-VDMA模組學習】

-01- VDMA IP的GUI配置介紹【Xilinx-VDMA模組學習】

使用的是Vivado 2015.4,XC7Z020, AXI Video Direct Memory Acess(6.2)。

在我的系統中,GUI配置圖片如下:(其實和預設配置沒有太大區別)

下面介紹VDMA IP內各個引數的配置說明。

1.Basic標籤頁

Address Width:資料線位寬

除非記憶體地址空間大約32位,一般就配置成32位了,因為所做的板子DDR只有512MB

Frame Buffers:幀緩衝數

用來緩衝輸入影象的幀快取數量,最大可以選擇32幀,在這裡選擇4就可以了。

據我所瞭解這個值一般最小設定為3,因為VDMA有一個讀通道,一個寫通道,在實際使用時一般都是寫完了一幀資料,然後再去讀這一幀的資料(VDMA內有一種機制,保證讀出的幀總是上一次寫完的幀)。這樣能夠防止讀取到的影象被撕裂或者別的情況發生。

正常情況下的讀寫速率一般相同或有可能是寫入速度略高於讀取速率,在影象寫入和讀出穩定後,為了保證寫入的幀不重疊到讀取幀上,Frame Buffers設定為3即可解決。

設定為3時,同一時刻的讀寫幀組合如下:

FRAME0/FRAME2
FRAME1/FRAME0
FRAME2/FRAME1

讀寫通道:

Memory Map Data Width: 根據影象的畫素資料位寬設定即可,我這裡用的RGB三色 共24位資料,選32就可以了

Write/Read Burst Size: 儲存空間AXI讀寫的突發讀寫數量大小

Stream Data Width:資料流AXIS位寬,RGB 24位,

Line Buffer Depth

:資料流AXIS的快取深度,用來快取影象資料每一行資料的buffer深度。在xapp1205文件中第6頁提到read and write side line buffers inside the AXI Video DMA core are
set to accommodate about one fourth of a line.我這裡影象是640*480,這裡設定的512,總之在讀寫速率相同的情況下這個值可以設定的稍微小一些,但最小也要超過行長度的1/4為好。

2.Advanced標籤頁

因為VDMA裡面的同步機制有些複雜,pg020文件裡也說建議專業的選手再來配置這些東西,所以所有配置都按預設配置。當然我也想專業一點,嘗試了許多次,但是感覺還是這個預設配置是最方便可靠的。

Write/Read Channel Options:

Fsyn Options(Write): 選擇了s2mm_tuser,這樣每一幀寫影象的同步操作是根據前一級IP的AXIS輸出匯流排內的tuser來觸發的。這是很好的方法,幀同步起來方便快捷,不會出太大問題。

還可以配置成s2mm_fsync,選擇這個後IP的GUI會多出一根訊號輸入線,這樣就可以用諸如VTC的模組來進行全域性的幀同步功能。選擇這個功能後,VDMA寫通道將會忽略AXIS匯流排中的tuser幀同步訊號。

總之,我暫時還是用了第一種預設配置,第二種配置嘗試過,但同步起來稍微要考慮的多了一些。也正是因為如此,Frame Buffers我選擇了4,防止讀寫不同步時可能帶來的問題。

Fsync Options(Read): 選擇了None,Free Running,我的理解就是不需要單獨外部同步觸發訊號,VDMA是通過M_AXIS_MM2S中tuser和反饋回來的tready訊號握手成功後來開始觸發一幀的讀寫的。

GenLock Mode: 寫通道設定為Dynamic-Master,讀通道設定為Dynamic-Slave

為了保證視訊影象的讀寫實時性,需要內部有著一定的機制,這個機制就是通過GenLock模組來完成的。

Dynamic的字首意思是讀寫GenLock會互相鎖定,而另外兩種沒有字首的Master和Slave則需要一些額外的軟體開銷,或者不太符合我的功能要求,我就沒有仔細研究了。

我所理解的動態互相鎖定:首先讀寫通道會有一個各自正在操作的幀編號告訴對方,預設寫是0,讀是2(3 Frame Buffers),由於讀寫速率不同或者是記憶體存取上出現延遲等等問題,有可能會導致,讀寫的幀編號錯位(我猜的)。當主(即寫通道)寫操作完成後,會看一下從通道正在操作的幀編號,假如從的幀編號和主準備下次操作幀編號相同,主會選擇跳過這個幀,並去下一幀進行寫操作。從(讀通道)讀操作完成後,會讀取主通道上一次操作的幀編號,並直接進行下次的讀操作。

機制就是這樣了,保證了讀寫操作不會同時發生在一個幀,導致資料的錯誤。但是我在想,對於攝像頭的讀取和顯示是否可以不用這樣設定,而是直接讓讀寫發生在同一幀上,讀取速率相同的前提下,讓讀取操作比寫操作晚上幾行,這樣系統將會有著更低的延時,但這樣也會需要更加精確的資料流控制。

Allow unaligned Transfers:預設不選擇,這種高階功能就先不研究了,不選

這樣,我的VDMA就配置完成了,讀寫通道的速率都是1080P要求的148.5M。通過另外的Video Test Pattern Generator、AXI_Interconnect、Video On Screen Display、Video Timing Controller、AXI4-Stream to Video Out來共同實現了VDMA影象讀寫和1080P視訊顯示的邏輯架構。

下一次,寫一下VDMA和上面提到的這些模組如何工作,讓視訊影象顯示起來。