我需要一些关于如何设计异步FIFO的建议。当将数据捕获到不同的时钟域中时,我理解了元稳定性问题,我的问题是如何使用两个触发器移位寄存器来帮助同步写入指针和读取指针值以进行满标志和空标志的计算。当寄存器捕获一个不同域的数据时,它有可能进入一个亚稳态,并且可以稳定到一个未知的值,那么如何有效地解决这个问题呢?
谢谢
发布于 2015-03-23 11:33:11
当从一个时钟域传输到另一个时钟域时,您的读和写指针需要使用灰色编码。您应该知道,在两个连续的值之间,只有1位灰度计数器是不同的。因此,亚稳态只会影响一个变化比特。在重新同步之后,所传输的指针将是更新的指针或其先前的值.
在任何一种情况下,这都不是一个问题,只会导致您的FIFO的悲观标志/计数。
我对我的读/写指针使用常规计数器,并使用以下函数将它们转换为灰色代码。他们用的是VHDL语言,但你应该知道:
function bin_to_gray(a: unsigned) return unsigned is
begin
return a xor ('0' & a(a'left downto 1));
end function bin_to_gray;
function gray_to_bin(a: unsigned) return unsigned is
variable ret : unsigned(a'range);
begin
ret(a'left) := a(a'left);
for i in a'left-1 downto 0 loop
ret(i) := ret(i+1) xor a(i);
end loop;
return ret;
end function gray_to_bin;发布于 2015-04-10 18:58:07
乔纳森解释得很好。我只想补充几点:首先,除了你的两级同步器寄存器,你还必须有一个源寄存器。你永远不能从组合逻辑输入信号到你的两级同步器,因为组合逻辑会产生故障。
您还必须知道,Verilog和VHDL没有内置的支持时钟域交叉和亚稳态。即使您创建了一个适当的两级同步器来传输灰色编码指针,也不能保证合成工具不会以一种使其在防止亚稳态方面无效的方式改变您的同步器。一些合成工具试图检测同步器,并将它们置之不理。有些人不相信,在这两种情况下,你都不应该依赖它。对于完全正确的时钟域交叉,必须使用特定于供应商的属性和SDC定时约束约束同步器和源寄存器。
https://stackoverflow.com/questions/29204807
复制相似问题