saber酱的抱枕

生于忧患,死于安乐

08/22
16:16
学习

关于异步异宽FIFO

搞点不一样的东西233毕竟转行数字前端了

这里的同宽指输入和输出的宽度。

同步同宽FIFO不提了。
异步同宽FIFO的知识参见著名文章
Simulation and Synthesis Techniques for Asynchronous FIFO Design
在作者自己公司的网站能看到:http://www.sunburst-design.com/papers/
翻译可参见:https://zhuanlan.zhihu.com/p/138300816

异步异宽?
本来这也没什么难的
前提是:两边宽度之间是2的幂次关系
比如,输入端是a bits,输出端是a * 2^n bits
此时将fifo本身的宽度设为a bits,深度设置到2的幂(和同宽相同,都是格雷码的要求),那么两边的指针自然就能用格雷码了。不论是格雷码直接计数还是二进制计数跨时钟用格雷码传都没问题。
两边都是2的幂也一样。

问题在于,不满足这个怎么办?
举例:输入32 bits, 输出24 bits……
最麻烦的在于,格雷码搞了一边另一边就完蛋。

能调整两边的位宽是最好啦,万一不行呢

我想尽方法,包括让24那边多走几轮凑一个2的幂出来做格雷码,结果判断“page”的MSB没法纳进来……也就是说跨clk传输的仍然不是格雷码,每轮一圈仍然有一次多bits同时改变,有风险。(直接格雷码指针到尾巴上强制跳转也是一样的)

想来想去,只想到一个方案,就是在数据流较快的那边再加个同步异宽的fifo。主要用于改变位宽,改成一样的。因为是同步的,指针就好解决了,不一定非得依赖格雷码。

然后中间就是过异步同宽的fifo,就没上面的问题了。

就是这电路膨胀了好多……
还有更好的方案吗?

关于异步异宽FIFO