VVAS调用HLS生成硬件加速器的主要流程介绍

01
hls kernel创建
我们以smartcam的预处理作为例子。xf_pp_pipeline的作用是将输入图像的格式从nv12转换为bgr,再进行减均值和归一化操作。xf_pp_pipeline的实现基于hls vision library。vitis视觉库是为在vitis开发环境中工作而设计的,它为在fpga设备上加速的计算机视觉功能提供了一个软件接口。vitis视觉库的功能大多与opencv的功能相似。更多的详细说明可以在参考链接中找到。
#include xf_pp_pipeline_config.hvoid pp_pipeline_accel(ap_uintxf_pp_pipeline_accel.cpp作为硬件的一部分,需要将它和platform结合在一起。v++将hls kernel打包为xo文件用于后续的硬件集成。
kv260_ispmipirx_vcu_dp是smartcam应用使用的platform,xf_pp_pipeline.cpp打包成xo对象后,通过v++链接为完整的硬件工程并生成xclbin文件。完整的硬件框图如下图所示,红框部分为对应的hls kernel。
02
kernel调用
使用vvas框架为xf_pp_pipeline.cpp编写自定义驱动是要实现四个函数,分别是xlnx_kernel_start、xlnx_kernel_done、xlnx_kernel_init、xlnx_kernel_deinit。
xlnx_kernel_init()函数读取json文件中的mean_r、mean_g、mean_b、scale_r、scale_g、scale_b。
int32_t xlnx_kernel_init(ivaskernel *handle){ ...... kernel_priv- >mean_r = json_number_value(val); kernel_priv- >mean_g = json_number_value(val); kernel_priv- >mean_b = json_number_value(val); kernel_priv- >scale_r = json_number_value(val); kernel_priv- >scale_g = json_number_value(val); kernel_priv- >scale_b = json_number_value(val); ......}xlnx_kernel_start()函数为hls kernel配置参数。
int32_t xlnx_kernel_start(ivaskernel *handle, int start, ivasframe *input[max_num_object], ivasframe *output[max_num_object]){ ...... ivas_register_write(handle, &(input[0]- >props.width), sizeof(uint32_t), 0x40); /* in width */ ivas_register_write(handle, &(input[0]- >props.height), sizeof(uint32_t), 0x48); /* in height */ ivas_register_write(handle, &(input[0]- >props.stride), sizeof(uint32_t), 0x50); /* in stride */ ivas_register_write(handle, &(output[0]- >props.width), sizeof(uint32_t), 0x58); /* out width */ ivas_register_write(handle, &(output[0]- >props.height), sizeof(uint32_t), 0x60); /* out height */ ivas_register_write(handle, &(output[0]- >props.width), sizeof(uint32_t), 0x68); /* out stride */ ivas_register_write(handle, &(input[0]- >paddr[0]), sizeof(uint64_t), 0x10); /* y input */ ivas_register_write(handle, &(input[0]- >paddr[1]), sizeof(uint64_t), 0x1c); /* uv input */ ivas_register_write(handle, &(output[0]- >paddr[0]), sizeof(uint64_t), 0x28); /* output */ ivas_register_write(handle, &(kernel_priv- >params- >paddr[0]), sizeof(uint64_t), 0x34); /* params */ ivas_register_write(handle, &start, sizeof(uint32_t), 0x0); /* start */ ......}xlnx_kernel_deinit()函数用来释放不需要的句柄。
uint32_t xlnx_kernel_deinit(ivaskernel *handle){ resizekernelpriv *kernel_priv; kernel_priv = (resizekernelpriv *)handle- >kernel_priv; ivas_free_buffer (handle, kernel_priv- >params); free(kernel_priv); return 0;}xlnx_kernel_done()函数进行超时检测。
int32_t xlnx_kernel_done(ivaskernel *handle){ uint32_t val = 0, count = 0; do { ivas_register_read(handle, &val, sizeof(uint32_t), 0x0); /* start */ count++; if (count > 1000000) { printf(error: kernel done wait time out !!\\\\n); return 0; } } while (!(0x4 & val)); return 1;}通过这四个函数就完成了vvas自定义插件的设计。在smartcam应用运行时,通过命令行gst-launch-1.0 -v filesrc xxxxxx ! queue ! vvas_xmultisrc kconfig=/opt/xilinx/kv260-smartcam/share/vvas/facedetect/preprocess.json ! xxxxxx完成插件的调用。
其中preprocess.json的内容为:
{ xclbin-location:/lib/firmware/xilinx/kv260-smartcam/kv260-smartcam.xclbin, vvas-library-repo: /opt/xilinx/kv260-smartcam/lib, element-mode: transform, kernels: [ { kernel-name: pp_pipeline_accel:{pp_pipeline_accel_1}, library-name: libvvas_xpp.so, config: { debug_level : 1, mean_r: 123, mean_g: 117, mean_b: 104, scale_r: 1, scale_g: 1, scale_b: 1 } } ]}

曝光高通骁龙830处理器配置:10nm工艺
电阻的测量方法有哪些
以太坊智能合约详细介绍
小米note2最新消息:随着小米6的发布,小米note2更难卖出去了
金鉴实验室:LED硫化、LED失效分析
VVAS调用HLS生成硬件加速器的主要流程介绍
IP SoC China 2023 开幕在即,Cadence 携两场技术演讲与您相约!
中心化交易所DEX的发展现状及未来趋势分析
谷歌决定不再竞争价值高达100亿美元的五角大楼云计算合同
基于NB-IoT物联网的路灯智能控制的特点性能
诺基亚情怀已经过去,那就重新征服,诺基亚8或将来临
带您探秘芯片与晶圆测试世界中的神器
研究人员证明可以使用生成性对抗网络(GAN)伪造CT和MRI扫描结果
通过DMA模式控制串口传输的方法
中美贸易争议升温 美下一步可能瞄准消费性电子
小米有品上架一款小沐智能马桶盖AI版 断网情况下也能本地语音控制智能马桶盖的各个功能
三星Galaxy Note 10系列即将发布国行版内置8GB+256GB组合支持25W快充
低功耗冷链资产管理RFID芯片SI24R2F+介绍
利用FPGA和CPLD技术实现8位RISC微处理器的设计并进行仿真分析
机器人焊接设备有什么功能