关于复位
为确保系统上电后有一个明确、稳定的初始状态,或当系统运行状态紊乱时可以恢复到正常的初始状态,数字系统设计中一定要有复位电路模块。复位电路异常可能会导致整个系统的功能异常,所以在一定程度上,复位电路的重要性也不亚于时钟电路。
复位电路可分类为同步复位和异步复位。
同步复位
复位信号在时钟有效边沿到来时有效。如果没有抓到时钟有效沿,无论复位信号如何变化,都无济于事,因为此时无法复位。
举个栗子:
Module sync_reset( input rstn, //同步复位信号 input clk, //时钟 input din, //输入数据 outputreg dout //输出数据 ); always@(posedge clk)begin //复位信号不加入到敏感列表中 if(!rstn) dout<=1'b0; //rstn信号与时钟clk同步 else dout<=din; end endmodule
该描述代码常常会被综合成如下电路:
同步复位的优缺点:
优点:信号间是同步的,能滤除复位信号中的毛刺,有利于时序分析。
缺点:大多数触发器单元是没有同步复位端的,采用同步复位会多消耗部分逻辑资源。且复位信号的宽度必须大于一个时钟周期,否则可能会漏掉复位信号。
异步复位
无论时钟到来与否,只要复位信号有效,电路就会执行复位操作。
举个栗子:
module async_reset( input rstn, //异步复位信号 input clk, //时钟 input din, //输入数据 output reg dout //输出数据 ); //复位信号要加到敏感列表中 always @(posedge clk or negedge rstn) begin if(!rstn)dout <= 1'b0; //rstn 信号与时钟 clk 异步 else dout <=din; end endmodule
该代码常常会被综合成如下电路:
异步复位的优缺点:
优点:大多数触发器单元有异步复位端,不会占用额外的逻辑资源。且异步复位信号不经过处理直接引用,设计相对简单,信号识别快速方便。
缺点:复位信号与时钟信号无确定的时序关系,异步复位很容易引起时序上 removal (去除时间)和 recovery(恢复时间)的不满足而出现亚稳态。且异步复位容易受到毛刺的干扰,产生意外的复位操作。
拓展:异步复位防止出现亚稳态的条件:
关于没有复位
复位信号很重要,但是并不是每一部分的电路都需要复位电路,一方面是复位电路也消耗逻辑资源、占用芯片面积,另一方面是复位信号会增加电路设计的复杂性(比如要考虑复位的策略、复位的布局布线等等)。
当某个电路的输出在任何时刻都可以不受到复位信号的控制就有正确的值时,比如说数据通路中的对数据进行处理的部分。在某些情况下,当流水线的寄存器(移位寄存触发器)在高速应用中时,应该去掉某些寄存器的复位信号以使设计达到更高的性能,因为带复位的触发器比不带复位的触发器更复杂,反应也更慢。
但是需要保证必须是在纯数据通路的场景下使用,而且没有使用复位的数据信号在后级不能与控制通路有任何关联,否则就会因为X态传播带来问题,因此设计需谨慎,考虑前后级,稳妥策略,一般不建议使用。
总结
复位电路会消耗更多的硬件逻辑和面积资源,增加系统设计的复杂性。不带复位端的触发器也具有相对较高的性能。所以在一些初始值不影响逻辑正确性的数字设计中,例如数据通路中一些数据处理的部分,高速流水线中的一些寄存器,可以考虑去掉复位以达到最佳性能。