特权和你一起学NIOS2 第五章 实战演练之时序收敛 part2
0赞一部曲——时序分析
系统整合完毕,所有的设计输入、初步的功能仿真等工作就绪后,设计者应该对整个系统所涉及到的各种时序模型做到心中有数。如图5.3所示,当我们回顾第二 个系统的整个架构时,在时序设计的初期,我们首先应该考虑的是这个系统要达到怎样的速度性能才算符合要求。那么,这个速度性能考虑包括:系统时钟频率(可 能会有好几个系统工作时钟)、外设接口的频率(与FPGA相关的考虑就是FPGA与这些外设间连接的管脚的时序要求)。从本质上来讲,好像就这两方面。
图5.3 第二个系统框图
第二个系统中与系统时钟频率有关的组件是哪些?与外设接口频率有关的组件又是哪些呢?其实图5.3中已经很明显的为大家划分出来了。NIOS2处理器以及 时钟单元、System ID、定时器这几个组件没有和外围器件直接连接的管脚,那么可以认为它们的时序路径只和系统内部的时钟有关。而GPIO、JTAG Uart、SDRAM控制器和EPCS控制器这几个组件都有与FPGA外部器件连接的管脚,那么它们的时序路径就涉及到外围器件的时钟频率(严格来讲可能 一般不说是外围器件的时钟频率,总之,你可以理解为这里要说的是外围器件要正常通信需要满足的时序要求)。但是由于JTAG Uart、EPCS控制器使用了FPGA的一些专用管脚,并且无需用户在集成这些组件后再手动分配管脚号,并且在FPGA底层的布局布线上工具已经默认能 够保证它们的时序收敛了。所以,本实例中需要考虑的外围器件时序路径分析只有GPIO外设和SDRAM控制器了。而GPIO连接的外围设备只不过是LED 灯而已,它们的闪烁大都是second级别的,相对于FPGA内部快慢延时最多也只有几十ns的情况,大可以不必理会。因此,可以这么认为,GPIO与外 围的时序基本没有要求,要不要做管脚的时序约束无关紧要,对我们的设计照成不了任何影响。用前面说过的情况来处理它,就把它归入false路径。因此,重 点就落在了SDRAM的时序分析上。
好的,从上面我们的讨论中分析得出第二个系统需要分析两方面时序:系统内部时钟的时序和SDRAM接口的时序。
系统内部时钟时序分析
在我们的第二个系统中,依然只有一个外部输入的25MHz时钟。而仅仅一个时钟对于整个系统运行来说是不够的,因此我们需要借助于Cyclone II器件内部的PLL来对这个外部时钟进行倍频或分频处理。
如图5.4所示,这是PLL的简单接口示意图。Inclk0是输入的外部25MHz外部时钟,由这个时钟通过PLL内部的处理产生了c0/c1/c2三个 输出时钟。这三个输出时钟的频率都是用户可以配置的,通过图中的Ratio列的值可以看出该设计中他们的输出值分别是 c0=25MHz,c1=50MHz,c2=50MHz。而在相位上c0/c1是0dg(一个时钟周期正好是360dg),c2的相位是108dg(即 (108/360)*20ns=6ns)。
图5.4
又由于c2是作为驱动外部SDRAM同步的输出时钟信号,因此该系统中真正需要我们关注的内部系统时钟只有c0和c1。另外,inclk虽然是外部输入的 时钟信号,但由于它是连接在了FPGA的专用时钟引脚上,因此也要纳入我们的内部系统时钟考虑的范围内。对于他们的分析很简单,因为inclk/c0 /c1的频率分别应该是25MHz/25MHz/50MHz,所以后面的时序约束中只要对它们做如此约束就可以了。对于PLL的输出时钟约束,有一个非常 “偷懒”的办法,后面会提到,甚至于我们无需关注这个PLL的输出频率到底是多大,只要使用一条语句就可以让时序分析工具自动识别我们对PLL的配置并进 行约束。
SDRAM接口时序分析
在《深入浅出玩转FPGA》一书的笔记15里提到了很多IO接口约束的实例,也提到了源同步接口的分析与约束,在开始这部分知识点前也建议大家不妨好好再 消化一下那些内容。当然,我们这里还是会考虑到知识的系统性,所以也会带大家重新回顾一下比较重要的知识点。
如图5.5所示,是一个简单的源同步接口(FPGA与外部芯片)模型。FPGA内部的时序逻辑基本是寄存器到寄存器的,通常是用相同的时钟分别去驱动源寄 存器和目的寄存器,而这个源同步接口的目的寄存器(驱动外部芯片)时钟虽然与源寄存器时钟不同,但仍然是FPGA内部产生的,一般两个时钟是同频不同相的 关系。因此,我们要做的就是对时钟延时路径以及对数据传输路径延时的分析。
图5.5
而对于外部器件,从本质上讲,它和FPGA之间的时序也是寄存器到寄存器的传输,只不过通常源寄存器和目的寄存器是分别处于FPGA内和外部芯片内,并且 驱动他们的时钟也常常不是一个时钟。但是既然它们在本质上是类似的,那么我们就可以在寄存器到寄存器传输的基础上,对它们的不同点做额外的考虑后进行分 析。下面我们就通过FPGA内部路径分析和IO口时路径分析的对比中来摸透IO时序路径分析的脾性。
其实若是一个FPGA内部的路径,如图5.6所示,若约束FPGA的时钟,那么简单的来看,公式 +( - )< 就必须得到满足。当然了,往深入的探讨,寄存器的建立时间和保持时间要求也都是需要得到满足的。
图5.6
而同样利用这样的思维去考虑FPGA与外部芯片的时序路径关系的时候,其实也还是完全一样的。只不过 的整个路径原本都在FPGA内部,但现在却要一分为三了,有一部分在FPGA内部,有一部分在芯片内部,还有一部分在哪里?没错,就是他们在电路板上连线 的那部分(图5.5中间粗体路径)。而时钟路径的分析会稍微复杂一些,有可能和源时钟同频也可能不同频,有可能同相位也可能不同相位,只能具体问题具体分 析了。对于我们这个设计,也可以理解为是一个比较典型的源同步接口的模型。所谓源同步接口,简单的理解就是输出的数据和输出的时钟路径都是由同一器件(这 里是FPGA器件内部)产生的,并且数据传输和时钟的上升沿(或下降沿)通常是中央对齐的或是边沿对齐的。我们的这个时序是中央对齐的,所谓中央对齐,就 是指在数据的采样端(目的寄存器),时钟的上升沿和数据传输的有效窗口(即两次数据变化的中央)是对齐的。
对于SDRAM的数据路径的分析,因为前面说到的三部分里,PCB板的走线延时对于特定的目标应用板是固定的,在芯片内部的路径时间等延时参数也相对固 定,可以从芯片的datasheet查到。那么,只有在FPGA内部的那部分路径延时在时序设计前还是个未知数,而我们要做的就是算出在整个数据路径延时 中留给FPGA内部走线延时的时间范围是什么,这个时间范围就是我们要分析的对象,也是我们要添加的约束内容。
我们再来看一个波形,如图5.7所示,这是一个理想的中央对齐的源同步传输。如果结合图5.5来理解,Data clock即FPGA内部源寄存器的时钟(图5.5的Sys_clk),Output clock即FPGA产生的作为外部芯片的时钟(图5.5的Ext_clk),Data bus即FPGA与外部芯片的数据传输总线(图5.5的Data out)。
图5.7
在FPGA内部,Data clock的每个上升沿Data bus会产生跳变。而Data bus需要在芯片端口被Output clock的上升沿锁存,因此Data bus的数据有效窗口(数据保持稳定的两次跳变的中央)必须对准Output clock的上升沿。那么Output clock喝Data clock就会有一定的相位差(Phase shift),理想状态下这个相位差为180dg。
说完理想的状态,我们再来看图5.8,这是一个和实际情况比较接近的波形(很多时候实际波形要比这复杂得多)。时钟Data clock后的若干延时时间(Output delay)后输出数据(Data bus)才会发生变化,而相应的外部时钟(Output clock)也必须做出调整(Phase shift比理想状态下要大一些)。
图5.8
此为,特权同学发现用这个图来理解时序分析工具将要进行的建立保持时间检查再合适不过了。看那两条虚线,左侧向右打箭头的是建立时间检查,即检查数据输出 在最慢情况下,数据是否能够在输出时钟上升沿前的某一个既定时间内(目的寄存器的建立时间)到达。右侧向左打箭头的是保持时间检查,即检查下一个(当然也 可以换到前一个时钟周期来考虑,效果是相同的)数据输出在最快情况下,是否能够在上一级时钟上升沿的某一既定时间(保持时间)之后到达。
好的,在理解了数据和时钟路径传输的基本概念之后,下一部分内容会配合约束方法更详细的来讨论。前文提到了,这里的SDR SDRAM的数据信号、地址信号以及相关的控制信号传输到SDRAM端口时,它们的信号有效窗口(所谓有效窗口,就是在一个时钟传输周期内,信号总线上所 有数据保持稳定不发生变化的时间范围)必须和SDRAM时钟的上升沿对齐,而如何能满足这个要求呢?通常的做法也就是利用PLL的相位调整来达到输出时钟 的可控性。下面我们就要研究一下SDRAM的时钟信号相位到底该如何取值。
《Quartus II Handbook Version 9.1 Volume 5:Embedded Peripherals》中Section I的1. SDRAM Controller Core部分提出了如何估计SDRAM数据有效信号窗口,并且给出了SDRAM时钟相对于FPGA时钟相移估计的公式。
从机理上来说,下面的估算无非就是通过第一轮的基本时序约束,查看FPGA内部管脚的一些延时值,然后再结合SDRAM的芯片资料提供的一些基本时序参 数,从而计算出读和写数据时的滞后值和超前值,然后在这四个值之间取一个比较合适的中间值就是估计的相位值了。注意了,这里只是估计的,在这个估计值中, 还有两个因素是没有考虑进去的,PCB板的线延时时间和SDRAM从PLL输出到外部管脚之间的延时时间。这两个参数虽然对最后的输出相位影响不是非常 大,但是也是需要在后期分析中加以考虑的。
我们首先需要理解读周期最大滞后时间、读周期最大超前时间、写周期最大滞后时间、写周期最大超前时间四个参数的估算公式。原文的四个公式如图5.9 和图5.10所示。所谓超前时间,是指SDRAM时钟的相移相对于FPGA时钟沿为负的偏移值;而滞后时间则是指SDRAM时钟的相移相对于FPGA时钟 沿为正的偏移值。
图5.9
图5.10
对上述四个公式的推导如下:
过去特权同学对这个相移估算也没有太多办法,只能凭感觉找,或者说是主要根据时序分析的结果来一次次的定位最佳的相移值,工作量比较大,也有撞运气的成分 在里面,而Altera官方提出的这个方法还是很有效的,至少可以将用户的相移值定位到一个比较小的范围内再进行调整。在这个基础上还需要考虑一些PLL 输出延时或者说是板级延时之类的影响,一般也只需要微调就可以搞定。
由于这个值的估算还涉及一次初步的时序约束以及查看时序报告,并提取相关参数进行计算,所以把实例的分析将放到后文阐述。初步时序约束的时候也只是先取个大概值。