图 3.8 二级寄存器亚稳态
由上图可知,第二级也是一个亚稳态,所以在这种情况下,亚稳态产生了串扰,从第一级寄存器传到了第二级寄存器,同样也可能从第二级寄存器串扰到第三级寄存器。这样会让设计逻辑判断出错,产生亚稳态传输,可能导致系统死机奔溃。
▶(3)亚稳态振荡时间 Tmet
亚稳态震荡时间 Tmet 关系到后级寄存器的采集稳定问题,Tmet 影响因素包括:器件的生产工艺、温度、环境以及寄存器采集到亚稳态离稳定态的时刻等。甚至某些特定条件,如干扰、辐射等都会造成 Tmet 增长。
消除亚稳态的办法
有亚稳态产生,我们就要对亚稳态进行消除,常用对亚稳态消除有三种方式:
对异步信号进行同步处理;
采用 FIFO 对跨时钟域数据
通信进行缓冲设计;
对复位电路采用异步复位、同步释放方式处理。
01 对异步信号进行同步提取边沿
在异步通信或者跨时钟域通信过程中,最常用的就是对异步信号进行同步提取边沿处理。对一个异步信号进行提取上升沿通常采用程序清单 4.1 所示。
▶程序清单 4.1 双极寄存器提取边沿
input sig_nsyn;
wire sig_nsyn_p;
reg[1:0] sig_nsyn_r;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) sig_nsyn_r <= 2’d0;
else sig_nsyn_r <= { sig_nsyn_r [0], sig_nsyn };
end
assign sig_nsyn_p = sig_nsyn_r[0] & ~sig_nsyn_r[1];
这种边沿提取方式对于一个稳定的系统是不合适的,例如:当第一级寄存器采集到亚稳态,那势必造成 sig_nsyn_p 输出亚稳态,这样就会对采用 sig_nsyn_p 的信号进行判断的电路造成影响,甚至判断出错误的值。
根据 3.3.1 小节的亚稳态产生概率,如果在 100M 时种下那第一级寄存器产生亚稳态的概率约为 10%,随着系统采集频率升高,那产生亚稳态的概率也会随之上升。因此,在进行异步信号跨频提取边沿时候,一般采用多进行一级寄存器消除亚稳态,可能在系统稳定性要求高的情况下,采用更多级寄存器来消除亚稳态,如程序清单 4.2 所示,即为采用 4 级寄存器消除亚稳态,相应的边沿信号产生的时间就晚了两个时钟周期。
▶程序清单 4.2 多级寄存器提取边沿信号
input sig_nsyn;
wire sig_nsyn_p;
reg[3:0] sig_nsyn_r;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) sig_nsyn_r <= 2’d0;
else sig_nsyn_r <= { sig_nsyn_r [2::0], sig_nsyn };
end
assign sig_nsyn_p = sig_nsyn_r[2] & ~sig_nsyn_r[3];
02FIFO 进行异步跨频数据处理
当数据流从一个时钟域到另一个时钟域的时候,绝大多数情况下都采用 FIFO 来作为中间缓冲,采用双时钟对数据缓冲,就可以避免亚稳态的发生。
03 异步复位,同步释放
对于复位情况下的亚稳态,常常是由于恢复时间和移除时钟不满足造成的,因此,最常用的处理方式是采用异步复位、同步释放。常用电路模型如所示。采用第二级寄存器输出作为全局复位信号输出。
▶程序清单 4.3 异步复位处理
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];
通过上面三种方式处理异步信号、异步数据、以及异步复位可有效的提高系统的稳定性。减少亚稳态的产生。