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

简谈同步复位和异步复位

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
简谈同步复位和异步复位
0 O+ Y1 o+ L# R

( }  P6 m( |1 \" p       谈到同步复位和异步复位,那咱们就不得不来聊一聊复位这个词了。在数字逻辑电路设计中,电路通过复位来启动,复位犹如数字电路的“起搏器”。那在设计中,主要会出现以下三种类型的,一是无复位:天生就强壮着,上电就启动;二是异步复位:好心人路过,随便踢了一脚,起搏了,这完全没有心理准备,随时都有可能复活啊;三是同步复位:专业救援队,手按住胸口,不起博按住不放啊。直到听到“砰砰”声才离开,非常关键,必须要按住一会会。, d) x5 T1 B8 Z0 j3 l; k, r
       那下面咱们就来详细聊聊这三种类型。
3 U7 B8 h% q! Z% j, B       一、无复位% ^& W) i0 }% H$ \0 H5 d
       没见过这样写代码的,竟然没有复位,老师都说数字电路离不开复位的,没有复位,寄存器怎么赋初值啊?没有确定的初值,这电路怎么工作呢?: x$ o* D- e' w9 c
        其实,不用担心,FPGA上电之后,寄存器初始值默认为“0”,当然,也可以人为的赋初值。下面为无复位的代码举例:9 Z" V+ D0 ^; k% V
        
% U" b5 {+ q' P4 z- f5 |; j; Y3 j0 a
' `8 @$ G( h. `- J  T) G2 G7 g4 u        reg [7:0] a;
( G( T3 j6 B' J        
4 K" a4 t( ]# \4 i1 ~        always @(posedge clk) 4 W4 E0 n! _: A- P0 a
                begin
( \4 A/ k( D% G: [                        a <= b;
2 ]0 ~, ]4 r, Y/ K+ R5 z                end; [0 C' E* B2 V4 o
7 U9 r$ H% ^6 H4 V/ X3 C5 L
       如果没有复位信号,省了很多资源,编译和布线时间也缩短不少,如果规模很大,对提高设计整体性能也是有帮助的。但是在数字电路设计中,我们很少不用复位电路。到是我们经常利用FPGA这个特性,自己产生内部复位电路。9 L, `, J  C0 z* f' I+ }6 u9 n) o- F
4 p/ p7 l& q; ?: b( l9 y
       二、异步复位9 T% S" G  O* W) K# a0 x- s
       异步复位电路描述:在always语句中添加复位信号在敏感量列表中,即可实现异步复位。下面为异步复位的代码举例以及电路图举例:
$ N; Y0 ^2 |4 @# R& v: \             * x- L( @: I6 t* Z
$ l4 z( c: Q5 S1 W
        reg [7:0] a;
' d- \* c9 Y' V" H( W5 c        5 O6 r. s5 X# n6 \& r+ t6 P2 U
        always @(posedge clk, posedge rst_n)
) m  b# @. v& A/ }# R- k                begin1 E& P. O+ \+ O: q
                        if(rst_n)6 c/ A: P2 P/ Q
                                begin8 p+ s$ |  O4 Q/ [$ D& @3 O
                                        a <= 8’h0;
/ M( p* i3 l( ]                                end
7 f% g: `$ B- }! N1 r8 d# j                        else
+ c% [8 R6 y& Q                                begin! {4 `$ R) ^* K* E5 a
                                        a <= b;
" l6 k& V9 R, w7 L- G% I9 A/ j                                end
5 ?, ~1 g& X: b5 b4 @7 y                end7 o! H; W( s* R  C
% `+ G! y1 N0 r1 J2 Y. h
         6 `9 b! M$ `- Z5 P; M! a7 l

/ |3 ?+ z% H9 X9 W        异步复位的缺点:
4 T& |) @; h2 o, M2 f. O/ P1 J        异步复位对复位信号要求很严格的,不然随便一个毛刺就会把电路给复位掉的。
3 Z$ n8 {4 p8 F        另外,异步复位信号依赖于FPGA内部的传导延时,因此,在微小的电压或温度差异下,设计都有可能输出错误,设计的可移植性也很差。上面不是说了嘛,这随便一脚提过来,有时候能感觉到,有时候感觉不到啊。冬天穿个大棉袄,就得使个大劲才能提醒。3 b2 G9 t/ w+ k: J. C
        正因为对不同寄存器延迟是不同的,所以容易引发间断性设计问题。怎么理解呢?
: V; m$ c* h0 O$ @! B& I        如图所示,2 bit的移位寄存器组成一个环,复位后,左边寄存器清零,右边寄存器置位,而且都在同一上升沿触发,所以,如果左边寄存器上升沿来的时候,复位信号已经释放掉了,但是右边寄存器还处于复位状态,这个时候数据就错误。
; S% C' A0 D' ^4 g: x) I
! ~( W  ]: y% c        异步复位的优点:& Y  G# h$ N  B  [
        异步复位不依赖于时钟。所以如果时钟是外部输入的,而且时钟有可能丢失,例如处于省电模式时,只能使用异步复位。6 x3 e9 w; ?- N" c3 R8 b# D
        另外一个优势是设计更快的物理实现。相对于同步复位,异步复位有更宽松的时序约束。从而布局布线工具使用更少的时间便可达到约束条件。
* {1 m4 R% m, [& \! l
9 b$ t" L1 R. a9 a        三、同步复位
" R  N1 H: a$ Q$ _4 c' t        同步复位就是非常专业,不留一点马虎,和他的名字一样,只在时钟的有效沿发生,所以一个有效的同步信号,至少要维持一个时钟周期(把你叫不醒,是不会停的)。由于仅仅在时钟的有效沿有效,所以可以滤除复位信号上的毛刺,电路可靠性好很多。下面为同步复位的代码举例:
/ E7 w+ e* l4 X6 `; u/ G$ D1 d% s         $ l# N# s4 P. Y; \+ Z2 @

8 F. r* ^+ M# J/ j: `        reg [7:0] a;, |" v3 r* ]  R- N
        
% ?' q0 l, R  r  ?* x2 l" l/ w          always @(posedge clk) 6 B/ S& U  c1 h4 \2 M2 z: K" H
                begin/ ]: ~& {1 V$ J  `
                        if(rst_n)! ^/ Q6 D0 s( X2 M, x  F
                                begin
) _. r2 p/ i( T0 v( e                                        a <= 8’h0;
* a# E7 O* G- K/ k                                end
: h# C9 L! X! N                        else: P& v7 x+ l3 y/ j5 a8 T
                                begin
7 C3 q* M& q" `5 o6 C                                        a <= b;
& [; p' V8 a% E9 B  O1 j                                end$ b; l. b6 x' ?. l* G3 v) ^
        end5 ^  `: B) D3 M- k- C
       . l& G4 ]/ l4 G/ S
        
4 E  H. o( D, \. m# B, r        所以,总结一下。其优点是“弥补了异步复位的所有缺点”,其缺点是“没有异步复位的优点“”。这个总结够简单吧。: w2 g5 W1 T; n% s
* {0 D- X0 x4 i. J! z- X& A; W# [
        总结1 g* Y  V' m4 b' F# A

" a7 r. d5 k- h$ K& Z$ A        我们熟悉了3种复位方式,了解了他们的脾气,那就总结一下,在我们平时设计中如何使用他们。. p/ F. l1 i# H+ k8 n5 _: [; V) p" g

  N! @1 l9 T! [. n$ M, h       尽量用同步复位,如果你的规模不是特别大,虽然占有布线资源多一点,但是对系统可靠性还是有帮助的。
) C7 \$ a1 ]. a/ d7 b; `! \1 d6 z; h/ D3 ?% V: [
       规模很大的时候,可以考虑混和复位方式,在什么场合呢?比如说设计中有多个IP核和功能模块,要求有不同的复位方式,这个时候就要求混和复位方式,另外,还有电路延迟,大型电路中两个模块之间信号延迟可能超过10ns,如果时钟周期为3ns,需要3个时钟周期才能通过,所以,大型设计中完全同步是非常不容易的。如图所示为一个复杂的混和复位树。各种复位都用上了。
4 i4 Q+ E4 M* d; q$ u0 L        
) ?( F# q1 X9 J, d* a
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-29 22:29 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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