最近在分析verilog代码的时候,遇到了听说过但是没有明白它真正含义的名词,亚稳态和异步FIFO的作用。
FPGA中的亚稳态是跨时钟域设计师最基本也是最重要的一个问题。要明白亚稳态首先要知道在数字电路中最简单的双稳态电路就是两个反相器首尾相连,加一些简单的控制逻辑就变成了锁存器或者触发器,然而这种电路其实还有第三种半稳定态,就是当两个反相器都处于中间值的情况,这就成为亚稳态。由于反相器在非逻辑值范围的反馈系数是非常大的,一旦因为干扰或者噪音离开了这个中心点,就会很快的进入逻辑范围。经数学分析,从亚稳态进入稳态,正如放射元素的衰变是一个指数的过程。当器件处于亚稳态是消耗的功率很大,但是亚稳态最大的危害不是功率的消耗,而是逻辑的混乱。,这是数字电路设计中最不好的。那么我们究竟如何避免亚稳态呢?由于它的变化规律是指数的,因此最好的办法就是等待,等到足够的时间,指导这个几率变得小的几乎不会发生。到底要等待多少时间呢?有的厂商有数据,但是有的没有,按照最普通的做法,就是至少等待一个时钟周期,这个就是所谓的异步数据要用两个触发器打一下,这样就可以避免亚稳态的发生。 另外,异步FIFO也是跨时钟域设计方法的集中体现,体现了很多方法,不过最重要的就是亚稳态和多控制/状态信号的跨时钟域传递。具体地说,就是把一组信号传递到另外一个时钟域的时候,这组信号可能因为延时不同,得到的数据相差一个老的时钟域时钟周期,这和避免亚稳态的原理是一样的。 在分析代码时,觉得自己真的学会了许多东西。也许以前有些东西是自己碰到过的,可是并没有真正理解,通过这种学习方式,我发现不仅可以学习新的知识,而且对自己写代码很有帮助,我会继续努力的。
|