HLS环境搭建及Vivado基本开发流程

一、 HLS简介

1、基本概念

  • 高层次综合(High-level Synthesis)简称 HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。
  • 所谓的高层次语言,包括 C、C++、SystemC 等,通常有着较高的抽象度,并且往往不具有时钟或时序的概念。相比之下,诸如 Verilog、VHDL、SystemVerilog 等低层次语言,通常用来描述时钟周期精确(cycle-accurate)的寄存器传输级电路模型,这也是当前 ASIC 或 FPGA 设计最为普遍使用的电路建模和描述方法。

2、与 VHDL/Verilog关联

  • 在 FPGA 硬件开发上,VHDL/Verilog 与 HLS 相比,就好比是几十年前的汇编语言与现在的 C 语言。
  • RTL(寄存器传输级别,基于 VHDL/Verilog 语言)逐步发展,但 VLSI 系统的复杂性呈指数级增长,使 RTL 设计和验证过程成为生产力的瓶颈。
  • HLS(高级综合)通过提高抽象级别, 可以减少最初的设计工作量,设计人员可以集中精力描述系统的行为,而不必花费时间来实现微体系结构的细节,且验证被加速、设计空间探索(DSE)更快、定位新平台非常简单、软件工程师可以访问HLS 等这些好处加在一起,减少了设计和验证时间,降低了开发成本,并降低了进行硬件项目的门槛,因此缩短了产品上市时间,并且在异构系统上使用硬件加速已成为更具吸引力的选择。
  • 但是在结果质量(QoR)上,HLS 工具还落后于 RTL,但 HLS的开发时间少、生产率高这些优点还是当前用于快速原型设计和较短上市时间的可行选择。

3、关键技术

关键技术:

1、字长分析和优化:使用任意字长的数据通路和运算,进行全局或局部的字长优化,从而达到性能提升和面积缩减的双重效果。

2、循环优化:流行的循环优化方法,就是所谓的多面体模型,即Polyhedral Model。多面体模型的应用非常广泛,在 HLS 里主要被用来将循环语句以空间多面体表示,然后根据边界约束和依赖关系,通过几何操作进行语句调度,从而实现循环的变换。

3、对软件并行性的支持:通过直接例化多个运算单元,实现任务的并行处理。
技术局限性:

1、字长分析和优化需要 HLS 的使用者对待综合的算法和数据集有深入的了解。

2、HLS 工具的结果质量(QoR)往往落后于手动寄存器传输级别(RTL)流程的质量。

3、在性能和执行时间上,HLS 设计的平均水平明显较差,但在延迟和最大频率方面,与 RTL 差异不那么明显,且 HLS 方法还会浪费基本资源。

二、HLS开发基本流程

1、HLS环境搭建

Vivado下载
百度云盘:https://pan.baidu.com/s/1jkurhTLgnxavgRnmi-JLDA
提取码:sygh
Vivado安装
点击xsetup.exe开始安装
在这里插入图片描述
标选三项同意
在这里插入图片描述
选择 Vivado HL Design Edition
在这里插入图片描述
选择存储位置,不能有中文
在这里插入图片描述
完成安装,安装时间较长

在这里插入图片描述
添加软件许可

在这里插入图片描述

2、HLS开发流程

说明:开发流程以LED为例

创建HLS工程

在这里插入图片描述
选择器件
在这里插入图片描述
添加文件
①源文件添加
点击Source,右键后,选择New File,创建文件
led.h

#ifndef _SHIFT_LED_H_
#define _SHIFT_LED_H_

#include "ap_int.h"
#define CNT_MAX 100000000
//#define CNT_MAX 100,100M时钟频率下计数一秒钟所需要的计数次数
#define FLASH_FLAG CNT_MAX-2
// typedef int led_t;
// typedef int cnt_t;
typedef ap_int<1> led_t;
typedef ap_int<32> cnt_t;
void flash_led(led_t *led_o , led_t led_i);

#endif

led.cpp

#include "led.h"

void flash_led(led_t *led_o , led_t led_i){
#pragma HLS INTERFACE ap_vld port=led_i
#pragma HLS INTERFACE ap_ovld port=led_o
	cnt_t i;
	for(i=0;i<CNT_MAX;i++){
		if(i==FLASH_FLAG){
			*led_o = ~led_i;
		}
	}
}

②仿真测试文件添加
右键Test Bench,选择New File
test_led.cpp

#include "led.h"
#include <stdio.h>

int main(){

	led_t led_i=0x01;
	led_t led_o;
	const int SHIFT_TIME = 4;
	int i;
	for(i=0;i<SHIFT_TIME;i++){
		flash_led(&led_o , led_i);
		led_i = led_o;
		printf("shift_out is %d \n",(int)(led_o&0x01));
	}
}

C仿真与C综合
点击project->project settings->synthesis->browser->选择顶层函数
在这里插入图片描述
②点击project->Run C Simulation(输出01交替,表示C仿真结果正确)
在这里插入图片描述

③点击Solution->Run C Synthesis->Active Solution
在这里插入图片描述
创建Vivado工程
①打开Vivado,选择Greate Project
在这里插入图片描述
②选择器件
在这里插入图片描述
导入HLS生成的IP核
①生成IP核
选择Solution->Export RTL
在这里插入图片描述
②导入
点击setting,选择IP->Repository,并且点击加号,选择solution,将会自动识别到IP,识别到后,点击Apply->OK
在这里插入图片描述
检验是否导入成功
在这里插入图片描述
生成IP
双击flash_led_1,默认选择,只有一步更改
在这里插入图片描述

添加实验代码
①选择Add Sources
在这里插入图片描述
在这里插入图片描述
代码内容

##############LED define################## 
set_property PACKAGE_PIN P15 [get_ports {led_o}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led_o}]

##############Reset define################## 
set_property PACKAGE_PIN P16 [get_ports {rst_n}] 
set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]

##############50M CLK define################## 
create_clock -period 20.000 -name clk -waveform {0.000 10.000} [get_ports clk]
set_property PACKAGE_PIN N18 [get_ports {clk}] 
set_property IOSTANDARD LVCMOS33 [get_ports {clk}]

在这里插入图片描述
约束文件编写
①创建约束文件
在这里插入图片描述
在这里插入图片描述
代码内容

##############LED define################## 
set_property PACKAGE_PIN P15 [get_ports {led_o}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led_o}]

##############Reset define################## 
set_property PACKAGE_PIN P16 [get_ports {rst_n}] 
set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]

##############50M CLK define################## 
create_clock -period 20.000 -name clk -waveform {0.000 10.000} [get_ports clk]
set_property PACKAGE_PIN N18 [get_ports {clk}] 
set_property IOSTANDARD LVCMOS33 [get_ports {clk}]

在这里插入图片描述
编译生成获取结果
①生成
在这里插入图片描述
②进行下载
点击Open Hardware Manager->Open target->Auto target
点击Program device,下载程序,直接点击Program
在这里插入图片描述

实验结果
在这里插入图片描述

三、参考与总结

参考:
主要参考都来自学姐,跟着学姐学习一步一步达成
学姐博客:https://blog.csdn.net/qq_43279579/article/details/117084706
总结
本次实验,主要是配置了HLS的开发环境,以及以led实例基本实现HLS的开发流程

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vivado HLS 是 Xilinx 公司推出的一款高级综合工具,可以将 C/C++ 等高级语言代码转换为硬件描述语言 VHDL/Verilog,从而实现硬件加速。在图像处理领域,使用 Vivado HLS 可以将图像处理算法实现为硬件电路,提高算法运行速度和功耗效率。 以下是 Vivado HLS 在图像处理中的基本应用: 1. 图像滤波:图像滤波是图像处理中的基本操作,可以去除噪声、增强图像细节等。常用的滤波算法有均值滤波、中值滤波、高斯滤波等。使用 Vivado HLS 可以将这些算法实现为硬件电路,加速图像滤波操作。 2. 图像变换:图像变换是将图像从一个空间域转换到另一个空间域的操作,如傅里叶变换、小波变换等。这些变换算法需要大量的计算,使用 Vivado HLS 可以将其实现为硬件电路,提高计算速度。 3. 图像分割:图像分割是将图像分成多个区域的操作,常用的算法有阈值分割、边缘检测等。使用 Vivado HLS 可以将这些算法实现为硬件电路,提高图像分割速度。 4. 特征提取:图像特征提取是从图像中提取出特定的特征,如角点、边缘等。常用的特征提取算法有Harris角点检测、SIFT算法等。使用 Vivado HLS 可以将这些算法实现为硬件电路,提高特征提取速度。 总之,Vivado HLS 在图像处理领域中有着广泛的应用,可以加速图像处理算法的运行,提高系统性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值