精华内容
下载资源
问答
  • vivado HLS图像处理了解

    2018-06-06 17:14:17
    使用vivado HLS 进行图像处理,需要了解的一些基本知识!
  • Vivado HLS关于图像处理的数据手册。内有相关函数介绍。
  • 通过Xilinx最新的Vivado HLS工具,设计实现了可变参数的拉普拉斯算子图像滤波算法,并且在ZYNQ-7000 SoC上构建了可视化的实时嵌入式图像处理系统。实验结果表明,系统可以实现不同的图像处理算法,很好地满足了图像...
  • vivado_hls_tutorial:使用HLS openCV函数的Xilinx Vivado基本HLS图像处理教程的源代码
  • System Generator从入门到放弃...文章目录System Generator从入门到放弃(九)-利用Vivado HLS block实现Vivado HLS调用C/C++代码一、利用Vivado HLS block实现Vivado HLS调用C/C++代码1、简介2、利用Vivado HLS bloc...

    System Generator从入门到放弃(九)-利用Vivado HLS block实现Vivado HLS调用C/C++代码



      System Generator是Xilinx公司进行数字信号处理开发的一种设计工具,它通过将Xilinx开发的一些模块嵌入到Simulink的库中,可以在Simulink中进行定点仿真,可以设置定点信号的类型,这样就可以比较定点仿真与浮点仿真的区别。并且可以生成HDL文件,或者网表,可以在ISE中进行调用。或者直接生成比特流下载文件。能够加快DSP系统的开发进度。


    一、利用Vivado HLS block实现Vivado HLS调用C/C++代码


    1、简介

      Vivado HLS是Xilinx FPGA开发套件中的一款软件,可以使用C/C++语言进行设计,并转换为RTL级模型。System Generator中的Vivado HLS block可以将HLS开发软件设计的C/C++代码整合到Simulink环境中,利用Simulink强大的仿真特性对设计进行仿真测试。
      ug948中提供的官方例程为图像的中值滤波,该设计将一副256*256大小的RGB图像,添加噪声后提取出其中的Y通道,使用C++语言完成中值滤波。该设计将在Simulink环境下进行仿真。
      本次设计的流程是利用Vivado HLS建立C/C++代码,Export RTL–>System Generator–>Vivado。


    2、利用Vivado HLS block实现Vivado HLS调用C/C++代码 流程

    2.1 Vivado HLS完成中值滤波设计

      建立相关HLS中的程序,其中Source中建立MedianFilter.cpp程序,程序如下:
    PS:这部分例程在官方ug948-design-files.zipLab2中找到。


    MedianFilter.cpp

    #include "MedianFilter.h"
    #define WINDOW_SIZE  3
    typedef unsigned char PixelType;
    
    #define PIX_SWAP(a,b) { PixelType temp=(a);(a)=(b);(b)=temp; }
    #define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); }
    
    PixelType OptMedian9(PixelType * p)
    {
    	PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
    	PIX_SORT(p[0], p[1]) ; PIX_SORT(p[3], p[4]) ; PIX_SORT(p[6], p[7]) ;
    	PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
    	PIX_SORT(p[0], p[3]) ; PIX_SORT(p[5], p[8]) ; PIX_SORT(p[4], p[7]) ;
    	PIX_SORT(p[3], p[6]) ; PIX_SORT(p[1], p[4]) ; PIX_SORT(p[2], p[5]) ;
    	PIX_SORT(p[4], p[7]) ; PIX_SORT(p[4], p[2]) ; PIX_SORT(p[6], p[4]) ;
    	PIX_SORT(p[4], p[2]) ; 
        return(p[4]) ;
    }
    
    PixelType Mean(PixelType* buffer)
    {
        PixelType i, j, min;
        unsigned int sum;
        for (i = 0;i<9; i++) {
        	sum+=buffer[i];
        }
        sum/=(WINDOW_SIZE*WINDOW_SIZE);
        return sum;
    }
    
    PixelType Min(PixelType* buffer)
    {
        PixelType i, j, min;
        min = buffer[0];
        for (i = 1;i<9; i++) {
            if (min>buffer[i]) min = buffer[i];
        }
        return min;
    }
    
    
    
    void MedianFilter(PixelType row1, PixelType row2, PixelType row3, PixelType* V)
    {
    #pragma AP PIPELINE  II=1
    	/*
    	 * Create a local Pixel Buffer based on WindowSize
    	 */
    	static PixelType pixelWindowBuffer[WINDOW_SIZE*WINDOW_SIZE];
    
    	PixelType sortBuffer[WINDOW_SIZE*WINDOW_SIZE];
    
        /*
        * Each Iteration Interval Update the Pixel Buffers
        */
    	for(int i = 0;i<WINDOW_SIZE;++i) {
    		for(int j=0;j<(WINDOW_SIZE-1);++j) {
    			pixelWindowBuffer[WINDOW_SIZE*i + (WINDOW_SIZE-j-1)] = pixelWindowBuffer[WINDOW_SIZE*i + (WINDOW_SIZE-j-1)-1];
    		}
    	}
    
        /*
         * Update the first Pixel of each row
         */
        pixelWindowBuffer[0] = row1;
        pixelWindowBuffer[3] = row2;
        pixelWindowBuffer[6] = row3;
    
        for(int k = 0;k<9;++k) {
        	sortBuffer[k] = pixelWindowBuffer[k];
        }
    
        *V = OptMedian9(sortBuffer);
    }
    
    
    
    

    MedianFilter.h

    
    #ifndef __MEDIAN__FILTER__
    #define __MEDIAN__FILTER__
    void MedianFilter(unsigned char R, unsigned char G, unsigned char B, unsigned char* V);
    #endif
    
    

      右键Solution->C Synthesis->Active Solution,综合设计源文件。

    在这里插入图片描述
      当综合完成时, Vivado HLS displays 将显示this message:

    • Finished C synthesis.

      完成后,再右键Solution->Export RTL,Format Selection选择为“System Generator for DSP”,点击OK将设计源文件打包为System Generator可以使用的形式。
    在这里插入图片描述

    当Export RTL完成时, Vivado HLS displays 将显示:

    • Finished export RTL

    2.2 将HLS设计导入System Generator


    Xilinx block

    • Vivado HLS block(->Index):调用HLS代码
    • System Generator(->Basic Elements):系统管理
    • Gateway In(->Basic Elements):数据输入
    • Gateway Out(->Basic Elements):数据输出

    其它block

    • 图像处理相关Block
    • Scope(Simulink->Commonly Used Blocks):示波器

      添加一个Vivado HLS block,双击打开该block:
    在这里插入图片描述

      点击Browse,将路径指定到HLS工程的Solution文件夹下。如果路径选择错误,或者HLS工程综合或导出失败导致solution文件夹下没有可用的System Generator文件,软件会提示错误。
    在这里插入图片描述

      设置完毕后,block端口也会随之改变,部分端口名称以ap_开头,表示与block之间的ap_hs通信协议。model的整体连接图如下:
    在这里插入图片描述

      其中包含几个子系统,各子系统及其作用如下:

    • Noisy Image:导入一副256*256的图像,转换为一维数据,并为其添加椒盐噪声;
    • RGB2Y:将R、G、B通道转换为Y通道(Y=0.299R+0.587G+0.114B,可以简化为只用两个乘法器的形式Y=0.299(R-G)+0.114*(B-G)+G);
    • LineBuffer:缓存器存储数据;
    • Noisy Input Image/Filtered Image:缓存数据,将一维数据转换为二维图像显示。

    2.3 仿真测试

      在Noisy Image子系统下,打开Image From File这个block(属于Computer Vision System Toolbox库)。点击Browse,将路径指向一副256256大小的彩色图片。将仿真时间设置为256256*2,确保可以完成一次图像滤波。运行结果如下:
    在这里插入图片描述
      Use the toolbar button Up 在这里插入图片描述 to Parent to return to the top level
      保存后,进行仿真,结果如下:
    PS:运行时间比较久,要耐心等待!!
    在这里插入图片描述
      可以看到经过中值滤波后,很好地滤除了图像中的椒盐噪声。


    3、Vivado HLS block详解

    摘自:https://blog.csdn.net/FPGADesigner/article/details/80985418
      该block支持C、C++和System C三种设计源文件。使用是首先需要在Vivado HLS开发环境下将设计源文件打包到Solution目录下,然后在block中指向该目录,将设计导入到System Generator设计中。
    在这里插入图片描述
      点击“Edit”可以打开与该solution对应的Vivado HLS工程,允许设计者修改;修改后点击“Refresh”更新block的端口信息。

      block默认采用RTL-model进行仿真,如果HLS中包含C仿真模型,可以选中“Use C simulation model if available”,选择C仿真模型。

      当选中“Display signal types”时,输入和输出的数据类型会显示在图标上,设计者可以根据该提示设置向此block输入的数据,如下图:
    在这里插入图片描述

      C/C++数据类型和System Generator数据类型之间的转换关系如下表:

    在这里插入图片描述
      在Vivado HLS中进行设计时有如下限制:

    • 设计不能是纯组合逻辑,综合到RTL设计后必须包含一个时钟和时钟使能输入信号;
    • 顶层模块中不能包含C/C++模板语法;
    • C仿真模型与block通信时支持ap_hs通信协议,但不支持ap_memory和ap_bus接口。




    展开全文
  • 参考资料:xilinx大学计划实验平台:ZYBO开发板本次...一、Vivado HLS 部分首先我们用Vivado HLS来编写FPGA图像处理所用的IP核。1.绘制直方图1.首先编写相应的C/C++语言程序,加入到Vivado HLS工程中,再编写相应的t...

    82fa05d5b88e6ebbf931a52e16bd333c.png

    参考资料:xilinx大学计划

    实验平台:ZYBO开发板

    本次实验要做的是一个基于FPGA的简单图像处理程序, 共实现两个功能:

    1.输出一个灰度图像的直方图。

    2.将一个曝光不足的图像进行处理,使其对比度更大。

    一、Vivado HLS 部分

    首先我们用Vivado HLS来编写FPGA图像处理所用的IP核。

    1.绘制直方图

    1.首先编写相应的C/C++语言程序,加入到Vivado HLS工程中,再编写相应的testbench代码进行编译测试。6fc5a74478a09ef631f8cc97ea4c4b1d.png

    代码很简单大家看一下就明白了。

    注意到右侧Directive窗口中的优化部分,分别表示doHist的输出接口使用AXI4-lite传输协议,inStream图像输入接口采用AXI4协议,输入数组histo存入bram中,loop_init循环进行展开。

    2.点击Run C Simulation进行对C/C++源文件进行编译测试。0f2b0b29ba6485afb19287d312e6d73f.png

    输出的部分直方图文本文件

    3.将testbench输出的直方图文本与MATLAB中的直方图文件进行对比验证算法无误后,点击Run C/RTL Cosimulation来进行协同验证。

    4.验证通过后点击Export RTL生成ip核。

    如上步骤所示,绘制直方图的IP核已经生成成功。

    2.调节对比度

    步骤如上所示,接口部分也同样使用AXI4协议,效果如下。0882855e147af2e780864d7ade8c6d40.png

    处理前

    b67274c71b4faf4cd185af3e97dd16b3.png

    处理后

    二、Vivado 综合部分

    1.将IP核部署到FPGA

    打开Vivado界面,并建立工程,随后创建Block Design。

    在Block Design界面首先需要添加zynq7 processing system,点击ADD IP查找ZYNQ添加IP核。该IP核是系统所提供的连接ARM与FPGA的IP核,详情见: https://www.xilinx.com/products/intellectual-property/processing_system7...c645002b8886cc7f4ea8be60caf52fc3.png

    随后点击Run Block Automation进行自动配置。

    将之前HLS所生成的两个IP核导入工程中,同样的步骤将doHist、doHistStrech和AXI DMA添加到diagram中。38356d86b35590fe7abc0ab1493a3b4a.png

    双击AXI DMA进行对IP核的配置,配置情况如图所示。5f9a09f5549a5dfaa8be3f2a6fcaeaa9.png

    可以使用Run Connection Automation 来自动连接。完成后的效果图如下,缺少的ip核可以按照下图来添加。c8d9ebe1a351cee344cb51c7474e323a.png

    完成后点击Validate Design进行验证。

    随后就可以生成bitstream,下载到FPGA。

    2.使用逻辑分析仪进行Debug

    三、利用ARM来测试FPGA的加速效果

    1.下载完成后点击File->Export->Export Hardware,弹出对话框810fa11c52d053d7d09343104715f512.png

    勾选include bitstream然后点击OK。

    2.点击File->Launch SDK启动SDK

    3.SDK开发环境如下,主要用于对ARM的开发,在之前生成ip核的时候会生成对应的驱动函数。98ceea95e76bc425359249dc4fd9b04c.png

    4.实验结果如下图所示c00bd41b4f8768b18ce969e2a49bd2c8.png

    文章转载自:知易行难的博客

    展开全文
  • 基于YCrCb颜色空间的CrCb范围筛选法 ...void hls::hls_skin_dection(RGB_IMAGE &src, RGB_IMAGE &dst, int rows, int cols, int y_lower, int y_upper, int cb_lower, int cb_upper, int cr_lower, int cr

    基于YCrCb颜色空间的CrCb范围筛选法

    • 资料显示,正常黄种人的Cr分量大约在133至173之间,Cb分量大约在77至127之间。
    • 可以根据自己的项目需求放大或缩小这两个分量的范围。
    void hls::hls_skin_dection(RGB_IMAGE &src, RGB_IMAGE &dst, int rows, int cols, int y_lower, int y_upper, int cb_lower, int cb_upper, int cr_lower, int cr_upper)
    {
    
    	for (int row = 0; row < rows; row++)
    	{
    	//#pragma HLS loop_flatten off
    		for (int col = 0; col < cols; col++)
    		{
                #pragma HLS pipeline II = 1 off 
    			RGB_PIXEL src_data;
    			RGB_PIXEL pix;
    			RGB_PIXEL dst_data;
    			bool skin_region;
    
    			if (row < rows && col < cols)
    			{
    				src >> src_data;
    			}
    
    
    			uchar B = src_data.val[0];
    			uchar G = src_data.val[1];
    			uchar R = src_data.val[2];
    
    
    			uchar y = (76 * R + 150 * G + 29 * B) >> 8;
    			uchar cb = ((128 * B - 43 * R - 85 * G) >> 8) + 128;
    			uchar cr = ((128 * R - 107 * G - 21 * B) >> 8) + 128;
    
    
    			if (y > y_lower && y < y_upper && cb > cb_lower && cb < cb_upper && cr > cr_lower && cr < cr_upper)
    				skin_region = 1;
    			else
    				skin_region = 0;
    
    			uchar temp0 = (skin_region == 1) ? (uchar)255 : 0;
    			uchar temp1 = (skin_region == 1) ? (uchar)255 : 0;
    			uchar temp2 = (skin_region == 1) ? (uchar)255 : 0;
    
    			dst_data.val[0] = temp0;
    			dst_data.val[1] = temp1;
    			dst_data.val[2] = temp2;
    			dst << dst_data;
    		}
    	}
    }
    

    图像边缘检测与重心提取

    void hls::hls_edge(RGB_IMAGE &input, RGB_IMAGE &output, int rows, int cols)
    {
    	RGB_PIXEL lastinPix;
    	double sum_x = 0, sum_y = 0, area = 0;
    
    	for (int row = 0; row < rows; row++)
    	{
    		lastinPix.val[0] = 0;
    		lastinPix.val[1] = 0;
    		lastinPix.val[2] = 0;
    
    		for (int col = 0; col < cols; col++)
    		{
                #pragma HLS pipeline II = 1 off 
    			RGB_PIXEL curinPix;
    			RGB_PIXEL outPix;
    
    			if (row < rows && col < cols)
    			{
    				input >> curinPix;
    			}
    			else
    			{
    			}
    
    			if (curinPix.val[0] == 255 && curinPix.val[1] == 255 && curinPix.val[2] == 255)
    			{
    				sum_x = sum_x + row; 
    				sum_y = sum_y + col; 
    				area = area + 1;
    			}
    			if (curinPix.val[0] == 0 && curinPix.val[1] == 0 && curinPix.val[2] == 0 && lastinPix.val[0] == 255 && lastinPix.val[1] == 255 && lastinPix.val[2] == 255)
    			{
    				outPix.val[0] = 255;
    				outPix.val[1] = 255;
    				outPix.val[2] = 255;
    			}
    			else
    			{
    				if (curinPix.val[0] == 255 && curinPix.val[1] == 255 && curinPix.val[2] == 255 && lastinPix.val[0] == 0 && lastinPix.val[1] == 0 && lastinPix.val[2] == 0)
    				{
    					outPix.val[0] = 255;
    					outPix.val[1] = 255;
    					outPix.val[2] = 255;
    
    				}
    				else
    				{
    					outPix.val[0] = 0;
    					outPix.val[1] = 0;
    					outPix.val[2] = 0;
    				}
    			}
    
    			lastinPix.val[0] = curinPix.val[0];
    			lastinPix.val[1] = curinPix.val[1];
    			lastinPix.val[2] = curinPix.val[2];
    
    			output << outPix;
    		}
    	}
    	center.y = round(sum_x / area);
    	center.x = round(sum_y / area);
    	cout << center.x << '\t' << center.y << endl;
    }
    
    展开全文
  • HLS中视频的读入和播放代码 代码 testbench,无需综合,直接仿真 #include <cassert> #include <iostream> #include <stdio.h> #include <hls_opencv.h> using namespace cv; #define ...

    HLS中视频的读入和播放

    代码

    testbench,无需综合,直接仿真

    #include <cassert>
    #include <iostream>
    #include <stdio.h>
    #include <hls_opencv.h>
    
    using namespace cv;
    #define INPUT_VIDEO "D:/HLS_Pjt/object_tracking/source_code/ic1.avi"
    
    int main(){
    	//读取视频文件
    	IplImage *frame;
    	CvCapture *capture =cvCaptureFromAVI(INPUT_VIDEO);//获取视频数据
    	cvNamedWindow("AVI player",0);
    	while(true)
    	{
    	  if(cvGrabFrame(capture))
    	  {
    		  frame = cvRetrieveFrame(capture);
    		  cvShowImage("AVI player",frame);
    		  if(cvWaitKey(10)>=0) break;
    	  }
    	  else
    	  {
    		  break;
    	  }
    	}
    
    	cvReleaseCapture(&capture);
    	cvDestroyWindow("AVI player");
    	return 0;
    }
    
    
    展开全文
  • Ubuntu16.04 下启动 Vivado HLS

    千次阅读 2018-12-25 12:00:20
    首先需要说明一下:今天遇到的这个问题给了我很大的感触,由于最近正在学习Zynq,从我在网上...在Ubuntu系统下,安装了Vivado系列软件,但是想去学习 Vivado HLS 软件的时候,却怎么也找不到 Vivado HLS软件的入口,...
  • VIVADO HLS 学习之路之图像的resize

    千次阅读 2018-09-13 11:33:10
    VIVADO HLS 学习之路之图像的resize ** 算下来接触vivado已经有半年了,学习fpga也满打满一年半了,零零碎碎的的笔记做过一些,但是记下了却没有复习,基本上等于没有。以后的学习尽量多做笔记,就先从HLS开始吧...
  • 出现问题:在hls的调试中发现,仅仅改变图像的尺寸,会导致系统无法正确识别出输出端口,导致输出端口的信号方向反向,并且无法输出资源利用率和延时。 目录: 一、hls中的设置,以及输出的端口和ip模块图 二、...
  • 针对Canny边缘检测算法在实时图像处理过程中运算耗时长、数据运算量大的缺点,研究了利用Vivado HLS实现Canny边缘检测算法的硬件加速方法。该方法由FPGA的逻辑资源生成算法对应的RTL级硬件电路,实现算法硬件加速。...
  • 一个vivado hls的例子,可以进行图像处理的,仿真正确,功能完整。可以按照说明一步步的学习。
  • 图像处理相关Block Scope(Simulink->Commonly Used Blocks):示波器   添加一个Vivado HLS block,双击打开该block:   点击Browse,将路径指定到HLS工程的Solution文件夹下。如果路径选择错误,...
  • 今天入坑Vivado HLS,在这里首先写个关于如何简单使用 Vivado HLS的简单教程! 入坑理由:Vivado HLS 的优势在于可以把C语言转换为我们的硬件描述语言,意味着可以让不懂硬件语言的开发者投入到FPGA的开发中。 软件...
  • Vivado Hls Opencv grey

    2019-10-03 15:35:18
    2、打开桌面vivado hls 2019.1 设置路径,命名。其余默认即可。 3、右键点击source,选择addfile,选中xf_dilation_accel.cpp即可 4、右键点击test benth 选择addfile 选中xf_dilation_tb.cpp和testcase55.jpg 5...
  • 针对计算机处理高清图像或视频的边缘检测时存在延时长和数据存储带宽受限的缺点,提出了用Vivado HLS将边缘检测软件代码转换成RTL级硬件电路的硬件加速方法。硬件加速是将运算量大的功能模块由硬件电路实现,根据...
  • ug902-vivado-high-level-synthesis(1)_high_HLS_vivado图像处理_ug902.
  • vivado SDK 图像处理

    千次阅读 2018-08-14 09:36:16
    使用vivado HLS生成的IP核,在vivado中实现两幅图像处理,使用VDMA进行图像的收发工作,SDK中VDMA的处理如下 使用这段程序无噪点和顶部噪点问题,完全适合 void VDMA1_setting(unsigned int width, unsigned int ...
  • ug902-vivado-high-level-synthesis(1)_high_HLS_vivado图像处理_ug902_源码.zip
  • LBP算法的原理不再介绍,下面只介绍一下使用vivado hls如何实现lbp算法。 首先,需要对输入图像做灰度变换,将rgb图像转为灰度图像。...使用hls中的Window和LineBuffer,来对图像进行缓存和窗处理。 typedef...
  • Vivado的高层次综合功能将帮助您为嵌入式视频应用设计更好的排序网络。 从汽车到安全系统再到手持设备,如今采用嵌入式视频功能的应用越来越多。每一代新产品都需要更多的功能和更好的图像质量。但是,对于一些...
  • vivado HLS算法分析

    千次阅读 2018-08-14 09:27:03
    HLS算法分析 HLS中使用C/C++语言作为开发语言,通过高层次综合将其转为IP核,省去了使用硬件语言的开发难度 该项目调用HLS中的hls_opencv视频...完成图像处理的硬件加速过程。     针对上述目标,设计如下算...
  • xilinx vivado HLS 小记

    千次阅读 2018-08-07 19:10:18
    HLS主要应用场景在与算法更密切的应用如DSP图像处理。 RTL:寄存器传输级 register transfer level verilog中分级是:系统级,算法级,RTL级,门级,开关级(分为行为级、结构级) verilog建模方式分为:行为级和...
  • 使用Vivado HLS实现OpenCV的开发流程

    千次阅读 2018-08-27 20:46:26
     本文通过对OpenCV中图像类型和函数处理方法的介绍,通过设计实例描述在vivadoHLS中调用OpenCV库函数实现图像处理的几个基本步骤,完成从OpenCV设计到RTL转换综合的开发流程。      开源计算机视觉 (OpenCV) ...
  • 最近在学习用vivado hls图像处理,在卷积,膨胀等操作时往往会用到Linebuffer和windows来做几行图像的缓存。但是如果windows设置的过大就会导致综合时间过长,我设置的是12*188就综合了两小时没通过,所以说图像...
  • [Xilinx ZYNQ] #7 Vivado HLS 使用方法

    千次阅读 2019-07-12 16:46:30
    New Vivado HLS Project - Add/Remove Files -- 添加顶层函数名 - Next - Next - Device Selection Dialog 编写 C++/C 代码 - C synthesis -Export RTL 创建的 HLS 工程如图所示 Includes 目录包含有 HLS 开发中...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 250
精华内容 100
关键字:

vivadohls图像处理