1、定义
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。在这个不确定的状态中,信号是无法预测的(这段时间称为决断时间(resolution time)),在这个期间,触发器可能输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去,也就是串扰(好像是这个词),导致出现严重错误。
那么在FPGA系统中,是如何造成这种情况的?有两种情况:1.如果数据传输中不满足触发器的Tsu(建立时间)和Th(保持时间)不满足;2.复位过程中复位信号的释放相对于有效时钟沿的Trecovery(恢复时间)和Tremoval(移除时间)不满足,就可能产生亚稳态。至于这四个“时间”具体是什么意思,相信大家已经清楚,这里就不细说了。
2、产生场合
1)异步的输入信号(例如:异步复位)
2)跨时钟域信号传输
3)时钟偏移超过容限值(硬件原因吗)
4)组合延时使触发器的输入信号在亚稳态窗口内发生变化(在hold时期吗)
下面以异步复位信号示例:
不超过一周期的亚稳态信号:
复位信号在recovery恢复时间和removal移除时间发生变化,导致出现亚稳态。
3、解决方法
软件:
1)对异步信号进行同步处理(采用同步器);
2)采用FIFO对跨时钟域数据通信进行缓冲设计;
3)对复位电路采用异步复位、同步释放方式处理;
硬件:
4)使用采样相应更快的触发器(亚稳态窗口小);
5)降低采样速率(降频);
6)避免使用dV/dt 低的输入信号;(输入信号出现在亚稳态窗口的概率更小)
4、对异步信号进行同步处理
多级同步器:如果亚稳态信号持续在n-1~n周期内,那么就设计n+1级同步器。
例如:亚稳态在一个时钟周期内,那就采用两级同步器(触发器),如下图所示:
亚稳态信号在1~2个周期,采用三级同步器:
5、对于复位电路则采用异步复位,同步触发的电路方式。简单来说就是延迟一个周期接收复位信号,通过一个时钟周期让亚稳态自行恢复。
wire sys_rst_n;
reg [1:0] rst_r;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) rst_r <= 2’d0;
else rst_r <= {rst_r[0], 1’b1};
end
assign sys_rst_n = rst_r[1];
通过上述方式能够有效提高电路的稳定性。