VHDL综合问题中的异步非对称FIFO

时间:2013-07-15 12:32:36

标签: vhdl fifo

我使用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:请告诉我是否有其他论坛我可以将我的设计供公众使用。感谢

2 个答案:

答案 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'我无法访问您的代码(防火墙)所以我只提及设计它们的一般要点,这可能对您和其他人有所帮助。

  • 要完全时钟安全,写入端应使用完全安全的异步握手方法将其指针交换到读取端,使用2个元稳定性信令链。

这个构造是一个双缓冲寄存器。

  1. 写入端将其写指针注册到缓冲区,并将有效信号置为高电平。
  2. 元稳定链将缓冲区有效信号重新锁定到读时钟域
  3. 在读时钟侧,一旦在元链的输出处看到有效转换为高,写入侧缓冲器中的数据被重新注册到读取域上的另一个寄存器。这没关系,因为已知缓冲区中的数据是稳定的。 (因为元链)。
  4. 读取域将ack信号置为高电平。
  5. 另一个元稳定链将ack信号重新锁定到写时钟域。
  6. 写入侧等待元链输出处的ack信号的转换,一旦看到它取消其有效信号就会消失。
  7. 读取侧等待元链输出处的有效信号转换为低电平,一旦看到它取消断言其ack信号。
  8. 写入侧等待元链输出处的ack信号转变为低。这个周期现在已经完成。
  9. 现在可能已经移动很多的当前写指针现在可以再次传输。
  10. 采用类似的方法将读指针传送到写域。 可以看出,虽然这种方法导致写/读侧的写指针和读/写侧的读指针之间的延迟,但是这种延迟永远不会导致溢出。相反,它会导致写入端过早填满,并且在读取端出现过早空,一旦指针下次交换,最终将解决。

    这种方法是fifo的唯一完全时钟安全设计,不依赖于时钟速度的先验知识。根本不需要格雷编码。

    需要注意的另一点是,需要在每个时钟域上复制寻址/清空/完全等逻辑。