Vitis HLS 学习笔记--初始化与复位

news2025/1/21 0:59:16

目录

1. 简介

2. 控制初始化与复位

2.1 初始化

2.2 复位

2.3 全局复位选项

2.4 复位排除

3. 阵列初始化和复位

3.1 不使用 static 限定符

3.2 使用 static 限定符

3.3 BRAM 和 URAM

4. 总结


1. 简介

本文对比分析两个方面的初始化和复位:阵列和控制(也即块级)

阵列的初始化和复位

  • 阵列初始化:初始化是在编译时(或上电时)为变量(包括阵列)赋予初始值的过程。对于 C/C++ ,全局变量和静态变量默认初始化为0,但也可以给它们指定初始值。对于硬件逻辑,阵列会被实现为存储器(例如RAM),并且在上电或编程 FPGA 时,这些存储器会被预加载指定的初始值。
  • 阵列复位:在运行时,通过复位信号将变量(包括阵列)恢复到其初始状态的过程。不同于初始化,复位是一个动态过程,可以在程序执行期间任何时刻发生。如果选择将变量复位到其初始状态,这会导致设计中增加额外的逻辑和存储器资源。

控制的初始化与复位

  • 控制初始化:初始化行为主要关注变量(包括阵列和寄存器)在编译时或上电时的状态。
  • 控制复位:在 kernel 端口添加复位信号,当用复位信号使能,立即将连接到复位端口的寄存器和 BRAM 还原为初始值。通常 RTL 配置中最重要的操作即选择复位行为。

2. 控制初始化与复位

2.1 初始化

默认情况下,C/C++ 中以 static 变量全局变量都初始化为 0,也可由用户赋予特定初始值。

在 Vitis HLS 工具中,需要注意:

  • 在 RTL 仿真期间,为这些变量设置的初始值与 C/C++ 语言代码中相同。
  • 在用于对 FPGA 进行编程的比特流中,也会对这些变量进行初始化。当器件上电时,变量将以其初始状态启动。

在 RTL 中,虽然变量启动时使用的初始值与 C/C++ 语言代码相同,但无法强制该变量返回至此初始状态。要复原初始状态,必须通过复位信号来实现。

2.2 复位

复位端口在 FPGA 中用于在应用复位信号时,立即将连接到复位端口的寄存器和块 RAM 还原为初始值。通常 RTL 配置中最重要的操作即选择复位行为。

* TOP LEVEL CONTROL
+-----------+---------------+-----------+
| Interface | Type          | Ports     |
+-----------+---------------+-----------+
| ap_clk    | clock         | ap_clk    |
| ap_rst_n  | reset         | ap_rst_n  |
| interrupt | interrupt     | interrupt |
| ap_ctrl   | ap_ctrl_chain |           |
+-----------+---------------+-----------+

对于复位行为,重要的是理解初始化与复位之间的差异。

2.3 全局复位选项

复位选项包含:

  • 复位极性(reset_level)
  • 同步复位/异步复位(reset_async)
  • 最重要的,通过“reset”选项来控制应用复位信号时要复位的寄存器。

“reset”选项包含 4 项设置:

  • “none”:在设计中不添加复位。
  • “control”:这是默认设置,将所有控制寄存器复位。控制寄存器即状态机中使用的寄存器,用于生成 I/O 协议信号。此设置可确保 kernel 可立即启动其操作状态。
  •  “state”:在“control”设置基础上,添加衍生自 C/C++ 语言代码中的静态变量和全局变量的任意寄存器或存储器添加复位。此设置可确保应用复位后,C/C++ 语言代码中初始化的静态变量和全局变量均复位为其初始值。
  • “all”:为 kernel 中的所有寄存器和存储器添加复位。

2.4 复位排除

通过 RESET 编译指示或指令可提供更精细的复位控制。静态变量和全局变量均可通过 RESET 指令来添加复位。还可使用 RESET 指令的 off 选项从复位的变量中移除变量。

示例一:

void foo(int in[3], char a, char b, char c, int out[3]) {
#pragma HLS reset variable=a

此示例会为 foo 函数中的 a 变量添加复位,即使全局复位设置为 none 或 control 也是如此。 

示例二: 

void foo(int in[3], char a, char b, char c, int out[3]) {
#pragma HLS reset variable=a off

从 foo 函数中的 a 变量移除复位,即使全局复位设置为 state 或 all 也是如此。

3. 阵列初始化和复位

对于阵列,推荐使用含 static 限定符的存储器来实现。这不仅可确保 HLS 工具以存储器来实现阵列,还允许使用“static”(静态)类型的默认初始化行为。

最为对比,我们设定两种情况:

3.1 不使用 static 限定符

int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8};

每次执行函数时,都会为 coeff 阵列分配这些值。综合后,每次执行 kernel 时,用于实现 coeff 的 RAM 都会随这些值一起加载。

如果使用单端口 RAM,此操作耗时 8 个时钟周期。对于 1024 阵列,当然也就需要 1024 个时钟周期,在此期间无法执行任何依赖于 coeff 的运算。

3.2 使用 static 限定符

static int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};

该阵列开始执行时会使用指定的值进行初始化。每次执行该函数时,coeff 阵列都会保留上次执行的值。静态阵列在 C/C++ 语言代码中的行为与 RTL 中的存储器行为相同。

如果变量包含 static 限定符,那么 Vitis HLS 会对 RTL 设计和 FPGA 比特流中的变量进行初始化。因此,无需经历多个时钟周期来初始化存储器,并且可确保大型存储器初始化不会产生任何运算开销。

3.3 BRAM 和 URAM

在不同的硬件平台上,比如 UltraScale+ 或 Versal,内存块(BRAM)和超大型RAM(URAM)的启动和重置方式可能会有所不同。简单来说,Vitis HLS 工具支持两种重置方式:

  • 上电初始化:就像设备刚通电时自动设置好的状态。这种情况下,所有平台的 BRAM 和 Versal 的 URAM 都会被设置成预先定义的初始值。
  • 运行时重置:当设备正在运行中,如果我们发送一个 RESET 信号,BRAM 和 URAM 会被重置到初始状态,就像重新启动一样。

如果读取/写入阵列,则保留“initial value array”(初始值阵列,ROM)和“run time array”(运行时阵列,RAM)。此行为适用于 BRAM 和 URAM,对应于器件执行期间的硬件 RESET 信号。

4. 总结

本文讨论了初始化和复位在硬件设计中的不同方面。阵列的初始化是在编译时或上电时为变量赋予初始值,而复位是在运行时将变量恢复到其初始状态。控制的初始化和复位也是关键,通过复位信号可以在 kernel 端口添加复位行为。对于阵列,使用 static 限定符的存储器可以实现默认初始化行为,避免运算开销。此外,BRAM 和 URAM 的启动和重置方式也需要根据硬件平台进行考虑。

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

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

相关文章

如何检测UV胶的均匀性?

如何检测UV胶的均匀性? 检测UV胶的均匀性可以通过以下几种方法来实现: 肉眼目视检查: 这是最简单直接的方法。将UV胶涂在表面上,使用裸眼观察胶层的表面。特别注意是否存在气泡、颜色不均匀、裂纹或其他明显的不均匀性。如凹凸不…

选择排序(直接选择排序与堆排序)----数据结构-排序②

1、选择排序 1.1 基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素,放在序列的起始位置,直到全部待排序的数据元素排完就停止 。 1.2 直接选择排序 排序思想: ①在元素集合array[i]--array[n-1]中选择…

FM148A,FM146B运行备件

FM148A,FM146B运行备件。电源保险丝仓主控底座的保险丝仓示意图底座上共有两个保险丝(800mA),FM148A,FM146B运行备件。(10~73)30/195主控单元2.K-CUT014槽底座地址接口主控站地址拨开关从上到下为二进制数的…

Day46 代码随想录打卡|二叉树篇---从中序与后序遍历序列构造二叉树

题目(leecode T106): 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 方法:本题要通过中序遍历和后…

Windows无法安装到这个硬盘空间。选定的分区上启用了BitLocker驱动器加密。请在控制面板中暂停(也称为禁用)BitLocker,然后重新开始安装。

我们安装操作系统的时候,到了选择安装分区的地方,我们选中的分区提示“无法在驱动器的分区上安装Windows”,然后我们点击显示详细信息,提示如图下所示 分析原因,可能是之前的分区未进行格式化。但是这个时候我们无法格…

基于51单片机水塔水位控制系统

基于51单片机水塔水位控制 (仿真+程序) 功能介绍 具体功能: 1.用滑动变阻器模拟水位,ADC0809将模拟信号转换为数字信号; 2.LCD1602显示当前水位和水位阈值; 3.当水位超过设定阈值&#xff…

STM32智能小车学习笔记(避障、循迹、跟随)

我们使用的是STM32CubeMX软件和MDK5 芯片使用的是STM32F103C8T6 完成对STM32CubeMX的初始化后开始我们的第一步点亮一个LED灯 一、点亮LED灯 点亮PC13连接的灯 打开STM32CubeMX软件,pc13设置为输出模式 然后按照这样配置,user label 设置成这个IO口代…

Go微服务: 关于消息队列的选择和分类以及使用场景

消息队列概述 在分布式系统和微服务架构中,消息队列(Message Queue)是一个核心组件,用于在不同的应用程序或服务之间异步传递消息在 Go 语言中,有多种实现消息队列的方式,包括使用开源的消息队列服务&…

2024 年最全的 21 款数据恢复工具软件汇总

使用其中任何一款免费数据恢复工具,您都可以找回那些您认为已经永远消失的文件。我根据这些程序对我而言的易用性和它们提供的功能对这些程序进行了排名。 这些应用程序从您的硬盘、USB 驱动器、媒体卡等恢复文档、视频、图像、音乐等。我建议每个计算机所有者都安装…

附录二-nmap基本用法

参考 黑客工具—Nmap的使用_哔哩哔哩_bilibili nmap是扫描IP和端口的,相当于攻击前的索敌步骤。不止网络安全方面会用到,平时运维的时候也会用到nmap 1 下载nmap nmap官网 https://nmap.org/ 点击下载,然后点你用的平台就行了 往下滚可以…

[职场] 硬件研发是什么职业 #职场发展#其他

硬件研发是什么职业 硬件研发工程师需要具备丰富的电子电路知识、熟练掌握各种电子元器件的性能及应用、具备一定的机械结构设计能力,同时还要具备良好的团队协作和沟通能力。本文会进行详细介绍。 一、硬件研发是什么 硬件研发,全称硬件研发工程师&am…

一文搞懂Python的异常

人生之事,不如意者十之有九。 在编程中亦是如此。异常(Exception),遍布于程序各个角落,开发工作的大部分coding,都是为了应对和解决它。 概念 异常,简而言之,是程序在执行期间发生的非预期的、非正常的事件或情况。 举个实际生活的例子: 你周末出门买大龙虾,但当你…

Vue-App桌面程序列表

Vue-App桌面程序列表 文章说明讲解视频核心代码效果展示项目链接 文章说明 采用Vue实现PC端的桌面程序列表,采用HBuilderX将程序转化为5App,实现移动端的适配;支持桌面打开新应用,底部导航展示当前应用列表,可切换或关…

用你熟悉的语言就能开发智能合约,Vara Network 以 WASM 解锁未来应用创新

Vara Network 自推出以来,凭借其基于 Gear Protocol 的独特架构和强大的开发工具,为开发者提供了一个高效、安全的智能合约构建平台。Vara Network 通过采用先进的 Actor 模型、持久内存概念和 WebAssembly 技术,实现了异步消息处理、并行计算…

在线OJ项目测试(selenium+Junit5)

目录 在线OJ项目测试的思维导图 在线OJ的UI自动化测试 测试一:检查未登录时的页面访问以及一些未登录时的非法操作 测试二:测试注册界面 测试三:测试登录界面 测试四:测试题目列表界面 测试五:测试题目详情界面…

Android Kotlin 异步操作回调转换为挂起函数

异步接口回调是一种通过接口将任务的执行和结果处理分离开来的编程设计模式。通常用于网络请求、数据库查询等耗时操作。 挂起函数是 Kotlin 中的一个特性,用于简化异步编程。挂起函数是可以在协程中暂停执行并恢复的函数,避免了回调地狱问题&#xff0…

php质量工具系列之PHPCPD

PHPCPD 用于检测重复代码,直观的说就是复制粘贴再稍微改改 该工具作者已经 停止维护 安装 composer global require --dev sebastian/phpcpd执行 phpcpd --log-pmd phpcpd_result.xml ./app参数介绍 --log-pmd 将结果保存在phpcpd_result.xml 中 ./app 是phpcpd扫…

linux系统PXE自动装机和无人值守

一、PXE 1.PXE:c/s模式,允许客户端通过网络从远程服务器(服务端)下载引导镜像,加载安装文件,实现自动化安装操作系统。(c/s客户端和服务端都可以是多台) 2.PXE优点:规模…

【机器学习基础】Python编程08:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

基于STM32开发的智能家居监控系统

目录 引言环境准备智能家居监控系统基础代码实现:实现智能家居监控系统 4.1 传感器数据读取4.2 电器设备控制4.3 实时数据监控与分析4.4 用户界面与数据可视化应用场景:家庭安全监控与管理问题解决方案与优化收尾与总结 1. 引言 随着智能家居技术的发…