找回密码
 注册
关于网站域名变更的通知
查看: 243|回复: 1
打印 上一主题 下一主题

FPGA设计异步复位同步释放有讲究

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:05
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2020-1-6 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    FPGA设计异步复位同步释放有讲究
    : ]) |9 W) O$ h: C# ^
    , I/ ^+ ~7 R6 z9 F; D. M9 r3 F5 ]
    异步复位同步释放
    首先要说一下同步复位与异步复位的区别。
    / s% b( I2 ~. `- L3 L9 X
    ( n6 g4 M. i, o7 O" D% [3 E' F; m! Z
    同步复位是指复位信号在时钟的上升沿或者下降沿才能起作用,而异步复位则是即时生效,与时钟无关。异步复位的好处是速度快。
    + g& Q/ Z/ X' y) W& U" c! U" d
    再来谈一下为什么 FPGA 设计中要用异步复位同步释放。

    * K2 ~+ K. Z. n8 ~6 {
    复位信号的释放是有讲究的:
    我们知道,DFF 的 D 端和 clk 端之间时序关系是有约束的,这种约束我们通过 setup time 和 hold time 来 check。即 D 端的 data 跳变的时刻要与 clk 端的时钟上升沿(或者下降沿)跳变要错开,如果这两个跳变撞到一起,我们无法保证 DFF 能够 sample 到正确的 data,这时候不满足 setup/hold time 要求,就会发生亚稳态,我们 sample 到的 data 可能是不稳定的中间态的值,并不是我们原本想要的 data。
    6 n& H! X# ^* C+ j( j9 a8 O+ d
    4 H- x$ [7 S' L% b# R1 D与此类似,异步复位端与 clk 端之间也存在着类似的时序约束关系,为了准确稳定地 sample 到异步复位端的 reset 信号,我们要求 reset 信号在 clk 上升沿(或者下降沿)跳变的前后一段时间内保持稳定,不要跳变。clk 跳变沿之前必须保持稳定的最短时间叫做 recovery time,clk 跳变沿之后需要保持稳定的最短时间叫做 removal time。如果在此时间窗口内 reset 信号发生跳变,不确定 reset 到底有没有释放成功(类似 setup+hold 时间窗口内,data 跳变,发生亚稳态,sample 到的值是不稳定的中间态值)。在 IC 设计过程中我们是会 check recovery 和 removal time 的,如果不满足,我们会通过布局布线的调整(后端的调整)让电路满足这个条件(实质就是让 reset 跳变沿和 clk 跳变沿错开);但是对于 FPGA 设计而言,我们一般不采用异步释放的方法,因为 FPGA 的布局布线可以调整的空间不大,相对于 IC 设计,FPGA 后端的布局布线基本上是 tool 自己搞定,所以我们很难调整布局布线以满足这个条件,所以我们一般就会直接用异步复位同步释放的方法来让 reset 跳变沿和 clk 跳变沿错开。
    4 o9 Q. J, |# d
    ) G! w' B( j2 W3 E( n3 w% H最后再说一下同步数字电路的 setup/hold timing check 的实质。
    $ X9 j* L% p8 H; L
    , T% E( t2 ?$ k) }# r4 C# _) p3 `
    同步数字电路的基本单元就是两级 DFF,中间是一堆组合逻辑,data 就是在 clk 一拍一拍的控制下,逐渐向后面传递,当然,在传递的过程中,通过组合逻辑实现数据的处理与转换;但是物理世界里面,组合逻辑一定是有毛刺的,比如说 data 通过一系列的处理之后准备通过 DFF 传递到下一个单元的时候,你怎么能保证第二级 DFF 采到的值是处理完毕稳定可靠的 data,而不是还处于中间态的 data?!(举个例子,假设我们这里的 data 是一个 8bit 的 bus 信号,处理之前是 1111_0000,通过组合逻辑处理完之后我们期望变成 1111_1111;我们知道后面 4 个 bit 由 0 变 1 是需要时间的,由于布局布线的缘故,这 4bit 不可能在同一个时刻齐刷刷的同时由 0 变 1,肯定是有的 bit 先变 1,有的 bit 后变 1;也就是在由 1111_0000 变成 1111_1111 的过程中,可能会存在 1111_1000/1111_1100/1111_1101/... 等等这样的中间态数据,我们不能在 data 还处于中间态的时候就去 sample 它,否则得到的不是我们预期的值,会引起整个芯片的逻辑错误)。
    ' k8 d5 ^. e) h  ]1 P
    我们实际上是通过 setup/hold time 来保证的,即:如果电路中所有 DFF 的 setup/hold time 都能够满足,表示 data 到达 D 端的时间比 clk 跳变沿时刻超过了 setup 时间(反之,如果 data 在 setup+hold 时间窗口内还在变化,一定会有 setup/hold timing vio),这样,我们通过 check 所有 DFF 的 setup/hold timing 来间接地保证所有 DFF 采到的值都是经过组合逻辑处理并且处理完毕之后稳定可靠的值。(更确切的说,通过 hold timing check 来保证 sample 到的值是经过组合逻辑处理之后的值而不是上一笔的 data,通过 setup time 来保证 sample 到的是经过组合逻辑处理完毕之后并且稳定下来的值)

    ( L6 t& {! _" h5 w. K

    该用户从未签到

    2#
    发表于 2020-1-6 16:09 | 只看该作者
    学习了,受教了
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-21 11:03 , Processed in 0.109375 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表