0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述HLS中的数组初始化遇到的那些个问题

OpenFPGA 来源:TeacherGaoFPGAHub 作者:TeacherGaoFPGAHub 2021-07-21 09:36 次阅读

在HLS中使用数组时,尤其是对数组初始化时,尽可能加上关键字static,这样C++中数组的行为才能与RTL中存储单元的行为保持一致。例如:将FIR滤波器系数存储在数组coeff中,由于系数固定不变,可以断定该数组最终映射为RTL中的ROM

添加static之后,每次函数在被执行时,数组coeff都会记住其前一次被调用时的值。这就要理解static在C++中的含义,即static规定其指定的变量存储方式为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放。对于指定static关键字的变量,VitisHLS在生成RTL代码时会对其先进行初始化。

7bb53a22-e428-11eb-a97a-12bb97331649.png

如果数组在整个函数执行过程中只发生读操作而没有写操作,那么建议添加关键字const,以保证VitisHLS能正确推断出ROM。

如果在ROM的初始化过程中出现复杂的运算,例如使用了math.h中的函数等,建议将初始化过程单独封装为一个函数。我们来看一个案例。在下面的代码中,函数init_sin_table用于初始化数组sin_table。在其初始化过程中会调用math.h中的函数sin。

sin要求其形参为float或double。函数lookup_math中声明了数组sin_table,并添加关键字static。在代码第17行调用了函数init_sin_table完成数组初始化。第18行则是从sin_table中获取相应地址上的数据完成最终的乘法运算。

7be282b6-e428-11eb-a97a-12bb97331649.png

从HLS综合后的报告来看,最终sin_table的存储形式(报告中的Storage列)为rom_1p,实现方式为auto,Latency为1。在资源评估报告中可以看到消耗了1个BRAM。

7c1a0862-e428-11eb-a97a-12bb97331649.png

7c46f2dc-e428-11eb-a97a-12bb97331649.png

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HLS
    HLS
    +关注

    关注

    1

    文章

    128

    浏览量

    24005

原文标题:HLS中的数组初始化问题

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于旋转平移解耦框架的视觉惯性初始化方法

    精确和鲁棒的初始化对于视觉惯性里程计(VIO)至关重要,因为不良的初始化会严重降低姿态精度。
    的头像 发表于 11-01 10:16 148次阅读
    基于旋转平移解耦框架的视觉惯性<b class='flag-5'>初始化</b>方法

    TMS320C6000 McBSP初始化

    电子发烧友网站提供《TMS320C6000 McBSP初始化.pdf》资料免费下载
    发表于 10-26 10:10 0次下载
    TMS320C6000 McBSP<b class='flag-5'>初始化</b>

    在一个while的循环里面,怎么样可以通过控件去让其中的数组值全部初始化

    这种方式是让所有的数据都初始化了,我只需要部分数据初始化,就是所有的数组,大佬们求帮助!
    发表于 04-18 21:19

    深入探索KUKA KRL数组应用

    如果 CHAR 类型数组的所有数组元素都拥有相同的字符串,则不必单独初始化每个数组元素。忽略右侧的数组下标。(对于一维
    的头像 发表于 04-18 10:37 1096次阅读
    深入探索KUKA KRL<b class='flag-5'>中</b>的<b class='flag-5'>数组</b>应用

    STM32F103RC变量初始化问题求解

    Test0变量的值一直是0x03,并且无法被初始化其他值。 例如:ArryTest[7]的地址为0x20000200,Test0 的地址为0x2000020e,则Test0 的值无法被修改,一直为0x03. 有哪位朋友遇到过这样的问题没有?
    发表于 04-10 07:35

    字符型、指针型等变量等该如何初始化

     对于数值类型的变量往往初始化为0,但对于其他类型的变量,如字符型、指针型等变量等该如何初始化呢?
    的头像 发表于 03-18 11:02 1219次阅读

    TC397 SPI的初始化需要修改那些配置吗?

    我想使用TC397芯片的SPI通讯功能,由于PCB设计原理图使用的SPI通道所有自带片选都被占用,因此需要使用GPIO功能模拟SPI的片选,遇到的问题是通讯偶尔出现接收数据全为F,我在使用SPI 的硬件片选时,SPI的初始化需要修改那些
    发表于 03-06 06:02

    MCU单片机GPIO初始化该按什么顺序配置?为什么初始化时有电平跳变?

    GPIO初始化时有时钟配置、模式配置、输出配置、复用配置,那么在编写初始化代码时,到底该按什么顺序执行呢?如果顺序不当那初始化过程可能会出现短暂的电平跳变。
    的头像 发表于 02-22 11:07 1398次阅读
    MCU单片机GPIO<b class='flag-5'>初始化</b>该按什么顺序配置?为什么<b class='flag-5'>初始化</b>时有电平跳变?

    串口初始化一般是初始化哪些内容

    串口初始化是指在使用串口进行数据通信之前,对串口进行一系列的设置和配置,以确保串口能够正常工作。串口初始化的内容主要包括以下几个方面: 串口硬件设置:首先,需要确定要使用的串口是哪一个,通常计算机
    的头像 发表于 01-04 09:39 3003次阅读

    labview运行后如何初始化

    LabVIEW是一款强大的图形编程软件,在运行之前通常需要进行一些初始化操作。本文将详细介绍LabVIEW运行前的初始化过程,并提供了一些常用的初始化方法。 创建新项目: 在LabV
    的头像 发表于 12-28 17:24 2423次阅读

    自动初始化机制原理详解

    自动初始化机制是指初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。这篇文章就来探索一下其中的奥秘, 简单理解其原理!
    的头像 发表于 12-16 09:33 951次阅读
    自动<b class='flag-5'>初始化</b>机制原理详解

    C语言编程时,各种类型的变量该如何初始化

    C语言编程时,各种类型的变量该如何初始化? 在C语言中,每个变量都需要在使用之前进行初始化初始化是为变量分配内存空间并赋予初始值的过程。C语言提供了不同的
    的头像 发表于 12-07 13:53 1100次阅读

    secondary cpu初始化状态设置

    ,用于填写secondary cpu的入口地址。 uboot负责将这块内存的地址写入devicetree,当内核初始化完成,需要启动secondary cpu时,就将其内核入口地址写到那块内存
    的头像 发表于 12-05 15:27 979次阅读
    secondary cpu<b class='flag-5'>初始化</b>状态设置

    C语言中的数组格式与初始化

    多少存储空间。 数组格式与初始化     格式:   元素类型 数组名[元素个数];        比如:   int[3];       数组元素有顺序之分,每个元素都有一个唯一的下
    的头像 发表于 11-26 16:12 740次阅读
    C语言中的<b class='flag-5'>数组</b>格式与<b class='flag-5'>初始化</b>

    实战经验 | Keil、IAR、CubeIDE 变量不被初始化方法

    关键词:不被初始化,编译环境 目录预览 1、前言 2、IAR 实现变量不初始化方法 3、Keil 实现变量不被初始化方法 4、CubeIDE 实现变量不初始化方法 01 前言 有些时候
    的头像 发表于 11-24 18:05 3792次阅读