十二 · 2021年10月29日

SpinalHDL—优雅地实现总线寄存器读写

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

Bus Slave Factory

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

075210c714d318389ff573abe5b3e4d9.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比特信号,可读。

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

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

    由于plus写1清零,因此代码14行用于实现清零操作。通过下面的语法生成RTL代码:

b0058e3a7204f17c38a90980d681e50c.png

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

a7642a00e165af844cdc40d6fe144db8.png

仿真结果

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

54f0655cb88a1d13f2c8edd01702698d.png

    通过gtkWave观察波形:

688dd6014537b8837dfa9ca9a14ffad7.png

    可以看到,功能符合我们的设计,写寄存器0x4信号plus拉高1个时钟周期后自动清零。

    这里简单几行代码实现了AXI4-Lite总线控制寄存器读写,对于我们在真正的项目实现里,能够极大简化我们的工作量和bug产生。尽管现在各个大厂或许有专门的总线控制寄存器读写代码生成工具,但SpinalHDL这种形式从本质上解决了Verilog描述的重复性工作。

写在最后

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

END

作者:玉骐
原文链接:https://mp.weixin.qq.com/s/xXxQSOaoHywFV3fw6YyAYA
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA专栏。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息