您的位置:首页 > 其它

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

2016-02-23 22:06 260 查看
本文转自网络,具体出处已忘记。望原作者知道后告知一声。

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拍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: