搞点不一样的东西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同时改变,有风险。(直接格雷码指针到尾巴上强制跳转也是一样的)
Bad Design预警!
加一个一般的位宽转换模块(读取一个宽数据,截取需要的部分送出,剩下的留在remain里,如果还够再送一次就不再读取,不够了就读新的)比玩坏fifo简单的多。在fifo上做这种不好定宽度的东西仅仅是使得空/满判断平添麻烦而已。我做的判断根本就不准确。所以接下来做异宽fifo的部分完全是胡扯233
更进一步的,其实还是两边想办法padding一下到公倍数比较好啊……
关于异步异宽FIFO
-
LBrowser 6Windows 。。。。。。。。。。。。。。。(假装发表了一句评论。)
(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
发现公司的也有用同步+异步的233