异步复位同步释放的方法以及多时钟系统的复位设计

本文转自网络,具体出处已忘记。望原作者知道后告知一声。

1.异步复位,同步释放:

input rst_asy_n,clk;
output rst_sy_reset_asy_release_n;//系统的复位信号
reg reg1,reg2;

always@(posedge clk or negedge rst_n ) begin
    if(!rst_n)begin
        reg1<=1'b0;
        reg2<=1'b0;
   end
  else begin
        reg1<=1'b1;
        reg2<=reg1;
    end

rst_sy_reset_asy_release_n=reg2;


end

复位是异步的,但是释放确实同步的;
用两级寄存器,是消除复位释放中可能存在的亚稳态;
异步复位,同步释放的好处是:1.不要求复位信号必须大于一个时钟周期;2.因为释放过程和时钟同步,所以避免了亚稳态。
兼具同步复位和异步复位的优点。
不使用reg1的原因是消除毛刺的影响,如果受到毛刺的影响,reg1会产生一个很短的复位信号,这样可能会导致复位不完全,系统出现混乱。

1.2     多时钟系统中复位的处理方法

这是一个很实际的问题,因为在较大型的系统中,一个时钟驱动信号显然不能满足要求,一定会根据系统的要求用多个同源时钟(当然也可以是非同源了)去驱动系统的不同部分。那么在这样的多时钟系统中,复位键怎么设置?它的稳定与否直接关系到了整个系统的稳定性,因此要格外注意(在我看来,复位信号在同步时序系统中的地位和时钟信号一样重要)。下面就说一下具体的处理方法,当然所遵循的原则就仍应该是上文的“异步复位,同步释放”:

1.non-coordinated resetremoval:顾名思义,就是同一个系统中的多个同源时钟域的复位信号,由彼此独立的“reset synchronizer”驱动。当异步复位信号有效时,各时钟域同时复位,但是复位释放的时间由各自的驱动时钟决定,也是就说:时钟快的先释放,时钟慢的后释放,但是各复位信号之间没有先后关系。

2.sequence coordinatedreset removal:这是相对于上述方式来说的,也就是说各时钟域的复位信号彼此相关,各个部分系统虽然也同时复位,但是却分级释放。而分级的顺序可由各个“reset synchronizer”的级联方式决定。可以先复位前级,再复位后级,也可以反过来。反正方式很灵活,需要根据实际需要而定。

用程序表示如下:

 

例子:三级复位系统,系统中的时钟分别为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

 

第2,3级的Reset_Sychronizer程序:

module Reset_Synchronizer2 (outputreg rst_n,

input  clk, asyncrst_n,d);

reg rff1;

 

always @ (posedge clk ,negedge asyncrst_n)

begin

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,

                                         outputSysRst1M_n,SysRst2M_n,SysRst11M_n

);

Reset_SynchronizerRst1M(.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

多级系统,整个系统的复位输入:rst_n,

系统定义:m1、m2、m3,复位信号按照该顺序依次释放,操作方法是将前一级的复位信号作为一个控制信号传递到下一级模块。

这样释放过程中复位信号的释放相对rst_n依次延时:2、3、4拍。



 



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值