5163|9

531

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

FPGA 异步FIFO的问题 [复制链接]

最近要用到异步FIFO,谁有过这方面的经验?我的数据时间是40M和80M,主要是读写空满标准哪里不是很明白!
此帖出自FPGA/CPLD论坛

最新回复

学习了  详情 回复 发表于 2010-9-15 14:38
点赞 关注
 

回复
举报

325

帖子

0

TA的资源

裸片初长成(初级)

沙发
 

回复 楼主 ming1005 的帖子

我用过异步FIFO,你说的是输入是40MHZ,输出是80MHZ?
此帖出自FPGA/CPLD论坛
个人签名科技应该让生活变得更简单!
 
 

回复

328

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
为保证数据的正确写入和读出,不发生写满和读空操作,怎样判断空/满标志位的产生就成为异步 FIFO设计的核心问题。异步FIFO是环形存储的,当读写地址指针相等时,意味着空标志位或者满标志位的产生。但是却不能确定是写满还是读空状态。为解决这一问题,本文将转换为格雷码后的读写地址指针分别经过检测和计数器。每当读写指针遍历一圈(当读写地址指针指向双端口RAM的最后一个地址)时,写计数i加1,读计数j加1。这样写满状态和读空状态的判断就需要同时满足两个条件。下面分别给出写满和读空状态的判断。   ①写满状态的判别:当读地址指针等于写地址指针,并且i>j时,产生满标志。   ②读空状态的判别:当写地址指针等于读地址指针,并且i=j时,产生空标志。

lz的读时钟频率大于写时钟频率,就有可能出现读空的情况
此帖出自FPGA/CPLD论坛
 
 
 

回复

531

帖子

0

TA的资源

一粒金砂(高级)

4
 

回复 沙发 wenhuawu 的帖子

两个都能用到,估计弄明白一个就都懂了,我查了一些文献说的各有千秋
此帖出自FPGA/CPLD论坛
 
 
 

回复

531

帖子

0

TA的资源

一粒金砂(高级)

5
 

回复 板凳 cscl 的帖子

这篇文献我看到过,如果我写>读的速度,是否需要用到乒乓结构呢?
此帖出自FPGA/CPLD论坛
 
 
 

回复

325

帖子

0

TA的资源

裸片初长成(初级)

6
 

回复 5楼 ming1005 的帖子

不一定哈,读写数据还存在一种情况就是,虽然说你写的时钟频率高,但是不是连续一直在写,而读的时钟频率低,但是却一直在读,平均算下来读写吞吐量是相当的,其实这也是FIFO的最大的作用!
此帖出自FPGA/CPLD论坛
个人签名科技应该让生活变得更简单!
 
 
 

回复

265

帖子

0

TA的资源

一粒金砂(高级)

7
 
借此宝地,问下fifo深度如何算啊?


此帖出自FPGA/CPLD论坛
 
 
 

回复

328

帖子

0

TA的资源

纯净的硅(高级)

8
 
具体情况具体分析
写时钟周期w_clk,
读时钟周期r_clk,
写时钟周期里,每B个时钟周期会有A个数据写入FIFO
读时钟周期里,每Y个时钟周期会有X个数据读出FIFO
则,FIFO的最小深度是?

首先,这道题不一定有解
有解的必要条件是在一定时间内(足够长),写入的数据数量一定要等于读出的数据数量
因此有:A/B * w_clk = X/Y * r_clk

其次,算出写数据的最大burst_length。考虑最坏情况
比如,如果条件给出,每100个写时钟,写入80个数据,那么在背靠背的情况下,burst_length = 2*80=160

最后,fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk

BTW:通常,为了安全起见,都会多留一些depth的余度

个人觉得,公式应该是这样:
A/(B * w_clk) = X/(Y * r_clk)

fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk


举例说明:
如果100个写时钟周期可以写入80个数据,10个读时钟可以读出8个数据
其中w_ck=5ns,r_ck=10ns

如果按照之前的公式,得出的深度为:fifo_depth = burst_length - burst_length * X/Y * r_ck/w_clk=160-160*8/10*2=-94,显然是不对的

实际上,考虑背靠背(20个clk不发数据+80clk发数据+80clk发数据+20个clk不发数据的200个clk)

这样在中间160个写时钟周期连续写的情况下,只能读出160*5/(10*10)*8=64个数据,所以FIFO的深度应该为160-64=96
也就是fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk=160-160*8/10*5/10=96

大家可以讨论一下,加深对这个问题的认识。


    原帖由 windzjy 于 2007-1-14 17:18 发表
    个人觉得,公式应该是这样:
    A/(B * w_clk) = X/(Y * r_clk)

    fifo_depth = burst_length - burst_length * X/Y * w_clk /r_clk


    举例说明:
    如果100个写时钟周期可以写入80个数据,10个读时钟可以读出 ...

我以前看到过这个公式,是用来计算同步fifo的。

你所举的那个例子, 如果呼入fifo的数据宽度和呼出相同的话,都设为w bit。那么呼如fifo的带宽就是200wbps,呼出fifo的带宽是100wbps。考虑链路利用率都是80%。那么呼入fifo的有效带宽是 160wbps。呼出fifo的带宽是80wbps。现在看到矛盾了,由于输入输出带宽不相等,进来永远比出去多,那么FIFO总是处于不断积累数据的状态。所以lz所举的这个例子并不合适。
应该提高读时钟的速率,使fifo两端的带宽匹配,在这个前提下才能计算出有解的fifo深度。

如果令wclk=rclk (以下内容中的clk表示时钟的频率,不是周期)。可使得读写带宽匹配。那么这个例子的答案是32
原因如下: 考虑背靠背的情况,160个wclk连续都写入了160个数据。而这160个wclk时间内,由于wclk=rclk,那么读出了(16/10 )×8=128个数据。有32个数据会被留在fifo里。那么fifo的最小深度就是32。

如果令wclk=200mhz,改为100个wclk里写入40个,rclk=100mhz,10个rclk里读出8个。那么fifo深度为48
续上:
讲数据带入公式 fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
正好也是也是这个结果。所以我觉得公式是对的。
其实 A/B * w_clk = X/Y * r_clk 即 (A/B)*W_CLK=(X/Y)*R_CLK
所表达的含义就是 fifo的输入和输出带宽要匹配,其中A/B表示链路利用率,w_clk×width表示带宽,这里大概是默认输入输出的数据宽度相同,所以以wclk来代替带宽。 X/Y 和 r_clk 的含义也是这样:) 。在带宽匹配的前提下数据不会无限积累。

fifo_depth = burst_length - burst_length * (X/Y) * (r_clk/w_clk)公式是对的

续上:
fifo_depth = burst_length - burst_length * (X/Y) * (r_clk/w_clk) 作个变形,
得到 fifo_depth = burst_length - (burst_length /w_clk)*[r_clk*(x/y)]
其中(burst_length /w_clk) 表示这个burst的持续时间,r_clk*(x/y)表示读的实际速度。
两者的乘积自然就是这段时间读出的数据量。显然burst_length表示这段时间写入的数据量,两者的差为fifo中残留的数据,这个也就是理论上的fifo的最小深度。
实际应用中往往是以半空半满信号来指示fifo的空满状态的,所以实际设计fifo的时候会至少留下一个数据空间的深度裕量。

仔细看了一下发现自己的问题:
1,贴子中写时钟周期w_clk和读时钟周期r_clk并不是指的周期,而是指的频率
2,我举例不当,因该是wice3所说的那样,100个CLOCK写40个数据,这样在100个周期内
     写入的数据数量和读出的数据数量就一致了,不会造成溢出。

总结:
1,原公式还是对的,只是w_clk和r_clk意义描述的容易让人误解
2,又加深了对fifo的理解

有什么问题大家可以继续讨论。
此帖出自FPGA/CPLD论坛
 
 
 

回复

531

帖子

0

TA的资源

一粒金砂(高级)

9
 

回复 6楼 wenhuawu 的帖子

有道理,启发了我,我要写的是图像数据,会有同步时间的,感谢回贴
此帖出自FPGA/CPLD论坛
 
 
 

回复

340

帖子

0

TA的资源

纯净的硅(初级)

10
 
学习了
此帖出自FPGA/CPLD论坛
个人签名FPGA Topic
技术博客 http://www.cnblogs.com/ifpga
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表