在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2162|回复: 0

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

[复制链接]
发表于 2016-2-23 22:05:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x

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


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拍。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-4 08:30 , Processed in 0.015369 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表