DDR3学习总结(二)

DDR带宽计算

IO时钟频率:

根据Part Number 中的“-125”我们就可以找到图中speed,根据这里tCK = 1.25ns,就可以算出芯片支持的最大IO时钟频率:1/1.25ns = 800Mhz;此处的IO时钟频率也就是DDR3的频率;(虽然DDR3最大支持的频率可以很高,但是还需考虑你选择的FPGA是否可以到这个速率)

位宽:

根据Part Number 中的“256M16”我们可以找到图中Configuration所指出的地方,这里的16是代表芯片的数据位宽是16位(也就是16根数据线)。

翻看A7数据手册ds181可以看到:

A7系列的FPGA所支持的DDR3传输速率高达1066Mb/s,板卡选用的xc7a100tfgg484-2 FPGA能支持的最高速率是800Mb/s,对应频率= 800M/2= 400Mhz;

带宽:

由于是DDR方式传输数据(上升和下降沿都传输),所以芯片的一根数据线上的传输速率 = 2*400Mhz = 800Mb/s。其实就是800Mbit/s;

FPGA挂载两片DDR,带宽就是32根数据线同时传输的数据速率 = 800Mbit/s x 32 = 25600Mbit/s = 3200Mbyte/s = 3.125GByte/s

两片DDR级联共32个数据位,每次读写8个地址,共256bit

ddr带宽 : 256bit x 100M =25600Mbps

DDR读写

1.DDR读写带宽计算

ddr读写需要考虑带宽使用率(写测+读测 /总带宽),读写时间是否满足,两个问题。

假设:将源头2240列 x 1400行 x 8bit x 720hz 约=16.83Gbps图像数据,裁剪为1920 x 1080 x 8 x 720hz 约= 11.13Gbps图像写入到ddr,写测带宽约为11.1Gbps,从ddr读出图像显示为2200 x 1125 x 8 x 180hz 约=3.32Gbps(1080p的图像显示,除有效区域外还有消隐行)

(11.13 + 3.32)/(256bit x 100M /1024) 约= 57.8% 理论上DDR除了读写操作外还需要刷新等操作,在不乒乓切换情况下,可以实现约90%的带宽利用率 ,一般情况下可以实现70%的带宽使用率。

2.工作时钟,帧率与带宽计算

假设使用32对LVDS lane传输图像数据,然后写入ddr,后面再读出显示。

那么时钟与帧率之间的计算关系如下图:

f = 280M ,帧率 710hz 左右 ,那么原画2240 x 1400 x 8 x 710hz裁剪后,DDR写测 :1920 x 1080 x 8bit x 710 hz 约= 10.97Gbps 出口为: 2200 x 1125 x 8 x180hz 约= 3.32Gbps ,读写带宽使用率不到70%,完全是可以满足的。

但是, 读写时间的话 图像一行是2240 x 8 bit /32 x 8bit = 70个周期,裁剪成1920就是60个周期,即传输一行数据需要70个周期,有效数据占60个周期(DDR一次写突发长度为8,也就是256it,一行有效数据需要写60次,也就是100M时钟下60个周期),再根据上面计算得出的读写带宽比例,大约为5:1,所以在每一行传输的周期内,写占60个周期,那么读至少也要12个周期,才能将图像数据读完,否则一帧图像写完,开始写第二帧,可是第一帧图像没有读完,一直重复 ,到后面堆积的数据越来越多,总会出现,新写入的数据覆盖原先一帧没读完的数据,这样读出的图像就出错了。

按照上述的计算,一行图像的读写至少需要72个周期,所以ddr读写虽然能满足带宽使用率,但是读写时间不满足。

而且上面的计算是粗略的计算,因为除了ddr读写时间,还有预充电,行列切换,刷新等操作也需要消耗一部分时间,还有就是ddr工作效率还和温度有关,随着温度升高,效率还会降低(虽然你给读写分配了很多时间,但是芯片的使能信号app_rdy会拉低,此时无法进行读写,这也就是为什么有的项目设计ddr一开始读写很正常,长时间烤机就出错了,所以读写时间需要尽量分配的充裕一点)

读写带宽与时间的分配

通过上面的计算,我们的ddr不能满足工作的条件,所以,假设我们抽取原图的1/4,减少ddr入口的数据。那么,在原先的处理时间内,需要处理的数据量减少了,时间应该也就满足了,我们来计算一下 读写比例约为4:1 ,ddr每写15个数据,至少要读出4个数据。

ddr写测:1920/4 x 1080 x 8 x 720 = 3.7Gbps

ddr读测: 2200 x 1125 x 8 x 180 /4 = 0.9Gbps

我们按照100拍来分配,读写状态机分为write,read,hold(占很小一份,为0也不影响)。理论上读写比例为4:1,写80拍,读20拍即可满足。但是在实际调试过程中,还是会存在问题,可以从读测先开始分配,需要读出4个数据,我们按读效率50%算,给读分配10拍,其余近90拍给写,按照上述分配实测是可以满足ddr工作的。

在ddr读写状态机中,还存在其他分配方式,一个周期里循环两次,三次以及更多次write,read,hold,可以将读写切的很碎,但是分的越碎,效率越低,假设每次分配的写,刚好遇到app_rdy为低的时候,那就悲催了。

读写FIFO

ddr在进行数据读写时,大部分情况下都是与前后两端的数率不匹配的,所以会用两个wfifo和rfifo先缓存,解决跨时钟域问题。DDR3工作时给用户提供的ui_clk时钟频率在100M.

(1)首先wfifo读测与DDR工作速率一致为100M,如果写的速率较慢,fifo会出现读空的情况,所以wfifo中要先写入一定量的数据。写的快读的慢,fifo快满时,almost_full信号拉高就不能往fifo里面写了,等到almost_full为低时,即可再次往fifo里面写。

假设wfifo写时钟为50M,有15个数据要写入ddr,那么wfifo读15个数据15/100M=150ns,在50M下 150ns x 50M = 7.5,所以为防止wfifo读空,需要先往wfifo中写至少7.5个数据,才能开始读。

(2)rfifo,在一个读写周期内,写时间占的时间比较长,所以在ddr写时间内,后面的rfifo还是在往外读数据的,所以rfifo的深度要满足,至少在ddr写数据时,rfifo不能读空。

按照上述写占90拍,那么这90拍时间内,rfifo中不往里写数据,但是会往外读数据,根据我们的设计是148.5M时钟下,128拍出3个256bit数据

90/100M = 90ns 128/3/148.5M 约= 29ns 90/29约=3.2 所以在写的这段时间内,rfifo中最少要有3.2个数据,不然fifo就读空了。

fifo深度与门限设置

以rfifo为例:首先从rfifo写开始分析,根据上述ddr 读写分配,rfifo的最小深度要大于3.2个,又因为==DDR读数据存在一定的延时,大概30拍左右,也就是说,DDR读结束命令发出,实际链路上还会有30个数据写入到fifo中。==如果fifo深度过小,那么延时到来的数据会被丢失。所以在此情况下,设置rfifo深度大于33.2,是可以满足需求的,(fifo深度为2的幂次方,且一些将满和空的信号阈值设置是在一定范围内的)。实际上,rfifo两侧带宽都不是固定的,是动态变化的,(写的同时rfifo也在出数据,所以延时到来的30个数据需要的深度是小于30的),所以深度和门限是可以根据两侧带宽大致计算出的。

fifo IP核设置中有如下页

设置rfifo深度为32,Full Threshold Assert Value满断言阈值,设为20,即rfifo里面存入20个数据就停止往里面写了,Full Threshold Negate Value满取消断言阈值,设置为12,即rfifo里面数据少于12个,又可以开始往里面写了。(2K82项目,原本rfifo设置深度为2048,两个阈值设置为1600,100。经过分析与计算,实际设置为深度32,两个阈值设置为20,12即可满足需求。)

反压

假设,fifo两侧入和出速率为2:1,那么理论上fifo的深度需要无限大,否则就会溢出,那么我设置fifo深度为3,门限为2,fifo中数据数量为2时停止写,当数量小于2时继续写,这就是反压。

还以上述入和出速率为2:1,可以用两个fifo,两拍交替写入两个fifo中,这样入和出速率就匹配上了。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年12月7日
下一篇 2023年12月7日

相关推荐