zoukankan      html  css  js  c++  java
  • FPGA开发基础————异步FIFO深度的计算与分析(1)

        这个文章早就想总结一下了,因为在自己刚开始学FIFO在处理异步多bit数据的时候,总对这个FIFO的深度选取跟耿于怀。看视频感觉也是讲的模棱两可。下面就主要总结一下,几种情况

    第一种情况:

    fA > fB 读写之间没有空闲周期(fA > fB 在两个连续读写之间有一个周期的延迟):

    写速率fA = 80MHz

    读速率fB = 50MHz

    突发长度Burst Length = 120

    读写之间没有空闲周期,是连续读写一个突发长度.

    解决的方法:

      写一个数据需要的时间 = 1 / 80MHz = 12.5ns,写一个突发需要的时间 = 120 * 12.5ns = 1500ns,读一个数据需要的时间 = 1 / 50MHz = 20ns,每1500ns,120个数据被写入FIFO,但读一个数据需要20ns的时间,可以计算出,1500ns内读出多少个数据,1500 / 20 = 75,剩下的没有读出,就存在FIFO中,则需要120 - 75  = 45,所以这种情况下,需要的FIFO最小深度为45

    第二种情况:

    fA > fB读写都有空闲周期(fA > fB并给出了读写使能的百分比

    写速率fA = 80MHz

    读速率fB = 50MHz

    突发长度Burst Length = 120

    两个连续写入之间的空闲周期为 = 1(写使能占得百分比为 = 50% = 1 / 2

    两个连续读取之间的空闲周期为 = 3(读使能占得百分比为 = 25% = 1 / 4

    解决的方法:

    注意:两个连续写入之间的空闲周期为1的意思是,每写入一个数据,要等待一个周期,再写入下一个数据。这也可以理解为每两个周期,写入一个数据。

    注意:两个连续读取之间的空闲周期为3的意思是,每读取一个数据,要等待三个周期,再读取下一个数据。这也可以理解为每四个周期,读取一个数据。

    写一个数据需要的时间 = 2 * (1 / 80MHz) = 25ns

    写一个突发需要的时间 = 120 * 25ns = 3000ns

    读一个数据需要的时间 = 4 * (1 / 50MHz) = 80ns

    每3000ns,120个数据被写入FIFO,但读一个数据需要80ns的时间

    可以计算出,3000ns内读出可以多少个数据,3000 / 80 = 37.5

    剩下的没有读出,就存在FIFO中,则需要120 - 37.5 = 82.5 约等于 83

    第三种情况:

    fA < fB 读写操作无空闲周期(每两个连续读写之间有一个周期延迟)

    解决的方法:想想怎么赛跑的,小明领先小强一圈(视作FIFO),然而小明的速度>小强的速度,永远填补不了那一圈,所以永远写不满。

    第四种情况:

    fA < fB 读写操作有空闲周期(读写使能占得百分比问题)

    写速率fA = 30MHz

    读速率fB = 50MHz

    突发长度Burst Length = 120

    两个连续写入之间的空闲周期为 = 1

    两个连续读取之间的空闲周期为 = 3

    解决的方法

    两个连续写入之间的空闲周期为1的意思是,每写入一个数据,要等待一个周期,再写入下一个数据。这也可以理解为每两个周期,写入一个数据。

    两个连续读取之间的空闲周期为3的意思是,每读取一个数据,要等待三个周期,再读取下一个数据。这也可以理解为每四个周期,读取一个数据。

    写一个数据需要的时间 = 2 * (1 / 30MHz) = 66.667ns

    写一个突发需要的时间 = 120 * 66.667ns = 8000ns

    读一个数据需要的时间 = 4 * (1 / 50MHz) = 80ns

    每8000ns,120个数据被写入FIFO,但读一个数据需要80ns的时间

    可以计算出,8000ns内读出可以多少个数据,8000 / 80 = 100

    剩下的没有读出,就存在FIFO中,则需要120 - 100 = 20

    所以这种情况下,需要的FIFO最小深度为20

     第四种情况:

    fA = fB 读写操作无空闲周期(每两个连续读写之间有一个周期延迟)

    这个不用说了吧,

     第五种情况:

    fA = fB 读写操作有空闲周期(读写使能占得百分比问题)

    写速率fA = 50MHz

    读速率fB = 50MHz

    突发长度Burst Length = 120

    两个连续写入之间的空闲周期为 = 1

    两个连续读取之间的空闲周期为 = 3

    解决方法:

    两个连续写入之间的空闲周期为1的意思是,每写入一个数据,要等待一个周期,再写入下一个数据。这也可以理解为每两个周期,写入一个数据。

    两个连续读取之间的空闲周期为3的意思是,每读取一个数据,要等待三个周期,再读取下一个数据。这也可以理解为每四个周期,读取一个数据。

    写一个数据需要的时间 = 2 * (1 / 50MHz) = 40ns

    写一个突发需要的时间 = 120 * 40ns = 4800ns

    读一个数据需要的时间 = 4 * (1 / 50MHz) = 80ns

    每4800ns,120个数据被写入FIFO,但读一个数据需要80ns的时间

    可以计算出,8000ns内读出可以多少个数据,4800 / 80 = 60

    剩下的没有读出,就存在FIFO中,则需要120 - 60 = 60

    所以这种情况下,需要的FIFO最小深度为60

     

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

    公式:fifo_depth = burst_length - burst_length * (X/Y) * (r_clk/w_clk)

    burst_length = 4Kbit/8bit ,有两种结果,其一,根据存储厂商的惯用算法,4Kbit=4000bit,burst_length=500;其二,用一般二进制算法,4Kbit=4*1024=4096bit,burst_length=512。

    因为X和Y的值没有给出,所以默认为1.

    可得:其一,fifo_depth = 500 - 500*(95/100)= 25 ,所以fifo_depth最小取值是25 。

             其二,fifo_depth = 512 - 512*(95/100)= 25.6 ,所以fifo_depth最小取值是26 。

    参考:

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

    https://blog.csdn.net/u011412586/article/details/10241585/

  • 相关阅读:
    Docker容器部署 Nginx服务
    trap 的用法 /etc/init.d/rcS trap :1 2 3 24
    android system setup and building (2)
    ubuntu 中建立tftp 服务器
    Mount nfs 报错Protocol not supported
    android system setup and building (1)
    mknod 详解
    linux 内核中已经定义的主设备号及查看设备设备号
    fstab 文件详解
    Linux根文件系统的挂载过程分析
  • 原文地址:https://www.cnblogs.com/lgy-gdeu/p/12891678.html
Copyright © 2011-2022 走看看