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

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

3天内不再提示

如何在C代码中插入寄存器?

FPGA技术驿站 来源:Lauren的FPGA 作者:Lauren的FPGA 2021-02-02 17:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

对于逻辑级数较高的路径,常用的方法之一是在其中插入流水寄存器,将路径打断,从而降低逻辑延迟,这在HDL代码中实现起来比较容易。此外,从RTL代码风格角度讲,对于关键模块,设计时常将其输入/输出端口寄存。这起到了隔离关键路径的作用。

但是,如果使用的RTL代码是HLS转换生成的,例如使用Vitis HLS综合的,其可读性较差,想要在其生成的HDL代码中插入寄存器就变得比较困难。为此,我们想到了能否在C代码中插入寄存器,并保证Vitis HLS综合后的结果是寄存器。

这要解决四个问题:一是这样的C代码要具备一定的可复用性,比如,以模板函数的形式呈现。二是这样的C代码是参数化的,尤其是数据类型,因为需要寄存的数据其数据类型不尽相同。这仍然可以借助模板函数实现。三是保证这个函数不被优化合并掉。因为这个函数功能比较单一,输出等于输入,这就要用到INLINE的功能。四是C语言是不具备时序特征的,要实现输出与输入的延迟,就要借助相应的pragma,我们想到了Latency。

在此基础上,我们构造了下面的C++代码。不难看出,这是一个模板函数,数据类型是参数化的,使用了三个pragma。其中PIPELINE用于限定II为1,LATENCY用于限定延迟为1,INLINE用于防止该函数被合并。

66d4998e-5fc8-11eb-8b86-12bb97331649.png

看一个具体的使用案例,如下图所示代码。功能很简单,就是实现两个数的相加。这里对两个输入数据a和b分别做了寄存,同时对结果c也做了寄存。最终的综合报告显示Latency为2,和我们预期的一致。对于生成的HDL代码,将其添加到Vivado中进行综合,综合后的结果也是符合预期的。

6a37c740-5fc8-11eb-8b86-12bb97331649.png

6dcf1afc-5fc8-11eb-8b86-12bb97331649.png

这里,我们对比一下三种情形。情形1:不添加流水寄存器;情形2:仅对输出添加流水寄存器;情形3:输入输出均添加流水寄存器。Vitis HLS综合结果以及其生成的HDL代码在Vivado下的综合结果对比如下图所示。首先,可以看到Latency符合预期,同时II始终为1;其次,Vivado下综合后的资源利用率与Vitis HLS的结果是不一致的。这一点也很容易理解,因为Vivado综合时会有很多优化。

6e165a70-5fc8-11eb-8b86-12bb97331649.png

进一步,我们看到这里的延迟为1,如果需要两级延迟,就要两次调用模板函数。能否将延迟的时钟周期也设置成参数呢?答案是肯定的,如下图代码所示。这里定义了L,用来管理延迟的时钟周期个数,对应pragma Latency的min和max值。

6e600c38-5fc8-11eb-8b86-12bb97331649.png

6f7ac52c-5fc8-11eb-8b86-12bb97331649.png

原文标题:在C代码中插入寄存器

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

责任编辑:haq

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

    关注

    31

    文章

    5589

    浏览量

    129064
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144612
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73149

原文标题:在C代码中插入寄存器

文章出处:【微信号:Lauren_FPGA,微信公众号:FPGA技术驿站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式系统必懂的 20 个寄存器

    了嵌入式系统开发者必懂的20个寄存器,让你快速掌握MCU的核心操作方法。01寄存器基础寄存器是CPU内部用于高速存取数据的小容量存储单元,是计算机执行指令、处理
    的头像 发表于 11-14 10:28 649次阅读
    嵌入式系统必懂的 20 个<b class='flag-5'>寄存器</b>

    ‌SN74HCT595 8位移位寄存器技术解析与应用指南

    Texas Instruments SN74HCT595/SN74HCT595-Q1 8位移位寄存器包含8位串进并出移位寄存器,向8位D类存储寄存器馈送信号。存储寄存器具有并行 3 状
    的头像 发表于 09-19 14:31 596次阅读
    ‌SN74HCT595 8位移位<b class='flag-5'>寄存器</b>技术解析与应用指南

    TPIC6595 8位功率移位寄存器技术文档摘要

    该TPIC6595是一款单片、高压、大电流功率的8位移位寄存器,设计用于需要相对较高负载功率的系统。该器件在输出端包含一个内置电压钳位,用于电感瞬态保护。功率驱动应用包括继电器、螺线管和其他电流
    的头像 发表于 09-09 11:10 690次阅读
    TPIC6595 8位功率移位<b class='flag-5'>寄存器</b>技术文档摘要

    ‌TPIC6B595 8位功率移位寄存器技术文档总结

    TPIC6B595器件是一款单片、高压、电流功率8位移位寄存器,设计用于需要相对高负载功率的系统。该器件在输出端包含一个内置电压钳位,用于电感瞬态保护。功率驱动应用包括继电器、螺线管和其他
    的头像 发表于 09-09 10:16 736次阅读
    ‌TPIC6B595 8位功率移位<b class='flag-5'>寄存器</b>技术文档总结

    ‌TPIC6C595 8位移位寄存器数据手册总结

    该TPIC6C595是单片、压、低电流 功率 8 位移位寄存器设计用于需要相对中等负载功率的系统 例如 LED。该器件在输出端包含一个内置电压钳位,用于电感瞬态 保护。功率驱动应用
    的头像 发表于 09-09 09:56 674次阅读
    ‌TPIC6<b class='flag-5'>C</b>595 8位移位<b class='flag-5'>寄存器</b>数据手册总结

    TLC6C598 8位移位寄存器LED驱动技术手册

    TLC6C598器件是单片、压、低电流功率 8 位移位 寄存器设计用于需要相对中等负载功率的系统,例如 LED。 该器件包含一个 8 位串行输入并行输出移位寄存器,可为 8 位
    的头像 发表于 08-26 14:31 827次阅读
    TLC6<b class='flag-5'>C</b>598 8位移位<b class='flag-5'>寄存器</b>LED驱动<b class='flag-5'>器</b>技术手册

    ‌TLC6C5912 12通道移位寄存器LED驱动技术文档总结

    该TLC6C5912是一款单片、压、低电流功率 12 位移位寄存器 设计用于需要相对中等负载功率的系统,例如 LED。 该器件包含一个 12 位串行输入并行输出移位寄存器,可为
    的头像 发表于 08-26 14:16 761次阅读
    ‌TLC6<b class='flag-5'>C</b>5912 12通道移位<b class='flag-5'>寄存器</b>LED驱动<b class='flag-5'>器</b>技术文档总结

    SN74LV595B-EP低噪声8位移位寄存器技术解析与应用指南

    Texas Instruments SN74LV595B-EP低噪声8位移位寄存器包含一个8位串行输入、并行输出移位寄存器,可为8位D类存储寄存器馈送信号。存储寄存器具有并行 3 状态
    的头像 发表于 08-15 09:28 843次阅读
    SN74LV595B-EP低噪声8位移位<b class='flag-5'>寄存器</b>技术解析与应用指南

    使用寄存器点亮LED灯

    学习本章时,配合以上芯片手册的“19. I/O Ports”章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。本章内容涉及到较多寄存器方面的深入内容,对于初学者而言这些内容丰富也较难理解,但非常有必要细读研究、夯实基础。
    的头像 发表于 05-28 17:37 1040次阅读
    使用<b class='flag-5'>寄存器</b>点亮LED灯

    如何用C语言操作寄存器——瑞萨RA系列FSP库开发实战指南(10)

    由于寄存器的数量是非常之多的,如果每个寄存器都用像*((uint32_t*)(0x40080000+0x0020*1))这样的方式去访问的话,会显得很繁琐、很麻烦。为了更方便地访问寄存器,我们会借助
    的头像 发表于 04-22 15:30 1661次阅读
    如何用<b class='flag-5'>C</b>语言操作<b class='flag-5'>寄存器</b>——瑞萨RA系列FSP库开发实战指南(10)

    24l01寄存器列表指南免费下载

      寄存器的功能是存储二进制代码,它是由具有存储功能的触发组合起来构成的。一个触发可以存储1位二进制代码,故存放n位二进制
    发表于 01-22 17:25 1次下载

    STC15系列常用寄存器汇总免费下载

      寄存器的功能是存储二进制代码,它是由具有存储功能的触发组合起来构成的。一个触发可以存储1位二进制代码,故存放n位二进制
    发表于 01-22 17:24 10次下载

    XILINX FPGA CLB单元之移位寄存器

    一、移位寄存器 SLICEM函数发生也可以配置为32位移位寄存器,而无需使用slice可用的触发。以这种方式使用,每个LUT可以将串行
    的头像 发表于 01-16 17:45 1453次阅读
    XILINX FPGA CLB单元之移位<b class='flag-5'>寄存器</b>

    何在播放视频过程插入音频

    ZDP14x0是一款基于开源GUI引擎的图像显示专用驱动芯片,可以通过串口或者SPI与其他芯片通信,且能播放视频。本文将介绍如何在播放视频过程插入音频。
    的头像 发表于 12-26 11:13 1950次阅读
    如<b class='flag-5'>何在</b>播放视频过程<b class='flag-5'>中</b><b class='flag-5'>插入</b>音频

    TPS80032寄存器手册

    电子发烧友网站提供《TPS80032寄存器手册.pdf》资料免费下载
    发表于 12-21 09:08 0次下载
    TPS80032<b class='flag-5'>寄存器</b>手册