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

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

(1)因?yàn)槭且抡鎣dma,vdma顧名思義就是video dma,那肯定要先做一個(gè)視頻模塊,注意,我這里除了vdma和fifo用xilinx的ip。其他的都不用ip,這樣更通用性。
我這里就把這個(gè)視頻發(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)建了一個(gè)圖像傳感器,總像素?cái)?shù)是600*800,有效像素是 480*640,水平有效像素開始位置是80,垂直有效像素開始位置是60,這個(gè)模塊會(huì)讀取一個(gè)本地圖像數(shù)據(jù),rgb格式,這里為了測(cè)試方便,直接把像素輸出位寬設(shè)置為32bit。
(2)video轉(zhuǎn)axis模塊,相當(dāng)于 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






























評(píng)論