打印

同步复位和异步复位的讨论

[复制链接]
5123|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dan_xb|  楼主 | 2011-3-28 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 同步复位和异步复位的写法:
//====== 同步复位 =======
always @(posedge clk)
  if(rst)
    ..........
  else if(....)

//====== 异步复位 =======
always @(posedge clk or posedge rst)
  if(rst)
    .........
  else if(......)

2. 应该选哪个?
  不清楚是什么原因,绝大部分初学者写的是异步复位。
  关于这个问题,《深入浅出玩转FPGA》这本书有比较详细的描述,说得很对。
  我不清楚Altera最新的FPGA怎么样,不过在以前的时候,Altera的FPGA内部是没有同步复位的,只有异步复位。所以,Altera强烈推荐异步复位也不足为奇了。我想Altera公司的软件和硬件应该做了一些特殊的处理,以防止我们下面讨论的亚稳态问题。
  Xilinx的器件的FF,既可以异步复位,也可以同步复位,不过Xilinx公司推荐同步复位。
  这里强烈推荐同步复位。

3. 为什么?
  在异步复位的情况下,复位信号与时钟信号的相位不能确定,会造成亚稳态。
  说简单点,寄存器是在时钟的上升沿变化的,这就要求输入寄存器的信号在时钟沿之后必须稳定一段时间,否则时钟沿也在变,输入数据也在变,就不清楚到底输出会变成什么了。
  复位信号也会造成一连串信号的变化,因为复位信号的不确定,所以会造成这个问题。
  Altera的FPGA应该在内部做了点什么以防止这个问题。据说,还是会偶尔发生这样的事情。
  发生这样的问题的时候,情况是非常古怪的,你再Reset一次就好了。

4. 推荐的做法
  推荐的做法,并不是直接使用Reset,而是异步复位-同步释放。
  这种电路比较复杂,实际情况中有简化。
  如果你的系统时钟是连续的话,你可以使用将Reset信号打两拍,然后上BUFG的方式。
  你如果这样做了,Xilinx的工具会去分析Reset信号的时序,从而防止亚稳态的产生;你如果使用异步复位,工具是没法分析的!!
  华为/中兴这样的公司,因为设计很大,加上写代码的人风格不统一,所以他们实际是在顶层里面专门建立一个复位模块,然后把异步复位时序化,这个就比较复杂了。但是总的来说,是同步的,所以不管你的子模块是写的异步复位还是同步复位,全部都变成同步的。

相关帖子

沙发
dan_xb|  楼主 | 2011-3-28 14:58 | 只看该作者
嘿嘿,自己帖子自己顶

使用特权

评论回复
板凳
小云001| | 2011-3-28 20:07 | 只看该作者
;P

使用特权

评论回复
地板
ty新气象| | 2011-3-28 22:52 | 只看该作者
我帮你顶。

使用特权

评论回复
5
atua| | 2011-3-29 14:34 | 只看该作者
如果你的系统时钟是连续的话,你可以使用将Reset信号打两拍,然后上BUFG的方式。
  你如果这样做了,Xilinx的工具会去分析Reset信号的时序,从而防止亚稳态的产生;你如果使用异步复位,工具是没法分析的!!

这个分析也是指同步以后的时序分析吧?从管脚进来的怎么分析呢?还是按异步信号来分析吗?

使用特权

评论回复
6
SuperX-man| | 2011-3-29 15:13 | 只看该作者
"这个分析也是指同步以后的时序分析吧?从管脚进来的怎么分析呢?还是按异步信号来分析吗?"

我觉得是的,从外部来的信号经过处理后,最后全部归入全局时钟网络.

使用特权

评论回复
7
byeyear| | 2011-3-29 16:50 | 只看该作者
ALTERA早在很久以前就强推同步复位了
我手上一份2005年的altera AN就说尽量不要async reset
推荐用altera的伙计们到altera官网下PDF版的quartus handbook
关于如何防止亚稳态有非常好的论述
尤其是multi clock情况下如何设计

使用特权

评论回复
8
明空| | 2011-3-29 17:39 | 只看该作者
其实xilinx直接推荐不使用复位,复位会占用很多的布线资源,能不用的就不用

使用特权

评论回复
9
atua| | 2011-3-30 09:03 | 只看该作者
ASIC设计中对reset信号要分析removal之类的时序,altera似乎也是这样,xilinx如何处理的呢?用offset in来约束吧?然后怎么分析呢?
期待高手指点一二:)

使用特权

评论回复
10
dan_xb|  楼主 | 2011-3-30 09:50 | 只看该作者
7# byeyear
是这样的吗?呵呵
我看过Altera写的一些应用手册,写的很好啊。

使用特权

评论回复
11
dan_xb|  楼主 | 2011-3-30 09:51 | 只看该作者
9# atua
这个我不清楚,Removal时序主要是分析哪方面的?

使用特权

评论回复
12
dan_xb|  楼主 | 2011-3-30 09:54 | 只看该作者
本帖最后由 dan_xb 于 2011-3-30 09:55 编辑

5# atua
管脚进来,因为无论如何都有亚稳态的,所以才打两拍消除亚稳态。
还有另外一种方法,请看一下Xilinx的WP272,Figure 7,我贴不上图了。。。。

使用特权

评论回复
13
atua| | 2011-3-30 14:42 | 只看该作者
In short words, recovery and removal timing are setup/hold constrains for set/reset pins.

其实我的问题是当异步reset信号被打两拍时,这部分同步化电路的时序在ISE中是如何约束,如何分析的?:)

使用特权

评论回复
14
七叶一枝花| | 2011-3-30 15:48 | 只看该作者
;P

使用特权

评论回复
15
dan_xb|  楼主 | 2011-3-30 17:32 | 只看该作者
In short words, recovery and removal timing are setup/hold constrains for set/reset pins.

其实我的问题是当异步reset信号被打两拍时,这部分同步化电路的时序在ISE中是如何约束,如何分析的?:) ...
atua 发表于 2011-3-30 14:42

我认为是作为普通的时序输入信号进行分析的,其实综合器可以识别你输入打两拍是什么意思。

使用特权

评论回复
16
atua| | 2011-3-31 09:18 | 只看该作者
综合器识别出输入打两拍再接BUFG后,会根据输入约束安排合理的BUFG,是这个意思吗?
这里的约束就用Offset来约束吗?
谢谢!

使用特权

评论回复
17
dan_xb|  楼主 | 2011-3-31 09:57 | 只看该作者
综合器识别出输入打两拍再接BUFG后,会根据输入约束安排合理的BUFG,是这个意思吗?
这里的约束就用Offset来约束吗?
谢谢!
atua 发表于 2011-3-31 09:18

软件会自己选择BUFG的。
OFFSET约束是对于时序信号的,这个根本不是时序信号,不用了。

使用特权

评论回复
18
atua| | 2011-3-31 13:54 | 只看该作者
软件会自己选择BUFG的。
OFFSET约束是对于时序信号的,这个根本不是时序信号,不用了。
dan_xb 发表于 2011-3-31 09:57

那该如何约束呢?

使用特权

评论回复
19
dan_xb|  楼主 | 2011-4-1 13:56 | 只看该作者
回18楼,就是不用约束。。。。

使用特权

评论回复
20
hwq362202| | 2011-4-1 16:34 | 只看该作者
:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

455

帖子

2

粉丝