1.1概述
米聯(lián)客uifdma是基于AXI4總線接口開(kāi)發(fā)的一種DMA數(shù)據(jù)管理IP,該IP可以統(tǒng)一視頻數(shù)據(jù)、普通ADC數(shù)據(jù)、PLDDR接口和PSDDR接口,具有更加廣泛的通用性。并且該IP是米聯(lián)客對(duì)所有開(kāi)發(fā)者開(kāi)源的。
本文實(shí)驗(yàn)?zāi)康模?
1. 掌握ui-fdma和ui_fdmadbuf在視頻采集方案的應(yīng)用
2. 掌握多個(gè)AXI-FDMA同時(shí)傳輸視頻的同步解決方法
3. 掌握uifdma_dbuf視頻格式中Stride參數(shù)的使用
4. 掌握uifdma_dbuf和VDMA之間如何進(jìn)行幀同步,如何實(shí)現(xiàn)3幀圖形緩存,確保圖形不撕裂。
1.2系統(tǒng)框圖
1.3搭建SOC系統(tǒng)工程
1.3.1PL圖形化編程
系統(tǒng)輸出部分的搭建請(qǐng),閱讀“米聯(lián)客2022版ZynqSocSDK高級(jí)篇”一文中“5.4搭建SOC系統(tǒng)工程”這一章節(jié),本文增加VDMA輸入部分。下面給出完成的工程,并且就新增加的輸入部分加以介紹。
上圖中高亮部是FDMA的幀同步計(jì)數(shù)器,CAM0的幀同步計(jì)數(shù)器提供給CAM1和VDMA 輸出 IP使用。VDMA 輸出 IP工作于SLAVE circle 模式,所以CAM1和VDMA 輸出都是從模式同步受控于CAM0的幀計(jì)數(shù)器,這樣可以確保視頻不出現(xiàn)撕裂。
1:CAM0中FDMA IP設(shè)置
關(guān)鍵設(shè)置:
1`WBaseaddr 0x08000000 設(shè)置緩存的起始地址
2`WDsizebits 設(shè)置緩存的大小,2^23次方代表8MB大小
3`WBufsize 設(shè)置圖像采用三緩存
4`WXsize設(shè)置行像素640
5`WXStride設(shè)置行Stride參數(shù)為1280,改參數(shù)用于2個(gè)視頻在一個(gè)顯存中顯示
6`WYsize設(shè)置場(chǎng)像素為480
2:CAM1中FDMA IP設(shè)置
1`WBaseaddr 0x0812CA00 設(shè)置緩存的起始地址,通過(guò)設(shè)置該地址可以讓圖像在指定的偏移位置顯示
2`WDsizebits 設(shè)置緩存的大小,2^23次方代表8MB大小
3`WBufsize 設(shè)置圖像采用三緩存
4`WXsize設(shè)置行像素640
5`WXStride設(shè)置行Stride參數(shù)為1280,改參數(shù)用于2個(gè)視頻在一個(gè)顯存中顯示
6`WYsize設(shè)置場(chǎng)像素為480
4:多路視頻同屏顯示原理
為了把2個(gè)圖像顯示到1個(gè)顯示器,首先得搞清楚以下關(guān)系:
hsize:每1行圖像實(shí)際在內(nèi)存中占用的有效空間,以32bit表示一個(gè)像素的時(shí)候占用內(nèi)存大小為hsize*4
hstride:用于設(shè)置每行圖像第一個(gè)像素的地址,以32bit 表示一個(gè)像素的時(shí)候h_cnt* hstride*4
vsize:有效的行
因此很容易得出cam0的每行第一個(gè)像素的地址也是h_cnt* hstride*4
同理如果我們需要把cam1在hsize和vsize空間的任何位置顯示,我們只要關(guān)心cam1每一行圖像第一個(gè)像素的地址,可以用以下公式h_cnt* hstride*4+offset
比如我們這里背景輸出到顯示器的分辨率為1280*720,cam1的分辨率是640*480需要移動(dòng)上圖的右下腳,offset=(1280-640)*4*(720-480)
1.3.2設(shè)置地址分配
以sccb方式初始化攝像頭的地址空間截圖
1.4搭建Vitis-sdk工程
創(chuàng)建soc_base sdk platform和APP工程的過(guò)程不再重復(fù),如果不清楚請(qǐng)參考“米聯(lián)客2022版ZynqSocSDK入門(mén)篇”中第一個(gè)工程 “01Vitis Soc開(kāi)發(fā)入門(mén)”這個(gè)實(shí)驗(yàn)。
1.5程序分析
1.5.1 主程序分析
1:地址空間的分配
#define BUF_BASE_SIZE 0x08000000
#define BUF_RANG_SIZE 0x800000
#define BUF1_ADDR BUF_BASE_SIZE + BUF_RANG_SIZE*0
#define BUF2_ADDR BUF_BASE_SIZE + BUF_RANG_SIZE*1
#define BUF3_ADDR BUF_BASE_SIZE + BUF_RANG_SIZE*2
#define VIDEO1_OFFSET (640+1280*240)*4
為了保存2路視頻圖像,我們需要為2路視頻圖像分別設(shè)置2個(gè)緩存地址空間,同時(shí)未來(lái)能讓2個(gè)圖像顯示在一個(gè)屏幕上,我們還需要對(duì)2路圖像緩存地址做合理分配,其中Stride值在這里就大大有用了。
地址為0x08000000=128MB,每個(gè)緩存的空間大小為0x800000=8MB
1.5.2 VDMA寄存器的參數(shù)配置
VDMA采用circle模式,為了確保視頻圖像輸出的不撕裂,需要對(duì)幀延遲做正確設(shè)置:
VideoOut通道,是從模式,和CAM0通道同步,由于CAM1可能延遲1幀于CAM0,所以如果設(shè)置延遲1幀,可能和正在寫(xiě)入的CAM1通道內(nèi)存重疊,導(dǎo)致CAM1圖像撕裂,因此最佳設(shè)置是延遲2幀。
1.5.3:OV5640的鏡像參數(shù)
本文中的攝像頭模塊采用了最新的FEP-CEPX3-CARD模塊,該模塊2個(gè)攝像頭是對(duì)稱(chēng)放置,為了讓2個(gè)圖像都是同一方向,需要把其中的一路圖像設(shè)置鏡像
ov5640_init(sscb_cam0,640,480,0x46,0x07);
ov5640_init(sscb_cam1,640,480,0x40,0x01);
我們可以簡(jiǎn)單了解下OV5640和鏡像相關(guān)的2個(gè)寄存器:
以看出來(lái),只是兩個(gè)寄存器:0x3820控制上下翻轉(zhuǎn),0x3821控制左右翻轉(zhuǎn)。
1.6雙目采集方案演示
1.6.1產(chǎn)品介紹
米聯(lián)客7X開(kāi)發(fā)板采用底板+核心板分體模式設(shè)計(jì),兼顧穩(wěn)定+便捷。核心板7X-7020采用XC7Z020-2CLG400I,具備85K邏輯資源,內(nèi)存為2片512MB DDR3,8GB EMMC,128Mbit QSPI FL ASH。適合需要大量FPGA邏輯資源實(shí)現(xiàn)更多FPGA接口,或者算法的領(lǐng)域。
1.6.2硬件準(zhǔn)備
本實(shí)驗(yàn)需要用到JTAG下載器、USB轉(zhuǎn)串口外設(shè),另外需要把核心板上的2P模式開(kāi)關(guān)設(shè)置到JTAG模式,即ON ON(注意新版本的米聯(lián)客7x,支持JTAG模式,對(duì)于老版本的核心板,JTAG調(diào)試的時(shí)候一定要拔掉TF卡,并且設(shè)置模式開(kāi)關(guān)為OFF OFF)
1.7.62實(shí)驗(yàn)結(jié)果
XC6SLX45T-2FGG484I
XC6SLX75T-3FGG484I
XC6SLX9-2CSG324I
XC6SLX9-2FTG256C
XC6SLX9-2FTG256I
XC6SLX9-2TQG144C
XC7A75T-2FGG676I
XC7K160T-2FFG676C
XC7K160T-2FFG676I
XC7Z010-2CLG400I
XC7Z020-1CLG400I
XC7Z030-1FBG484C
XC7Z045-2FFG900I