Vitis HLS 学习笔记--资源绑定-使用URAM

目录

1. 简介

2. 代码解析

2.1 代码总览

2.2 优化指令

2.3 综合报告

3. 总结


1. 简介

Vivado IP 流程中的 AP_Memory,它用于与存储器资源(如 BRAM 和URAM)进行通信。不同于全局存储器(DDR),对此专用存储器执行的访问称为本地数据访问,比如 BRAM/URAM 中存储的数据。此类访问十分快速。

本地数据交互的唯一方式是通过其输出端口和输入端口。

使用本地存储器 (BRAM/LUTRAM/URAM) 访问时,存储器端口的数量可能限制对数据的访问带宽,导致流水打拍循环内出现 II 违例。

ap_memory 协议同样遵循地址和数据阶段方式来进行操作。该协议首先请求读/写资源,并等待至它收到资源可用确认为止。随后,它会发起读/写的数据传输阶段。

使用UltraRAM(URAM)有几个关键意义和优势,特别是对于需要处理大量数据或需要高性能内存解决方案的应用。以下是使用URAM的主要理由和好处:

  • 增加内存容量:URAM提供了比Block RAM (BRAM)更大的存储容量。在Xilinx一些FPGA设备中,URAM可以提供高达288Kb的存储容量,这是BRAM容量的四倍。使用URAM可以在不牺牲FPGA上其他资源的情况下,增加设计的内存容量。
  • 改善资源利用率:对于需要大量内存的设计,使用URAM可以更有效地利用FPGA的内存资源。通过用更少的URAM实现相同的存储需求,可以释放BRAM资源供其他用途使用,这有助于优化整体的资源分配和利用率。
  • 提高性能:URAM能够提供与BRAM相似的访问速度,同时提供更大的存储容量。对于大规模数据处理和存储密集型应用,使用URAM可以减少数据访问延迟,提高系统的数据吞吐量和性能。
  • 降低功耗:相对于使用多个BRAM实现同等存储容量,使用URAM可以在一定程度上降低系统的总体功耗。因为减少了所需内存单元的数量,从而降低了功耗。
  • 优化数据局部性:通过在设计中合理地使用URAM,可以优化数据的局部性,减少对外部存储的访问需求。这对于那些对延迟和性能有严格要求的应用来说是非常重要的。
  • 支持高级特性:在Vitis HLS中,URAM可以支持一些高级的内存管理和访问特性,如双端口访问、异步读写等,这为复杂的算法实现提供了更多的灵活性和可能性。

2. 代码解析

2.1 代码总览

以下代码展示了一个在Vitis HLS环境中设计的简单存储器模型。它实现了一个可读写的存储器,其中使用UltraRAM(URAM)作为存储介质:

#include "ap_int.h"#define ADDRBITS 14
#define NWORDS 1 << ADDRBITStypedef ap_uint<128> data_t;
typedef ap_uint<ADDRBITS> addr_t;void example(bool wren, bool rden, addr_t addrW, data_t datain,addr_t AddrR, data_t* dataout) {
#pragma HLS PIPELINE II = 1static data_t buffer[NWORDS];
#pragma HLS DEPENDENCE   variable = buffer inter WAR false
#pragma HLS BIND_STORAGE variable = buffer type = ram_2p impl = uramif (rden)*dataout = buffer[AddrR];if (wren)buffer[addrW] = datain;
}

其中,

ADDRBITS 定义了地址位数,这里是14位。

NWORDS 定义了存储器的地址数,通过左移操作计算得到,即1 << 14,表示存储器中有16384(2^14)个地址。

以上代码生成的IP:

  • wren:写使能信号。
  • rden:读使能信号。
  • addrW:写操作的地址。
  • datain:写入的数据。
  • AddrR:读操作的地址。
  • dataout:读出的数据。 

2.2 优化指令

#pragma HLS PIPELINE II = 1

这条指令指示 HLS 工具尝试以流水线方式执行这个函数,每个时钟周期开始一个新的操作(迭代间隔II=1)。

static data_t buffer[NWORDS];
#pragma HLS DEPENDENCE variable = buffer inter WAR false
#pragma HLS BIND_STORAGE variable = buffer type = ram_2p impl = uram

这段定义了一个静态的 buffer 数组,大小为 NWORDS,用作存储数据。
#pragma HLS DEPENDENCE指示编译器这个变量(buffer)不存在写后读(WAR)的数据依赖问题,优化并行执行。
#pragma HLS BIND_STORAGE将buffer绑定为双端口RAM(ram_2p),并指定实现为URAM。这使得buffer在FPGA上的物理实现是使用URAM资源。

2.3 综合报告

================================================================
== HW Interfaces
================================================================
* REGISTER
+-----------+---------+----------+
| Interface | Mode    | Bitwidth |
+-----------+---------+----------+
| AddrR     | ap_none | 14       |
| addrW     | ap_none | 14       |
| datain    | ap_none | 128      |
| dataout   | ap_none | 128      |
| rden      | ap_none | 1        |
| wren      | ap_none | 1        |
+-----------+---------+----------+================================================================
== Bind Storage Report
================================================================
+--------------+------+------+--------+----------+---------+------+---------+
| Name         | BRAM | URAM | Pragma | Variable | Storage | Impl | Latency |
+--------------+------+------+--------+----------+---------+------+---------+
| + example    | 0    | 8    |        |          |         |      |         |
|   buffer_V_U | -    | 8    | pragma | buffer_V | ram_2p  | uram | 1       |
+--------------+------+------+--------+----------+---------+------+---------+================================================================
== Pragma Report
================================================================
* Valid Pragma Syntax
+--------------+---------------------------------------------+---------------------------+
| Type         | Options                                     | Location                  |
+--------------+---------------------------------------------+---------------------------+
| pipeline     | II = 1                                      | example.cpp:12 in example |
| dependence   | variable = buffer inter WAR false           | example.cpp:15 in example |
| bind_storage | variable = buffer type = ram_2p impl = uram | example.cpp:16 in example |
+--------------+---------------------------------------------+---------------------------+

 从综合报告来看,我们成功绑定了 URAM 作为 buffer 的实现方式,并且II=1。

3. 总结

本文提供了对使用 URAM 进行高性能内存解决方案设计的全面理解,详细介绍了在 Vivado IP 流程中使用 AP_Memory 进行与存储器资源通信的方法,并介绍了使用 UltraRAM(URAM)的优势和意义。通过代码解析,展示了在 Vitis HLS 环境中设计的一个简单存储器模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/12499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊Spring为什么需要三级缓存

写在文章开头 笔者在很早整理过一篇关于AOP的源码的文章,阅读起来晦涩难懂,在复盘时就有了想重构的想法,所以就借着这一话题重新聊一聊Spring中的三级缓存。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide …

Sketch总结

sketch禁用了lineGap https://www.sketch.com/docs/designing/text/ http://www.sketchcn.com/sketch-chinese-user-manual.html https://github.com/sketch-hq/sketch-document https://developer.sketch.com/file-format/ https://animaapp.github.io/sketch-web-viewer/ htt…

IP代理中的SOCKS5代理是什么?安全吗?

在互联网世界中&#xff0c;网络安全和个人隐私保护变得日益重要。SOCKS5代理作为一种安全高效的网络工具&#xff0c;不仅可以保护个人隐私安全&#xff0c;还可以提供更稳定、更快度的网络连接。本文将带大家深入了解SOCKS5代理在网络安全领域中的应用。 什么是SOCKS5代理 …

k8s的整体架构及其内部工作原理,以及创建一个pod的原理

一、k8s整体架构 二、k8s的作用&#xff0c;为什么要用k8s&#xff0c;以及服务器的发展历程 1、服务器&#xff1a;缺点容易浪费资源&#xff0c;且每个服务器都要装系统&#xff0c;且扩展迁移成本高 2、虚拟机很好地解决了服务器浪费资源的缺点&#xff0c;且部署快&#x…

TDesign:腾讯企业级设计体系的UI组件库详解

随着时代的快速发展&#xff0c;产品规模不断扩大&#xff0c;传统的研发模式已不能满足市场需求。如何在设计和研发工作中实现高效的协调已成为一个大问题。腾讯企业级设计系统TDesign大量开源&#xff0c;为产品体验设计提供了新的解决方案&#xff01; TDesign是一套完整的…

JVM运行时内存整体结构一览

文章目录 Java 虚拟机 (JVM) 运行时内存由程序计时器, 堆, 方法区, 本地方法栈, 虚拟机栈,构成 Java 虚拟机 (JVM) 运行时内存布局主要包括以下几个部分&#xff1a; 程序计数器 (Program Counter Register): 每个线程都有一个程序计数器&#xff0c;它是当前线程执行的字节码…

voceChat - 支持独立部署的个人云社交媒体聊天服务(使用场景及体验分享)

序言 在工作室的发展中&#xff0c;我们急需一个更加简单便捷&#xff0c;高效&#xff0c;适用于团队内部交流的组织平台。起因是我们团队一直是直接使用QQ进行活动&#xff0c;发现QQ很多功能不是很方便并且过于臃肿&#xff0c;越来越不契合工作室的生产环境&#xff0c;于…

风电功率预测 | 基于RBF径向基神经网络的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于RBF(径向基函数)神经网络的风电功率预测是一种常见的方法。RBF神经网络是一种前馈神经网络,其隐藏层使用径向基函数作为激活函数。 下面是一个基于RBF神经网络的风电功率预测的一般步骤: 数据收集:收集包括风速、风向…

如何在 Windows 11/10 中恢复已删除的分区

在将重要数据存储在计算机上之前&#xff0c;许多用户会创建分区以更好地组织和管理他们的文件。此分区可以在内部硬盘驱动器或外部存储设备上创建。但是&#xff0c;有时可能会意外删除分区。如果发生这种情况&#xff0c;您可能想知道是否可以在不丢失任何信息的情况下恢复已…

[Python图像处理] 换脸(face swapping)操作实践

换脸操作实践 换脸 (face swapping)换脸操作实现相关链接 换脸 (face swapping) 换脸是指照片中的人脸自动替换&#xff1a;将一个人脸的某些部分与另一个人脸的其他部分相结合以形成新的面部图像。它可以被视为另一种类型的面部融合技术。在本节中&#xff0c;我们将使用面部…

【计网】TCP中的滑动窗口

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 工作原理如下&#xff1a; 结语 我的其他博客 正文 TCP&#xff08;传输控制协议&#xff09;中的滑动窗口是一种用于流量控制和拥…

数学建模——线性回归模型

目录 1.线性回归模型的具体步骤和要点&#xff1a; 1.收集数据&#xff1a; 2.探索性数据分析&#xff1a; 3.选择模型&#xff1a; 4.拟合模型&#xff1a; 5.评估模型&#xff1a; 1.R平方&#xff08;R-squared&#xff09;&#xff1a; 2.调整R平方&#xff08;Ad…

【教程向】从零开始创建浏览器插件(四)探索Chrome扩展的更多常用API

探索Chrome扩展的更多常用API 在Chrome扩展开发中&#xff0c;除了最基础的API外&#xff0c;Chrome还提供了一系列强大的API&#xff0c;允许开发者与浏览器的各种功能进行交互。本文将介绍其中几个常用的API&#xff0c;并提供详细的示例代码帮助您开始利用这些API。 书签…

JavaScript进阶——05-迭代器和生成器【万字长文,感谢支持】

迭代器 概念 迭代器&#xff08;Iterator&#xff09;是 JavaScript 中一种特殊的对象&#xff0c;它提供了一种统一的、通用的方式遍历个各种不同类型的数据结构。可以遍历的数据结构包括&#xff1a;数组、字符串、Set、Map 等可迭代对象。我们也可以自定义实现迭代器&…

【class8】人工智能初步(图像识别-----卷积神经网络)

上节回顾 上节课&#xff0c;我们简单了解了图像识别和深度学习的相关知识。 快速回顾一下吧&#xff5e; A图像识别是以图像的主要特征为基础的。B. 图像分辨率决定图像的质量。 C&#xff0e; 像素是图像中的最小单位D. 在图像识别的原理上&#xff0c;计算机和人类在本质…

面试加分项:精通Java高并发下的锁优化策略

1. 问题背景与挑战 1.1 并发编程中的挑战 在现代软件开发中&#xff0c;高并发已成为衡量系统质量的一项关键因素&#xff0c;特别是对于那些需要同时处理数以万计甚至百万级用户请求的服务。并发编程的挑战在于如何有效地同步多个线程&#xff0c;确保数据的一致性和系统的稳…

3ds Max与Maya不同之处?两者哪个更适合云渲染?

3ds Max 和 Maya 都是知名的3D软件&#xff0c;各有其特色。3ds Max 以直观的建模和丰富的插件生态闻名&#xff1b;Maya 则在动画和角色创作方面更为出色。两者都支持云渲染技术&#xff0c;能帮助用户在云端高效完成项目。 一、3ds Max和Maya之间的主要区别&#xff1a; 3ds…

短视频的拍摄方式有哪些:四川京之华锦信息技术公司

创意与技术并存的艺术之旅 在数字媒体高速发展的今天&#xff0c;短视频已经成为人们获取信息、表达情感、展示才艺的重要窗口。从社交平台到新闻资讯&#xff0c;再到教育娱乐&#xff0c;短视频无处不在&#xff0c;其独特的魅力和广泛的传播力让人们对它的拍摄方式产生了浓…

全像宇宙投影第三部时间与空间(全文)下载

当这个人向空中凝视时&#xff0c;他所在的房间渐渐变得透明而朦胧&#xff0c;空中渐渐浮现一个久远前景像。突然他觉得自己在皇宫中庭内&#xff0c;他面前站著一位年轻女士非常美丽&#xff0c;有著橄榄色的皮肤。他可以见到她的颈项、手腕、脚踝上都挂著金饰&#xff0c;还…

df 中的 NoneType、空和 None

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 目录 简介什么是 NoneType&#xff1f;什么是空&#xff08;Empty&#xff09;&#xff1f;什么是 None&#xff1f;Python 中如何判断 NoneType&#xff1f;Pandas DataFrame 中的 NoneType、空和 None实操&#x…