|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
简谈同步复位和异步复位 - L) M0 L8 T& x, ]
/ w* e. }" C: ~5 ~1 B
谈到同步复位和异步复位,那咱们就不得不来聊一聊复位这个词了。在数字逻辑电路设计中,电路通过复位来启动,复位犹如数字电路的“起搏器”。那在设计中,主要会出现以下三种类型的,一是无复位:天生就强壮着,上电就启动;二是异步复位:好心人路过,随便踢了一脚,起搏了,这完全没有心理准备,随时都有可能复活啊;三是同步复位:专业救援队,手按住胸口,不起博按住不放啊。直到听到“砰砰”声才离开,非常关键,必须要按住一会会。
5 N3 f7 V6 c& N( }8 E9 Q 那下面咱们就来详细聊聊这三种类型。
- s( L. G; `1 y5 W 一、无复位
5 [! B2 ^( W0 l& u 没见过这样写代码的,竟然没有复位,老师都说数字电路离不开复位的,没有复位,寄存器怎么赋初值啊?没有确定的初值,这电路怎么工作呢?
! ?) r2 x* O+ q' `! X- K4 u* D 其实,不用担心,FPGA上电之后,寄存器初始值默认为“0”,当然,也可以人为的赋初值。下面为无复位的代码举例:7 N$ @$ h: I0 ^1 W+ n5 L4 n7 d
, l- v# f3 y! S9 B# j3 z) K/ p% ?, D
reg [7:0] a;
+ p: e: ]3 e) n8 ~' H7 e4 b 4 y P! o' {# N
always @(posedge clk) 1 |0 W( W/ a( Q/ r- ?2 A. h) G: l; ?
begin
6 R( e# q w! k, l& H2 A6 A! `; y' z a <= b;
9 M3 Q; r @2 v: e0 p( _ end
+ I3 W' p4 D$ ^0 H9 }# P G
0 J C) Y% _9 u! `7 w, p2 m 如果没有复位信号,省了很多资源,编译和布线时间也缩短不少,如果规模很大,对提高设计整体性能也是有帮助的。但是在数字电路设计中,我们很少不用复位电路。到是我们经常利用FPGA这个特性,自己产生内部复位电路。
$ }7 k U' ~; P! Z2 k* a6 {& }4 c( {! M5 F* O
二、异步复位* ^ m8 C0 P1 y
异步复位电路描述:在always语句中添加复位信号在敏感量列表中,即可实现异步复位。下面为异步复位的代码举例以及电路图举例:
. |! p: j( e& J4 D4 |5 b0 H6 O
# l# F- r; d2 _0 C+ ^3 h
& G* {/ w/ u+ G4 o. K reg [7:0] a;( l" N: R2 ?( o; E1 [
) r' F/ U1 a! _! V. X5 `/ m0 \' } always @(posedge clk, posedge rst_n) # o- t5 f4 z: k2 G; D2 Q1 B
begin( @+ {; W. m2 G" }
if(rst_n)
. O: A6 O5 ^6 y7 i begin B5 ~! v$ ^' B; o8 K4 j
a <= 8’h0;+ m* [- U7 W7 q3 n6 `0 Q
end
) o4 X- f9 k) g1 N; A3 j2 T else* r/ l2 }; G4 V9 ^; |$ K+ [
begin5 A2 K0 C: p4 N: r
a <= b;
9 h& b" Y1 D; n; z end
8 | `5 S' q2 E end! W7 c" x9 Y7 m& k' ]
' e7 Z+ @2 S+ H$ S8 b* Z
! N# I$ }: K+ \( I! h! @
5 i( [% [8 A# I" C" S6 U
异步复位的缺点:9 }) G" @' v% R
异步复位对复位信号要求很严格的,不然随便一个毛刺就会把电路给复位掉的。2 ]* I' q: o( G2 s! L( [ |
另外,异步复位信号依赖于FPGA内部的传导延时,因此,在微小的电压或温度差异下,设计都有可能输出错误,设计的可移植性也很差。上面不是说了嘛,这随便一脚提过来,有时候能感觉到,有时候感觉不到啊。冬天穿个大棉袄,就得使个大劲才能提醒。
, h0 F. M# r" I6 |4 }, L2 c) o8 b 正因为对不同寄存器延迟是不同的,所以容易引发间断性设计问题。怎么理解呢?. z+ D) e% l' l1 [2 e
如图所示,2 bit的移位寄存器组成一个环,复位后,左边寄存器清零,右边寄存器置位,而且都在同一上升沿触发,所以,如果左边寄存器上升沿来的时候,复位信号已经释放掉了,但是右边寄存器还处于复位状态,这个时候数据就错误。
$ w- Q( _8 f3 B! j' b/ |1 ], S7 n' u2 L
异步复位的优点:
; L: k6 a* f: | W( O0 u* k 异步复位不依赖于时钟。所以如果时钟是外部输入的,而且时钟有可能丢失,例如处于省电模式时,只能使用异步复位。0 z: o; G! S% h9 i9 [7 S3 U. W/ h
另外一个优势是设计更快的物理实现。相对于同步复位,异步复位有更宽松的时序约束。从而布局布线工具使用更少的时间便可达到约束条件。; t7 p; f8 `5 x. u9 X, ^1 u8 X
, l% _* M% V- k- W! \# Y( }; D: _ 三、同步复位- B' [2 C! d0 N( V0 b0 M, ^( w8 |
同步复位就是非常专业,不留一点马虎,和他的名字一样,只在时钟的有效沿发生,所以一个有效的同步信号,至少要维持一个时钟周期(把你叫不醒,是不会停的)。由于仅仅在时钟的有效沿有效,所以可以滤除复位信号上的毛刺,电路可靠性好很多。下面为同步复位的代码举例:
! O. W+ S2 [& Y 8 `) \, s1 S& C9 v
5 J) L, i/ N6 L" ~* S* n$ p
reg [7:0] a;
1 l* Q- \' m3 N9 z9 z$ ` 1 V" z: k' |' U2 j- U) n5 p5 ^
always @(posedge clk)
% x2 _. @& L- v begin7 @. d. E/ S* c6 ~+ S
if(rst_n)+ e, X& C. D5 {9 F: C
begin
) T2 {6 m/ Z6 [/ N" T a <= 8’h0;
; g5 {' c2 q9 \; N( w end# @( R: m/ M3 B5 N; M+ x
else3 D3 s/ o5 V9 c
begin
+ l4 d: B2 _0 B# G6 h/ N) z a <= b;
" C% Q8 ]" A- O( A0 Q: q0 Q end
1 S* t5 f3 K' p2 k# B4 c end: q, P5 h+ R0 q+ b& a V7 Z
2 g. [/ r0 ^8 r' L* u6 k
+ Q: F2 [& L, H
所以,总结一下。其优点是“弥补了异步复位的所有缺点”,其缺点是“没有异步复位的优点“”。这个总结够简单吧。
2 f9 ~$ w+ k3 T% B+ m
6 S' ?$ V/ Q8 s$ n# P) t! ? 总结
U! P! R: U5 H: v( n& H& Y; s1 Y7 h- ]. n) i% e1 F, w* n- k: W
我们熟悉了3种复位方式,了解了他们的脾气,那就总结一下,在我们平时设计中如何使用他们。
6 A9 o# o: i0 ^6 W W, P, [
2 v- C: U0 i* a( D3 d( R/ y 尽量用同步复位,如果你的规模不是特别大,虽然占有布线资源多一点,但是对系统可靠性还是有帮助的。' n: n0 F8 p; P
6 M' Q, I, s- o+ h5 t; h! P$ P. d: W 规模很大的时候,可以考虑混和复位方式,在什么场合呢?比如说设计中有多个IP核和功能模块,要求有不同的复位方式,这个时候就要求混和复位方式,另外,还有电路延迟,大型电路中两个模块之间信号延迟可能超过10ns,如果时钟周期为3ns,需要3个时钟周期才能通过,所以,大型设计中完全同步是非常不容易的。如图所示为一个复杂的混和复位树。各种复位都用上了。7 Y$ D# ?: P5 v, U
1 b" m( t5 |* D# X' B# C. s2 |) y+ x
|
|