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

转——verilog的同步复位与异步复位

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
转——verilog的同步复位与异步复位

8 D, `' _  x9 w
同步复位sync
异步复位async
* j, D* V0 y% ]1 j$ s- E$ G' H
特点
复位信号只有在时钟上升沿到来时才能有效。
无论时钟沿是否到来,只要复位信号有效,就进行复位。

2 C% ?$ s0 \6 F2 t7 L
Verilog描述
always@(posedge CLK)
always@(posedge CLK , negedge Rst_n)

$ d) `( a" z! Y" K6 `* |- u
优点
1)利于仿真器仿真。
) D( g9 |; U' b& w  x& f2)因为只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。  b5 s6 i3 ~$ F* p' X
3)可以使所设计的系统成为100%的同步时序电路,有利于时序分析。
1)设计相对简单。+ |5 z: _1 k# v; k" c' Q$ M
2)因为大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
# u/ S' V, r  T6 Y( ]- l3)异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
0 n6 Z9 O2 D+ O- p: r+ e
! |3 n' G$ J8 L# M: L9 Y- t/ t% n

% z; m5 ]8 X! e# B' Y. o- i
缺点
1) 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素。+ s9 m# ?5 j* h( n7 t
2) 由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
1)复位信号容易受到毛刺的影响。
+ |8 l( F2 X# S, a( h; k& w. A1 C2)在复位信号释放(release)的时候容易出现问题。具体就是说:若复位释放刚好在时钟有效沿附近时,很容易使寄存器输出出现亚稳态,从而导致亚稳态。

; F" ~& w6 Z- ?1 y  ~1 U0 T, H$ y! C

' l- f7 J& c: k9 g
! m7 C) X, J) s) B

6 Z; f  s* G) v1 p$ B2 E, f
! N  I1 x3 x. `+ Z) R2 w. S' l
总结
推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。
0 Y; k! t0 o- |2 _3 t
6 p9 \( I$ ?) t  x) e, }
8 W6 J# s1 u' c/ [
2:推荐的复位方式
所谓推荐的复位方式就是上文中所说的:异步复位,同步释放。这就结合了双方面的优点,很好的克服了异步复位的缺点(因为异步复位的问题主要出现在复位信号释放的时候,具体原因可见上文)。
其实做起来也并不难,我推荐一种我经常使用的方式吧:那就是在异步复位键后加上一个所谓的reset synchronizer,这样就可以使异步复位信号同步化,然后,再用经过处理的复位信号去作用系统,就可以保证比较稳定了。reset sychronizer的Verilog代码如下:
module Reset_Synchronizer
(output reg rst_n, input clk, asyncrst_n);
  reg RFf1;
always @ (posedge clk , negedge asyncrst_n) begin
    if (!asyncrst_n) {rst_n,rff1} <= 2'b0;
else {rst_n,rff1} <= {rff1,1'b1};
end
endmodule
大家可以看到,这就是一个dff,异步复位信号直接接在它的异步复位端口上(低电平有效),然后数据输入端rff1一直为高电平1。倘若异步复位信号有效的话,触发器就会复位,输出为低,从而复位后继系统。但是,又由于这属于时钟沿触发,当复位信号释放时,触发器的输出要延迟一个时钟周期才能恢复成1,因此使得复位信号的释放与时钟沿同步化。
此外,还有一种方法更为直接,就是直接在异步复位信号后加一个D触发器,然后用D触发器的输出作为后级系统的复位信号,也能达到相同的效果。这里就不多说了。
" n/ X' O7 @2 p1 ^* l3 S8 [( O
3:多时钟系统中复位的处理方法
这是一个很实际的问题,因为在较大型的系统中,一个时钟驱动信号显然不能满足要求,一定会根据系统的要求用多个同源时钟(当然也可以是非同源了)去驱动系统的不同部分。那么在这样的多时钟系统中,复位键怎么设置?它的稳定与否直接关系到了整个系统的稳定性,因此要格外注意(在我看来,复位信号在同步时序系统中的地位和时钟信号一样重要)。下面就说一下具体的处理方法,当然所遵循的原则就仍应该是上文的异步复位,同步释放
1.non-coordinated reset removal:顾名思义,就是同一个系统中的多个同源时钟域的复位信号,由彼此独立的reset synchronizer驱动。当异步复位信号有效时,各时钟域同时复位,但是复位释放的时间由各自的驱动时钟决定,也是就说:时钟快的先释放,时钟慢的后释放,但是各复位信号之间没有先后关系。
2.sequence coordinated reset removal:这是相对于上述方式来说的,也就是说各时钟域的复位信号彼此相关,各个部分系统虽然也同时复位,但是却分级释放。而分级的顺序可由各个reset synchronizer的级联方式决定。可以先复位前级,再复位后级,也可以反过来。反正方式很灵活,需要根据实际需要而定。由于图片上传问题,我只能用程序表示了,
! l% T) }3 N$ J, E2 l) e
例子:三级复位系统,系统中的时钟分别为1M,2M,11M:
第一级Reset_Sychronizer程序:
module Reset_Synchronizer
(output reg rst_n,
input  clk, asyncrst_n);
  reg rff1;
always @ (posedge clk , negedge asyncrst_n)
begin
    if (!asyncrst_n) {rst_n,rff1} <= 2'b0;
else {rst_n,rff1} <= {rff1,1'b1};
end
endmodule
- L$ ?3 y7 c) \: d* r
第2,3级的Reset_Sychronizer程序:
module Reset_Synchronizer2
(output reg rst_n,
input  clk, asyncrst_n,d);
  reg rff1;

: _6 C9 ^: k6 i9 |; u
always @ (posedge clk , negedge asyncrst_n) begin
2 C1 i) L! {2 u) f3 |$ B$ `
if (!asyncrst_n) {rst_n,rff1} <= 2'b0;
    else {rst_n,rff1} <= {rff1,d};
end
endmodule
顶层模块的源程序:
include "Reset_Synchronizer.v"
include "Reset_Synchronizer2.v"
module AsynRstTree_Trans
( input  Clk1M,Clk2M,Clk11M,SysRst_n,
  output SysRst1M_n,SysRst2M_n,SysRst11M_n
);
  Reset_Synchronizer Rst1M(.clk(Clk1M),. asyncrst_n(SysRst_n),.rst_n(SysRst1M_n));
  Reset_Synchronizer2Rst2M(.clk(Clk2M),.d(SysRst1M_n),. asyncrst_n(SysRst_n),.rst_n(SysRst2M_n));
  Reset_Synchronizer2Rst11M(.clk(Clk11M),.d(SysRst2M_n),. asyncrst_n(SysRst_n),.rst_n(SysRst11M_n));
endmodule

, ?7 G1 L- L2 d& L" d  x
% }; N) Z1 s2 J* b& N. X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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