HLS入门

2024-05-25 08:52
文章标签 入门 hls

本文主要是介绍HLS入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. HLS是什么?与VHDL/Verilog编程技术有什么关系?

高层次综合 (HLS)

  1. 抽象级别更高:HLS允许设计者在更高的抽象级别上工作,使用高级编程语言来描述硬件的功能。这种方法减少了设计者需要处理的底层细节,使得设计过程更加高效。
  2. 自动生成HDL代码:HLS工具可以将高级语言编写的算法自动转换为HDL代码,从而生成可综合的硬件描述。这种自动化过程可以减少手工编码的错误,并加快设计周期。
  3. 设计优化:HLS工具通常具有许多优化选项,可以自动进行循环展开、流水线化等优化,以生成更高效的硬件实现。
  4. 加快设计验证:由于使用高级语言进行设计,设计者可以利用软件调试工具进行早期验证,从而加快整个设计验证过程。

VHDL/Verilog编程技术

  1. 低级硬件描述:VHDL和Verilog是传统的硬件描述语言,设计者需要在较低的抽象级别上编写代码,详细描述硬件的行为和结构。这需要设计者具备深厚的硬件知识。
  2. 手工编码:使用VHDL或Verilog进行设计时,所有的代码都是手工编写的。这种方法尽管灵活,但也容易出现人为错误,并且开发周期较长。
  3. 详细控制:设计者可以完全控制硬件的每一个细节,因此在需要精确控制和优化硬件时,VHDL和Verilog是不可替代的。
  4. 广泛应用:尽管HLS越来越受欢迎,但VHDL和Verilog仍然是硬件设计中的主流语言,尤其在FPGA和ASIC设计中。

关系和区别

  1. 抽象级别:HLS使用高级语言进行设计,抽象级别较高;而VHDL和Verilog是低级的硬件描述语言,需要详细描述每个硬件组件。
  2. 设计流程:HLS的设计流程包括高级语言编写、自动综合、优化和验证;而VHDL/Verilog的设计流程主要是手工编写和验证。
  3. 应用场景:HLS适用于快速原型设计和算法验证,尤其在设计周期较短的项目中表现出色;而VHDL和Verilog适用于需要详细控制和优化的复杂硬件设计。

总的来说,HLS与传统的VHDL/Verilog编程技术是互补的。HLS提高了设计效率,减少了设计复杂度,而VHDL和Verilog则提供了更高的控制和优化能力。在现代硬件设计流程中,设计者往往会结合使用这两种技术,以充分发挥各自的优势。

二. HLS有哪些关键技术问题?目前存在什么技术局限性?

高层次综合 (HLS) 虽然提供了显著的设计效率提升和抽象级别的提高,但在实际应用中仍然面临一些关键技术问题和局限性:

关键技术问题

  1. 精确的硬件映射:如何将高级语言中的抽象描述精确地映射到硬件结构上是HLS的核心挑战之一。高级语言的抽象程度较高,而硬件设计需要精确的细节控制,这两者之间的映射是一个复杂的过程。

  2. 性能优化:尽管HLS工具可以进行自动化的性能优化,但如何高效地利用硬件资源(如寄存器、逻辑单元、内存等)仍是一个挑战。自动化优化可能无法达到手工优化的精细程度。

  3. 并行性和流水线化:高级语言中的并行性和流水线化在硬件中实现时,需要处理数据相关性、控制依赖性等问题。HLS工具需要智能地分析和处理这些依赖关系,以生成高效的并行和流水线化硬件。

  4. 代码风格和结构:高级语言代码的风格和结构对生成的硬件有很大影响。设计者需要熟悉如何编写适合HLS工具处理的代码,以便生成高效的硬件。

  5. 调试和验证:从高级语言到硬件描述语言的转换过程中,调试和验证是一个复杂的问题。如何在高级语言级别进行有效的调试,并在硬件级别验证功能正确性,是HLS面临的重要问题。

技术局限性

  1. 性能与手工设计的差距:HLS生成的硬件在性能上可能与手工优化的设计存在一定差距。手工设计可以进行更细粒度的优化,而HLS工具的自动化优化难以达到相同的精度。

  2. 对复杂控制逻辑的支持不足:HLS在处理复杂的控制逻辑时可能表现出局限性。这是因为高级语言通常更适合描述算法,而硬件设计需要详细的状态机和控制逻辑。

  3. 工具的成熟度和兼容性:目前市场上的HLS工具在成熟度和兼容性上存在差异。不同工具对高级语言的支持程度不同,生成的硬件描述语言代码质量也有所不同。这可能导致在不同工具之间进行移植时遇到问题。

  4. 学习曲线:尽管HLS提高了抽象级别,但设计者仍然需要学习如何有效使用HLS工具,以及如何编写适合硬件实现的高级语言代码。这对传统的软件工程师和硬件设计师都是一个新的挑战。

  5. 资源开销:HLS工具和方法可能引入额外的资源开销,如增加硬件面积、功耗等。虽然HLS可以显著提高设计效率,但在资源受限的应用中,这些开销需要仔细权衡。

未来发展方向

尽管存在这些问题和局限性,HLS技术仍在不断发展。未来的研究和改进可能包括:

  1. 提高工具智能化:利用人工智能和机器学习技术,提高HLS工具的智能化水平,自动识别和优化复杂的硬件结构。
  2. 改进调试和验证工具:开发更强大的调试和验证工具,支持从高级语言级别到硬件级别的全流程验证。
  3. 优化算法:研究和开发更高效的算法,用于自动优化生成的硬件描述,缩小与手工优化的性能差距。
  4. 标准化和互操作性:推动HLS工具的标准化,增强不同工具之间的兼容性和互操作性,使得设计者可以更灵活地选择和切换工具。

总体来说,HLS作为一种前沿的设计技术,正在不断进步,并有望在未来的硬件设计中发挥越来越重要的作用。

三. 在win10(或者Ubuntu系统下)安装 Intel 或者 Xilinx 的支持HLS的FPGA编程开发软件(Quartus18或者Vivado18),设置好环境,完成一个入门级的HLS程序,并进行仿真或者实际开发板运行。

创建项目

1、点击Vivado HLS 中的Create New Project
在这里插入图片描述
2、设置项目名
在这里插入图片描述
在这里插入图片描述
3、加入文件
在这里插入图片描述
右键Source与Test Bench,分别新建文件Helloworld.cpp,Helloworld.h与tb_Helloworld.h。

C仿真

1、编写代码
在三个文件中分别编写以下代码:

Helloworld.h

//helloworld.h
#ifndef _HELLOWORLD_H_
#define _HELLOWORLD_H_
#include "ap_int.h"
typedef 	ap_int<1> led_t;
void flash_led(led_t *led_o);
#endif

Helloworld.cpp

//Helloworld.cpp
#include "HelloWorld.h"
void flash_led(led_t *led_o){
#pragma HLS INTERFACE ap_ovld port=led_oint i;for(i=0;i<10000;i++){if(i==9999){*led_o = ~(*led_o);}}
}

tb_Helloworld.cpp

#include "HelloWorld.h"
#include <stdio.h>
int main(){led_t led_o;const int SHIFT_TIME = 4;int i;for(i=0;i<SHIFT_TIME;i++){flash_led(&led_o);printf("result : %d \n",(int)(led_o&0x01));}
}

2、仿真
在保存好代码之后,点击图中的这个按钮进行C仿真:
在这里插入图片描述
在这里插入图片描述
运行仿真后,出现下面这个界面就说明仿真成功了:
在这里插入图片描述
3、综合
进行综合之前,先选择Top Function。

点击Project -> Project Setting -> Synthesis ,点击Helloworld.cpp,并点击Browse选择函数flash_led。
在这里插入图片描述
然后点击C运行:
在这里插入图片描述
C 综合结束后,会有一个总结文件在这个文件的最后,有关于端口的表格:
在这里插入图片描述
solution1\impl\verilog中,有已经生成好的.v文件:
在这里插入图片描述
4、联合仿真
在这里插入图片描述
仿真结束后,出现下面界面,说明联合仿真成功:
在这里插入图片描述

这篇关于HLS入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001041

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis