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中,这样入和出速率就匹配上了。
DDR3学习总结(二)相关推荐
- 语义分割:基于openCV和深度学习(二)
语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- Mybatis底层原理学习(二):从源码角度分析一次查询操作过程
在阅读这篇文章之前,建议先阅读一下我之前写的两篇文章,对理解这篇文章很有帮助,特别是Mybatis新手: 写给mybatis小白的入门指南 mybatis底层原理学习(一):SqlSessionFac ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
- Membership学习(二)membership入门
Membership学习(二)membership入门 --不写一行代码在asp.net中实现用户验证管理系统 这篇文章我们将实现一个简单的网站,在网站中实现用户的身份验证,创建用户,修改密码 还有限 ...
- appium学习【二】:用try捕获异常后,用例的执行结果为pass
appium学习[二]:用try捕获异常后,用例的执行结果为pass 参考文章: (1)appium学习[二]:用try捕获异常后,用例的执行结果为pass (2)https://www.cnblog ...
- PyTorch学习笔记(二)——回归
PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...
- tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数
tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报 分类: tensorflow(4) 目录(?)[+] 本笔记目的 ...
- Maven学习总结(二)——Maven项目构建过程练习
2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(二)--Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验 ...
- Scapy学习笔记二
Scapy学习笔记二 Scapy Sniffer的用法: http://blog.csdn.net/qwertyupoiuytr/article/details/54670489 Scapy Snif ...
最新文章
- Python学习教程(Python学习路线):Python面试100题(二)
- python tk下拉列表的state_Python tkinter之ComboBox(下拉框)的使用简介
- python编程基础与应用-Python程序设计基础与应用
- 021 设计模式之工厂方法模式,抽象工厂模式的区别
- VTK修炼之道79:交互与拾取_单位拾取
- python-opencv时间计算,视频物体追踪标记
- 吸尘器电机拆解图解_老少皆宜居家清理更轻松?吉米A6上手把无线吸尘器体验...
- matlab练习程序(PCASVD)
- 基于阿里云的 Node.js 稳定性实践
- python 进位_蓝桥杯-Python-高精度加法
- java批量上传文件_Spring Boot2(十四):单文件上传/下载,文件批量上传
- poj 1159 (DP LCS)
- PowerBuilder反编译,PowerBuilder 反编译
- webstorm小程序插件和中文插件
- 迅雷精简版 for Mac(迅雷下载器)v4.1.2中文版
- 【知识点总结】自动控制原理(自控)
- 查看ubuntu版本号
- mini计算机结构,简单拆机看内部构造_苹果 Mac mini MGEN2CH/A_台式电脑评测-中关村在线...
- 印度影星沙鲁克-罕简介
- php 字符串 strpos,PHP字符串处理函数:strpos() -- 内置函数
热门文章
- HBuilderX、微信开发者工具、VScode之间运行微信公众号
- HECATE G2耳机麦克风问题解决
- 【vue2】中 谷歌 Chrome 实现自定义页眉页脚打印
- 如何在网页标题前添加图标
- 阿里巴巴巨震,堪比地震
- HDOJ Saving HDU JAVA 2111
- 06.图像识别与卷积神经网络------《Tensorflow实战Google深度学习框架》笔记
- uniapp 安卓 跳转到系统浏览器_Android 实现浏览器跳转APP应用,网页也可以跳转APP...
- 毛利率逼近茅台,巨子生物赴港IPO市场会买单吗?
- 美团CAT客户端(windows版)接入指南