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