经常在一些资料上看到FIFO的深度应该设置为2的幂次方,否则的话格雷码不连续,多bit数据跨时钟域传输会出现多位跳转的问题,而两级同步器只能解决单bit数据跨时钟域亚稳态。实际应用中,若只需要深度20的FIFO,选取深度32的未免造成浪费。
理论上,FIFO的深度可以是任何值,只要保证格雷码转换的时候只有1bit的线翻转。
我们知道指针为地址位扩展一位,因此深度为n的FIFO,对应2n个指针。
扩展一位,多出的一倍深度,就是为了判断满标志。判断空的话,只需要指向相同的位置就好了,而满的话必须追上一圈到同样的位置。
格雷码具有对称性,如下图,首尾去掉相同个数后,剩下的数仍然符合相邻位只有一bit跳变,包括绕回。
举例:深度为5
需要10个指针,深度为5对应的最大深度的FIFO为8,需要16个指针。
格雷码的起始地址为(16-10)/2 = 3,结束地址12,共10个。
写出对应的格雷码:
3: 0010
4: 0110
5: 0111
6: 0101
7: 0100
8: 1100
9: 1101
10: 1111
11: 1110
12: 1010
可以看到首位仅有1bit跳转。
任意深度异步FIFO
最新推荐文章于 2023-08-13 23:06:38 发布