首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步FIFO中的写后读延迟?

异步FIFO中的写后读延迟?
EN

Stack Overflow用户
提问于 2017-08-08 03:00:38
回答 2查看 1.1K关注 0票数 1

我正在尝试将一个模块与Xilinx CORE Generator生成的异步FIFO接口。然而,我观察到AFIFO输入端口提供的数据(虽然正确)在6-7个时钟周期的延迟后开始出现在dout上。这是意料之中的吗?还是我做错了什么?我要做的是断言AFIFO的write_enable引脚,提供输入数据,然后在下一个周期断言read_enable引脚。但是延迟的问题仍然存在。任何帮助都是非常感谢的。

编辑:我附加了我代码的一部分。

代码语言:javascript
复制
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)
    );

EN

回答 2

Stack Overflow用户

发布于 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

票数 2
EN

Stack Overflow用户

发布于 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信号。然后,您可以正确地转换时钟区域。

请原谅我的英语。

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

https://stackoverflow.com/questions/45553980

复制
相关文章

相似问题

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