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

    文章

    5619

    浏览量

    130421
  • C语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146165
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74381

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Texas Instruments SN74SSTU32864C:25位可配置寄存器缓冲深度剖析

    Texas Instruments SN74SSTU32864C:25位可配置寄存器缓冲深度剖析 在DDR2 DIMM设计领域,一款出色的寄存器缓冲
    的头像 发表于 04-23 13:40 89次阅读

    解析ICSSSTV16859C:DDR 13位到26位寄存器缓冲

    解析ICSSSTV16859C:DDR 13位到26位寄存器缓冲 在DDR内存模块的设计,选择合适的寄存器缓冲
    的头像 发表于 04-14 10:05 89次阅读

    IDT74SSTVN16859C:13位至26位寄存器缓冲的技术解析

    的是IDT74SSTVN16859C这款13位至26位的寄存器缓冲,看看它在实际应用能为我们带来哪些便利。 文件下载: IDT74SSTVN16859CNLG.pdf 产品特性亮点
    的头像 发表于 04-12 12:55 411次阅读

    74HC595 8位移位寄存器:设计与应用全解析

    74HC595 8位移位寄存器:设计与应用全解析 在电子工程师的工具箱,移位寄存器是一个非常实用的组件。今天,我们就来深入了解一下SG Micro Corp的74HC595 8位串行输入/串行输出
    的头像 发表于 03-16 10:35 368次阅读

    STPIC6C595:8位移位寄存器的性能剖析与应用解读

    STPIC6C595:8位移位寄存器的性能剖析与应用解读 在电子设计领域,对于需要控制相对中等负载功率的系统而言,合适的移位寄存器至关重要。STPIC6C595作为一款单片、
    的头像 发表于 01-26 17:40 871次阅读

    请问如何实现C语言访问MCU寄存器

    系列KeilC扩充sfr关键字,举例如下:   sfr P0 = 0x80;   这样操作0x80单元直接写P0即可。   下面对AVR的歌C编译对访问MCU寄存器的方法进行简介。
    发表于 12-26 07:00

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

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

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

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

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

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

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

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

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

    该TPIC6C595是单片、压、低电流 功率 8 位移位寄存器设计用于需要相对中等负载功率的系统 例如 LED。该器件在输出端包含一个内置电压钳位,用于电感瞬态 保护。功率驱动应用
    的头像 发表于 09-09 09:56 1009次阅读
    ‌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 1278次阅读
    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 1157次阅读
    ‌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 1426次阅读
    SN74LV595B-EP低噪声8位移位<b class='flag-5'>寄存器</b>技术解析与应用指南

    使用寄存器点亮LED灯

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