天天看點

-03-實時Prewitt邊緣檢測,第一步:硬體平台搭建【ARM NEON加速】 S0. 設計要求 S1. 硬體平台選取 S2. FPGA邏輯設計 S3. ZYBO HDMI Demo工程導入

在上面的一篇裡文章”-02-實時Prewitt邊緣檢測,640×480 @60fps【ARM NEON加速】 “裡,提到了實時Prewitt邊緣檢測的硬體平台,展示了處理效果,還分享了視訊:http://v.youku.com/v_show/id_XMjUyNTk3NzQwOA==.html?from=y1.7-2&spm=a2hzp.8253869.0.0。

下面将詳細介紹整個系統的實作過程。

這一篇,主要介紹Prewitt邊緣檢測的設計要求和硬體平台的選取與設計。

S0. 設計要求

利用基于ARM處理器的可程式設計邏輯平台,設計如下圖所示的片上系統,實作HDMI輸入、VGA輸出的實時視訊處理系統,并運作Prewitt算子計算輸入視訊的二維梯度。

-03-實時Prewitt邊緣檢測,第一步:硬體平台搭建【ARM NEON加速】 S0. 設計要求 S1. 硬體平台選取 S2. FPGA邏輯設計 S3. ZYBO HDMI Demo工程導入

1. HDMI輸入分辨率為1280×720,VGA輸出分辨率為640×480,幀速率為60fps逐行掃描,每個像素的紅、綠、藍通道分别為1位元組(8位)資料。系統将HDMI輸入的圖像資料存儲在DDR RAM中的一個1280×720×3位元組的幀緩沖内,同僚從另一個640×480×3位元組的幀緩沖區讀取圖像資料并輸出至VGA。如果DDR RAM的資料接口為32位,計算HDMI輸入和VGA輸出分别需要占用的存儲器貸款。

2. CPU完成Prewitt算子計算的基本過程是:順序掃描輸出圖像中的每個點,設三坐标為(x/2,y/2+60),找到在輸入圖像中對應的點(x,y),CPU從輸入圖像緩沖區中讀取附近8個點的資料,并計算它們的灰階

-03-實時Prewitt邊緣檢測,第一步:硬體平台搭建【ARM NEON加速】 S0. 設計要求 S1. 硬體平台選取 S2. FPGA邏輯設計 S3. ZYBO HDMI Demo工程導入

則改點在x、y方向的一階梯度分别為

-03-實時Prewitt邊緣檢測,第一步:硬體平台搭建【ARM NEON加速】 S0. 設計要求 S1. 硬體平台選取 S2. FPGA邏輯設計 S3. ZYBO HDMI Demo工程導入

輸出點的灰階為兩個方向梯度的均方根:

-03-實時Prewitt邊緣檢測,第一步:硬體平台搭建【ARM NEON加速】 S0. 設計要求 S1. 硬體平台選取 S2. FPGA邏輯設計 S3. ZYBO HDMI Demo工程導入

CPU将計算結果G加以适當增益後,寫入輸出圖像緩沖區的紅、綠、藍通道。輸出圖像上下空白處用黑色填補。

-03-實時Prewitt邊緣檢測,第一步:硬體平台搭建【ARM NEON加速】 S0. 設計要求 S1. 硬體平台選取 S2. FPGA邏輯設計 S3. ZYBO HDMI Demo工程導入

考慮Prewitt算子計算每個輸出圖像中的點時,需要8個輸入圖像中的點的資料。根據你使用的硬體平台性能參數,計算并驗證DDR RAM存儲器貸款是否滿足60fps實時處理的需求。

3. 在硬體平台上實作該系統,并編寫ARM處理器的程式,在不使用作業系統的情況下,僅由CPU完成Prewitt算子的計算。借助GPIO輸出,觀察CPU計算1幀輸出圖像需要的時間。

4. 利用ARM處理器中的NEON加速引擎,可以同時運算多個計算。編寫程式使用NEON引擎完成這樣的并行計算,以加速Prewitt算子的計算過程,觀察計算1幀輸出圖像需要的時間,與沒有NEON引擎參與的情形對比簡要分析結果。

S1. 硬體平台選取

為了加速開發,我在這裡直接選取開發闆進行設計驗證。而設計要求中說到要用HDMI輸入、VGA輸出、NEON功能,是以,選擇的開發闆需要有HDMI和VGA接口,ARM處理器需要能夠支援NEON功能。

而一直以來Zynq SoC平台接觸的比較多,這裡就直接找一款該平台的開發闆來進行設計。我手頭有ZedBoard和ZyBo開發闆,可惜的是ZedBoard的HDMI接口隻能夠支援輸出,而ZyBO的HDMI接口輸入輸出都能夠支援,是以我就選ZyBo了(ZyBo中XC7Z010晶片中的硬核ARM處理器為Cortex-A9)。

ZyBo是DIgilent公司做的開發闆,網址:中文:http://www.digilent.com.cn/products/product-zybo-zynq-7000-arm-fpga-soc-trainer-board.html,英文:https://reference.digilentinc.com/reference/programmable-logic/zybo/start。

闆子的連結如下圖,圖中的開發闆有四個對外的接口,逆時針來看:USB調試接口、電源接口、HDMI輸入接口(連接配接電腦的HDMI輸出)、VGA輸出接口(連接配接LCD顯示器)。

-03-實時Prewitt邊緣檢測,第一步:硬體平台搭建【ARM NEON加速】 S0. 設計要求 S1. 硬體平台選取 S2. FPGA邏輯設計 S3. ZYBO HDMI Demo工程導入

Zynq系列SoC中,包含了PS(ARM)和PL(FPGA)部分,是以我們需要針對不同的部分進行設計。在FPGA中需要設計HDMI和VGA接口邏輯,以及相關的圖像存儲和讀取邏輯功能;在ARM中需要設計圖像的讀取、Prewitt的NEON加速、以及結果圖像的存儲功能。這裡雖然我就兩句話說明了它們各自的任務,但是還需要進行細緻的軟硬體協同設計,才能夠最終實作相關的功能。

FPGA部分的邏輯設計在這篇文章後面介紹,ARM部分NEON的處理在之後的文章再來介紹。

S2. FPGA邏輯設計

Zynq SoC内PL的邏輯結構設計如下圖:

-03-實時Prewitt邊緣檢測,第一步:硬體平台搭建【ARM NEON加速】 S0. 設計要求 S1. 硬體平台選取 S2. FPGA邏輯設計 S3. ZYBO HDMI Demo工程導入

外部HDMI輸入信号在PL内直接采用的DVP轉RGB圖像的IP子產品進行資料HDMI信号的解碼,再經過并行資料到串行資料的轉換,并通過VDMA實作視訊輸入資料到DDR3存儲器的存儲。在一幀圖像資料采集完成後PL會産生一個中斷信号到ARM處理器,處理器會開使執行圖像的Prewitt濾波程式,并将計算結果儲存到指定的顯存空間中。VDMA會同步将顯存中的濾波後圖像讀取出來,然後将串行資料到RGB并行資料,并最終通過VGA顯示IP子產品實作VGA接口信号的輸出。

上面的邏輯結構與設計要求中的視訊資料流方式基本相同,一般的ARM晶片實作方式也是類似的。但是是以前沒有用過Zynq的話,設計起來還是非常複雜的(因為涉及到了FPGA部分的調試,不像一般晶片中的視訊輸入輸出接口是固化到晶片内的)。

HDMI TMDS

HDMI是我們常見到的一種顯示接口,一端連接配接電腦之類裝置、另外一端連接配接顯示器進行顯示。HDMI接口與DVI接口比較除了能夠額外支援音頻信号的輸出,其它部分與DVI接口可以說是一模一樣的。HDMI的資料是通過高速查分信号進行傳輸的,而且需要使用I2C接口傳輸顯示器的EDID資訊,可以百度一下HDMI接口或者關于TMDS的介紹:

HDMI:http://baike.baidu.com/link?url=dqa3Y8hzdBAiTGCm8abtf-WkqkskyDhwa3D5QaUo3xDpiZ_jmUe_-eEQMRxubQO3NEgNDTFj3fVb77SDVT_-cK

HDMI之TMDS:blog.sina.com.cn/s/blog_679686370100vgg1.htmlhttp://blog.sina.com.cn/s/blog_679686370100vgg1.html

DVI & HDMI 的 TMDS 原理:http://blog.sina.com.cn/s/blog_6a382cce0102vm79.html

高速查分信号看起來描述的挺簡單的,在一般的嵌入式處理器中調試起來也比較簡單,但是,但是,在FPGA裡面去用邏輯實作還是非常複雜的!因為涉及到高速信号,必須要用的SERDES,自己重頭去設計相關的接口簡直是···我還是算了吧,找找現成的吧!

VGA

VGA接口的信号時序還是非常簡單和易懂的,在FPGA中實作起來也很友善,我就不介紹了。

VDMA

AXI Video DMA是Xilinx Vivado中本身就包含的視訊DMA IP,使用方法仔細研究官方文檔:

AXI Video DirectMemory Access v6.2:https://www.xilinx.com/support/documentation/ip_documentation/axi_vdma/v6_2/pg020_axi_vdma.pdf

看起來是不是很麻煩,還不直接去用一般的嵌入式ARM晶片去實作。但是不要擔心,在選用ZyBo之前我就想到了這些, 看一下這個連結:ZYBO HDMI Demo:https://reference.digilentinc.com/learn/programmable-logic/tutorials/zybo-hdmi-demo/start。

看完以後是不是很開森~~

上面說了那麼多,最後還是用了别人給的Demo,是不是覺得我都說了廢話。但是俗話都說 知其然不知其是以然 是不好的,他是怎麼實作的還是需要仔仔細細的閱讀他的RTL代碼去學習。 雖然我花點時間也可以做出來相同的功能,但是時間寶貴啊,請上天寬恕我的偷懶··

ZYBO HDMI Demo的源碼位址:

ZIP:https://github.com/Digilent/ZYBO/archive/master.zip

GitHub:https://github.com/Digilent/ZYBO

這個倉是ZyBo的所有例子,HDMI Demo在子目錄/tree/master/Projects/hdmi_in中

S3. ZYBO HDMI Demo工程導入

下載下傳源碼檔案後,打開子目錄:ZYBO-master\Projects\hdmi_in,即是HDMI Demo工程。工程沒有包含所有的檔案,需要運作tcl腳本進行建立。我下載下傳的源碼是在Vivado 2016.2中設計的,是以又得重新下載下傳一個2016.2的軟體了(之前用的2015.4和2016.3,好煩啊~~~)。

如何運作tcl腳本建立工程參考文檔:How to Generate a Project from Digilent’s Github Repository:https://reference.digilentinc.com/learn/software/tutorials/vivado-projects-from-digilent-github/start?redirect=1

運作腳本後我們就可以打開hdmi_in.xpr工程了。

hdmi_in.bd檔案的子產品連接配接如下圖,看起來有點複雜,其實跟S2中說到的FPGA邏輯結構圖功能基本相同。

-03-實時Prewitt邊緣檢測,第一步:硬體平台搭建【ARM NEON加速】 S0. 設計要求 S1. 硬體平台選取 S2. FPGA邏輯設計 S3. ZYBO HDMI Demo工程導入

接下來就是正常的點按鈕!:綜合、實作、生成bitstream、Export Hardware、Launch SDK。

Xilinx SDK打開後,就可以進行PS部分ARM程式的設計了,下一篇再來詳細介紹~~