异步FIFO经过比较读写地址进行满空判断,可是读写地址属于不一样的时钟域,因此在比较以前须要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址必定是小于或者等于当前的写地址,因此此时判断FIFO为空不必定是真空,这样更保守),将读地址同步到写时钟域再和写地址比较进行FIFO满状态判断(同步后的读地址必定是小于或者等于当前的读地址,因此此时判断FIFO为满不必定是真空,这样更保守),这样能够保证FIFO的特性:FIFO空以后不能继续读取,FIFO满以后不能继续写入。异步
大多数情形下,异步FIFO两端的时钟不是同频的,或者读快写慢,或者读慢写快,这时候进行地址同步的时候,可能会有地址遗漏,以读慢写快为例,进行满标志判断的时候须要将读地址同步到写时钟域,由于读慢写快,因此不会有读地址遗漏,同步后的读地址滞后当前读地址,因此可能满标志会提早产生。进行空标志判断的时候须要将写地址同步到读地址,由于读慢写快,因此当读时钟同步写地址的时候,必然会漏掉一部分写地址(写时钟快,写地址随写时钟翻转,直到满标志出现为止),那到底读时钟会同步到哪一个写地址?没必要在乎是哪个,咱们关注的是漏掉的地址会不会对FIFO的空标志产生影响。好比写地址从0写到10,期间读时钟域只同步到了2,5,7这三个写地址,漏掉了其余地址。同步到7地址时,真实的写地址可能已经写到10地址,至关于“在读时钟域还没来得及觉察的状况下,写时钟域可能偷偷写了数据到FIFO去”,这样在比较读写地址的时候不会产生FIFO“空”读操做。漏掉的地址也没有对FIFO的逻辑操做产生影响。编码
咱们能够对异步FIFO的地址采用binary编码,这样并不影响异步FIFO的功能,前提是读写地址同步时可以保持正确。这种状况在功能仿真时彻底正确,问题只有到时序仿真时才会遇到。毛刺能够说是异步电路的杀手,一个毛刺被触发器采样后会被放大,而后传播,致使电路功能出错。binary编码的地址总线在跳变时极易产生毛刺,由于binary编码是多位跳变,在实现电路时不可能作到全部的地址总线等长,address bus skew必然存在,并且写地址和读地址分属不一样时钟域,读写时钟彻底异步,这样地址总线在进行同步过程当中出错不可避免,好比写地址在从0111到1000转换时4条地址线同时跳变,这样读时钟在进行写地址同步后获得的写地址多是0000-1111的某个值,这个彻底不能肯定,因此用这个同步后的写地址进行FIFO空判断的时候不免出错。同步
这个时候gray码体现了价值,一次只有一位数据发生变化,这样在进行地址同步的时候,只有两种状况:1.地址同步正确;2.地址同步出错,可是只有1位出错;第一种正确的状况不须要分析,咱们关注第二种,假设写地址从000->001,读时钟域同步出错,写地址为000->000,也就是地址没有跳变,可是用这个错误的写地址去作空判断不会出错,最可能是让空标志在FIFO不是真正空的时候产生,而不会出现空读的情形。因此gray码保证的是同步后的读写地址即便在出错的情形下依然可以保证FIFO功能的正确性,固然同步后的读写地址出错老是存在的(由于时钟异步,采样点不肯定)。这里须要注意gray码只是在相邻两次跳变之间才会出现只有1位数据不一致的情形,超过两个周期则不必定,全部地址总线bus skew必定不能超过一个周期,不然可能出现gray码多位数据跳变的状况,这个时候gray码就失去了做用,由于这时候同步后的地址已经不能保证只有1位跳变了。数据
另外须要将地址总线打两拍,这是为了不亚稳态传播,理论上将打两拍不能消除亚稳态现象,由于时钟异步,亚稳态不可避免,可是能够极大下降亚稳态传播的几率,低频状况下甚至STA不须要分析这里的异步时序,由于寄存器均可以在一拍内将亚稳态消除,恢复到正常0/1态。而在高频状况下则不必定,尤为在28nm工艺如下,须要检查两级触发器的延迟,保证延迟低,这样能够提升Tr,提升系统MTBF。错误