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

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

3天内不再提示

在SpinalHDL中如何优雅地实现寄存器总线读写

FPGA之家 来源:CSDN技术社区 作者:weixin_39611666 2021-04-08 17:28 次阅读

对于FPGA系统设计里,寄存器控制通道的设计是系统控制中必不可少的部分。今日且看SpinalHDL中如何优雅地实现寄存器总线读写。

Bus Slave Factory

在SpinalHDL里,其Libraries里提供了关于总线相关的库。包含AMBA3、AMBA4、AVALON等总线类型,并提供了bus slave factory工具:

1bb53004-95c8-11eb-8b86-12bb97331649.png

通过bus slave factory,我们可以方便地实现寄存器读写,其提供了一系列寄存器读写方法。这里列举几个常用的方法(完整的方法列表可参照SpinalHDL-Doc):

read(that,address,bitOffset)

注册寄存器读操作到指定地址,比特偏移为bitOffset 。

write(that,address,bitOffset)

注册寄存器写操作到指定地址,比特偏移为bitOffset。

readAndWrite(that,address,bitOffset)

注册寄存器读写操作到指定地址,比特偏移为bitOffset 。

readMultiWord(that,address)

注册大位宽寄存器(超过总线数据位宽)读操作到指定地址,其中address地址存放对应低比特,高比特地址向上累加。

writeMultiWord(that,address)

注册大位宽寄存器(超过总线数据位宽)写操作到指定地址,其中address地址存放对应低比特,高比特地址向上累加。

除此之外,bus slave factory还提供了printDataModel函数用于打印寄存器列表。而且在生成RTL时,其会自动检测寄存器地址是否存在冲突。

AXI4-Lite总线实现

这里以AXI4-Lite总线举例,通过AXI4-Lite总线读写三组寄存器:

en:单比特信号,可读可写。

plus:单比特信号,可读写,写1自动清零。

cnt:64比特信号,可读。

这里给出完整的代码结构:

1be7147a-95c8-11eb-8b86-12bb97331649.png

这里代码5~10行代码声明模块端口,第12行代码规范AXI4-Lite端口名称。代码第15~18行通过slave factory实现AXI4-Lite寄存器读写。代码第19行打印输出寄存器列表。

由于plus写1清零,因此代码14行用于实现清零操作。

通过下面的语法生成RTL代码:

1c02ad02-95c8-11eb-8b86-12bb97331649.png

在生成RTL代码的同时,会打印寄存器列表:

1c513a62-95c8-11eb-8b86-12bb97331649.png

仿真结果

SpinalHDL里提供了AXI4-Lite总线的基础仿真库,这里直接调用其仿真库,完整的仿真代码如下:

1c5fa5ac-95c8-11eb-8b86-12bb97331649.png

通过gtkWave观察波形:

1cfc2076-95c8-11eb-8b86-12bb97331649.png

可以看到,功能符合我们的设计,写寄存器0x4信号plus拉高1个时钟周期后自动清零。 这里简单几行代码实现了AXI4-Lite总线控制寄存器读写,对于我们在真正的项目实现里,能够极大简化我们的工作量和bug产生。尽管现在各个大厂或许有专门的总线控制寄存器读写代码生成工具,但SpinalHDL这种形式从本质上解决了Verilog描述的重复性工作。

写在最后

虽然SpinalHDL这种slave factory工具能够让我们在工程中快捷的实现想要的功能,但对于初学者来说,理解掌握AXI4-Lite这些标准的总线协议时序还是非常有必要的(Verilog or SpinalHDL实现都行喽)~
编辑:lyn

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

    关注

    1625

    文章

    21665

    浏览量

    601734
  • 寄存器
    +关注

    关注

    31

    文章

    5310

    浏览量

    119983

原文标题:SpinalHDL—优雅地实现总线寄存器读写

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

收藏 人收藏

    评论

    相关推荐

    调试ads1192、ads1198等系列的芯片中,发现寄存器上报的导联状态一直处于不稳定状态,为什么?

    我们调试ads1192、ads1198等系列的芯片中,发现寄存器上报的导联状态一直处于不稳定状态。导联连上时,寄存器可以上报稳定的连上状态,但是当脱落时,发现导联寄存器上报的状态一
    发表于 11-20 06:25

    接口的控制与状态寄存器什么作用

    的行为并获取硬件的状态信息。 接口的控制与状态寄存器的作用 现代计算机系统,硬件设备与软件之间的交互是通过一系列的接口来实现的。这些接口不仅需要能够传输数据,还需要能够控制硬件设备
    的头像 发表于 10-17 10:42 264次阅读

    寄存器间接寻址和寄存器寻址的区别

    寄存器间接寻址和寄存器寻址是计算机体系结构两种重要的寻址方式,它们指令执行过程起着关键作用。下面将从定义、原理、特点、应用场景以及区别
    的头像 发表于 10-05 17:13 772次阅读

    微处理寄存器的作用

    微处理寄存器是计算机体系结构的核心组成部分,它们扮演着至关重要的角色。寄存器是一种高速的存储单元,用于暂时存储数据、指令和地址等信息
    的头像 发表于 10-05 15:07 300次阅读

    寄存器的类型和作用

    计算机科学寄存器(Register)是一种高速存储单元,它位于CPU内部,与CPU的运算单元和逻辑控制单元紧密相连。寄存器的主要作用是暂时存储指令、操作数和地址等临时数据,以便C
    的头像 发表于 09-05 14:11 1062次阅读

    寄存器是什么意思?寄存器是如何构成的?

    计算机科学寄存器(Register)是一个高速存储单元,它位于中央处理(CPU)内部,用于存储计算机程序执行过程中所需要的数据、指令地址或状态信息。
    的头像 发表于 08-02 18:23 3263次阅读
    <b class='flag-5'>寄存器</b>是什么意思?<b class='flag-5'>寄存器</b>是如何构成的?

    寄存器寻址和直接寻址的区别

    寄存器寻址和直接寻址是计算机指令系统的两种基本寻址方式。它们指令的执行过程起着至关重要的作用,决定了指令操作数的来源和目标。下面我们将介绍这两种寻址方式的特点、区别以及
    的头像 发表于 07-12 10:42 1287次阅读

    寄存器寻址的实现方式

    计算机体系结构寄存器寻址是一种常见的寻址方式,它允许程序直接访问CPU内部的寄存器寄存器寻址可以提高程序的执行效率,因为它避免了对内
    的头像 发表于 07-12 10:36 553次阅读

    寄存器分为基本寄存器和什么两种

    寄存器是计算机中用于存储数据的高速存储单元,它们是CPU内部的重要组成部分。寄存器可以分为基本寄存器和扩展寄存器两种类型。 一、基本寄存器
    的头像 发表于 07-12 10:31 1109次阅读

    移位寄存器右移是怎么移位的

    移位寄存器是一种在数字电路和计算机科学中广泛使用的存储设备,它可以用来存储和传输数据。移位寄存器,数据可以通过移位操作来实现数据的传输和
    的头像 发表于 07-12 10:14 967次阅读

    威纶触摸屏RW寄存器如何使用

    威纶触摸屏是一种广泛应用于工业自动化领域的设备,它具有易用性、灵活性和可靠性等特点。威纶触摸屏,RW寄存器是一种非常重要的数据存储方式,它可以帮助用户实现数据的
    的头像 发表于 06-11 16:32 3924次阅读

    如何根据自己设计寄存器配置总线定义来生成一套寄存器配置模版

    无论是FPGA还是ASIC,系统设计总会存在配置寄存器总线的使用,我们会将各种功能、调试寄存器挂载
    的头像 发表于 03-04 13:56 1051次阅读
    如何根据自己设计<b class='flag-5'>中</b>的<b class='flag-5'>寄存器</b>配置<b class='flag-5'>总线</b>定义来生成一套<b class='flag-5'>寄存器</b>配置模版

    TC3XX寄存器读写时间过长怎么解决?

    我目前在做TC3XX底层代码优化,经过之前多次测试目前可以确定该系列芯片对单个寄存器地址的读写耗时超过100us。请问对于寄存器读写耗时你们官方有没有确切的文件说明?还有就是既然
    发表于 01-25 06:56

    移位寄存器的工作原理 移位寄存器左移和右移怎么算

    移位寄存器是一种用于在数字电路实现数据移位操作的基本电路元件。它由多个触发以及相关控制电路组成,具有存储、接受和移动数据的功能。移位寄存器
    的头像 发表于 01-18 10:52 7239次阅读

    AD9779A有静电干扰,出现寄存器复位现象的原因?

    AD9779A,有静电干扰(金属碰地、焊点等),出现寄存器复位现象。请指教。
    发表于 12-22 08:21