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

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

3天内不再提示

寄存器的基本知识

路科验证 来源:IC小迷弟 作者:Martin 2022-07-26 13:52 次阅读

1. 寄存器的作用

1)时序逻辑存储数据。例如,一个计数器,每个周期要加1,那它就要使用寄存器实现。纯组合逻辑是实现不了的。

2)CPU硬件协调工作,提高设计的灵活度。例如,在休眠时,我们可能会把某个模块的时钟关掉,然后在正常工作时,再将时钟打开。这个就可以通过CPU来实现。

2.基地址/偏移地址

几乎我们设计的每个模块都会有寄存器,而它们的寄存器或多或少能被CPU访问到。但CPU的接口通常只有一组总线去访问这些模块,所以设计上都会把CPU和各个模块挂到总线上。这样CPU作为Master就能够访问到所有的模块了。

4078180e-0c99-11ed-ba43-dac502259ad0.png

那CPU的地址是怎么映射到一个具体的寄存器上的呢?这就是涉及到基地址和偏移地址的概念。首先,我们在定架构时,会做一张地址映射表格。我们就以下图为例,假设给每个外设接口都分配了32KB的地址空间,32KB占用的是15bit。所以32bit的CPU地址的高17位就是基地址,而低15位便是偏移地址。当CPU发一个0x46018000的地址下来,那么硬件会自动根据它的基地址判断它是去访问I2C的。然后根据偏移地址便可以知道是访问I2C的哪一个寄存器了。

40936fb4-0c99-11ed-ba43-dac502259ad0.png

3. 寄存器的复位

需不需要复位

40bf62e0-0c99-11ed-ba43-dac502259ad0.png

如上图,就面积而言,同样的驱动等级下,带复位的寄存器要比不带复位的寄存器大。所以在实际中,为了节省面积,有些寄存器是可以不加复位的。那么,什么样的寄存器不需要复位呢?答案很简单:如果一个寄存器的值是在别的信号的控制下更新,且只有在更新后才会被使用,那么这个寄存器就可以不用复位。例如流水线的数据通路;又例如总线设计中的部分寄存器。我们以AXI总线的地址通道为例,由于addr和size这些控制信号是在valid和ready的控制下更新的。换句话说,在时钟沿下,只要valid和ready同时为高,addr和size就会马上更新;而valid和ready只要有一个不为高时,总线都不会去使用addr和size的值(此时它们的值是don’t care的)。在这个前提下,addr和size是可以不用复位的;但是valid和ready就一定要复位。参考代码如下:

40e96f7c-0c99-11ed-ba43-dac502259ad0.png

不过话说回来,寄存器不加复位的设计风险会比较大,所以建议在设计初期都加上复位,后面要抠面积时,再回来修改。

同步复位or异步复位

在电路结构上,同步复位是要比异步复位多一个与门的。如果采用同步复位设计,那么就相当于每个寄存器都会多一个与门,这无疑会撑大面积。所以现在的设计基本上都是采用异步复位,然后在前面加个异步复位同步释放电路。

而由于异步复位同步释放是要在时钟下对复位打两拍,所以在一些源同步设计中,我们要特别注意的一个问题是:时序上是否允许你做同步,例如在SPI slave的设计中,假设我们使用CS进行复位。由于时钟是master发送过来的,每一个数据对应一个时钟。这时就不能用master发送过来的时钟做同步了。

复位源

一个复杂的设计中,一个寄存器可能会有很多复位源的。例如,上电复位,软复位,watchdog复位等等。因此,在设计的时候,我们要先根据功能和应用场景将寄存器分到不同的复位域。并画出具体的复位电路图,然后对着电路图来coding。

复位原因记录寄存器

当复位源很复杂时,建议在设计中加上一个寄存器。用于记录上次复位的原因,方便debug。如下图,不同的复位,该寄存器会被复位成不一样的值。另外,还可以加上一个计数器,用于记录复位的次数等。

411317fa-0c99-11ed-ba43-dac502259ad0.png

4.寄存器的时钟域

这里的时钟域指的是,配置寄存器的时钟域和使用寄存器的时钟域。如果它们是同一个时钟域,那就没什么好顾虑的。但是如果它们属于异步时钟域。那这时候就要对寄存器做静态和动态甚至更细的划分。所谓静态寄存器是指,在使用的过程中,寄存器是不会被改变的;而在改变的过程中一定不能被使用。举个例子,假设某个模块的时钟是通过分频获得的,而分频系数可能在上电初始化后就不会再去修改,而这个模块只会在初始化完成之后才会启动工作。那么这个分频系数寄存器就可以当作是静态的。否则,这个寄存器就是动态的。

在跨时钟域处理的场景中,区分静态和动态寄存器尤为重要。例如,假设一个寄存器是在clka下配置的,却用于clkb下。这时,如果是静态寄存器,那就不需要做跨时钟域处理。因为不管clkb在哪个时刻采样,都只能采到固定值;而动态寄存器可能在采样时发生变化,从而导致亚稳态的出现。当然,也有人为了保险起见,不管是静态和动态寄存器,都统一做跨时钟域处理了。


5.访问权限

寄存器的访问权限类型多种多样,包括但不局限于下图。我们在设计中要考虑的是,哪些寄存器是CPU能否访问的,哪些寄存器是硬件能够访问的。尤其是在安全相关的设计中(例如安全boot),要特别重视这访问权限。因为CPU能读到的东西,随时都会被别人看到。

4123b088-0c99-11ed-ba43-dac502259ad0.png

访问权限在寄存器描述文档中是必不可缺的。下面给出一个参考格式。

413c019c-0c99-11ed-ba43-dac502259ad0.png

6.Byte mask

CPU访问寄存器的数据总线要么是32bit,要么是64bit。也就是说数据总线会是多byte的。如果没有byte mask,那么CPU在修改某一byte时,要做读改写的操作。所以通常在设计中,我们会给寄存器加上byte mask的属性。例如,寄存器是32bit的,那么可以通过4bit的byte_en来控制写。

7.多路访问源仲裁

一个寄存器有多个访问源的场景很常见。例如,CPU和其它硬件都可以访问;又例如多个CPU可以访问。我们举个例子,假设模块A和模块B都有一个SPI控制器,但是它们共用一组IO,并使用一个寄存器spi_switch来选择是模块A还是模块B的控制器接到IO中。而好死不死spi_switch又正好能够被两个CPU配置。那么,假设CPU0把IO交给了模块A,如果模块A在使用SPI传输的过程中,CPU1把IO切到了模块B,这就出问题了。那么只是在寄存器spi_switch的设计上下功夫,该如何设计才能避免上面的问题呢?答案是有的,但我要卖个关子,你们自己想去吧。

8.保留寄存器

在实际项目中,固件的完成时间往往要落后于RTL设计,你总会遇到tapeout了,固件还在设计的情况。也就是说,我们在设计RTL时,有可能固件的一些功能或架构还不够明确。所以我们在设计时,可视情况,预留多一些寄存器,这些寄存器在RTL设计时还没有明确的功能,因此,我管它们叫做保留寄存器(reserved寄存器),如下图。万一固件哪天需要使用寄存器来做标记,直接使用这些保留寄存器即可。

415c19fa-0c99-11ed-ba43-dac502259ad0.png

9.寄存器和RAM之间的选择

项目中使用到memory做缓存是家常便饭。而从实现的角度来看,这些memory可通过寄存器来实现,也可以通过调用RAM来实现。选择寄存器和RAM需要考虑三点:

1)面积。一般小的memory可以使用寄存器搭;而较大的memory使用RAM搭比较换算。两者选择的边界很难分清,需要根据具体工艺来评估。

2)因为寄存器的读取是单拍就出来了,而RAM的读取要等下一拍才出来。所以在做选择时,我们要先看看是否允许数据下一拍出来。

3)RAM的读latency很大,它有可能是项目timing的瓶颈。尤其是RAM比较大,或者RAM的访问源比较多的时候。在评估时,可是打开RAM的library,来查看具体的latency。

10.默认值

设置寄存器的默认值也是一门艺术。这里列几个我暂时还记得的规则:

1) IO驱动的默认值不要给太小。

2) MCU复位自己的软复位寄存器的默认值不能有效。否则,复位状态下,MCU根本就动不起来,更别说去释放软复位了。

3)时钟gate相关寄存器要防止死锁。举个极端的例子,假设MCU的时钟gate是通过MCU自己配置寄存器来控制的。那么这个gate寄存器的默认值就是要开启的。否则复位后,时钟会被gate住,MCU根本就动不起来。

11.寄存器复用

还是为了那该死的面积。举个例子,假设一个系统是半双工的,也就是说同一时间只能读或者只能写。那么读跟写是可以共用一部分寄存器的。

12.寄存器访问接口

比较常见的寄存器接口有三个:

1.APB总线

2.AHB总线

3.用户自定义的总线

具体的设计实例,去知识星球看I2C控制器的代码吧。

13.寄存器文档和代码自动生成

手敲寄存器代码,MAS文档和代码分开维护都是蛋疼的事情。所以很多公司都只会维护一张excel表格,并在excel表格的寄存上生成MAS和代码,甚至是C语言头文件和寄存器RALF文件。这个具体的脚本还在开发中,后面会更新到知识星球。

14.寄存器的setup和hold time

请看我之前写的这篇文章《从寄存器结构上理解setup和hold time》

目前只想到这些了,洗洗睡吧

审核编辑:汤梓红

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

    关注

    30

    文章

    5028

    浏览量

    117712
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10438

    浏览量

    206528

原文标题:我能想到的关于寄存器的一切

文章出处:【微信号:Rocker-IC,微信公众号:路科验证】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    解析CPU中的寄存器

    8位寄存器在16位寄存器中,而16位寄存器在32位寄存器中。
    发表于 09-19 10:10 2900次阅读

    RISC-V工作模式及寄存器基本知识

    RISC-V Linux为例,Linux应用程序处于U模式,Linux内核/uboot处于S模式,M模式则是OpenSBI。M模式拥有最高访问权限,Linux内核如果要访问CSR寄存器,则必须由S模式切换
    发表于 04-12 14:06

    寄存器点亮led灯

    本篇文章介绍了STM32的基本知识,以及寄存器编程,映射等有关知识,最后实例为用寄存器点亮led灯
    发表于 08-24 06:57

    串口通讯基本知识简介

    基本知识串口通讯 (Serial Communication)串口中断其实也是依靠判断寄存器的状态进行中断服务的通信的速率Bitrate—比特率:每秒钟传输的二进制位数,单位为比特每秒(bit/s
    发表于 12-08 08:30

    数字通信基本知识组成

    RxMachine波特率的计算UART相关寄存器1寄存器地址分析2控制寄存器3状态寄存器4波特率寄存器5数据
    发表于 12-08 07:50

    寄存器与移位寄存器

    寄存器与移位寄存器 寄存器是用来寄存数码的逻辑部件,所以必须具备接收和寄存数码的功能。任何一种触发器都可以构成
    发表于 03-12 15:19 59次下载

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定义  寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用
    发表于 03-08 14:26 2.1w次阅读

    数据寄存器,数据寄存器是什么意思

    数据寄存器,数据寄存器是什么意思 数据寄存器数据寄存器包括累加器AX、基址寄存器BX、计数寄存器
    发表于 03-08 14:38 1.2w次阅读

    32位寄存器,32位寄存器是什么意思

    32位寄存器,32位寄存器是什么意思  从X8086开始学了一年,第一个ASM的程序就是变32换16进制的程序,不过现在叫我从新开始写ASM程
    发表于 03-08 17:26 1.7w次阅读

    寄存器与移位寄存器

    寄存器与移位寄存器:介绍寄存器原理和移位寄存器的原理及实现。
    发表于 05-20 11:47 0次下载

    ARM处理器中的寄存器基本知识详解

    ARM处理器在每一种处理器模式下均有一组相应的寄存器与之对应。即在任意一种处理器模式下,可访问的寄存器包括15个通用寄存器(R0~R14)、一至二个状态寄存器和程序计数器。在所有的
    的头像 发表于 12-11 11:48 1.6w次阅读
    ARM处理器中的<b class='flag-5'>寄存器</b><b class='flag-5'>基本知识</b>详解

    工业机器人FANUC数据位置寄存器和位置寄存器的运用小知识分享

    工业机器人FANUC数据位置寄存器和位置寄存器的运用 一、寄存器指令 Registers① 寄存器指令R[i] i=1~200② 位置寄存器
    的头像 发表于 06-22 10:08 3w次阅读
    工业机器人FANUC数据位置<b class='flag-5'>寄存器</b>和位置<b class='flag-5'>寄存器</b>的运用小<b class='flag-5'>知识</b>分享

    深度学习_硬件知识_上拉寄存器与下拉寄存器

    上拉寄存器上拉寄存器是控制对应端口上拉使能的。当对应位为0时,设置对应引脚上拉使能,对应位为1时,禁止对应引脚上拉使能。如果上拉寄存器使能,无论引脚功能寄存器如何设置(输入、输出、数据
    发表于 01-14 14:31 10次下载
    深度学习_硬件<b class='flag-5'>知识</b>_上拉<b class='flag-5'>寄存器</b>与下拉<b class='flag-5'>寄存器</b>

    RTC时钟源和RTC寄存器基本知识

    RTC控制寄存器 (RTC_CRH, RTC_CRL)
    的头像 发表于 06-10 08:53 6517次阅读
    RTC时钟源和RTC<b class='flag-5'>寄存器</b>的<b class='flag-5'>基本知识</b>

    74HC595的8位移位寄存器基本知识

    电子发烧友网站提供《74HC595的8位移位寄存器基本知识.zip》资料免费下载
    发表于 10-19 14:17 1次下载
    74HC595的8位移位<b class='flag-5'>寄存器</b>的<b class='flag-5'>基本知识</b>