Vitis HLS
文章平均质量分 90
记录Vitis HLS相关学习笔记和实用示例
hi94
探索智能硬件发展,拥抱AI改变未来
展开
-
KV260 进阶开发(PYNQ驱动开发+Pixel Pack)
本文讨论在 PYNQ 框架下,使用 Python 驱动 Vitis HLS Kernel。使用 Registermap 也可以完成驱动,即直接操作所有寄存器。通过Python 方式编写的驱动更直观,可以理解为对Registermap 的封装。Registermap 和Python 驱动,底层都是调用 MMIO 的读写。原创 2024-09-12 22:42:21 · 936 阅读 · 0 评论 -
Vitis HLS 学习笔记--AXI_STREAM_TO_MASTER
本文详细介绍了如何利用 Vitis HLS 工具将 AXI Stream 格式的数据流转换为并行存储数据,并通过 AXI Master 接口写入到存储器中。通过示例代码和编译器指令的解释,读者可以了解到 AXI Stream 接口和 AXI Master 接口的特点以及在 FPGA 设计中的应用。同时,本文还分析了示例中各个函数的功能和参数,以及综合报告中的重要信息。原创 2024-05-06 23:47:59 · 1079 阅读 · 0 评论 -
Vitis HLS 学习笔记--控制驱动任务示例
本文对《Vitis HLS 学习笔记--抽象并行编程模型-控制驱动与数据驱动-CSDN博客》中的控制驱动任务示例进行了详细解析,重点分析了 kernel 代码的并行处理机制及各模块的实现。通过查看综合报告、Schedule Viewer 和 Dataflow Viewer,确认了 funcB 和 funcC 的并行执行和 vecOut 的 FIFO 设置。并介绍了 Vitis IDE 的关键设置,包括数据文件加载、Flow Target 配置及 FIFO 深度调整。原创 2024-05-21 23:17:47 · 1353 阅读 · 0 评论 -
Vitis HLS 学习笔记--抽象并行编程模型-概述
HLS工具通过识别代码中可并行执行部分来加速硬件性能,但软件常见技巧如动态内存分配在硬件中难以应用,增加了转换难度。高效FPGA软件开发需掌握并行处理原则,包括任务集合与通道机制。任务通过控制或数据驱动,在本地存储器和I/O端口支持下执行。通道提供阻塞和非阻塞语义以保证数据传输的可靠性,但需注意阻塞可能导致死锁,非阻塞可能导致数据丢失。这些原理是编写高效FPGA代码的关键。原创 2024-05-18 22:53:31 · 824 阅读 · 0 评论 -
Vitis HLS 学习笔记--资源绑定-使用URAM
本文提供了对使用 URAM 进行高性能内存解决方案设计的全面理解,详细介绍了在 Vivado IP 流程中使用 AP_Memory 进行与存储器资源通信的方法,并介绍了使用 UltraRAM(URAM)的优势和意义。通过代码解析,展示了在 Vitis HLS 环境中设计的一个简单存储器模型。原创 2024-05-14 23:33:28 · 1132 阅读 · 0 评论 -
Vitis HLS 学习笔记--抽象并行编程模型-控制驱动与数据驱动
任务级并行度(TLP)通过同时执行多个任务提升应用效率和性能。Vitis HLS 提供了数据驱动和控制驱动两种 TLP 模型。数据驱动模型像自动化流水线,适用于无外部存储器交互且函数间无数据依赖的应用;控制驱动模型则更像一个指挥官,适合不同部分需相互通信的应用。数据驱动模型中,任务通过 hls::task 声明,通道通过 hls::stream 模拟,注意避免死锁。控制驱动模型使用 C++ 顺序语义创建并行处理流水线,任务级并行执行函数,需使用 DATAFLOW 编译指示。两者结合,实现高效并行计算。原创 2024-05-20 23:30:51 · 1414 阅读 · 0 评论 -
Vitis HLS 学习笔记--抽象并行编程模型-不良示例
本文讨论了数据流水线中常见的三种绕过问题:输入绕过、中间绕过和输出绕过,导致性能下降。通过优化,绕过问题得以解决,提升了流水线性能。分别优化了三个示例:输入绕过:将两个独立的函数调用合并,使数据流更紧凑。中间绕过:重新组织数据流,减少不必要的传递,简化路径。输出绕过:改进输出处理,确保每个数据都被正确处理和传递。这些优化措施有助于减少延迟,提高数据处理效率,增强整体性能。原创 2024-05-19 23:50:11 · 703 阅读 · 0 评论 -
Vitis HLS 学习笔记--HLS流水线基本用法
本文介绍了使用pipeline进行硬件优化的基本方法,并通过示例展示了不同优化方式的性能影响。针对累加计算函数,我们通过内外层循环的pipeline优化和数组访问优化,显著提高了时序性能,从405个周期降至3个周期。这些优化方法可有效应用于其他硬件设计中,提高性能和效率。原创 2024-05-04 23:55:56 · 979 阅读 · 0 评论 -
Vitis HLS 学习笔记--理解串流Stream(2)
在硬件中可以被设计为连续处理数据的模块,尽管其代码表面上看只处理一次数据。重要的是要理解硬件设计和软件逻辑之间的差异:硬件模块可以被设计为重复触发,以连续处理数据流,而不仅仅是单个数据项。原创 2024-05-09 23:37:49 · 1284 阅读 · 0 评论 -
Vitis HLS 学习笔记--理解串流Stream(1)
在Vitis HLS中,hls::stream是一个关键的数据结构,用于处理数据流。它类似于C++标准库中的std::stream,但专门设计用于硬件描述语言。hls::stream具有类似无限深度的FIFO的行为,支持顺序读写操作,并可灵活定义数据类型和FIFO深度。通过示例代码和综合报告,我们了解到hls::stream在硬件设计中的重要作用,以及如何根据需求配置不同的接口实现。这使得在设计硬件加速器时更加灵活、可控。原创 2024-05-07 23:49:57 · 987 阅读 · 0 评论 -
Vitis HLS 学习笔记--资源绑定-使用URAM(1)
通过本文深入探讨了在Vitis HLS环境下设计的存储器模型的内部机制。通过分析生成的RTL代码和IMPL报告,我们了解到该存储器模型利用URAM实现,具有读写功能,并且限制了级联深度为1。特别地,我们注意到存储器的初始化操作在Vitis HLS中被转化为硬件实现的一部分,这为预加载存储器内容提供了便利。总的来说,本文为使用Vitis HLS设计存储器提供了实用的指导,加深了对存储器设计原理的理解。原创 2024-05-15 23:53:21 · 1365 阅读 · 0 评论 -
Vitis HLS 学习笔记--避免使用多重访问指针
虽然 Vitis HLS 在指针上支持多重访问指针,但强烈建议使用 hls::stream 类替代多重访问指针来实现所需的行为,以避免陷入困难。如果设计使用接口上的顶层函数的实参列表中的指针,那么在使用指针执行多重访问时需考量一些特殊注意事项。当任一指针以相同方式多次执行读取或写入时,就会发生多重访问。原创 2024-05-17 16:36:44 · 902 阅读 · 0 评论 -
Vitis HLS 学习笔记--优化本地存储器访问瓶颈
通过对原始代码进行优化,成功地改善了内存访问模式,提高了循环执行效率。优化后的代码减少了存储器访问次数,优化了数据重用,以及改进了迭代间隔,使得每个时钟周期都可以开始一个新的迭代。这些优化措施有效地减少了存储器访问延迟,提高了硬件执行效率。优化后的代码在性能和效率上都有了显著的提升,更适用于高性能处理应用场景。原创 2024-05-16 15:00:30 · 946 阅读 · 0 评论 -
Vitis HLS 学习笔记--HLS眼中的完美循环嵌套
本文介绍了在处理嵌套循环时的重要性以及创建完美嵌套循环的关键原则。优化循环结构对于硬件描述和高级综合中的性能至关重要,其中完美循环嵌套的设计能够最大程度地利用硬件资源和并行计算能力,提高性能并降低时延。通过确保最内层循环包含所有计算、循环边界为常量以及没有循环间的逻辑依赖,可以实现这一目标。在HLS工具中,利用指令如#pragma HLS UNROLL和#pragma HLS PIPELINE可以进一步优化循环结构。原创 2024-05-03 23:41:50 · 1527 阅读 · 0 评论 -
Vitis HLS 学习笔记--理解串流Stream(3)
针对《Vitis HLS 学习笔记--理解串流Stream(2)-CSDN博客》博文的内容,做进一步说明。原创 2024-05-10 23:52:20 · 947 阅读 · 0 评论 -
Vitis HLS 学习笔记--基本指针和算术指针
在Vitis HLS中,指针的使用与传统的C/C++环境存在显著差异,尤其是在涉及硬件综合时。基本指针可以直接指向数据,并且通常不会对硬件综合产生负面影响,但在顶层函数的接口中使用时需要注意指针的实现方式。另一方面,算术指针的灵活性在软件编程中很有用,但在硬件设计中可能引入问题,因为硬件需要按照固定顺序访问数据。为了克服这些问题,可以通过使用数组和RAM接口来替代指针,以更好地满足硬件设计的需求。总之,在进行Vitis HLS设计时,需要仔细考虑指针的使用方式,以确保最终的硬件实现符合设计要求。原创 2024-05-16 23:48:02 · 1165 阅读 · 0 评论 -
Vitis HLS 学习笔记--控制驱动TLP-处理deadlock
在数据流优化中,通道类型、握手机制、FIFO大小和死锁避免都是关键因素。通过Dataflow查看器和协同仿真数据,您可以有效地优化设计,提高性能并避免潜在问题。原创 2024-05-22 23:10:49 · 1509 阅读 · 0 评论 -
Vitis HLS 学习笔记--MAXI手动控制突发传输
这篇文章探讨了在《Vitis HLS 学习笔记--AXI4 主接口-CSDN博客》中介绍的AXI4主接口的突发传输。虽然适用于HLS工具能够自动推断突发传输的情况,但并非所有情况工具都能自动推断。文章提供了详细的操作方法和示例,帮助读者在各种情况下优化存储器访问。本文分享了在Vitis HLS中使用AXI4主接口进行手动突发传输的方法。首先,解释了突发传输的前置条件,包括请求类型、顺序、连续性等。接着,介绍了通过hls::burst_maxi对象实现手动突发传输的方法,包括构造函数、读取和写入方法的使用。原创 2024-05-02 23:44:35 · 1649 阅读 · 0 评论 -
Vitis HLS 学习笔记--Schedule Viewer 调度查看器
Vitis HLS中的schedule viewer是设计和优化硬件加速器过程中的一个关键工具,它通过提供算法执行的详细视图,帮助设计者理解、分析和优化他们的设计。原创 2024-04-29 20:18:31 · 1635 阅读 · 0 评论 -
Vitis HLS 学习笔记--优化指令-ARRAY_PARTITION
ARRAY_PARTITION 指令中非常重要,它用于优化数组的存储和访问。该指令可以将一个大数组分割成多个小数组,以提高并行处理能力和减少访问延迟。原创 2024-04-22 17:01:34 · 1969 阅读 · 0 评论 -
Vitis HLS 学习笔记--对于启动时间间隔(II)的理解
定义:启动时间间隔(II)是指连续启动两个操作之间的时间间隔。性能影响:II 过短可能导致任务冲突,II 过长则可能浪费资源。优化目标:在设计中需要平衡 II,以确保高效利用 FPGA 资源并实现最佳性能。设计考虑:合理设置 II 可以提高硬件加速器的吞吐量和效率。原创 2024-04-23 23:15:54 · 469 阅读 · 0 评论 -
Vitis HLS 学习笔记--Syn Report解读(1)
综合报告是Vitis HLS工具链中一个关键的输出,它为开发者提供了关于其HLS设计的重要信息,包括时序估计、性能和资源使用情况、硬件接口细节以及软件到硬件的映射信息。本文通过三个简单的示例,详细解读这些报告,以便更好地理解 Vitis HLS 工具的输出,并利用这些信息来优化和调试硬件设计。原创 2024-04-26 23:39:18 · 1820 阅读 · 0 评论 -
Vitis HLS 学习笔记--C/C++ static 关键字的作用
在Vitis HLS中,偶尔会用到 static 关键字。考虑到Vitis HLS同时兼容C和C++语言,有必要理解这两种语言中static关键字细微差异。本文旨在梳理和总结C与C++中static关键字的具体差别,以便于开发者更加精确地应用于Vitis HLS环境中。原创 2024-04-26 15:43:55 · 1420 阅读 · 0 评论 -
Vitis HLS 学习笔记--AXI4 主接口
本文介绍了在使用 Vitis HLS 进行高层次综合时,利用 AXI4 存储器映射 (m_axi) 接口进行数据传输的方法和优势。首先,对于 MAXI 接口的认识和概述进行了阐述,MAXI 接口作为主动、全局、存储器级别的接口,提供了在 FPGA 内部和外部存储器之间高效传输数据的能力。接着,通过代码示例详细展示了如何在函数接口中使用 MAXI 接口进行数据传输,以及如何利用突发模式提高数据传输效率。原创 2024-04-28 19:21:24 · 2067 阅读 · 0 评论 -
Vitis HLS 学习笔记--优化指令-BIND_OP_STORAGE
这些指令指导了高级综合(HLS)工具在优化指定数组的存储和操作实现时的行为。它们有助于在 FPGA 设计中实现更好的性能和资源利用率。存储类型的选择(BRAM、LUTRAM 或 URAM)以及专用 DSP 资源的使用会影响设计的整体效率。指定的延迟控制了这些操作的时序特性。原创 2024-04-22 22:43:22 · 1266 阅读 · 0 评论 -
Vitis HLS 学习笔记--S_AXILITE 寄存器及驱动
使用 Vitis HLS 工具进行硬件设计带来了额外的“隐式”优势,即在驱动程序的自动生成方面。本文详解 S_AXILITE Registers 寄存器及其驱动过程。通过对 s_axilite 协议下生成的寄存器进行解释,我们了解了这些寄存器的作用和每个寄存器位的含义。原创 2024-04-28 13:26:18 · 1260 阅读 · 0 评论 -
Vitis HLS 学习笔记--scal 函数-探究
Vitis Libraries在HLS中扮演了至关重要的角色,它汇集了众多领域内关键的函数以及它们的硬件实现版本,极大地方便了开发者。本文以BLAS库中的scale函数为例,该函数实现了向量的缩放运算,展示了Vitis Libraries的实用性和强大功能。scale函数通过模板参数、数据类型和流对象的复杂组合,实现了数据的并行处理与高效运算,虽然这些高度优化的实现在一开始可能令人望而生畏,但一旦掌握,便能大幅提升数据处理任务的性能。通过深入学习和实践,开发者可以解锁Vitis Libraries的潜力。原创 2024-04-16 17:56:58 · 1089 阅读 · 0 评论 -
Vitis HLS 学习笔记--硬件卷积加速 Filter2DKernel
就表示没有数据相关性,那么编译器就可以在同一个循环内自由地移动读写操作的位置,从而提高操作的可调度性和潜在的性能或面积优化。,就表示没有数据相关性,那么编译器就可以在流水线化或展开循环时并行执行多个循环的读写操作,从而提高吞吐量。,就表示有数据相关性,那么编译器就会保证每一次循环内的读写操作都按照顺序执行,不能移动位置。,就表示有数据相关性,那么编译器就会保证每一次循环的读写操作都按照顺序执行,不能并行化。工具计算循环的延迟,从而在报告中显示循环对总设计延迟的贡献,并帮助确定适合的优化方法。原创 2024-04-12 17:26:38 · 1152 阅读 · 0 评论 -
Vitis HLS 学习笔记--readVec2Stream 函数-探究
readVec2Stream函数是一个高效的数据搬运工具,它专门设计用于将数据从主存(如DDR)高效地传输到FPGA上的流中。通过并行处理和流水线技术,该函数能够显著提高数据处理的吞吐量,从而优化整体的硬件性能。原创 2024-04-16 20:37:35 · 1149 阅读 · 2 评论 -
Vitis HLS 学习笔记--优化循环启动间隔(II)
循环重排优化了内存访问模式,减少了数据依赖性,使得硬件能够更有效地并行处理计算,从而提高了执行效率。II从32降低到了1。原创 2024-04-11 11:54:02 · 765 阅读 · 1 评论 -
Vitis HLS 学习笔记--BLAS库之WideType
了解WideType的实现和功能,能够帮助开发者更好地设计和优化处理密集型数据操作的应用程序。WideType通过内部数组存储固定数量的数据项,并通过模板参数化以支持不同的数据类型和宽度,实现灵活的数据操作和存储。此外,WideType提供了一系列位级操作方法,如shift和unshift,以及数据访问和修改的方法,如重载的operator[]和getVal,从而使得对于底层数据的操作既直观又高效。原创 2024-04-17 15:05:29 · 1313 阅读 · 0 评论 -
Vitis HLS 学习笔记--理解图像数据的生成、存储模式、调取方法
通过 HLS 中提供的函数Filter2D,了解在硬件加速中,图像数据在 DDR 中的存储模式,从而理解的生成、调取方法,方便快速测试和验证。原创 2024-04-11 17:48:33 · 616 阅读 · 1 评论 -
Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(2)-深度探究
这篇文章的目的,正是要揭开ap_int.h和ap_fixed.h这两个强大工具的神秘面纱,更好地理解其背后的原理和应用方式。原创 2024-04-15 15:35:34 · 1231 阅读 · 0 评论 -
Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(1)
使用标准的数据类型(如 int、float 等)往往会导致资源浪费,因为这些类型的位宽是固定的,可能远远超过实际需求。例如,在执行加法操作时,较小的数据位宽意味着较少的逻辑门延迟,从而加快运算速度。此外,较小的数据位宽还可以减少数据传输的带宽需求,提高整体系统的性能。在执行加法或减法运算时,两个浮点数的指数可能不同,需要进行对阶操作,即调整两个数的指数使其相同,然后才能对尾数进行加减操作。浮点运算单元(FPU)的设计比定点运算单元复杂得多,需要更多的逻辑电路和更多的时钟周期来完成一个运算。原创 2024-04-09 07:30:00 · 1399 阅读 · 0 评论 -
Vitis HLS 学习笔记--移除内存分配malloc
Vitis HLS不支持动态创建或删除C/C++对象,因此开发者必须寻找替代方案。本文通过一个例子展示了如何在不定义USE_MALLOC的情况下,使用栈内存代替堆内存进行内存分配。示例中的函数example通过两个循环处理输入数组,使用栈上的局部变量而非malloc分配的内存,从而在编译时确定内存大小,这对硬件合成至关重要。原创 2024-06-12 23:35:35 · 1273 阅读 · 0 评论 -
Vitis HLS 学习笔记--通道的FIFO/PIPO选择
本文通过调整 Vitis HLS 编译器的默认设置,选择FIFO或者PIPO作为通道缓存。PIPO 缓冲器可以自动调节,确保任务之间的重叠执行,而不会出现死锁。而显式手动串流的 FIFO 通道虽然可以更快地开始重叠执行,但需要小心调整队列大小,以避免死锁问题。原创 2024-05-30 23:25:39 · 840 阅读 · 0 评论 -
Vitis HLS 学习笔记--控制驱动与数据驱动混合编程
在Vitis HLS中,控制驱动(Control-driven)和数据驱动(Data-driven)的并行性是高效硬件设计的两个关键组成部分。控制驱动并行性通过#pragma HLS dataflow指令实现,允许不同函数在数据准备好时即刻并行执行,从而优化整体性能。数据驱动并行性则通过hls::task类实现,它将函数封装为可并行执行的任务。这两种技术的结合,使得设计者能够充分利用硬件资源,实现复杂算法的高效执行。原创 2024-05-31 23:37:03 · 704 阅读 · 0 评论 -
Vitis HLS 学习笔记--FRP自由运行流水线
FRP自由运行流水线是一种高效的硬件架构风格,它通过持续运行来优化性能,即使在没有新的输入数据时也不会停滞。这种设计简化了控制逻辑,减少了资源使用,并提高了时序性能。然而,FRP流水线也有其局限性,如不支持MAXI接口,且在某些情况下可能导致死锁。原创 2024-06-01 23:48:38 · 662 阅读 · 0 评论 -
Vitis HLS 学习笔记--接口存储器布局模型
在现代计算机系统中,数据对齐和结构填充是确保数据存储和访问效率的关键因素。数据对齐涉及将数据按照处理器优化的边界排列,以加快访问速度。结构填充则是在数据结构中插入额外空间,以保持成员变量的正确对齐。这些概念在硬件设计中尤为重要,因为 FPGA 和其他硬件加速器对数据布局的要求更为严格。Vitis HLS 等工具允许开发者自定义对齐和填充规则,以优化软件与硬件之间的数据交互,从而提升整体性能。理解并应用这些原则,可以帮助开发者在存储器要求和性能之间找到最佳平衡点。原创 2024-06-08 23:37:27 · 1222 阅读 · 0 评论 -
Vitis HLS 学习笔记--global_array_RAM初始化及复位
在本文中,我们探讨了如何在Vitis HLS中处理FPGA的全局数组映射和初始化问题。通过示例代码,我们了解了如何将C++数组映射到不同类型的RAM,并使用#pragma HLS BIND_STORAGE指令来指定存储实现。我们还讨论了URAM的使用限制和手动数据打包的解决方案。最后,我们比较了两种解决方案:一种是不使用复位指令的solution_A,另一种是使用复位指令的solution_B。solution_B通过ROM和RAM的结合,提供了一种在复位信号激活时能够将数组恢复到初始状态的方法。原创 2024-06-03 23:38:02 · 1501 阅读 · 0 评论