异步fifo
异步FiFO有两个时钟,读写分别采用不同的时钟,这两个时钟频率,相位可能不同,也可能是同源时钟。
多时钟域问题,异步fifo可以在两个不同时钟系统之间快速方便地 传输实时数据。
异步fifo地址的传递需要使用格雷码,每位地址格雷码变化只有一位。
格雷码的作用:
格雷码每两个相邻码字之间只有1bit的变化,将多bit的地址抓换成格雷码。然后进行跨时钟域的传递, 就可以直接使用两级寄存器 进行同步。由于只有1bit的变化,即使采样错误也只有一种错误的可能,最多也就是保持原来的状态,不会出现其他不稳定的状态,
降低了产生亚稳态的概率,以及逻辑冒险的概率。
应用到异步fifo地址的指针中,采样点只有1bit不同的错误值。如果写指针001-011. 那么读时钟域采样到的写指针只可能是001- 001-011,或者是001-011-011. 而不会出现其他的值,如果采样到011,那么采样是正确的,如果采样到001,其实就是和读时钟域上一次同步的写指针的值一样,最多出现假空现象,不影响fifo正常工作。
格雷码从0001递增到0011,即便没有采集到0011,也会采集到0001,会导致不该抱空满而报了空满。
而写时钟域采集到0001,那么也只会报写满,,从而停止写入。
跨时钟域处理方法: 寄存器打两拍和格雷码
格雷码的作用是即使在亚稳态进行读写指针采样,也能进行正确的空满状态指示。
将写时钟域的写指针 同步到读时钟域,将同步后的写指针和读时钟域的读指针比较,产生读空信号。
将读时钟域的读指针同步到写时钟域,将同步后的读指针与写时钟域的写指针进行比较 产生写满信号。
为什么使用格雷码?
由于异步fifo的读指针和写指针分别属于不同的时钟域,这样指针在进行同步的过程中容易出错,采用格雷码,相邻每位只有一位发生变化,这样在进行指针同步时候,就会产生同步正确。 即使同步出错,出错的结果也是写指针的跳变不变。 对于读空判断,最多导致fifo在不是真空的时候产生,而不会出现读空。 格雷码保证即使读写指针同步后出错,也不影响fifo功能的正确性。
同步过程中的亚稳态不会消失,只是不受其影响。
二进制转格雷码:
右移一位和自己异或, 最高位保持不变 其余位与前一位做异或。
格雷码转二进制:
二进制码次高位位 高位二进制码和格雷码的异或。