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

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

3天内不再提示

寄存器的作用以及复位

jf_78858299 来源:IC小迷弟 作者:Martin 2023-01-30 17:17 次阅读

1. 寄存器的作用

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

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

2.基地址/偏移地址

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

图片

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

图片

3. 寄存器的复位

  • ** 需不需要复位**

图片

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

图片

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

  • ** 同步复位or异步复位**

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

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

  • ** 复位源**

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

  • ** 复位原因记录寄存器**

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

图片

4.寄存器的时钟域

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

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

5.访问权限

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

图片

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

图片

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寄存器),如下图。万一固件哪天需要使用寄存器来做标记,直接使用这些保留寄存器即可。

图片

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文件。这个具体的脚本还在开发中,后面会更新到知识星球

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

    关注

    30

    文章

    5037

    浏览量

    117764
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10451

    浏览量

    206582
  • 时序逻辑
    +关注

    关注

    0

    文章

    37

    浏览量

    9100
收藏 人收藏

    评论

    相关推荐

    C51中断、定时、串口常用特殊寄存器使用以及初始化

    C51中断、定时、串口常用特殊寄存器使用以及初始化1.中断系统系统结构如下:中断初始化:void main(){IE = 0x81; //假设只用外部中断0,这里就可以让IE为0x81;如果全开
    发表于 12-01 07:22

    什么样的寄存器不需要复位呢?哪些寄存器是CPU能够访问的

    1、寄存器作用1)时序逻辑存储数据。例如,一个计数,每个周期要加1,那它就要使用寄存器实现。纯组合逻辑是实现不了的。2)CPU和硬件协调工作,提高设计的灵活度。例如,在休眠时,我们
    发表于 07-08 17:43

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

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

    寄存器作用有哪些?

    寄存器作用有哪些? 寄存器用途  1.可将寄存器内的数据执行算术及逻辑运算;  2.存于寄存器内的地址可用来指向
    发表于 03-08 14:35 1.5w次阅读

    51单片机复位电路及复位寄存器的状态

    这是一个有关于51单片机复位电路的介绍以及复位寄存器状态的讲解,有助于我们更好的了解复位电路。
    发表于 05-09 14:16 2次下载

    51寄存器的所有寄存器名称,(包括寄存器每一位的作用及用法)资源详解

    51寄存器的所有寄存器名称,(包括寄存器每一位的作用及用法)资源详解
    发表于 10-16 13:04 14次下载
    51<b class='flag-5'>寄存器</b>的所有<b class='flag-5'>寄存器</b>名称,(包括<b class='flag-5'>寄存器</b>每一位的<b class='flag-5'>作用</b>及用法)资源详解

    移位寄存器具有什么特点及作用

    本文以移位寄存器为中心,主要介绍了移位寄存器原理、移位寄存器特点、移位寄存器分类、移位寄存器作用以及
    发表于 12-22 14:44 8.2w次阅读
    移位<b class='flag-5'>寄存器</b>具有什么特点及<b class='flag-5'>作用</b>?

    移位寄存器怎么用_如何使用移位寄存器_移位寄存器的用途

    移位寄存器是一个具有移位功能的寄存器,是指寄存器中所存的代码能够在移位脉冲的作用下依次左移或右移。本文主要介绍了移位寄存器的用途
    发表于 12-22 15:49 1.9w次阅读

    STM32复位来源(寄存器版)

    一篇很简单,有必要了解的文章 - STM32复位来源(寄存器版)
    的头像 发表于 03-14 14:13 1w次阅读
    STM32<b class='flag-5'>复位</b>来源(<b class='flag-5'>寄存器</b>版)

    4bit的移位寄存器复位与不复位的实现

    实现一个4bit的移位寄存器如下,不带复位 module shift_reg( input clk, input rst, input din, output dout ); reg
    的头像 发表于 12-30 12:04 3374次阅读

    IO口配置常用的8个寄存器 1.6

    有 9 组 IO,分别用大写字母表示,即 x=A/B/C/D/E/F/G/H/I,端口X配置位0~15。OTYPER 寄存器,该寄存器仅用于输出模式,在输入模式(MODER[1:0]=00/11 时)下不起作用。该
    发表于 11-29 13:51 10次下载
    IO口配置常用的8个<b class='flag-5'>寄存器</b> 1.6

    GPIO寄存器

    ,一般高16位保留BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,BSRRL配置一组IO口的16个IO口的状态(1),BSRRH配置复位状态(0)。每组GPIO端口的寄存器包括:4个32位配置
    发表于 12-08 17:06 5次下载
    GPIO<b class='flag-5'>寄存器</b>

    浅析寄存器作用及应用

    寄存器是计算机内部最快的存储器件之一,其在计算机中具有重要的作用。本文将从寄存器作用、应用和分类等方面对寄存器进行详细介绍。
    的头像 发表于 04-09 18:44 7169次阅读

    CPSR寄存器和APSR寄存器的组成

    程序状态寄存器作用就是反映处理器的状态信息。在程序运行期间我们可以通过查看程序状态寄存器的状态位来进行程序的分支跳转处理,或者我们可以设置程序状态寄存器的模式位来改变处理器的运行模式
    的头像 发表于 10-20 11:38 1817次阅读
    CPSR<b class='flag-5'>寄存器</b>和APSR<b class='flag-5'>寄存器</b>的组成

    arm三个寄存器在gdb调试时的作用

    arm三个寄存器在gdb调试时作用  ARM是一种广泛使用的微处理器架构,它广泛应用于移动设备、嵌入式系统和其他高性能计算设备。当我们在使用gdb(GNU调试器)调试ARM程序时,了解和理解三个重要
    的头像 发表于 01-31 10:44 218次阅读