Verilog基础知识7(FIFO深度计算)

需求说明:Verilog设计

内容       :第一部分 FIFO深度讨论

                  第二部分 FIFO深度计算

来自       :时间的诗

第一部分 FIFO深度讨论

原文:http://comm.chinaaet.com/adi/blogdetail/37555.html

其实很惭愧,在这之前用FIFO都是直接用IP,因为应用场景很简单,因此FIFO深度的选择也比较随意,并没想很多。今天在网上看到一个异步FIFO深度计算的题目,发现对于这块并不熟悉,因此注意了下,下面写写自己的一些理解吧。提前说明下,因为我实际中并没有碰到需要去计算FIFO深度的场景,因此可能有些理解是错误的,希望各位大侠能批评指正。

首先,一定要理解清楚FIFO的应用场景,这个会直接关系到FIFO深度的计算,如果是面试官抛出的问题,那么有不清楚的地方,就应该进行询问。如果是笔试或者工程中需要计算FIFO深度的话,那么就需要自己考虑清楚。

其次,异步FIFO,读写时钟不同频,那么FIFO主要用于数据缓存,我们选择的FIFO深度应该能够保证在最极端的情况下,仍然不会溢出。因此考虑的前提一般都是写时钟频率大于读时钟频率,但是若写操作是连续的数据流,那么再大的FIFO都无法保证数据不溢出。因此可以认为这种情况下写数据的传输是“突发Burst”的,即写操作并不连续,设计者需要根据满标志控制或者自己来控制写操作的起止。

宏观地,从整个时间域上看,"写数据=读数据",这个条件必须要满足,如果这个大条件不满足的话,用FIFO是没有效果的。但是在发送方"突发"发送数据的时间T内,是很有可能写数据>读数据的,因此FIFO的深度要能够保证,在这段时间T内,如果接收方未能将发送方发送的数据接收完毕的话,剩下的数据都是可以存储在FIFO内部而且不会溢出的,那么在发送方停止发送数据的"空闲时隙"内,接收方可以从容地接收剩下来的数据。

红字部分就是个人认为在FIFO深度计算中,最重要的部分了。接着来看一个例子,这是我看一个网友写时,是他当时遇到的一道笔试题。

一个8bit宽的AFIFO,输入时钟为100MHz,输出时钟为95MHz,设一个package为4Kbit,且两个package之间的发送间距足够大。问AFIFO的深度。

因为这位网友可能只是简述,因此信息并不完整,我的个人理解是这样的场景,一个异步FIFO,读写频率不同,读写位宽相同。发送发一次Burst突发的数据量为4Kbit,即500Word,在两次Burst突发之间有足够的时间,因此我们只用考虑在发送方Burst发送数据的时间T内,如果接受方没法将数据全部接受,其余数据均可存在FIFO内且不溢出,那么在发送方停止Burst发送数据的时间段内,接收方就可以从容的从FIFO内读取数据。首先发送方Burst发送数据的时间段为
T = 500/100MHz,发送的数据量为 B_send = 500word,而在T这段时间内,接收方能够接受的数据量为B_rec =  T*95MHz = 500 * 95 / 100 word = 475word,因此 B_remain = B_send - B_rec = 500 - 475 = 25 。那么FIFO的深度至少要大于等于25才行。

再看另外一个例子,还是从网上找到的,

写时钟频率w_clk,

读时钟频率r_clk,

写时钟周期里,每B个时钟周期会有A个数据写入FIFO

读时钟周期里,每Y个时钟周期会有X个数据读出FIFO

则,FIFO的最小深度是?

首先,我们可以认为写操作是Burst突发的。

其次,写操作的效率并不是100%的,而是A/B的,因此我们可以认为实际的F_wr = (A/B)*w_clk,同理,实际中F_rd = (X/Y)*r_clk。

另外,和第一个例子不同的是,这个题目里面并没有约束Burst突发的场景,在正常情况下,应该是这样的

空闲---Burst突发---空闲---Burst突发---空闲---Burst突发。但是我们在计算中,需要考虑最极端的情况,即

空闲---Burst突发---Burst突发---空闲---Burst突发---空闲。即传输过程中,可能会出现"背靠背"的情况,那么我们设计的FIFO深度必须能够保正,在"背靠背"的时间段内,如果接收方没法接受所有数据,那么剩余的数据可以被存储在FIFO内部且不会溢出。那么就可以开始计算了。假设"背靠背"时发送的数据 = BL,那么"背靠背"的时间 =  BL / w_clk ,注意,这段时间内 F_wr = w_clk  而不是之前提到的

(A/B)*w_clk。在这段时间内,接收方可以接受的数据 = (BL / w_clk)  * (X/Y)*r_clk ,

剩下的数据量 = BL -  ( BL / w_clk ) * (X/Y)*r_clk,那么FIFO的深度至少就要为

" depth =  BL -  ( BL / w_clk ) * (X/Y)*r_clk "这样的深度了。

将上述公式变换下,得到 depth = BL - BL  * (X/Y) * (r_clk/w_clk) 。这个公式就是网上流传的计算FIFO深度的公式,我想应该就是这个推理过程吧。

上述的讨论的一个前提就是FIFO的读写位宽一致,如果这个条件不满足的话,那么FIFO的深度的计算就更加复杂一些,但是我们还是可以把FIFO的读写位宽也折合成一定的因子,带入 实际的F_wr = (A/B)*w_clk 和 F_rd = (X/Y)*r_clk 中去,应该是是可以解决的。

第二部分 FIFO深度计算

原文 http://blog.sina.com.cn/s/blog_6a89f7010100mnua.html

如果数据流连续不断则FIFO深度无论多少,只要读写时钟不同源同频则都会丢数;

FIFO用于缓冲块数据流,一般用在写快读慢时,

FIFO深度 / (写入速率 - 读出速率) = FIFO被填满时间   应大于 数据包传送时间= 数据量 / 写入速率

例:A/D采样率50MHz,dsp读A/D读的速率40MHz,要不丢失地将10万个采样数据送入DSP,在A/D在和DSP之间至少加多大容量(深度)的FIFO才行?

100,000 / 50MHz =   1/ 500 s = 2ms

(50MHz - 40MHz) * 1/500 = 20k既是FIFO深度。

一种错误的算法(我也犯了同样的错误):

100,000/40MHZ=   1/400s = 2.50ms

(50M - 400M)*1/400 =25K.那么这样进去的数据就不是100K了,而是100K+50M*(0.0025-0.002)=125,000bit,错误在时间的计算

异步FIFO设计注意事项

异步FIFO的设计与同步FIFO的设计具有很大差距;设计的时候需要考虑跨时钟域处理带来的问题;

1、FIFO的设计必须解决empty和full控制问题;

2、异步FIFO可以考虑把写Addr在写时钟域转换成gray码,然后通过读时钟来寄存器,转换到读时钟域中,解决empty标记信号;

3、异步FIFO可以考虑把读Addr在读时钟域转换成gray码,然后通过写时钟来寄存器,转换到写时钟域中,解决full标记信号;

4、使用gray码的原因在gray码可以把Addr值连续变化的规例(但是Addr的会有多个bit跳变)转换成gray码中只有1个bit跳变,这样在跨时钟域传输中不会出现异步采取出现很大差异(异步时钟采样会出现亚稳态现象),最多是原始Addr值加1或者减1,这样不会使得FIFO状态出现错误;

当fifo的尺寸很大时候。用gray code 变得不太合算。

因为要从binary变成gray,再变回来。

这个时候,要用异步handshake来把地址转到另一个

时钟域里面。简单的说用 request  和 ack。

具体我也没有做过。

不过这是几乎每个美国公司面视毕问的问题。

所以研究透一点有好处。

计算FIFO深度-翻译-英汉对照版

introduction

One of the most common questions in interviews is how to calculate the depth of a FIFO.

在而试过程中,经常被问及的问题之一就是如何计算一个FIFO的深度。

Fifo is used as buffering element or queueing element in the system, which is by common sense is required only when you slow at reading than the write operation.

FIFO在统中用来作缓冲或者队列,通常情况下,当读速率比写速率慢的时候,需要采用FIFO。

So size of the FIFO basically implies the amount of data required to buffer, which depends upon data rate at which data is written and the data rate at which data is read.

所以FIFO的深度取决于需要缓冲的数据量,缓冲的数据量取决于写速率和读速率。

Statistically, Data rate varies in the system majorily depending upon the load in the system. So to obtain safer FIFO size we need to consider the worst case scenario for the data transfer across the FIFO under consideration.

统计表明,系统中数据率的变化主要依赖于系统的负载。所以,为了得到安全的FIFO,在设计时,我们需要考虑最坏情形下的通过FIFO进行的数据传输。

For worst case scenario, Difference between the data rate between write and read should be maximum. Hence, for write operation maximum data rate should be considered and for read operation minimum data rate should be considered.

最坏情况下,读写数据间的速率差,应该为最大值。也就是说,写操作速率应该取最大的写速率,而读操作应该取选小的读速率。

So in the question itself, data rate of read operation is specified by the number of idle cycles and for write operation, maximum data rate should be considered with no idle cycle.

如问题本身,读操作的数据速率是由空闲周期决定的,而对于写操作,最大的写数据率,应该不考虑空闲周期。

So for write operation, we need to know Data rate = Number of data * rate of clock. Writing side is the source and reading side becomes sink, data rate of reading side depends upon the writing side data rate and its own reading rate which is Frd/Idle_cycle_rd.

因而,对于读操作,我们有 Data rate = Number of data * rate of clock。写方是数据流入的方,而读方是数据露出方。读方的速率取决于写方的速率和自身的读速率(Frd/Idle_cycle_rd.)

In order to know the data rate of write operation, we need to know Number of data in a Burst which we have assumed to be B.

为了获知写方数据速率,我们需要知道在突发模式下的数据量,我们假设其为B.

So following up with the equation as explained below: Fifo size = Size to be buffered = B - B * Frd / (Fwr* Idle_cycle _rd ).

参考如下的等式:Fifo size = Size to be buffered = B - B * Frd / (Fwr* Idle_cycle _rd ).

Here we have not considered the sychnronizing latency if Write and Read clocks are Asynchronous. Greater the Synchronizing latency, higher the FIFO size requirement to buffer more additional data written.

这里,我们没有考虑由于异步读写需要同步,所引入的延时。越大的延时,需要越大的FIFO来缓冲更多和写数据。

Example : FIFO Depth Calculation

例子:计算FIFO深度

Assume that we have to design a FIFO with following requirements and We want to calculate minumum FIFO depth,

假充我们需要设计如下需求的FIFO,我们需要计算它的最小深度。

A synchronized fifo 异就FIFO

Writing clock 30MHz - F1    写时钟

Reading clock 40MHz - F2     读时钟

Writing Burst Size - B     突发数据量 

Case 1 : There is 1 idle clock cycle for reading side - I  读方一个空闲周期 

Case 2 : There is 10 idle clock cycle for reading side - I  读方10个空闲周期 

FIFO depth calculation = B - B *F2/(F1*I)

If if we have alternate read cycles i.e between two read cycle there is IDLE cycle.

如果我们已经改变了读周期,比如,两个读周期中有一个空闲周期。

FIFO depth calculation = B - B * F2/(F1*2)

In our present problem FIFO depth = B - B *40/(30*2)

= B(1-2/3)= B/3

That means if our Burst amount of data is 10 , FIFODEPTH = 10/3 = 3.333 = 4 (approximatly)

If B = 20 FIFO depth = 20/3 = 6.6 = 7or 8 (clocks are asynchronous)

If B = 30 FIFO depth = 30/3 = 10   10+1 = 11 (clocks are asynchronous)

If 10 IDLE cycles betweeen two read cycles .

FIFO DEPTH = B - B *F2/(F1*10) .= B(1-4/30)= B * 26 /30

时间: 2024-11-01 20:47:45

Verilog基础知识7(FIFO深度计算)的相关文章

Linux基础知识题解答(五)

题目来自老男孩BLOG:http://oldboy.blog.51cto.com/2561410/1709569,比较适合新手,空余的时候做一下,可以巩固Linux基础知识,有不对的地方欢迎指正. (1)155729 -rw-r--r--.  1 root root   35 Oct 28 2011  oldboy 请解析上面的每一列内容 文件inode号,文件访问权限,硬链接数,文件所属用户,文件所属组,文件最后修改时间,文件名 (2)描述下硬链接和软连接的区别 1.硬链接原文件/链接文件共用

服务器架设笔记——Apache模块开发基础知识

通过上节的例子,我们发现Apache插件开发的一个门槛便是学习它自成体系的一套API.虽然Apache的官网上有对这些API的详细介绍,但是空拿着一些零散的说明书,是很难快速建立起一套可以运行的系统.(转载请指明出于breaksoftware的csdn博客) 为了实现最基础的URL解析等功能,我把<Apache模块开发指南>一书粗略了翻看了两遍,以利于迅速了解Apache模块编程的相关知识.至于书中具体的知识点,我并不在此赘述.但是为了便于大家了解之后遇到的各种相关的知识点,我大致罗列几条(摘

JS基础知识回顾:引用类型(一)

在ECMAScript中引用类型是一种数据结构,用于将数据和功能组织在一起,而对象时引用类型的一个实例. 尽管ECMAScript从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构,所以虽然说引用类型与类看起来想死,但他们并不是相同的概念. 不过引用类型有的时候也可以被称为对象定义,因为他们描述的是一类对象所具有的属性和方法. 新对象是使用new操作符后跟一个构造函数来实现的,构造函数本身就是一个函数,只不过该函数时处于创建新对象的目的而定义的. ECMASc

Linux基础知识题解答(六)

题目来自老男孩BLOG:http://oldboy.blog.51cto.com/2561410/1709569,比较适合新手,空余的时候做一下,可以巩固Linux基础知识,有不对的地方欢迎指正. (1)怎样查看文件或目录的属性,给出命令. ls -l 或者 ll (2)描述硬链接和软链接的区别 1.硬链接原文件/链接文件共用一个inode号,说明他们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件:2.在文件属性上软链接明确写出了是链接文件,而硬链接没有写

如何学习FPGA?FPGA学习必备的基础知识

如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识 FPGA已成为现今的技术热点之一,无论学生还是工程师都希望跨进FPGA的大门.网络上各种开发板.培训班更是多如牛毛,仿佛在告诉你不懂FPGA你就OUT啦.那么我们要玩转FPGA必须具备哪些基础知识呢?下面我们慢慢道来. (一) 要了解什么是FPGA 既然要玩转FPGA,那我们首先最重要的当然是要了解什么FPGA.FPGA(Field-Programmable Gate

iOS开发多线程基础知识

--------------------------多线程概念基础------- 进程:正在运行的程序 内存:每个进程所占的存储空间 线程:1个进程要像执行任务,必须得有线程,线程是进程的基本执行单元, 线程的串行: ·1个线程中人物的执行是串行的 ·0同一个时间内,1个线程只能执行1个任务 0·线程是进程的一条执行路径 --------多线程 ·一个进程中可以开启多条线程,每条线程可以并行(同时)同时执行不同的任务 ·进程->车间 线程->车间工人 线程的并行: ·进程内多个线程同时执行,可

线程基础知识系列(四)线程的同步2 线程通信和Condition变量

本文是系列的第四篇. 线程基础知识系列(三)线程的同步  :同步控制,锁及synchronized 线程基础知识系列(二)线程的管理 :线程的状态,控制,休眠,Interrupt,yield等 线程基础知识系列(一)线程的创建和启动  :线程的创建和启动,join(),daemon线程,Callable任务. 第三篇文章,重点阐述了如何使用锁和同步块对线程间共享可变变量保护,保证只有一个线程可以进入临界区.其实,没有过多的涉及另一个重要的同步概念:线程协作.第三篇中涉及的线程间并没有有效的协调.

socket网络编程的一些基础知识

源地址:http://blog.csdn.net/roger_77/article/details/1453049 目录: 1) 什么是套接字? 2) Internet 套接字的两种类型 3) 网络理论 4) 结构体 5) 本机转换 6) IP 地址和如何处理它们 7) socket()函数 8) bind()函数 9) connect()函数 10) listen()函数 11) accept()函数 12) send()和recv()函数 13) sendto()和recvfrom()函数 

(转)Linux基础知识学习

Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过修改配置文件来完成. 1.1.Linux磁盘分区 Linux可以将磁盘分为多个分区,每个分区可以被当做一个独立的磁盘使用,磁盘类型:主分区.扩展分区.逻辑分区. 主分区标记为活动,用于操作系统的引导,一块磁盘最多划分4个主分区,主分区存放操作系统的文件或用户数据. 扩展分区:主分区小于4个时才可以划