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

简谈同步复位和异步复位

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
简谈同步复位和异步复位

2 ^/ h! A% O+ b" N9 K6 @6 ]0 Y
       谈到同步复位和异步复位,那咱们就不得不来聊一聊复位这个词了。在数字逻辑电路设计中,电路通过复位来启动,复位犹如数字电路的“起搏器”。那在设计中,主要会出现以下三种类型的,一是无复位:天生就强壮着,上电就启动;二是异步复位:好心人路过,随便踢了一脚,起搏了,这完全没有心理准备,随时都有可能复活啊;三是同步复位:专业救援队,手按住胸口,不起博按住不放啊。直到听到“砰砰”声才离开,非常关键,必须要按住一会会。
( z& J" ^. k6 W. ^1 a       那下面咱们就来详细聊聊这三种类型。
5 O: U# P* A' _1 ~& U3 e' L       一、无复位
2 n: s( u) h1 D' y/ s( n       没见过这样写代码的,竟然没有复位,老师都说数字电路离不开复位的,没有复位,寄存器怎么赋初值啊?没有确定的初值,这电路怎么工作呢?% J: J) K3 L# W/ M) Y+ a3 v
        其实,不用担心,FPGA上电之后,寄存器初始值默认为“0”,当然,也可以人为的赋初值。下面为无复位的代码举例:1 U/ e6 I0 A: e. @# v7 \1 }
         7 z) i+ U6 U2 w
2 ^8 W3 Z  _5 u, _8 I
        reg [7:0] a;# E4 F; W* D( _0 s, C
        9 V5 Y" ]: h7 N) \% {
        always @(posedge clk) " H1 x' d" _, r( i# a; k
                begin; q  U# e& f' o' U1 I: j
                        a <= b;
- A3 f4 O  b. K                end
3 j+ i6 W" p7 q, r, b1 G2 T4 {6 L: B+ F3 s
       如果没有复位信号,省了很多资源,编译和布线时间也缩短不少,如果规模很大,对提高设计整体性能也是有帮助的。但是在数字电路设计中,我们很少不用复位电路。到是我们经常利用FPGA这个特性,自己产生内部复位电路。
4 X7 K5 K3 o7 s% K. X8 ^
! M( x9 _' y0 c0 `  E+ n       二、异步复位; E8 ?7 Z! G0 w+ M6 h5 F1 q1 q
       异步复位电路描述:在always语句中添加复位信号在敏感量列表中,即可实现异步复位。下面为异步复位的代码举例以及电路图举例:8 Z0 |% e' _2 _5 W& u" C" R, J+ @
             ) S' u( D: N0 B, n

$ y7 x% _9 h/ e* C        reg [7:0] a;* ^" r# g6 C$ S" T* r
        
5 m5 x, ~* G8 G7 h* e        always @(posedge clk, posedge rst_n) . X( i5 O8 R8 M  P; o
                begin* L; r0 K4 ]' x+ Q) p/ s
                        if(rst_n)
# I( m# e, T8 V1 l( T- u+ ~" h; u                                begin
7 {# O/ ~% v2 k; |/ w# B3 @                                        a <= 8’h0;! y5 [' ]  }) `3 O7 I
                                end0 \9 C; F6 w) W3 i$ z6 R
                        else
" y9 C" ?3 o9 E6 B6 g$ a" U$ c                                begin8 h. i* T# z% f: v" U! p4 x
                                        a <= b;
, n* A1 a1 F0 U% F1 {  P                                end
. Z$ ~2 _2 r7 F                end# W6 b5 {) [+ @
( U& \" |& V' W# V: ]% e8 h/ v
         9 w) G: e: o" ~0 z8 t) p
$ r  U1 O- E4 i3 {! x
        异步复位的缺点:& [' S7 U/ o0 Y, K6 m
        异步复位对复位信号要求很严格的,不然随便一个毛刺就会把电路给复位掉的。
  _  C9 O: u/ ?( P        另外,异步复位信号依赖于FPGA内部的传导延时,因此,在微小的电压或温度差异下,设计都有可能输出错误,设计的可移植性也很差。上面不是说了嘛,这随便一脚提过来,有时候能感觉到,有时候感觉不到啊。冬天穿个大棉袄,就得使个大劲才能提醒。
9 G5 F; b- N3 H1 V8 M, `# o* D        正因为对不同寄存器延迟是不同的,所以容易引发间断性设计问题。怎么理解呢?
; Y; W0 J1 k% P0 g, H6 g  {8 j. l        如图所示,2 bit的移位寄存器组成一个环,复位后,左边寄存器清零,右边寄存器置位,而且都在同一上升沿触发,所以,如果左边寄存器上升沿来的时候,复位信号已经释放掉了,但是右边寄存器还处于复位状态,这个时候数据就错误。* m( a2 `( ^9 ]1 |8 g

3 F' g" \: h# Z* o6 k% D$ p        异步复位的优点:
" m+ ~4 t! E" C9 c8 s        异步复位不依赖于时钟。所以如果时钟是外部输入的,而且时钟有可能丢失,例如处于省电模式时,只能使用异步复位。" O0 Z$ [9 B3 c0 o7 b
        另外一个优势是设计更快的物理实现。相对于同步复位,异步复位有更宽松的时序约束。从而布局布线工具使用更少的时间便可达到约束条件。
5 {5 n/ p1 N9 N4 `- @4 Q1 R; z; B8 ]! P/ r8 p: m/ |& P# {
        三、同步复位
1 E; h6 q' }1 t5 s9 b  ^) z" F! n        同步复位就是非常专业,不留一点马虎,和他的名字一样,只在时钟的有效沿发生,所以一个有效的同步信号,至少要维持一个时钟周期(把你叫不醒,是不会停的)。由于仅仅在时钟的有效沿有效,所以可以滤除复位信号上的毛刺,电路可靠性好很多。下面为同步复位的代码举例:. J. u* c3 @( B. A8 t7 H
        
2 {" Y3 L  b) l/ X" ^
  B7 V& t, |" s# g        reg [7:0] a;
$ D2 }' z# B1 w7 W6 q/ [        1 l! e  _4 s- s
          always @(posedge clk) " _6 E6 D* p8 N9 a
                begin4 f, `% b: o* ^5 z2 \% M( n! o
                        if(rst_n)
4 ~- A4 G' w3 X5 r" Q0 V! q                                begin
0 d, s+ P4 f* ?5 D! Z                                        a <= 8’h0;
! S  Y& |: w' a                                end
1 o5 B& X2 ^2 d" }' C+ t                        else
3 j! e( g5 E5 U, z8 z. F" e7 K# Q                                begin
- y. h0 |+ B7 r                                        a <= b;: |2 g7 {8 L; J8 [2 {
                                end+ }* a0 g  \! A6 B9 j4 `% Z
        end5 `+ x- K$ [+ g. F5 R
       7 Q5 W. _  I* n2 O* a) B  [
        
9 d7 G. J8 K6 n  f  P- @& X        所以,总结一下。其优点是“弥补了异步复位的所有缺点”,其缺点是“没有异步复位的优点“”。这个总结够简单吧。3 D5 P. Z* m  f: N+ O  U
. z" @/ d! p, @5 T& D# I& i! P
        总结
; o; X  G  K' c8 R, g5 |: r& b# q& \
        我们熟悉了3种复位方式,了解了他们的脾气,那就总结一下,在我们平时设计中如何使用他们。
  A9 A& Z& Q8 z7 R6 N3 _* n
) M: d: K9 @8 i% t       尽量用同步复位,如果你的规模不是特别大,虽然占有布线资源多一点,但是对系统可靠性还是有帮助的。
: W4 R  }" m6 [% ~% w3 i6 B6 z! G
       规模很大的时候,可以考虑混和复位方式,在什么场合呢?比如说设计中有多个IP核和功能模块,要求有不同的复位方式,这个时候就要求混和复位方式,另外,还有电路延迟,大型电路中两个模块之间信号延迟可能超过10ns,如果时钟周期为3ns,需要3个时钟周期才能通过,所以,大型设计中完全同步是非常不容易的。如图所示为一个复杂的混和复位树。各种复位都用上了。; f3 o1 h( a, x0 u1 ~- L' @
         ' B/ M5 r+ c$ ~* f; U' |7 y' h
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 23:05 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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