我正在尝试将一个模块与Xilinx CORE Generator生成的异步FIFO接口。然而,我观察到AFIFO输入端口提供的数据(虽然正确)在6-7个时钟周期的延迟后开始出现在dout上。这是意料之中的吗?还是我做错了什么?我要做的是断言AFIFO的write_enable引脚,提供输入数据,然后在下一个周期断言read_enable引脚。但是延迟的问题仍然存在。任何帮助都是非常感谢的。
编辑:我附加了我代码的一部分。
always @ (posedge clk1, posedge rst)//faster clock domain
begin
if (rst)
wr_en<= 1'b 0;
else
begin
if (data_wrt)
begin
wr_en<= 1'b 1;
end
else
wr_en<= 1'b 0;
end
end
always @ (negedge clk2, posedge rst)//slower clock domain
begin
if (rst)
rd_en<= 1'b 0;
else
begin
if (wr_en)
begin
rd_en<= 1'b 1;
end
else
rd_en<= 1'b 0;
end
end
AFIFO AFIFO1(//AFIFO module instantiation
.din(data_in),
.rd_clk(clk2),
.rd_en(rd_en),
.rst(reset),
.wr_clk(clk1),
.wr_en(wr_en),
.dout(data_out),
.empty(empty),
.full(full)
);


发布于 2017-08-11 21:38:27
时钟关系是什么?假设你看到的是6-7个clk1 (快速时钟)周期的延迟,根据时钟关系clk1/clk2,这似乎是你所期望的。
也就是说,异步FIFO的作用通常是充当从一个时钟域到另一个时钟域的同步器。只要写入时钟域(clk1)未满,写入时钟域就会将数据写入到AFIFO。只要读时钟域(clk2)不为空,它就会读取新数据。您在这里所做的就是打破这种使用。
您正在使用由clk1生成的wr_en来控制由clk2提供时钟的rd_en。因此,现在在两个时钟域中都使用了wr_en,这将导致metastability。
因此,简而言之,您没有正确使用AFIFO。相反,当AFIFO为!empty时,尝试让您的clk2逻辑始终设置rd_en。
发布于 2017-08-15 18:05:52
我认为你想通过异步先进先出将一些数据同步到clk1到同步到clk2。
首先,你不需要通过clk2 directly.Like采样同步到clk1的信号,使用clk1生成的wr_en来控制由clk2定时的rd_en,这将导致metastability.FIFO总是用来解决metastability.So不需要做第二个总是阻塞的问题。
因此,如何正确使用异步FIFO就成了一个问题。你应该阅读像PG057这样的Xilinx先进先出产生器的产品指南。你应该知道先进先出的原理和用法method.Otherwise你在使用先进先出的时候会有很多的痛苦。
我的建议如下。对于写操作,你需要同时使用almost_full和full信号,以避免overflow.You可以在PG057图3-2中看到它。你需要使用almost_full,因为如果wr_en是连续的,那么full信号要慢1个时钟才能避免溢出。对于读操作,出于同样的原因,您需要同时使用almost_empty和empty信号。然后,您可以正确地转换时钟区域。
请原谅我的英语。
https://stackoverflow.com/questions/45553980
复制相似问题