我使用VHDL结构设计了一个Asynchrounous非对称fifo。它是具有depth和prog_full作为参数的通用fifo。它具有32位的16位输出数据宽度。 您可以找到fifo设计链接here 顶级非对称 fifo(fifo_wrapper.vhd)基于32位异步 fifo(async_fifo.vhd)构建。这个内部fifo(async_fifo)是使用开放核心(http://opencores.org/project,generic_fifos)上的通用FIFO的逻辑构建的。我添加了一个简单的测试平台来试用这个fifo设计 但是这个设计存在一些问题,我无法弄清楚。当我模拟它时,fifo设计工作得很好,但是当我合成它并在硬件上运行它和我的其他设计时,我有时会得到一些错误的数据。可能有一些我无法模拟的角落情况,还是其他的东西?
这就是为什么我希望任何需要此设计的人尝试一下,如果他/她在模拟过程中或在合成后遇到任何问题,请告诉我。 感谢
PS:请告诉我是否有其他论坛我可以将我的设计供公众使用。感谢
答案 0 :(得分:1)
关于这个异步FIFO,有许多问题要指出 设计,基于写和读时钟完全的假设 异步的。
A(也可能是THE)主要问题是写侧指针(wp in async_fifo),它是一个普通的二进制计数器,被传输和同步 到没有任何格雷编码的读侧时钟。所以不同的位 矢量可以在读时钟域中的不同时间到达,因此 写指针值可以(并且很可能会不时)不同 从写边值。与读指针(rp)的比较将 因此毫无意义。通过时钟传输的二进制值 域名应在传输前进行格雷编码,并在到达时解码。也 使用两个触发器级别的同步。
假设两个时钟(rd_clk和wr_clk)是异步的,但在那里 只是一次复位(rst),因此复位时可能会违反时序 取消断言,除非对时钟有一些额外的要求 重置的时间无效。
类似于清楚,其中只有一个信号可用于两个 不同的时钟域。
建议使用时钟域的端口命名约定 名称中指示清除端口的关系,如命名全部 写时钟域wr_ *中的端口(例如wr_clk_i,wr_clk_we_i等, 读时钟域中的所有端口为rd _ *。
复位被置为低电平,因此命名rst_n会很好。
答案 1 :(得分:0)
n'我无法访问您的代码(防火墙)所以我只提及设计它们的一般要点,这可能对您和其他人有所帮助。
这个构造是一个双缓冲寄存器。
采用类似的方法将读指针传送到写域。 可以看出,虽然这种方法导致写/读侧的写指针和读/写侧的读指针之间的延迟,但是这种延迟永远不会导致溢出。相反,它会导致写入端过早填满,并且在读取端出现过早空,一旦指针下次交换,最终将解决。
这种方法是fifo的唯一完全时钟安全设计,不依赖于时钟速度的先验知识。根本不需要格雷编码。
需要注意的另一点是,需要在每个时钟域上复制寻址/清空/完全等逻辑。