首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步不对称FIFO在VHDL合成中的应用

异步不对称FIFO在VHDL合成中的应用
EN

Stack Overflow用户
提问于 2013-07-15 12:32:35
回答 2查看 2.4K关注 0票数 0

我用VHDL设计了一个非同步的非对称fifo,constructs.It是以深度和prog_full为参数的通用fifo。它有32位的16位输出数据宽度.您可以找到fifo设计链接这里

顶层非对称 fifo (fifo_wrapper.vhd)是建立在32位异步 fifo(async_fifo.vhd)之上的.这个内部fifo (async_fifo)是使用开放核上的通用FIFO (fifos)逻辑构建的。我增加了一个简单的测试平台来尝试这个fifo设计。

但是这个设计有一些问题,我无法弄清楚。当我对fifo进行仿真时,它的工作原理非常好,但是当我将它与硬件上的其他设计一起运行时,有时会得到一些错误的数据。可能有一些角落的情况,我不能模拟,或者是其他什么东西?

这就是为什么我希望任何需要这个设计的人尝试它,如果他/她在模拟或合成之后遇到任何问题,请告诉我。谢谢

请让我知道,如果有其他论坛,我可以把我的设计供公众使用。谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-07-15 13:15:24

基于写读时钟完全异步的假设,这种异步FIFO设计需要指出许多问题。

  • 一个(也可能是)主要问题是,写入侧指针(async_fifo中的wp)是一个普通的二进制计数器,在没有任何格雷编码的情况下,它被传送并同步到读取的侧时钟。因此,向量中的不同位在读时钟域中可能到达不同的时间,因此写入指针值可以(而且极有可能不时地)与写入侧值不同。因此,与读指针(rp)的比较是没有意义的。在时钟域上传递的二进制值应该在传输之前进行灰色编码,并在到达时解码。同时使用具有两个触发器级别的同步。
  • 这两个时钟(rd_clk和wr_clk)被认为是异步的,但只有一个复位(rst),因此当复位被解除时可能会违反定时,除非在复位解除时有一些额外的时钟要求。
  • 与clear相似,其中只有一个信号可以在两个不同的时钟域中使用。
  • 建议使用端口命名约定,其中清除以名称表示的端口的时钟域关系,例如将写入时钟域中的所有端口命名为wr_* (例如,wr_clk_i、wr_clk_we_i等),并将读取时钟域中的所有端口命名为rd_*。
  • 重置断言较低,因此对rst_n进行命名将是一个不错的选择。
票数 3
EN

Stack Overflow用户

发布于 2013-07-19 07:54:16

我无法访问您的代码(防火墙),所以我将只提到设计它们的一般要点,这可能对您和其他人都有帮助。

  • 为了使时钟完全安全,写端应该使用使用2元稳定信令链的完全安全的异步握手方法来交换指向读取侧的指针。

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

  1. 写入端将其写入指针注册到缓冲区中,并断言有效信号较高。
  2. 元稳定链将缓冲器有效信号重新锁定到读时钟域。
  3. 在读取时钟侧,一旦在元链的输出处看到向高有效的转换,则写入侧缓冲器中的数据被重新注册到读取域上的另一个寄存器上。这是可以的,因为我们知道缓冲区中的数据是稳定的。(因为元链)。
  4. 读取域断言一个ack信号很高。
  5. 另一个元稳定链将ack信号重新锁定到写时钟域.
  6. 写入端在元链的输出处等待ack信号的转换,一旦看到它就放弃其有效信号。
  7. 读取侧在元链的输出端等待有效信号的转换,一旦看到它就将其ack信号解除。
  8. 写入侧在元链的输出端等待ack信号的转换到低。这一周期现在已经完成。
  9. 现在可能已经移动了相当多的当前写指针可能会再次被传输。

采用类似的方法将读指针传输到写域。可以看出,虽然这种方法会导致写/读端的写指针与读/写端的读指针之间的延迟,但这种延迟永远不会导致溢出。相反,它会导致写入端的过早填充,而在读取端则导致过早的空,这将在下一个指针交换后最终解决。

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

另外要注意的是,寻址/空/满等的逻辑需要在每个时钟域中重复。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17654349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档