1. 程式人生 > >Zynq開發之HLS

Zynq開發之HLS

用戶 高層 通過 嵌入 line first UNC ctr nat

Zynq開發之HLS 技術分享圖片

HLS簡介

HLS(High Level Synthesis)即高層次綜合,不同於以往的FPGA邏輯開發,是用HDL編寫的,開發周期長、難度大。而HLS可以使用C,C++,SystemC以及OPenCL等編寫,通過高層次綜合,可以把軟件代碼轉化為硬件描述語言,可以大大加快開發速度,使軟件工程師也可以編寫硬件語言。

HLS OpenCV簡介

OpenCV是開源的圖像處理和計算機視覺庫,它支持多種操作系統、包含多種計算機語言的接口。HLS opencv是HLS裏帶有的可綜合成HDL的OpenCV庫函數,換句話說,由於HDL和C++的特性(例如動態內存分配不可以綜合成HDL)並不是所有的OpenCV庫函數都可以綜合成HDL,當然目前Xilinx提供了較多的HLS OpenCV庫函數,可以滿足一定的需求,相信以後會越來越多的。

HLS加速模型

技術分享圖片

HLS OpenCV和OpenCV有著相似的書寫風格

OpenCV library : cvScale(src, dst, scale, shift);
HLS video library : hls::Scale<…>(src, dst, scale, shift);

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

加速的opencv應用

技術分享圖片

技術分享圖片

開發註意

技術分享圖片

技術分享圖片

實例
#ifndef _IMAGE_CORE_H_
#define _IMAGE_CORE_H_

#include"hls_video.h" //這裏調用可以綜合的視頻庫

// maximum image size
#define MAX_WIDTH 1920
#define MAX_HEIGHT 1080
// I/O Image Settings
#define INPUT_IMAGE "test_1080p.jpg"
#define OUTPUT_IMAGE "result_1080p.jpg"
#define OUTPUT_IMAGE_GOLDEN "result_1080p_golden.jpg"

// typedef video library core structures
typedef hls::stream<ap_axiu<24,1,1,1> > AXI_STREAM_IN;
typedef hls::stream<ap_axiu<24,1,1,1> > AXI_STREAM_OUT;
typedef hls::Mat<max_height, max_width,="" hls_8uc3=""> RGB_IMAGE;

// top level function for HW synthesis
void image_core(AXI_STREAM_IN& src_axi, AXI_STREAM_OUT& dst_axi, int rows, int cols);

#endif

#include "image_core.h"

void image_core(AXI_STREAM_IN& input, AXI_STREAM_OUT& output, int rows, int cols) {
#pragma HLS RESOURCE variable=input core=AXI4Stream metadata="-bus_bundle INPUT_STREAM"
#pragma HLS RESOURCE variable=output core=AXI4Stream metadata="-bus_bundle OUTPUT_STREAM"
#pragma HLS INTERFACE ap_none port=cols
#pragma HLS INTERFACE ap_none port=rows
//AP_CONTROL_BUS_AXI(CONTROL_BUS);
//set_directive_interface -mode ap_ctrl_none hls_sobel
#pragma HLS interface ap_ctrl_none port=return
RGB_IMAGE img_0(rows, cols);
RGB_IMAGE img_1(rows, cols);
#pragma HLS DATAFLOW // must use data flow to stream the data
hls::AXIvideo2Mat(input, img_0); //read video stream by frames
hls::Sobel<1,0,3>(img_0, img_1);//use Hls Sobel
hls::Mat2AXIvideo(img_1, output); //write the frames to video stream
}

將“input”指定為以 “ S 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"
指定“rows”可通過AXI4-Lite接口進行訪問
#pragma HLS RESOURCE variable=rows core=AXI_SLAVE metadata="-bus_bundle CONTROL_BUS"
聲明在函數執行過程中 “rows”不會改變
#pragma HLS INTERFACE ap_stable port=rows
啟用數據流優化
#pragma HLS dataflow

C綜合
點擊Solution -> Run C Synthesis -> Active Solution
運行test.cpp C仿真測試
#include "image_core.h"
#include "opencv/cv.h"
#include "opencv/cxcore.h"
#include "opencv/highgui.h"
#include "hls_opencv.h"

int main (int argc, char** argv) {
IplImage* src = cvLoadImage(INPUT_IMAGE);
IplImage* dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
AXI_STREAM_IN src_axi;
AXI_STREAM_OUT dst_axi;
IplImage2AXIvideo(src, src_axi); //將圖像轉為視頻流結構
image_core(src_axi, dst_axi, src->height, src->width);
AXIvideo2IplImage(dst_axi, dst);
cvSaveImage(OUTPUT_IMAGE, dst);
cvReleaseImage(&src);
cvReleaseImage(&dst);
}

點擊Project -> Run C simulation,彈出的對話框點確定即可。

技術分享圖片

技術分享圖片

文章來源:skyplain1984的博客

轉載:http://xilinx.eetrend.com/blog/11593

Zynq開發之HLS