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
    +关注

    关注

    1665

    文章

    22576

    浏览量

    640917
  • 寄存器
    +关注

    关注

    31

    文章

    5625

    浏览量

    130665

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    74AHC594:8位移位寄存器的详细解析与应用

    74AHC594:8位移位寄存器的详细解析与应用 电子设计领域,移位寄存器是一种常见且重要的数字电路元件,它能够实现数据的串行输入、串行输出或并行输出。今天,我们就来深入了解一下SG
    的头像 发表于 03-26 09:10 721次阅读

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

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

    RDMA设计38:寄存器功能验证与分析

    。由于DUT寄存器数量较多,这里用全局计数寄存器为例说明寄存器功能验证过程。对于寄存器的仿真需要考虑
    发表于 02-09 10:26

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

    单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,C语言环境下对其访问归纳起来有两种方法。 采用标准C的强制类型转换和指针来实现   采用标准C的强制转换和指针的概念来实现
    发表于 12-26 07:00

    汇编寄存器的知识

    学习汇编语言,首先必须了解两个知识点:寄存器和内存模型。 先来看寄存器。CPU 本身只负责运算,不负责储存数据。数据一般都储存在内存之中,CPU 要用的时候就去内存读写数据。 但是,CPU
    发表于 11-20 06:45

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

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

    基于hbirdv2的APB总线添加外设(二)

    的要求设计APB总线接口。其次,需要根据外设的需要来设计对应外设的寄存器,如定义一些只读、读写寄存器等。寄存器后级的具体算法需根据自己算法需
    发表于 10-29 07:49

    基于hbirdv2的APB总线添加外设(三)

    main.c即可实现寄存器读写。 读: 写: 方法二: (1)hbirdv2.h添加
    发表于 10-29 06:39

    E203添加浮点数方法:寄存器设计

    决这个问题,根据浮点 CSR 的读写指令由普通 CSR 读写指令实现的特点,笔者 CSR 寄存器
    发表于 10-24 13:25

    蜂鸟内核DMA的硬件实现——寄存器配置

    :DMA寄存器的配置、读写模块和fifo。 这里主要分享对DMA寄存器配置的分析讨论。 寄存器配置 开始传输前,DMA控制
    发表于 10-24 08:46

    DMA硬件实现——读写实现

    寄存器、长度寄存器回到初始状态0,状态寄存器回到初始状态111。 此外,由于这里一次进行16个数据的读写,需要一个fifo模块存放数据。这里例化了fifo。下一小部分具体阐述fifo
    发表于 10-24 07:58

    NVMe高速传输之摆脱XDMA设计31: 寄存器功能验证与分析1

    待测设计, 系统控制模块寄存器通过 AXI4-Lite 接口访问, 该接口与axi4_lite_agent 对应, 因此可以直接在测试用例
    发表于 09-30 10:01

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

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

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

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

    使用寄存器点亮LED灯

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