很多人用zynq平臺做視頻圖像開發(fā),但是對vdma了解比較少,上手起來稍微有些困難,我針對這一現(xiàn)象,做了一個基于vivado和modelsim的仿真和應(yīng)用測試工程,并寫篇文章做些介紹,希望能對大家有幫助。
一:xilinx vdma IP例化以及接口介紹

上面圖片就是在vivado2015.4中例化vdma的界面,首先對參數(shù)做些介紹:
Frame Buffers :選擇vdma緩存幾幀圖像,這里默認是寫通道和讀通道都設(shè)置相同的緩存幀數(shù),具體設(shè)置多少幀合適一般根據(jù)應(yīng)用來定,比如讀寫帶寬相同,想用ddr作為一個乒乓buffer,那就可以設(shè)置成2幀,寫第一個地址,讀第二個地址,寫第二個地址,讀第一個地址。這里面設(shè)置幾幀,就要在vdma寄存器配置的時候設(shè)置幾個幀起始地址。
Memory Map Data Width:代表數(shù)據(jù)到達AXI4總線上的位寬,比如這里設(shè)置成64,那就代表M_AXI_XX總線上的數(shù)據(jù)位寬是64bit,這時候如果stream上的數(shù)據(jù)是32bit,那vdma內(nèi)部會有一個帶寬轉(zhuǎn)換模塊,把數(shù)據(jù)拼成64bit。
Burst Size : AXI總線上突發(fā)傳輸?shù)拈L度,一般設(shè)置為16
Stream Data Width:vdma與pl邏輯部分通過axi stream協(xié)議交互數(shù)據(jù),這里代表stream數(shù)據(jù)位寬
Line Buffer Depth:vdma內(nèi)部會有一個行緩存fifo,stream數(shù)據(jù)會先寫入fifo,然后AXI總線邏輯會讀出到總線上,這個深度就代表fifo的深度。設(shè)置原則(個人理解):如果AXI總線數(shù)據(jù)帶寬是stream總線數(shù)據(jù)帶寬的1.5倍以上,這個fifo深度可以設(shè)置的小一點,如果AXI總線帶寬小于1.5倍的stream總線帶寬,那fifo的深度至少要是圖像一個有效行的一半。
Advanced : 這里面只說一下Fsync Options,這個信號是什么意思呢,就是告訴vdma什么時候開始運行,一般s2mm通道選擇tuser,就是說在tuser 拉高的時候開始傳輸。mm2s通道,可以選擇none,也可以選擇 mm2s_fsync,這里介紹一下這兩個的區(qū)別。
none : 就是沒有同步信號,但這并不是說沒有開始信號,而是只要mm2s_stream通道tready拉高,就開始傳輸,相當于free模式
mm2s_fsync:當這個信號發(fā)生一個下降沿的時候開始傳輸,如果沒有這個下降沿,即使mm2s_stream通道tready拉高也不會傳輸
下面是接口介紹:
M_AXI_XX : axi4總線接口,用來與ddr交互數(shù)據(jù)
M_AXIS_XX , S_AXIS_XX : axi stream接口,用來與pl交互數(shù)據(jù)
S_AXI_LITE :控制總線,接到ps的gp口或者寫一個axilite master總線去配置
其他接口不做介紹
二:下面開始一步步的詳解如何搭建一個vdma的仿真工程
FPGA的開發(fā),離不開仿真,很少有人能直接寫好代碼上板就成功的,仿真必不可少。但是有些應(yīng)用要用到vdma,vdma又要和ddr做數(shù)據(jù)交互,這樣做起來就很麻煩了,我這里就實現(xiàn)了一個簡單的方法,可以測試vdma,又不用去例化MIG搞什么ddr。下面開始!
系統(tǒng)框圖:

(1)因為是要仿真vdma,vdma顧名思義就是video dma,那肯定要先做一個視頻模塊,注意,我這里除了vdma和fifo用xilinx的ip。其他的都不用ip,這樣更通用性。
我這里就把這個視頻發(fā)生模塊叫做sensor,可以理解為xilin的tpg模塊,sensor模塊的接口如下:
module sensor
(
input rst,
input clk,
output reg vsync,
output reg hsync,
output reg de,
output reg vblank,
output reg[31:0]pix_out
);
parameter SENSOR_ACT_W = 640;
parameter SENSOR_ACT_H = 480;
parameter SENSOR_WIDTH = 800;
parameter SENSOR_HEIGHT = 600;
parameter H_START = 80;
parameter V_START = 60;
我這里構(gòu)建了一個圖像傳感器,總像素數(shù)是600*800,有效像素是 480*640,水平有效像素開始位置是80,垂直有效像素開始位置是60,這個模塊會讀取一個本地圖像數(shù)據(jù),rgb格式,這里為了測試方便,直接把像素輸出位寬設(shè)置為32bit。
(2)video轉(zhuǎn)axis模塊,相當于 xilinx的vid in to stream模塊,接口如下:
module video2axis #
(
parameter DW = 32,
parameter WIDTH = 640,
parameter HEIGHT = 480
)
(
input axis_clk,
input axis_aresetn,
// axis
input reg_axis_s2mm_start,
output [DW-1:0] m_axis_tdata,
output [DW/8-1:0] m_axis_tkeep,
output reg m_axis_tvalid,
output m_axis_tlast,
output m_axis_tuser,
input m_axis_tready,
// video data
input video_clk,
input video_rst,
input video_hsync,
input video_vsync,
input video_hblank,
input video_vblank,
input video_de,
input [DW-1:0] video_data
);
電子發(fā)燒友App






























評論