1.产生的原因:
对于同步系统中,输入的信号是满足触发器的时序要求的
但对于异步系统,信号和时钟关系并不是固定的,会产生一个违反set up time (建立时间)和Hold time(保持时间)的现象。一旦发生了违反Tset和Thold现象,就会产生亚稳定。
2.亚稳态的定义:
其实就是采样的时候采样的数据不稳定。根据上面的原因就可以推断出:数据信号在Tset和Thold时需要保持稳定。如果在这段时间产生变化,即出现了亚稳态。(一般来说亚稳态在1到2个时钟周期就会恢复正常)
可以理解为:有一个城市是A,一个城市是B,在某一时间你只能在A或者在B,如果采样采到了你在路上,那就是无法定义你在A还是B,产生了亚稳态。
具体的setup time和hold time可以考虑是否去找个DC综合视频看一看,这样理解会比较深刻。
3.解决办法
亚稳态如果不解决,也有可能会一级一级的传递下去,因此就需要解决。具体解决办法如下。
为了解决它需要引用一个平均无故障时间(MTBF)的公式:
3.1 大的时钟周期
最简单的法子,给一个足够大的时钟周期来避免亚稳态。这的确是可以解决的,但是有一个问题就是时钟频率是很重要的一个指标,这个方法在实际问题上并不实用。
3.2 同步器
同步器的具体电路结构:
就是我们在跨时钟域的时候,经常用的打拍。使用一个同步触发器可以用一个完整的时钟周期来解决一个亚稳态问题。但是这样会增加延迟,降低效率。
一般来说,在设计中会采用打两拍来完成。具体可以根据上一个公式推断出来打两拍的MTBF:
打一拍对可以缓解亚稳态,打两拍也是有必要的,打三拍相对于两拍的作用并不明显。一般最多打三拍,具体使用需要考虑时间应用。
//A信号使用两个同步器处理的列子
always@(posedge clk )
if (rst)
A_dly1 <= 1'b0;
else
A_dly1 <= A;
if (rst)
A_dly2 <= 1'b0;
else
A_dly2 <= A_dly1;
//这两拍也可以用移位寄存器来实现
3.3使用倍频时钟的同步器
对于3.2提到的同步器会增加信号处理的时间,为了解决这个问题,可以使用接收时钟的两倍时钟来减少时间。
3.4 用反应更快的触发器(工艺相关)
4.亚稳态测试电路
传递到触发器FFB 和FFC 的信号是两个互补的信号,无论FFA 什么时候产生亚稳态,异或非门的输出都会变成高电平,在触发器FFD 输出端捕获到高电平就表示已经检测到亚稳态事件。
5.总结
这个其实是参考《硬件架构的艺术》所做的笔记,想要深入了解的话,可以去看一下这本书。