本篇文章來(lái)自 FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor。在這里感謝 Adam Taylor 對(duì) ALINX 產(chǎn)品的關(guān)注與測(cè)試。為了讓文章更易閱讀,我們?cè)谠牡幕A(chǔ)上作了一些靈活的調(diào)整,包括對(duì)一些專(zhuān)業(yè)名詞進(jìn)行了補(bǔ)充解釋?zhuān)阌诔鯇W(xué)者快速理解。原文鏈接已貼在文章底部,點(diǎn)擊"閱讀原文"即可跳轉(zhuǎn)。歡迎大家在評(píng)論區(qū)友好互動(dòng)。
最近,我在辦公室里搞了一塊ALINX VD100。
這是一塊基于AMD Versal Edge AI平臺(tái)的開(kāi)發(fā)板,功能特別強(qiáng)大,可以用來(lái)做圖像處理、人工智能等各種高階應(yīng)用。
為了方便隨時(shí)開(kāi)發(fā),我把它連到了公司局域網(wǎng),遠(yuǎn)程就能連接,由此開(kāi)始了我的折騰之旅。
這次,我最想探索的是:怎么在這塊板子上跑圖像處理的應(yīng)用。
VD100不僅帶了兩個(gè) MIPI 攝像頭接口,還能直接連上LCD屏幕,基本滿(mǎn)足了圖像應(yīng)用開(kāi)發(fā)的需求。
第一步:讓屏幕先亮起來(lái)!
搞攝像頭太復(fù)雜,我決定先從屏幕入手——先通過(guò)測(cè)試圖案生成器(Test Pattern Generator)驗(yàn)證 LCD 屏幕圖像顯示鏈路的有效性。
ALINX VD100開(kāi)發(fā)板支持的 LCD 屏幕,分辨率是1280×720(WXGA 標(biāo)準(zhǔn))。
數(shù)據(jù)傳輸采用的是VESA 標(biāo)準(zhǔn)的 LVDS 接口。
這里稍微解釋一下:
LVDS(低壓差分信號(hào))是一種高速又抗干擾的數(shù)據(jù)傳輸方式,特別適合屏幕傳輸高速畫(huà)面。
VESA 和 JEIDA 是常見(jiàn)的兩種 LVDS 傳輸標(biāo)準(zhǔn),咱們用的是 VESA。VESA 更國(guó)際通用,JEIDA 常見(jiàn)于日本廠商。
在 VESA 標(biāo)準(zhǔn)下使用 RG888 格式時(shí),屏幕的每一幀圖像數(shù)據(jù)和控制信號(hào)(如同步信號(hào) hsync、vsync)會(huì)被打包進(jìn) 4 條數(shù)據(jù)通道里,同時(shí)還有第 5 條通道專(zhuān)門(mén)傳時(shí)鐘(Clock),方便接收端正確還原數(shù)據(jù)。
每次時(shí)鐘跳動(dòng)時(shí),每條數(shù)據(jù)通道都會(huì)同步傳7 位數(shù)據(jù)。
聽(tīng)起來(lái)有點(diǎn)復(fù)雜?簡(jiǎn)單說(shuō)就是:用 4+1 條小路,高速搬運(yùn)屏幕畫(huà)面。
開(kāi)發(fā)流程:搭建系統(tǒng)設(shè)計(jì)
為了讓板子順利傳屏幕數(shù)據(jù),我們需要在 Vivado(AMD/Xilinx 的開(kāi)發(fā)工具)里做一套設(shè)計(jì),包括:
CIPS
→ 配置 VD100 平臺(tái)上的 V100 SoM。
NOC
→ 配置 DDRMC,并開(kāi)兩條 MAXI 輸出,提供數(shù)據(jù)存取支持。
視頻測(cè)試圖生成器 (Video Test Pattern Generator, TPG)
→ 通過(guò) AXI Lite 總線連接到 NOC,生成標(biāo)準(zhǔn)圖像(比如彩條、棋盤(pán)格)。
視頻時(shí)序生成器 (Video Timing Controller, VTC)
→ 通過(guò) AXI Lite 總線連接到 NOC,生成 LCD 顯示需要的同步信號(hào)(如 hsync、vsync)。
AXI4-Stream to Video Out
→ 與上述兩個(gè)生成器相連,把測(cè)試圖和時(shí)序信息組織成并行視頻流(RGB888格式)。
LCD_LVDS IP核
→ 把并行視頻信號(hào)轉(zhuǎn)成符合 LVDS 規(guī)范的數(shù)據(jù)流。
Advanced IO Wizard
→ 負(fù)責(zé)真正的串行化操作,把數(shù)據(jù)以 LVDS 標(biāo)準(zhǔn)發(fā)出去(包括 4 路數(shù)據(jù)+ 1 路時(shí)鐘)。
最終 LCD 屏幕接收到 LVDS 信號(hào)并顯示圖像。
這套設(shè)計(jì)(可以在我的 GitHub 上找到)如下所示:
通過(guò)這個(gè)系統(tǒng),我們可以使用 CIPS 內(nèi)置的處理器來(lái)控制測(cè)試圖案,從而驗(yàn)證各顏色通道是否正常。
設(shè)置和驅(qū)動(dòng) LCD 顯示器的 CIPS 端代碼也非常簡(jiǎn)單,如下所示:
#include#include"platform.h" #include"xil_printf.h" #include"xvtc.h" #include"xparameters.h" #include"xv_tpg.h" #include"xvidc.h" #include"vga.h" XV_tpg tpg; XVtc VtcInst; VideoMode video; XVtc_Config *vtc_config ; intmain() { XVtc_SourceSelect SourceSelect; XVtc_Timing vtcTiming; u32 height,width,status; init_platform(); print("Setting up Timing "); vtc_config =XVtc_LookupConfig(XPAR_XVTC_0_BASEADDR); XVtc_CfgInitialize(&VtcInst,vtc_config ,XPAR_XVTC_0_BASEADDR); print("Setting up Video "); video = VMODE_1280x720 ; vtcTiming.HActiveVideo = video.width; vtcTiming.HFrontPorch = video.hps - video.width; vtcTiming.HSyncWidth = video.hpe - video.hps; vtcTiming.HBackPorch = video.hmax - video.hpe +1; vtcTiming.HSyncPolarity = video.hpol; vtcTiming.VActiveVideo = video.height; vtcTiming.V0FrontPorch = video.vps - video.height; vtcTiming.V0SyncWidth = video.vpe - video.vps; vtcTiming.V0BackPorch = video.vmax - video.vpe +1;; vtcTiming.V1FrontPorch = video.vps - video.height; vtcTiming.V1SyncWidth = video.vpe - video.vps; vtcTiming.V1BackPorch = video.vmax - video.vpe +1; vtcTiming.VSyncPolarity = video.vpol; vtcTiming.Interlaced =0; print("Setting up TPG "); XV_tpg_Initialize(&tpg,XPAR_XV_TPG_0_BASEADDR ); status =XV_tpg_IsIdle(&tpg); XV_tpg_Set_height(&tpg, (u32) video.height); XV_tpg_Set_width(&tpg, (u32) video.width); height =XV_tpg_Get_height(&tpg); width =XV_tpg_Get_width(&tpg); XV_tpg_Set_colorFormat(&tpg,XVIDC_CSF_RGB); XV_tpg_Set_bckgndId(&tpg,XTPG_BKGND_TARTAN_COLOR_BARS); XV_tpg_Set_maskId(&tpg,0x0); XV_tpg_Set_motionSpeed(&tpg,0x4); XV_tpg_EnableAutoRestart(&tpg); XV_tpg_Start(&tpg); print("Setting up Source "); memset((void*)&SourceSelect,0,sizeof(XVtc_SourceSelect)); SourceSelect.VBlankPolSrc =1; SourceSelect.VSyncPolSrc =1; SourceSelect.HBlankPolSrc =1; SourceSelect.HSyncPolSrc =1; SourceSelect.ActiveVideoPolSrc =1; SourceSelect.ActiveChromaPolSrc=1; SourceSelect.VChromaSrc =1; SourceSelect.VActiveSrc =1; SourceSelect.VBackPorchSrc =1; SourceSelect.VSyncSrc =1; SourceSelect.VFrontPorchSrc =1; SourceSelect.VTotalSrc =1; SourceSelect.HActiveSrc =1; SourceSelect.HBackPorchSrc =1; SourceSelect.HSyncSrc =1; SourceSelect.HFrontPorchSrc =1; SourceSelect.HTotalSrc =1; print("Run Timing Gen "); XVtc_SetGeneratorTiming(&VtcInst, &vtcTiming); XVtc_SetSource(&VtcInst, &SourceSelect); XVtc_EnableGenerator(&VtcInst); XVtc_RegUpdateEnable(&VtcInst); XVtc_Enable(&VtcInst); while(1){ }; cleanup_platform(); return0; }
LCD_LVDS 這個(gè)模塊,我是直接從 ALINX 的 GitHub 倉(cāng)庫(kù)上下載的。
下載好后,把它加到 Vivado 里面,就能像拼積木一樣拖進(jìn)設(shè)計(jì)里。
LCD_LVDS 下載鏈接:https://github.com/alinxalinx/VD100_2023.2/tree/master/Demo/course_s1
寫(xiě)好所有程序后,我們讓開(kāi)發(fā)板運(yùn)行,屏幕上果然顯示出了測(cè)試圖案,色彩鮮明,說(shuō)明各個(gè)顏色通道都正常了。開(kāi)發(fā)板和屏幕之間的溝通,算是正式打通了!
不過(guò),這里面有個(gè)很有意思的事情。
Advanced IO Wizard 這個(gè)模塊,默認(rèn)是按 8 位一組來(lái)打包數(shù)據(jù)發(fā)出去的。
而我們的 VESA LVDS 傳輸,要求 7 位一組。這咋辦?
我用到了一個(gè)叫做 Gearbox 的小模塊,把 7 位數(shù)據(jù)轉(zhuǎn)換成 4 位數(shù)據(jù)輸出。
然后,用 Advanced IO Wizard 把 4 位數(shù)據(jù)高速串行發(fā)出去。
這樣就實(shí)現(xiàn)了 7 位序列化,雖然中間多了一步變換,但整體還是很高效的。
不過(guò),其實(shí)只要手動(dòng)配置一下,Advanced IO Wizard 也是可以支持直接 7 位打包發(fā)送的,只是這次參考了 AMD 的官方應(yīng)用筆記(參考代碼叫 tx_piso_7to1),所以先用了 Gearbox 的方式。
未來(lái)有機(jī)會(huì)的話,我想試著優(yōu)化一下,直接用 7 位串行模式,把系統(tǒng)做得更簡(jiǎn)潔高效!
接下來(lái)要做的
現(xiàn)在圖像輸出環(huán)節(jié)已經(jīng)搞定了,接下來(lái)就是更刺激的前端部分:
通過(guò) MIPI 接口接入攝像頭,把真實(shí)拍到的圖像,實(shí)時(shí)顯示到屏幕上。
真正的圖像處理任務(wù),馬上就要開(kāi)始啦!
(未完待續(xù))
-
FPGA
+關(guān)注
關(guān)注
1644文章
22007瀏覽量
616361 -
amd
+關(guān)注
關(guān)注
25文章
5577瀏覽量
136117 -
圖像處理
+關(guān)注
關(guān)注
27文章
1326瀏覽量
57870 -
lvds
+關(guān)注
關(guān)注
2文章
1122瀏覽量
67284 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5620瀏覽量
103497
原文標(biāo)題:【實(shí)戰(zhàn)筆記】FPGA 大神 Adam Taylor 使用 ALINX VD100(AMD Versal系列)開(kāi)發(fā)平臺(tái)實(shí)現(xiàn)圖像處理
文章出處:【微信號(hào):ALINX,微信公眾號(hào):ALINX】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
FPGA 大神 Adam Taylor 使用 ALINX VD100(AMD Versal系列)開(kāi)發(fā)平臺(tái)實(shí)現(xiàn)圖像處理

如何用51開(kāi)發(fā)板實(shí)現(xiàn)藍(lán)牙小車(chē)的設(shè)計(jì)
51開(kāi)發(fā)板實(shí)現(xiàn)計(jì)算器
STM32F103ZET6開(kāi)發(fā)板實(shí)現(xiàn)俄羅斯方塊小游戲
使用51單片機(jī)開(kāi)發(fā)板實(shí)現(xiàn)LED點(diǎn)陣顯示數(shù)字0的程序免費(fèi)下載

使用STM32開(kāi)發(fā)板實(shí)現(xiàn)俄羅斯方塊游戲的工程文件和源代碼免費(fèi)下載

使用單片機(jī)開(kāi)發(fā)板實(shí)現(xiàn)LED流水和定時(shí)器的程序免費(fèi)下載

ALINX紫光同創(chuàng)國(guó)產(chǎn)FPGA開(kāi)發(fā)板PGL22G發(fā)布

STM32實(shí)例——基于STM32開(kāi)發(fā)板實(shí)現(xiàn)傳感數(shù)據(jù)采集-DHT11溫濕度采集

ALINX FPGA+GPU異架構(gòu)視頻圖像處理開(kāi)發(fā)平臺(tái)介紹
基于ALINX開(kāi)發(fā)板Z19-P實(shí)現(xiàn)WIFI無(wú)線通信功能

基于RV1126開(kāi)發(fā)板實(shí)現(xiàn)人員檢測(cè)方案

基于RV1126開(kāi)發(fā)板實(shí)現(xiàn)人臉識(shí)別方案

評(píng)論