精华内容
下载资源
问答
  • hls 教程zynq 7000 fpga教程,超过200页的hls教程(含例程),手把手教会你hlshls 教程zynq 7000 fpga教程,超过200页的hls教程(含例程),手把手教会你hls
  • zynq系列的fpga开发板,HLS使用教程。内容详细,指导全面,小白也可使用入门。亲测好用。内容详细,指导全面,小白也可使用入门。亲测好用。
  • ZYNQ HLS工具系列(一)中,体会到了HLS的强大,本篇将持续积累对HLS的学习,加固HLS的基础 一、HLS工作过程 如图,HLS的C到硬件,有几个重要步骤: 调度: 用来确定操作发生于哪几个时钟周期(以及是否...

    HLS学习笔记

    在ZYNQ HLS工具系列(一)中,体会到了HLS的强大,本篇将持续积累对HLS的学习,加固HLS的基础

    一、HLS工作过程

    这里写图片描述
    如图,HLS的C到硬件,有几个重要步骤:
    调度: 用来确定操作发生于哪几个时钟周期(以及是否并行),调度要考虑到控制逻辑提取(可能生成状态机)以及用户的指令
    绑定: 用于确定每个操作所使用的硬件单元,绑定要考虑到元件的延时以及用户的指令
    这里写图片描述
    上图则大致展示了从C语言中提取控制逻辑然后绑定到硬件单元的过程

    二、HLS大致设计流程

    这里写图片描述
    上图是HLS设计的一个大致的流程,添加设计文件、添加 test bench、C仿真、综合、C/RTL协同仿真、导出IP核,在综合之前可以在solution里添加约束指示,以综合出想要的结果
    这里写图片描述
    这张图则是更详细的说明了一般的设计流程,首先添加各设计文件,对C代码功能进行仿真,然后通过HLS生成硬件描述语言(可读性很差,不需要看懂),然后实现RTL级的仿真,最后可以导出为VIVADO的IP核或者设计检查点或者System Generator的核

    三、HLS软件使用过程

    这里写图片描述

    未完。。。。持续更新

    展开全文
  • ZYNQ HLS工具系列(一) HLS图像处理入门

    万次阅读 热门讨论 2017-12-19 21:33:17
    OPENCV是开源计算机视觉库,支持C/C++、PYTHON等多种语言,OPENCV的设计可以直接运行在ZYNQ的PS上,但是用ARM处理高清视频处理的时候,可能就会处理不过来,于是会使用HLS OPENCV进行硬件加速,本文主要是针对HLS的...

    ZYNQ开发之HLS图像处理入门

    HLS(High Level Synthesis)即高层次综合,和以前Verilog及VHDL不一样,通过它可以用C/C++、SystemC及OPENCL编写FPGA程序,实现相应功能,大大加快开发的速度,使软件工程师可以参与到项目中,使硬件工程师可以增加工作效率

    OPENCV是开源计算机视觉库,支持C/C++、PYTHON等多种语言,OPENCV的设计可以直接运行在ZYNQ的PS上,但是用ARM处理高清视频处理的时候,可能就会处理不过来。于是HLS OPENCV就这样出现了(硬件加速),HLS Opencv是HLS自带的、可综合成HDL的OpenCV库函数(因为并不是所有的OpenCV库函数都可以综合成HDL),HLS OPENCV具体的函数操作方法,将写在理论系列(一) HLS OPENCV函数,本文主要是针对HLS的入门操作

    一、运行环境

    这个HLS的版本很重要!!!
    之前尝试用HLS普通的仿真没问题,但是对图像进行C仿真(调用HLS带的函数),仿真编译的时间就很长,而且结果报错:

    cc1plus.exe:-1: error: out of memory allocating ……

    解决方法:不要使用2017.1和2017.2的HLS,降到2016.4,或者升级到2017.3(本文2017.3)

    二、搭建HLS工程

    • 1.新建工程,根据向导设置相关参数
      新建工程的最后一步,新建了一个solution1,时钟周期就默认10ns,然后选择芯片型号,完成工程的创建

    • 2.新建文件
      新建三个文件test.cpp(测试文件)、image_core.cpp(算法核心)以及image_core.h,文件内容

    test.cpp:

    #include "image_core.h"
    #include "opencv/cv.h"
    #include "opencv/cxcore.h"
    #include "opencv/highgui.h"
    #include "hls_opencv.h"
    #define INPUT_IMAGE "test.jpg"
    
    int main (int argc, char** argv) {
        IplImage* src = cvLoadImage(INPUT_IMAGE,0);//读图片灰度
        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); //将输出流转回图片
        cvShowImage("src",src);
        cvShowImage("dst",dst);
        cvWaitKey(0);
        cvReleaseImage(&src);
        cvReleaseImage(&dst);
        return 0;
    }

    image_core.cpp:

    #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
        #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);  //读输入到img_0
        hls::Sobel<1,0,3>(img_0, img_1);  //Sobel算子,边缘提取
        hls::Mat2AXIvideo(img_1, output); //img_1写到输出
    }

    image_core.h:

    #ifndef _IMAGE_CORE_H_
    #define _IMAGE_CORE_H_
    
    #include"hls_video.h" //调用可以综合的视频库
    
    //图像最大尺寸
    #define MAX_WIDTH 800
    #define MAX_HEIGHT 600
    
    //定义图像处理核,要用到的结构体
    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;
    
    //硬件综合的顶层
    void image_core(AXI_STREAM_IN& src_axi, AXI_STREAM_OUT& dst_axi, int rows, int cols);
    
    #endif
    • 3.添加文件到相应位置
      将上述三个文件放在工程目录下,然后如图添加:
      这里写图片描述
      h文件,不需要添加,放在工程目录下即可

    • 4.运行仿真
      点击Run C Simulation按钮,然后直接点确定
      这里写图片描述
      按空格键,关闭图片

    • 5.生成IP核
      点击Run C Synthesis,综合完毕后,然后点击Export RTL
      这里写图片描述
      生成完毕后,即可通过VIVADO调用HLS的IP核(image_core)

    展开全文
  • 该存储库包括用于Xilinx FPGA的矩阵矩阵乘法(A * B = C)的纯Vivado HLS实现,使用Xilinx Vitis / SDx / SDAccel实例化内存和PCIe控制器并与主机接口。 在上进行的实验实现了一半,单精度和双精度的462 GFLOP / s...
  • HLS创建矩阵乘法加速器 目录 HLS创建矩阵乘法加速器 一、实验目的 二、HLS设计 三、打包IP 一、实验目的 通过HLS自动生成一个对两个4*4的矩阵进行乘法的电路,然后通过HLS进行优化,打包AXI接口并创建IP,最后...

    HLS创建矩阵乘法加速器

    目录

    HLS创建矩阵乘法加速器

    一、实验目的

    二、HLS设计

    三、打包IP


    一、实验目的

    通过HLS自动生成一个对两个4*4的矩阵进行乘法的电路,然后通过HLS进行优化,打包AXI接口并创建IP,最后在vivado中调用,在SDK中进行正确性检验。本篇我们只介绍HLS如何加速并打包生成IP,与vivado的联合测试将在下一篇介绍。

    二、HLS设计

    首先创建一个工程,我的工程名叫matrix,然后在source中添加两个文件,一个是.cpp文件,用来进行函数的定义,还要创建一个.h文件,用来对函数进行声明,我的两个文件都叫做matrix_mul,只是后缀名不同。然后在testbench中创建一个程序,名为main.c,用来提供输入并接受输出,这样便可以检测程序或者说电路的正确性了。

    首先是matrix.cpp文件,内容如下:

    #include "matrix_mul.h"
    #include "matrix_mul.h"
    void matrix_mul(ap_int<8> A[4][4],ap_int<8> B[4][4],ap_int<16> C[4][4])
    {
    	for(int i=0;i<4;i++)
    	{
    
    		for(int j=0;j<4;j++)
    		{
    
    			C[i][j]=0;
    			for(int k=0;k<4;k++)
    			{
    				C[i][j]=C[i][j]+A[i][k]*B[k][j];
    			}
    		}
    	}
    }
    

    ap_int是赛灵思自己定义的一种数据结构,可以自定义数据位宽。

    matrix.h文件很简单,只是对matrix_mul函数进行了声明,这样会使整个工程结构更加清晰,而且将定义和声明分开放,当函数较多时,函数声明文件仍较简短,可以更便捷的找到想要调用的函数。

    #ifndef __MATRIX_MUL__
    #define __MATRIX_MUL__
    
    #include "ap_fixed.h"
    void matrix_mul(ap_int<8> A[4][4],ap_int<8> B[4][4],ap_int<16> C[4][4]);
    
    #endif
    

    接下来是main.c文件:

    #include "matrix_mul.h"
    #include <iostream>
    
    int main()
    {
    	ap_int<8> A[4][4];
    	ap_int<8> B[4][4];
    	ap_int<16> C[4][4];
    
    	for(int i=0;i<4;i++)
    		for(int j=0;j<4;j++)
    		{
    			A[i][j]=i*4+j;
    			B[i][j]=A[i][j];
    		}
    
    	matrix_mul(A,B,C);
    
    	for(int i=0;i<4;i++)
    		for(int j=0;j<4;j++)
    			std::cout<<"C["<<i<<","<<j<<"]="<<C[i][j]<<std::endl;
    
    	return 0;
    }
    

    以上所有程序内容均比较简单,就是实现了两个4*4矩阵的乘法,不再做详细讲解。

    加下来按CTRL+B进行编译,然后进行C仿真:

    仿真按钮如上图,仿真完的结果如下,我们可以进行手算验证,得到的结果和图中所显示的应该是一致的。接下来点仿真右边的按钮,进行综合。时间可能比较久,但由于电路结构简单,也不会太慢。


    可以看到总共用了169个时钟周期,这肯定是不能接受的,所以我们接下来进行优化。首先是对矩阵的存储结构进行优化,我们知道如果A*B,那么每次需要读取A的一行和B的一列进行乘加操作,目前的电路是一次读一个乘后等下一个乘法算好后相加,一次类推,那么我们的优化思路便是可不可以一次读四个,这样就可以节省75%的读取时间。那么在HLS中如何操作呢?HLS中有个
    ARRAY_PARTITION,可以将矩阵按不同维度存储,我们可以将A按行存储,B按列存储,设置如下:

    右键A,选择insert Directive,然后按顺序操作:

    如果这时候我们去点综合,发现并没有变快,还是169个周期,这是因为我们只是改变了存储方式,读取后的操作并没有进行改变,仍是读完四个再进行下一步新的读取所以对运算并没有什么实质上的影响。

    通过波形图也可以看出,此时仍是一个一个读,并不是我们所想的一次全都出来进行运算,这时我们还要加一个约束,那就是pipeline,将其设置为一,也是说强制让每个运算在一个周期内完成,共16个运算,也就是只需要16个周期。方法如下:

     这样便可以实现一个周期得出一个结果了。进行综合后可以发现,只用了18个周期便可以完成了,至于为什么不是16个周期,是因为还有一个周期进行启动,并且写操作也有一个周期的延迟,如波形所示:

    三、打包IP

    首先我们将ABC三个数组转化成AXI_lite接口,这样才能在ZYNQ SOC中使用,操作如下:

    我们还可以对接口控制信号进行AXI打包,这样使用起来更加方便:

     接下来重新综合,然后Export RTL,将电路打包成IP。

    至此,HLS部分的工作到此结束。 

    展开全文
  • Zynq与Vivado HLS的Heston实施 动机: Zynq平台为快速加速器开发提供了一些非常吸引人的功能,包括: 全功能Linux发行版(Linaro Ubuntu)在ARM上运行,具有ssh访问,数据包管理器和线程支持 几乎可以运行任何跨...
  • ZYNQ7020_Linux_HLS_IP的驱动

    千次阅读 2018-12-03 16:18:08
    ZYNQ7020_Linux_HLS_IP的驱动一、目标二、准备工作1、生成.bit文件三、裸机程序1、HLS IP初始化四、驱动介绍1、驱动结构2、测试程序3、结果 一、目标 驱动HLS 生成的角点检测IP。 二、准备工作 1、生成.bit文件 将...

    一、目标

    驱动HLS 生成的角点检测IP。

    二、准备工作

    1、生成.bit文件

    将编译好的HLS IP添加到vivado工程中。
    在这里插入图片描述

    三、裸机程序

    1、HLS IP初始化

    HLS IP的初始化主要是完成控制寄存器和行列、阈值寄存器数值的初始化。

    void FastCornerDecInit(XHls_fast_corner *fc, int column,int row)
    {
    	XHls_fast_corner_Initialize(fc, 0);
    	XHls_fast_corner_SetRows(fc, row);
    	XHls_fast_corner_SetCols(fc, column);
    	XHls_fast_corner_SetThrehold(fc, 20);
    	XHls_fast_corner_EnableAutoRestart(fc);
    	XHls_fast_corner_Start(fc);
    }
    

    四、驱动介绍

    1、驱动结构

    只需在原有的驱动程序中添加hls的初始化(hls_init())、启动(hls_start())和退出(hls_exit())程序。

    static int hls_start(struct hls_handle *hls_fc)
    {
    	struct chvdma_dev *devp;
    	volatile unsigned int *reg;
    
    	if((hls_fc->virt_addr == NULL) || (hls_fc->phys_addr == NULL))
    		{
    			printk("hls_start failed;\n");
    			return -1;
    		}
    
    	devp = container_of(hls_fc,struct chvdma_dev,hls_fc);
    
    	if(devp == NULL)
    		{
    			printk("hls_start fialed.\n");
    			return -1;
    		}
    	reg = (volatile unsigned int *)(hls_fc->virt_addr + XHLS_FAST_CORNER_CONTROL_BUS_ADDR_COLS_DATA);
    	*reg = devp->hsize;
    	reg = (volatile unsigned int *)(hls_fc->virt_addr + XHLS_FAST_CORNER_CONTROL_BUS_ADDR_ROWS_DATA);
    	*reg = devp->vsize;
    	reg = (volatile unsigned int *)(hls_fc->virt_addr + XHLS_FAST_CORNER_CONTROL_BUS_ADDR_THREHOLD_DATA);
    	*reg = hls_fc->fc_threshold;
    	reg = (volatile unsigned int *)(hls_fc->virt_addr + XHLS_FAST_CORNER_CONTROL_BUS_ADDR_AP_CTRL);
    	*reg = 0x80|0x01;
    	printk("hls_start done\n");
    	return 0;
    }
    

    初始化程序当中用到了hls ip的物理地址,由于没有修改设备树,此处直接从vivado address editor中找到地址。

    static int hls_init(struct hls_handle *hls_fc)
    {
    	int hls_state;
    	if(hls_fc == NULL)
    		{
    			printk("hls inite failed;\n");
    			return -1;
    		}
    
    	hls_fc->phys_addr = (void __iomem *)0x43c00000;
    	hls_fc->virt_addr = ioremap((u32)(hls_fc->phys_addr),0x50);
    	if(hls_fc->virt_addr == NULL)
    		{
    			printk("ioremap failed;\n");
    			return -1;
    		}
    	hls_fc->fc_threshold = 0x20;
    	hls_state = hls_start(hls_fc);
    	if(hls_state !=0)
    		{
    			printk("hls_init failed.\n");
    			return -1;
    		}
    	return 0;
    }
    
    static void hls_exit(struct hls_handle *hls_fc)
    {
    	struct chvdma_dev *devp;
    	volatile unsigned int *reg;
    
    	if((hls_fc->virt_addr == NULL) || (hls_fc == NULL))
    		{
    			printk("hls exit null; \n");
    			return ;
    		}
    
    	devp = container_of(hls_fc,struct chvdma_dev,hls_fc);
    	if(devp == NULL)
    		{
    			printk("hls exit null; \n");
    			return ;
    		}
    
    	reg = (volatile unsigned int *)(hls_fc->virt_addr + XHLS_FAST_CORNER_CONTROL_BUS_ADDR_AP_CTRL);
    	*reg =;
    
    	iounmap(hls_fc->virt_addr);
    	printk("exit done\n");
    	return ;
    }
    

    另外,角点检测iP需要设置一个阈值。所以驱动程序中需要编写一个写函数。

    static ssize_t chvdma_write(struct file *filep, const char __user *buf, size_t count, loff_t * ppos)
    {
    	int state state;
    	char val[4];
    	struct chvdma_dev *devp;
    	volatile unsigned int *reg;
    
    	devp = (struct chvdma_dev *)(filep->private_data);
    	if(devp == NULL)
    		{
    			printk(" dev NULL\n");
    			return -1;
    		}
    
    	state = copy_from_user(&val, buf, count);
    	if(state !=0)
    		{	
    			printk("copy_from_user state = %d\n",state);
    			return -1;
    		}
    	
    	printk("copy_from_user state = 0x%x,0x%x,0x%x,\n",val[0],val[1],val[2]);
    	switch(val[0])
    		{
    			case 0x00:
    				reg = (volatile unsigned int *)(devp->hls_fc.virt_addr + XHLS_FAST_CORNER_CONTROL_BUS_ADDR_THREHOLD_DATA);
    				*reg = val[1];
    				devp->hls_fc.fc_threshold = val[1];
    				break;
    
    			default:break;
    		}
    	return count;
    }
    

    2、测试程序

    阈值调节测试程序hls_test.c

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <string.h>
    
    /* firstdrvtest on
      * firstdrvtest off
      */
    int main(int argc, char **argv)
    {
        int fd;
        char val[4] ;
        fd = open("/dev/chvdma", O_RDWR);
        if (fd < 0)
        {
            printf("can't open!\n");
        }
        if (strcmp(argv[1], "0x00") == 0)
        {
            val[0]  = 0;
        }
        else
        {
            val[0] = 1;
        }
        val[1] = atoi(argv[2]);
        val[2] = 10;
        val[3] = 0;
        write(fd, &val, 4);
        return 0;
    }
    

    3、结果

    在这里插入图片描述执行./hls_test.o 0x00 阈值。可以调节检测的阈值。
    在这里插入图片描述

    展开全文
  • zynq开发之HLS

    千次阅读 2016-12-17 14:31:00
    HLS简介 HLS(High Level Synthesis)即高层次综合,不同于以往的FPGA逻辑开发,是用HDL编写的,开发周期长、难度大。而HLS可以使用C,C++,SystemC以及OPenCL等编写,通过高层次综合,可以把软件代码转化为硬件描述...
  • ALINX_ZYNQ开发平台HLS教程V1.03
  • HLS自定义IP核在linux下的调用-以adder为例 使用HLS生成自定义IP核 注意:这里将输出输出参数均指定为AXI_Lite接口,并指定return以创建模块的中断端口。 void adder(int a, int b, int& c) { #pragma HLS ...
  • ZYNQ-vivado HLS工具

    千次阅读 2018-01-31 14:11:26
    设计简单算法体验Vivado HLS的使用 前言  本文主要讲解了使用Vivado HLS设计简单C语言的二选一选择器算法的硬件HLS开发的全流程,包括工程创建-算法验证和仿真-算法综合-RTL仿真-IP封装等步骤。 参考网站:  ...
  • mnist-nnet-hls-zynq7020-fpga prj all code file
  • 以个人的理解,xilinx将HLS(高层次综合)定位于更方便的将复杂算法转化为硬件语言,通过添加某些配置条件HLS工具可以把可并行化的C/C++的代码转化为vhdl或verilog,相比于纯人工使用vhdl实现图像算法,该工具综合出...
  • 计算机视觉技术几年来已发展成为学术界一个相当成熟的科研领域,目前许多视觉算法来自于数十年的科研成果。不过,我们最近发现计算机视觉技术正快速渗透到我们生活的方方面面。现在我们拥有能自动驾驶的汽车、能根据...
  • zynq hls定点数计算

    2021-01-06 11:34:13
    本节介绍如何使用HLS进行定点运算以及如何与zynq cpu交互。 HLS中,有头文件ap_fixed.h,极大的方便了我们使用定点数,具体情况略。 HLS代码示例 #include #include typedef ap_fixed data_t; data_t fixed_test...
  • Vivado_HLS视频库加速Zynq-7000_All_Programmable_SoC_OpenCV应用,很不错的官方资料,推荐给大家
  • 适用于 ZynqHLS AXI 主控和 Yocto 内核驱动程序 微型板上的完整流程示例,包括中断处理 这是一个应用程序模板,可帮助希望通过自定义 AXI Master 将数据从 Axi Stream 源传输到 Zynq DDR 的用户。 包括中断生成...
  • ZYNQ HLS 图像算法

    2018-09-12 11:20:29
    这是基于ZYNQ HLS图像处理算法的资料 详细的中文介绍 可以参考一下
  • 基于ZYNQHLS 图像算法设计基础
  • ZYNQ FPGA HLS旅程(1)

    千次阅读 热门讨论 2019-03-21 17:13:20
    用Verilog开发难度太大,现在只能用HLS进行综合, 鉴于有部分学者对英文文档的学习比较吃力,我就直接参考官方的手册ug871-vivado-high-level-synthesis-tutorial进行和实现的。 相当于把XILINX的官方文档实际操作...
  • 基于ZYNQHLS 图像算法设计, 是购买的ZYNQ开发板里的图像算法设计文档, 供大家学习fpga开发图像算法方法
  • 在使用PetaLiunx定制的上位机中,通过UIO方式快速调用Vivado HLS生成的IP核。驱动为HLS工具自动生成,大大简化开发难度。实验过程见下文: https://blog.csdn.net/Win321thinks/article/details/106796721
  • zynq linux调用HLS IP核

    2020-11-28 13:41:44
    1.HLS IP开发 这里仅作示例,写了一个最简单的HLS IP核,通过AXI Lite总线和ARM相连,代码编写如下: void adder(int a, int b, int& c) { #pragma HLS INTERFACE s_axilite port=a #pragma HLS INTERFACE s_...
  • 1)摘自【正点原子】领航者ZYNQHLS 开发指南2)平台购买地址:https://item.taobao.com/item.htm?&id=6061601087613)全套实验源码+手册+视频下载:...
  • 四个HLS入门得例子,Xilinx暑假计划的作业,步骤特别详细,比一众的开发板教程要好的多,里面详细讲解了为什么进行这样的directives,以及这些directives的作用
  • 初识HLS 基于HLS的状态指示led实验 基于HLS的浮点运算实验 基于HLS视频库的视频彩条输出实验 基于HLS视频3帧缓存管理实验 基于HLS视频图像缩放叠加实验 基于HLS视频字符叠加实验 基于HLS图像对比度调整 基于...
  • S05_基于ZYNQHLS 图像算法设计,中文教程,手把手操作
  • 《领航者ZYNQHLS开发指南V1.1.pdf》正点原子ZYNQHLS开发资料,非常好的ZYNQ资料,希望对你的工作学习有所帮助。
  • 《course_s3_ZYNQ那些事儿-HLS实验篇V1.03》很不错的资料,细致,详实,全面,希望对你的工作学习有所帮助。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 758
精华内容 303
关键字:

hlszynq