verilog异步复位jk触发器_verilog的同步复位与异步复位

本文介绍了Verilog中异步复位JK触发器的设计,并强调了推荐的复位方式——异步复位、同步释放。通过使用“reset synchronizer”将异步复位信号同步化,确保系统的稳定性。此外,还讨论了多时钟系统中复位的处理方法,包括non-coordinated和sequence coordinated两种复位信号释放策略。
摘要由CSDN通过智能技术生成

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触发器的输出作为后级系统的复位信号,也能达到相同的效果。这里就不多说了。

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

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

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

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

例子:三级复位系统,系统中的时钟分别为1M,2M,11M:

第一级Reset_Sychronizer程序:

module Reset_Synchronizer

(output reg rst_n,

inputclk, 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

(output reg rst_n,

inputclk, 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

( inputClk1M,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值