sdram 时钟相位_零基础学FPGA (二十五)必会! 从静态时序分析到SDRAM时序收敛(下篇)...

七、SDRAM工作时钟相位偏移计算本文引用地址:http://www.eepw.com.cn/article/279083.htm

从上篇文章中我们知道,我们的数据是要经过一定的延时才会到达目标器件的,这个延时也就是相对于源寄存器的时钟发射沿的时间延时,数据在源寄存器时钟的上升沿到来时输出,经过FPGA的走线,PCB走线等,到达目标寄存器的数据端口时会有一定的延时,而这个数据要想被目标器件的目的寄存器锁存,那么,目的寄存器的锁存时钟应该尽量在数据的有效窗口内才能确保数据被捕获成功。所谓数据的有效窗口,就是数据在两次变化之间的中间部分,也是数据最稳定的部分。

所以,要想将数据正确捕获,我们的SDRAM工作时钟必须相对于源时钟有一定的相位偏移,这个相位偏移是我们可以在PLL模块中手动设置的,这个值应该取多少?下面我们就来计算这个值。

这个相移值的计算,需要借助四个参数,即读周期最大滞后、超前时间,写周期最大超前、滞后时间,下面依依来讲

1、读周期滞后时间

所谓读周期滞后时间就是,SDRAM的工作时钟相对于FPGA的工作时钟慢了多少时间。我用一个图来解释

1892da09b0c18a73cf9803830afc8b59.png

下面我来解释一下这个图,既然是读周期,那么就是在SDRAM的工作时钟下发出数据,在FPGA的工作时钟下捕获数据,由上图可以看出,读周期的滞后时间就是图上的两个参数相减对吧,在理论篇里我讲过,SDRAM在发出一个数据之后,数据会保持一段时间的稳定,这个参数就是Toh,这个参数可以查到。

数据发出后,需要被FPGA的工作时钟捕获,但是捕获的时候需要考虑保持时间不能违规,因此,Th这个参数就是FPGA的寄存器保持时间,这个参数我们需要从时序报告里查,等会我们再说,那么我们可以计算出

读周期最大滞后时间 = Toh - FPGA的保持时间Th

2、读周期超前时间

所谓超前时间,就是SDRAM的工作时钟相对于FPGA的工作时钟快了多少

8f1f85388e49f9d727286db76f477c41.png

看到这里,有些人可能就不明白了,SDRAM的时钟比FPGA的时钟相位快了还怎么捕获数据咧?其实,我所说的快慢,只是说时钟的上升沿谁在前而已,我们完全可以这么理解,就是数据是在SDRAM时钟的前一个时钟沿发出的,

上面的原图是错的,即SDRAM发出数据后,要经过Thz的时间数据才会有效,这个时间也是可以查到的,即我们前面理论篇所讲的参数那个参数TOH,注意这个TOH和上面的那个Toh是不一样的。然后是FPGA的建立时间,我们从时序报告里查。那么,可以得到

读周期最大超前时间 = Tclk - (TOH + FPGA的建立时间Tsu)

3、写周期滞后时间

5a66fb3b6dea10fc775ce5bfdc431bf0.png

原图也是错误的,既然是写周期,那么就是在FPGA的工作时钟下发数据,在SDRAM的工作时钟下捕获数据,那么源寄存器的工作时钟上升沿到来时,数据发送,要等一段时间后,数据才会有效,这段时间应该是FPGA寄存器的输出延时时间,即图上的Tcomax,这个参数我们需要到时序报告里找,Tss当然就是SDRAM的建立时间了,所以我们可以得到

写周期滞后时间 = Tclk - (Tcomax + SDRAM的建立时间Tsu)

4、 写周期超前时间

3f06a31fda2be3e89f3fe67496abe8f2.png

这个图可能刚开始理解起来不太好看,我用红笔标出来了,也就是说,这里的Tcomin参数,是当下的时钟沿,到下一个数据有效的时间,而当前的数据,是上一个时钟沿发出的。当然,Toh即SDRAM锁存数据的保持时间了,因此我们得到

写周期最大超前时间 = Tcomin - Toh

5、参数计算

下面我们来找这些参数,将上篇文章中的数据添加约束之后,执行一次全编译,当然这个时候肯定是时序不收敛,不过没关系,时序收不收敛跟我们的PFGA建立保持时间以及数据输出时间是没什么关系的。

我们先来看建立保持时间,由于建立保持时间是读周期的参数,因此,我们查看读周期的路径时序报告,也就是sdram_data路径

c34f5b54919b1277bd86fc3f37b7b97a.png

我们右键,报告最糟糕路径得到下图

4d11c1e5b5ac8223cb4c3c023841c3d5.png

书上说的是,从左上方的数据到达路径中可以得出

数据的建立时间 17.602 - 7.291 - 3.279 =7.032ns

即准建立时间 - 发射沿相对时间 - 时钟网络延时的时间,其实单看这个公式是不好懂的,小墨当时也不明白为什么建立时间是这么算的呢?后来我看了一下右面的图,才渐渐明白过来,其实看右面的图更容易理解一点

b3b1f7d6a99f683dcf5f07e97535ce2d.png

看了这个图我们就会明白,当17.602 减去那两项之后,剩下的就是我们设置的最大输入延时时间以及数据进入FPGA的走线延时时间,为什么这段时间是建立时间呢?我们之前不是定义数据不是应该在建立时间内保持稳定吗?但是这段时间内,数据还没到啊。对,没错,好像是这样的,数据没到,为什么没到呢?是因为我们的数据延时太长,以至于我们的捕获时钟在当下的时钟沿捕获不到,因此,这就涉及到了多周期路径约束的知识,我们可以让捕获周期为2 ,也就是说,等到下一锁存沿到来的时候再把数据捕获就好了。

我们再来看一下这两段时间,第一段时间,也就是时钟发射沿相对时间加上时钟网络延时的时间,其实这个时间就是SDRAM发出数据,到数据出现在数据总线上的时间

70d531b2b1f129424ab95184fe54dea8.png

再回过头去看一下我们分析读周期之后时间的时候,数据出现在数据总线上之后是不是直接被锁存沿锁存了?这样说来就是没有加上数据在PCB走线的延时,因此上图只是一个理想过程,即没有考虑PCB走线的延时,而我们的时序分析工具确实将其考虑在内了,所以,我们的FPGA建立时间,除了包括数据保持稳定的时间外,还应加上这段走线延时的时间,这也就解释了,为什么我们的建立时间是那么算的

这个过程是我自己的理解,不知道是不是准确,觉得有问题的朋友请积极指正,谢谢

同理,我们用同样的方法

算出保持时间为 4.122ns

下面再来看FPGA的输出时间,这个过程就要看时序报告中的输出路径了,按照同样的方法,我们找到输出路径的建立时间的时序报告

6d59cbac3ae475c5a38ae3a494a6b7ed.png

我们可以看到,这个很直观,没有像上面那个那么复杂

最大输出延时为6.161ns,

同理,查看输出路径保持时间的时序报告

9cf7b417cc8755b5405c567974d75ab3.png

这个也比较直观,用14.623 减去 10 就好了,为什么要减10呢?再来看这个图

7ca8ffaa9c6e739ae0be4a9904751be1.png

头一个发射沿为0时刻的话,我们需要等一个时钟周期后发射第二个沿,也即这里的数据到达时间14.623,是下一个数据的到达时间,减去10,不就是我们的最小输出时间了么。

所以,我们的最小输出时间为4.623ns

好了,所有的参数都有了,下面计算

读周期最大滞后时间 = Toh - FPGA的保持时间Th = 2.7 - 4.122 = - 1.422ns

读周期最大超前时间 = Tclk - (TOH + FPGA的建立时间Tsu) = 10 - (5.4 +7.032)=-2.432

写周期最大滞后时间 = Tclk - (Tcomax + SDRAM的建立时间Tsu)

= 10 - (6.161 +1.5) = 2.339ns

写周期最大超前时间 = Tcomin - Toh = 4.623 - 0.8 = 3.823ns

这样,我们根据公式,取最小滞后时间为 - 1.422 最小超前时间为 -2.423

取二者平均值得 (-1.422 - 2.423 )/ 2 = - 1.9225

然后,还没有完.... 时序分析这一块就是这么麻烦...

我们现在考虑的,仅仅是考虑的是在SDRAM端口的时钟延时,也就是说还没有考虑SDRAM时钟从PLL输出,经过FPGA内部走线,和外部PCB的延时,我们想一下,是不是有一个这样的关系

就是,PLL的时钟偏移 + 时钟从PLL输出在FPGA内部的延时 + 时钟在外部PCB走线的延时 = SDRAM 端口的时钟延时

而我们要手动添加的,就是PLL的时钟偏移值。再者,上篇文章我们对虚拟时钟SDRAM_CLK进行约束的时候,我们对他就行约束为最大值为3ns对吧, 时钟从PLL输出在FPGA内部的延时就可以按我们所约束的最大值来计算,所以因此,我们计算

PLL的时钟 偏移值 = -1.9225 - 3 - 0.1 = - 5.0225

换算成正值为 10 - 5.0225 = 4.9775

到此为止,我们的相位偏移才计算完毕,我们将它送给PLL

7d3572cae87c26656e89bf4046231071.png

八、多周期约束

对其进行全编译,查看时序报告,发现时序仍然不收敛

59418d7f3b42db011b4346ff7518be1b.png

查看错误时序报告可以看到,我们没有做多周期约束,至于为什么,上面已经说过了,这里直接来做

我们设置延时周期数为2,即在第二个时钟周期进行数据锁存,因为是输入路径时序违规,所以我们约束的多周期路径就是从我们的虚拟时钟,也就是SDRAM的工作时钟,到我们FPGA的工作时钟clk1

f125e5203ab9719b348c1ce912bc6846.png

再执行一次全编译,所有的路径达到时序收敛

bc0d58070be7b0e5082c3f57572255c3.png

当然,除了这些,我们还需要一些时序上的优化,以及一些微调,要想达到系统的真正稳定,光做这些还是不够的,小墨也是在学习当中,更深入的探究我只能说对于现在的我来说是力不从心了,有很多经验都是我们后续在不断地摸索中获得的,急也没用,还是安心做好当下,一步一个脚印,学无止境,我们永远不能说自己学会了,只能说熟悉了,慢慢来吧~大家还需加油!

下面是我调好的板级测试图,下面也会附有源代码,不过下到你的板子上不一定跑的起来哦,大家还是自己亲手算算这些参数,等到板子真正跑起来的时候,你才会感受到那种成功的喜悦~

80a4da3b96ebaf7030e33f1fa997c0e7.png

好了,SDRAM就写到这吧,谢谢大家的支持~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

星跃计划 | 新项目持续招募中!MSR Asia-MSR Redmond 联合科研计划邀你申请!

微软亚洲研究院与微软总部联合推出的“星跃计划”科研合作项目邀请你来报名!本次“星跃计划”报名再次新增了来自微软 ED (Experiences Devices) Applied Research 全球总部的新项目,欢迎大家关注与申请!还在等什么?加入“星跃计…

C++之map的前后遍历

java用迭代器只能往后迭代 但是C可以往后迭代和往前迭代 1、CMap往后迭代 map<int,int> amap; amap.insert(pair<int,int>(1,1)); amap.insert(pair<int.int>(2,2)); map<int,int>::iterator it; for(it amap.begin();it ! ampa.end();it…

Linux服务器上监控网络带宽与监控性能命令大全

【51CTO精选译文】本文介绍了一些可以用来监控网络使用情况的Linux命令行工具。这些工具可以监控通过网络接口传输的数据&#xff0c;并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显示。一些命令可以显示单个进程所使用的带宽。这样一来&#xff0c;用户很容易发…

Android的AlertDialog详解

AlertDialog的构造方法全部是Protected的&#xff0c;所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog&#xff0c;就要用到AlertDialog.Builder中的create()方法。 使用AlertDialog.Builder创建对话框需要了解以下几个方法&#xff1a; s…

C++中之a[5](栈区)和int a=new int[5](堆区)有什么区别

1、int* anew int[5]需要判断内存是否分配成功&#xff0c;以及在不用时需要使用delete[] a进行内存释放&#xff1b; 2、如果不是a[5]&#xff0c;而是a[5000000000]或者更大的话&#xff0c;那一般情况下&#xff0c;就只能使用int* anew这种方式了。这个涉及到内存存放位置的…

最长严格上升子序列

该题应使用动归 时间限制: 1 s空间限制: 256000 KB题目等级 : 黄金 Gold题解查看运行结果题目描述 Description给一个数组a1, a2 ... an&#xff0c;找到最长的上升降子序列ab1<ab2< .. <abk&#xff0c;其中b1<b2<..bk。 输出长度即可。 输入描述 Input Descri…

workbench mysql mac_mysql workbench mac下载-mysql workbench mac 64位下载8.0.15 官方最新版__西西软件下载...

MySQL Workbench mac版是专为数据库架构师、开发人员和 DBA 打造的一个统一的可视化工具。MySQL Workbench 为数据库管理员、程序开发者和系统规划师提供可视化的Sql开发、数据库建模、以及数据库管理功能。MySQL Workbench 提供了数据建模工具、SQL 开发工具和全面的管理工具(…

C# 使用Awaiter

可以对任何提供 GetAwaiter 方法并返回 awaiter 的对象使用 async 关键字。awaiter 用 OnCompleted 方法实现 INotifyCompletion 接口。此方法在任务完成时调用。下面的代码片段不是在任务中使用 await&#xff0c;而是使用任务的 GetAwaiter 方法。Task 类的 GetAwaiter 返回一…

模板-1-模板类的特化

2019独角兽企业重金招聘Python工程师标准>>> 类模板的特化 语义: 表明该模板类在特殊的类型下具有不同的行为.类的定义,应该与模板类放入一个头文件中,告知编译器该特化类的存在;类成员的定义,应该放入源文件中.该特化类就与普通类一样,是一个实实在在存在的实体.语…

mac环境下分别用vim和Xcode运行C++(hello word)程序

1、用vim写第一个C++程序 1) 打开mac终端 2) 用vim新建一个test.cpp文件 vim test.cpp 3) 写hello word代码 输入插入命令 i 写入代码 #include<iostream>using namespace std;int main() {cout<<"hello word"<<…

C# 内存法图像处理

内存法通过把图像储存在内存中进行处理&#xff0c;效率大大高于GetPixel方法&#xff0c;安全性高于指针法。 笔者当初写图像处理的时候发现网上多是用GetPixel方法实现&#xff0c;提到内存法的时候也没有具体实现&#xff0c;所以笔者在这里具体实现一下- -&#xff0c;望指…

mysql分组查询和子查询语句_6.MySQL分组聚合查询,子查询

自己的MySQL阅读笔记&#xff0c;持续更新&#xff0c;直到看书结束。数据库技术可以有效帮助一个组织或者企业科学、有效的管理数据&#xff0c;也是现在很多企业招聘数据分析师的必备要求之一。大家如果看过MySQL的书&#xff0c;也可以看我的知识导图做一个复习&#xff0c;…

swf 文件在线播放的,怎么能够下载呢?(除视频外其它都可)

点击播放SWF文件的网页上方工具的Internet选项&#xff0c;点击设置&#xff0c;再点击查看文件&#xff0c;里面有播放的SWF文件图标&#xff0c;把它复制就可以了。转载于:https://blog.51cto.com/wangheyu1/1894807

ABP vNext微服务架构详细教程——分布式权限框架(下)

3公共组件添加公共类库Demo.Permissions&#xff0c;编辑Demo.Permissions.csproj文件&#xff0c;将 <Project Sdk"Microsoft.NET.Sdk"> 改为&#xff1a;<Project Sdk"Microsoft.NET.Sdk.Web">为Demo.Permissions项目添加Nuget引用Volo.Abp.…

ios开发第一步--虚拟机安装MAC OS X

暂时还没买Macbook&#xff0c;先用虚拟机练练手。 先说说准备工作&#xff0c;我是在win8下安装的&#xff0c;这个不是关键的&#xff0c;只要Vmware版本和MAC OS X版本确定就行了&#xff0c;win7下同样可以。 1、虚拟机Vmware10.0.0 下载地址 http://pan.baidu.com/s/1jGv…

算法学习笔记(三)-----各种基础排序问题

2019独角兽企业重金招聘Python工程师标准>>> 一、直接插入排序&#xff1a;是最简单的排序方法&#xff0c;算法简单来说就是可以把第一个数a[0]看做有序数组&#xff0c;那么a[1]要插入进来&#xff0c;对比&#xff0c;插入合适位置&#xff1b;然后a[0],a[1]是有…

mac之把打开终端设置快捷键为Ctrl+Alt+T

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程 1、在Automator.app中创建一个AppleScript Finder&#xff0d;>应用程序->Automator打开Automator.app&#xff0c;打开Automator后…

基础磁盘管理

一、设备文件Linux中设备类型分为字符设备与块设备&#xff0c;他们特点分别为&#xff1a;块设备特性&#xff1a;以“块”为单位进行存取&#xff0c;随机访问&#xff0c;例如磁盘字符设备特性&#xff1a;以“字节”单位进行存取&#xff0c;线性访问&#xff0c;例如键盘设…

redhat yum 安装 mysql_Redhat 7 下Mysql8.0.19安装配置图文详解(配合使用 centos YUM源)...

MySQL Database Service数据库服务器具有以下特点&#xff1a; 具有分析引擎的MySQL数据库服务&#xff1a; MySQL数据库服务是一项完全托管的数据库服务&#xff0c;可使用世界上最受欢迎的开源数据库来部署云原生应用程序。MySQL Analytics Engine将性能提高了400倍。 MySQL企…

Elasticsearch数据库

什么是ElasticsearchElasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。…