关于FIFO的深度计算

2 篇文章 0 订阅
1 篇文章 0 订阅
  • 1、FIFO深度计算

例如(对于同步fifo,每100个cycle可以写入80个数据,每10个cycle可以读出8个数据,fifo的深度至少为? )
参考网址:https://blog.csdn.net/times_poem/article/details/51917648

  1. 首先

要确实FIFO的应用场景
并且最终要保证在最极端的情况下,仍不是发生溢出以及空数据的情况。如果数据是连续的数据流,那在频率不同的异步FIFO中,当写入频率大于读出频率时,FIFO必定是溢出的。因此这个时候需要确定数据的传输的突发性的,也就是一段一段的传输而不是连续的。

网上的:宏观地,从整个时间域上看,“写数据=读数据”,这个条件必须要满足,如果这个大条件不满足的话,用FIFO是没有效果的。但是在发送方"突发"发送数据的时间T内,是很有可能写数据>读数据的,因此FIFO的深度要能够保证,在这段时间T内,如果接收方未能将发送方发送的数据接收完毕的话,剩下的数据都是可以存储在FIFO内部而且不会溢出的,那么在发送方停止发送数据的"空闲时隙"内,接收方可以从容地接收剩下来的数据
总结上述的话:就是说在突发传输期间内,输入的数据减去输出的数据的剩下的数据还不会使FIFO溢出,那就FIFO的深度够用。同理不会空的情况也就是如此。

  1. 然后

例题:一个8bit宽的AFIFO,输入时钟为100MHz,输出时钟为95MHz,设一个package为4Kbit,且两个package之间的发送间距足够大。问AFIFO的深度。
这里理解是:一个突发周期内为4Kbit,根据上面的位宽,也就是500个数据。
计算突发发送数据的时间为T=500/100MHz(这里每一个数据的发送时间是频率的倒数)。数据发送量为500.然后计算在T时间内,从FIFO中传输出去的数据。即为TX95MHZ=500x95/100=475个数据。那也就是说FIFO的深度至少大于500-475=25也就是说,FIFO的深度至少为25以上,又因为FIFO的深度设置为2N,也就是2的倍数。因此FIFO的深度至少设置为32 depth

  1. 然后

解答上述的题目:
可以认为写操作是突发写的。然后要考虑突发的情况,一般情况下,数据传输是:空闲—Burst突发—空闲—Burst突发—空闲—Burst突发。但是我们在计算中,需要考虑最极端的情况,即空闲—Burst突发—Burst突发—空闲—Burst突发—空闲。
以最极端的情况空闲—Burst突发—Burst突发—空闲来计算。
此时考虑背靠背(20个clk不发数据+80clk发数据+80clk发数据+20个clk不发数据的200个clk)

  1. 也就是说

首先
是一个突发写的数据个数为80/100 x W_CLK(这个是实际写频率)
同理由于是同步FIFO一个突发读数据为8/10 x W_CLK (这个为实际的读频率,这是原读频率等于原写频率,才能这么计算。)
为什么这里是实际的频率?
8/10是指一个周期内会有0.8个数据传输,再乘以频率等于也就是说在10个周期内不是实际的每个周期内都读取数据,而是有两个周期未读取数据,这样导致实际的周期增加,也就是实际的频率降低。计算出实际的等效频率为8/10 x W_CLK
在背靠背时发送的数据位160,这段时间为160/ W_CLK(这是的频率是原有的频率而不是上面计算后的频率。).
那么这段时间内读出的数据为160/ W_CLK x 8/10 x W_CLK
也就是得到最终的FIFO深度为
160-160/ W_CLK x 8/10 x W_CLK=160-128=32
此时设置最少FIFO深度为32即不会发生溢出的情况,但是会有满的情况。这是按最极端的情况来计算的。

然后
如果令wclk=200mhz,改为100个wclk里写入40个,rclk=100mhz,10个rclk里读出8个。那么fifo深度为48

计算如下fifo_depth =80-80X(80%)X(100/200)=80-32=48

  1. 总结:

写时钟频率 w_clk,
读时钟频率 r_clk,
写时钟周期里,每B个时钟周期会有A个数据写入FIFO
读时钟周期里,每Y个时钟周期会有X个数据读出FIFO
则,FIFO的最小深度是?

计算公式如下:

fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk
其中burst_length为实际的突发写长度,其最大为上述两个A。如果按正常的突发写一个A长度也是按上述的公式计算。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
异步FIFO和同步FIFO是两种不同的FIFO(First-In-First-Out)设计方式。 异步FIFO是指读写时钟为不同时钟,读写时钟彼此相互独立。异步FIFO的设计关键点是区分读空和写满这两种不同的状态,即FIFO在被写满后不能再写入,从而覆盖原有数据;再被读空后不能再进行读操作,防止读取无效数据。异步FIFO的设计方法包括计数器法、高位扩展法和单端口/双端口RAM等。\[1\] 同步FIFO是指读时钟与写时钟为同一时钟,在时钟上升沿同时发生读写操作。同步FIFO的设计方法包括使用计数器和RAM实现同步FIFO。同步FIFO的读写判断存在漏洞,不是真空或真满,因为写指针和读指针需要通过两级寄存器同步到对应的时钟域,同步后的指针可能小于或等于当前实际的指针,所以判断FIFO为空或满不一定是真空或真满。这种设计保守但不会出错。\[2\] 异步FIFO和同步FIFO在设计和工作原理上有所不同,具体选择哪种方式取决于具体的应用需求和设计要求。 #### 引用[.reference_title] - *1* [同步FIFO与异步FIFO](https://blog.csdn.net/buzhiquxiang/article/details/103287220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [同步FIFO、异步FIFO详细介绍、verilog代码实现、FIFO最小深度计算、简答题](https://blog.csdn.net/qq_42135020/article/details/129994364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值