*本文是對Xilinx官方教學視頻部分內容的提煉和簡單整理
原視頻地址:http://v.elecfans.com/video/ysp-v2.html
1 HLS視頻庫與OpenCV
OpenCV是可以直接在ARM架構上運行的計算機視覺庫,但是在FPGA上不能直接處理。
在HLS中對OpenCV的開發過程可以看作分成兩個部分:輸入輸出模塊(模塊A和D)以及處理模塊(模塊B和C)。其中輸入輸出部分是軟件完成的,將數據轉換成AXIvideo格式並將OpenCV的函數轉換為相應的HLS可綜合的函數,使得算法可綜合並用FPGA硬件加速算法。第二步的轉換過程AXIvideo2HLS是轉成MAT格式(相當於OpenCV的矩陣形式)或Stream格式(數據流的形式)來處理圖像數據。流架構的設計優勢是性能更高,功耗更低。

前面提到OpenCV代碼是不可綜合的,原因在於OpenCV的很多函數是采用動態內存分配的;函數運算都是基於浮點數運行的;且其默認圖像總是在外部存儲器中修改的。而對於FPGA來說,圖像是從DDR中導入在內部進行處理的。

HLS視頻庫(HLS Video Library)是對OpenCV許多函數的替換,使其變成基於FPGA優化處理的替代OpenCV的函數。比如,最基本的就是其運算是定點運算,而不是浮點運算。其部分函數如下:

具體的函數功能在UG902文檔中均有介紹。需要注意的是這些視頻庫函數是在hls命名空間中的,不要忘記聲明頭文件。

2 HLS視頻庫C++代碼詳解
下圖為使用HLS視頻庫函數的具體例子,包括各個環節的對應代碼。其中,hls_video.h中的內容都是可綜合的,而hls_opencv.h中的內容是不可綜合的。


可以看到在上述代碼中有很多pragma語句,是對編譯器的約束指令。
2.1 #pragma約束詳解

//將“input”指定為以“INPUT_STREAM”命名的AXI4 Stream格式 #pragma HLS RESOURCE variable=input core=AXIS metadata="-bus_bundle INPUT_STREAM" //將控制接口分配到AXI4-Lite接口 #pragma HLS RESOURCE variable=return core=AXI_SLAVE metadata="-bus_bundle CONTROL_BUS" //指定“row”(像素行數,即圖片寬度尺寸)可通過AXI4-Lite接口進行訪問 #pragma HLS RESOURCE variable=rows core=AXI_SLAVE metadata="-bus_bundle CONTROL_BUS" //聲明在函數執行過程中“row”參數不會改變 #pragma HLS INTERFACE ap_stable port=rows //啟用流媒體數據流優化 #pragma HLS dataflow
2.2 以快速角點算法為例演示HLS數據流的處理特性
下圖中的代碼不是以數據流的形式編寫的,因為以數據流的形式不能直接用std::vector以及cvRectangle等方法,也是不能畫矩形框的。 

3 延遲處理
src1對快速角點算法檢測位置對應矩形框的繪制的數據流,要與算法檢測位置的數據流延遲相匹配,這也是#pragma中設置“depth=20000”的理由:

ug902-vivado-high-level-synthesis文檔地址:
