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.hqwc.cn/news/701547.html

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

相关文章

讲解SSM的xml文件

概述&#xff1a;这些配置文件很烦&#xff0c;建议直接复制粘贴 springMVC.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XM…

基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 扩散映射&#xff08;Diffusion Maps&#xff09; 4.2 卡尔曼滤波 4.3 基于梯度流的扩散映射卡尔曼滤波&#xff08;GFDMKF&#xff09; 5.完整程序 1.程序功能描述 基于梯度流的扩散…

数学建模入门手册

数模的主要比赛 美赛&#xff08;报名费100美元&#xff0c;每年2月比赛&#xff09;&#xff1b;国赛&#xff08;每年9月&#xff09; 电工杯&#xff08;每年5月&#xff09;&#xff1b;APMCM&#xff08;每年11月&#xff09;&#xff1b;MathorCup&#xff08;每年4月&a…

电容笔记汇总

电容 一、电容理论基础 1、电容的本质 两个相互靠近的导体&#xff0c;中间夹一层不导电的绝缘介质&#xff0c;这就构成了电容器。当电容器的两个极板之间加上电压时&#xff0c;电容器就会储存电荷。 两个相互靠近的金属板中间夹一层绝缘介质组成的器件&#xff0c;当两端…

K8S内容

K8S介绍 1、故障迁移:当某一个node节点关机或挂掉后&#xff0c;node节点上的服务会自动转移到另一个node节点上&#xff0c;这个过程所有服务不中断。这是docker或普通云主机是不能做到的 2、资源调度:当node节点上的cpu、内存不够用的时候&#xff0c;可以扩充node节点&…

【选型推荐】洁净室( 区) 悬浮粒子的测试方法及仪器选型

环境监测承担着环境污染控制措施有效性的评判者的角色。其本身不是一个控制措施&#xff0c;环境监测本身并不能够改变环境指标&#xff0c;降低污染。一个有效的环境监测体系是能反映洁净区内的粒子和微生物的真实水平。确认环境是否满足法规的要求&#xff0c;同时给予污染控…

【基本数据结构】链表

文章目录 前言链表简介头节点与尾节点特性 分类单向链表双向链表循环链表 单链表基本操作定义并初始化单链表读取节点插入节点删除节点修改节点 参考资料写在最后 前言 本系列专注更新基本数据结构&#xff0c;现有以下文章&#xff1a; 【算法与数据结构】数组. 【算法与数…

初识C语言——第二十天

do while ()循环 do 循环语句; while(表达式); 句式结构&#xff1a; 执行过程&#xff1a; do while循环的特点&#xff1a; 代码练习&#xff1a; 二分法算法&#xff1a; int main() {int arr[] { 0,1,2,3,4,5,6,7,8,9};int k 7;//查找数字7&#xff0c;在arr这个数组…

【iOS】——RunLoop学习

文章目录 一、RunLoop简介1.RunLoop介绍2.RunLoop功能3.RunLoop使用场景4.Run Loop 与线程5.RunLoop源代码和模型图 二、RunLoop Mode1.CFRunLoopModeRef2.RunLoop Mode的五种模式3.RunLoop Mode使用 三、RunLoop Source1.CFRunLoopSourceRefsourc0&#xff1a;source1: 2.CFRu…

利用AI创建MYsol存储过程

DDLDML CREATE TABLE student (id INT AUTO_INCREMENT PRIMARY KEY,createDate DATETIME NOT NULL,userName VARCHAR(255) NOT NULL,phone VARCHAR(20) NOT NULL,age INT NOT NULL,sex ENUM(男, 女, 其他) NOT NULL,introduce TEXT ); INSERT INTO student (createDate, userN…

JavaScript异步编程——11-异常处理方案【万字长文,感谢支持】

异常处理方案 在JS开发中&#xff0c;处理异常包括两步&#xff1a;先抛出异常&#xff0c;然后捕获异常。 为什么要做异常处理 异常处理非常重要&#xff0c;至少有以下几个原因&#xff1a; 防止程序报错甚至停止运行&#xff1a;当代码执行过程中发生错误或异常时&#x…

冷风机厂家电话,为什么车间降温要用冷风机?

冷风机厂家电话&#xff0c;为什么车间降温要用冷风机&#xff1f; 夏季车间高温很多工厂想降温&#xff0c;采用原来的传统空调费用高耗能高&#xff0c;很多工厂是用不起的&#xff0c;那么采用蒸发市冷风机怎么样&#xff1f; 冷风机是很过对于为什么冷风机比空调更适合车…