数字芯片设计面试问题——异步FIFO的本质和外延

前言:异步FIFO之所以成为数字芯片设计工程师或者FPGA设计工程师的面试必考问题,在于其设计思想包含了较丰富的跨时钟同步的概念,其中有单比特跨时钟打两拍思想、多比特数据跨时钟和格雷码转换等思想。本文章不仅分析异步FIFO的根本设计原理,同时会根据字节跳动面试的一道问题进行展开,来探讨异步FIFO的本质和外延。

字节跳动问题

对于1个异步FIFO,如果写时钟频率是读时钟频率的100倍,是否会出现风险?

分析

既然这样问了,那肯定是有风险的。但是风险在哪里呢?FIFO的IP核在用户手册上也没看到对于使用频率的限制呀,下面我将对此问题进行详细分析,本文基于你已经理解异步FIFO的设计原理的前提下,进行讲述。

异步FIFO的难点在于2个指示信号,即读空和写满。对于空满判断,如果写地址比读地址多了1个FIFO的深度,那么就是写满;如果读地址赶上了写地址(即相等),那么就是读空。在具体设计过程中,会将地址位扩充1位,高位不等其余位相等则为写满,所有位都相等则为读空。但是,在读写地址是否相等判断时,需要转换到同一时钟域,比如写满full信号判断需要转换到写时钟域,读空empty信号判断需要转换到读时钟域,那么就会引出跨时钟域问题。

读写地址属于多比特数据,那么可以提出面试常问问题:跨时钟域的常用方法有哪些?对于单比特数据可以打两拍,降低亚稳态发生概率。对于多比特数据跨时钟域有两种方法,一种是可以通过握手的方式,本质上相当于跨时钟的是单比特的握手指示信号,而握手成功后即可将数据发出;另一种方法是将多比特数据转换成格雷码,然后跨时钟域之后打两拍,因为格雷码的特性是在连续数据上一次只变换1bit,那么在跨时钟域时相当于单比特传输。但是,值得注意的是,应用格雷码跨时钟域时,要求数据连续变化,即连续递增或连续递减,否则在跨时钟域时就不是只有1bit不同了。

异步FIFO设计的常用跨时钟域方法就是格雷码加打两拍,然后进行空满判断即可。具体内容网上有很多博客,大家如果忘记了FIFO的原理也可以看文章最后的一个链接(我随便搜了一篇)。

那么回到本文的问题,如果写时钟是读时钟的100倍,会出现什么风险?

相信很多读者已经想到问题的答案了,答案就在我上面分析的内容上,由于异步FIFO读写地址的跨时钟域采用格雷码和打两拍的方法。当写时钟频率是读时钟频率的100倍时,当写地址转换为格雷码之后,在读时钟域同步时,相邻2个读时钟的写地址数据间隔,最多可达100,那么即使已经转换为格雷码了,但是也失去了同步的意义。比如第一个读时钟的上升沿对应的写地址是1,那么对应的格雷码是0000001,在第二个读时钟的上升沿对应的写地址最大可能是101,对应的格雷码是1010111,可以发现这时候打两拍时,已经不是同步单比特数据了,亚稳态的风险会明显增加。

---------------------------------------END---------------------------------------

参考博客:异步FIFO设计:https://blog.csdn.net/alangaixiaoxiao/article/details/81432144

上一篇:4.进程通信篇(3--有名管道)-2020物联网_Linux高级程序设计全套教程(通俗易懂)


下一篇:手写先进先出队列