特权同学

特权和你一起学NIOS2 第五章 实战演练之时序收敛 part6

0
阅读(3052)

IO接口约束之output delay约束

学习完相关的理论知识,下面就要结合工程进行计算。我们所使用的SDR SDRAM是三星的K4S641632,它在芯片上的引脚分布如图5.22所示。


图5.22

这些引脚大致分为四个部分,即时钟信号(CLK)、地址总线(A0-A11/BA0-1)、数据总线(DQ0-DQ15)、控制信号(LDQM/UDQM/CS/WE/CAS/RAS/CKE)。

时钟信号在前面已经做过约束,即FPGA器件内部定义为sdram_clk的引脚,对于SDRAM芯片而言这是一个外部输入(FPGA输出)的时钟信号。 控制信号中LDQM/UDQM分别控制数据总线的低字节和高字节是否有效,通常均拉低,表示高低字节的数据都有效;CS是片选信号,WE是写选通信 号,CAS是列选通信号,RAS是行选通信号,CKE是时钟有效信号,这五个信号的不同电平组合(满足一定时序要求)构成了不同的SDRAM控制指令。

对于FPGA而言,SDRAM的所有控制信号以及地址总线都是output,而数据总线则是inout。因此,在IO约束中,我们需要对所有这些信号做 output delay约束,同时还要对数据总线做input delay约束。它们的参考时钟即前面定义的生成时钟SDRAM_CLK。

为了帮助大家更快理解SDRAM的基本时序关系,就用图5.23所示最简单的突发长度为4的SDRAM读写周期时序来做分析。通常一次读或写数据,先发起 RAS选通命令,同时送行地址;然后间隔tRCD时间后发起CAS选通命令,同时送列地址,如果是写数据,则从该时钟周期开始连续写入4个有效数据(因为 突发长度为4);如果是读数据,再等待2-3个时钟周期(通常称作潜伏期CL)后的连续4个时钟周期内数据总线的有效数据可供读取。


图5.23

在这整个时序关系中,我们不仅关心数据信号与时钟的关系,还有地址总线、控制总线与时钟的关系也是我们需要关注的,毕竟他们都是IO约束的一部分,他们的时序也都必须达到收敛。

光靠时序图肯定还不够,细心的读者一定注意时序图中还有不少时间符号的标注,没有错,这些时间值都可以在datasheet里提供的时间表里对照的找到。下表就是图5.23对应的时间表。

 在这个表里,我们在理论中所提到的芯片内部建立时间、保持时间等都可以查到。我们将先对SDRAM的output接口做时序约束,那么需要先找出output max/min delay运算公式中的相关参数。

先从上面的时间表里,我们可以看到Input setup time和Input hold time参数,其含义就是SDRAM信号的输入建立时间和保持时间。正好是output max/min delay运算公式中的外部器件的 和 两个参数。先做个说明,因为我们所使用的SDRAM器件速度等级为-75,所有下面的分析均以此列为准。所以,外部器件的 =2ns,外部器件的 =1ns。

接下来我们来算PCB data delay的最大和最小值,好在我们的PCB是自己画的,Altium Designer也提供了一个很便利的功能。如图5.24所示,在PCB面板下选择All Nets,然后下面的列表中出现了所有网络连线的长度,我们也只要找到相关总线的最大最小线长,然后换算成延时时间即可。


图5.24

在这里要计算的相关SDRAM输出信号(时钟信号除外)中,最长连线为1982mil,最短连线为671mil,时钟信号(sdram_clk)为737mil。那么这三者分别带来前面的公式换算成延时时间为:

1.982*0.18ns(1000mil) = 0.36ns

0.671*0.18ns(1000mil) = 0.12ns

0.737*0.18ns(1000mil) = 0.13ns

由此可得:<PCB max data delay> = 0.36ns,<PCB min data delay> = 0.12ns。

最后还差PCB clock skew值没有计算,我们重新来看图5.25中的时钟信号,这里的Ext_clk也就是sdram_clk,他们的相位通常都需要调整,肯定会有些偏差。 而sdram_clk信号传输在PCB上的那一段走线延时即PCB clock skew值。有些人可能会纳闷sdram_clk从PLL输出到外部管脚这一部分走线也会有延时,为什么不算在PCB clock skew值中?其实这段延时值和sys_clk的时钟网络延时值一样,都是在FPGA内部,我们只要按照前面的方法约束好了这个sdram_clk,那么 TimeQuest会乖乖的把它计算到时序分析的公式中去的,所以根本没有必要我们多此一举再去考虑它。因此,这里也得到了<PCB max/min clock skew> = -0.13ns。为什么是负数?大家回到前面复习下就明白,呵呵!


图5.25

最后,我们再将前面得到的参数代入output max/min delay计算公式中,得到:

Output Max Delay = 0.36ns + 2ns + 0.13ns = 2.49ns

Output Min Delay = 0.12ns – 1ns – 0.13ns = -1.01ns

分别再给点余量,取Output Max Delay = 2.6ns,Output Min Delay = -1.1ns。

最后要把我们算得的结果告诉TimeQuest,点击菜单栏的ContrainsàSet Output Delay…。如图5.26和图5.27进行约束。


图5.26


图5.27

在console栏里会出现如下两个语句:

set_output_delay -clock { SDRAM_CLK } -max 2.6 [get_ports {sdram_addr[0] sdram_addr[1] sdram_addr[2] sdram_addr[3] sdram_addr[4] sdram_addr[5] sdram_addr[6] sdram_addr[7] sdram_addr[8] sdram_addr[9] sdram_addr[10] sdram_addr[11] sdram_ba[0] sdram_ba[1] sdram_cas_n sdram_cke sdram_cs_n sdram_data[0] sdram_data[1] sdram_data[2] sdram_data[3] sdram_data[4] sdram_data[5] sdram_data[6] sdram_data[7] sdram_data[8] sdram_data[9] sdram_data[10] sdram_data[11] sdram_data[12] sdram_data[13] sdram_data[14] sdram_data[15] sdram_ldqm sdram_ras_n sdram_udqm sdram_we_n}]

 

set_output_delay -clock { SDRAM_CLK } -min -1.1 [get_ports {sdram_addr[0] sdram_addr[1] sdram_addr[2] sdram_addr[3] sdram_addr[4] sdram_addr[5] sdram_addr[6] sdram_addr[7] sdram_addr[8] sdram_addr[9] sdram_addr[10] sdram_addr[11] sdram_ba[0] sdram_ba[1] sdram_cas_n sdram_cke sdram_cs_n sdram_data[0] sdram_data[1] sdram_data[2] sdram_data[3] sdram_data[4] sdram_data[5] sdram_data[6] sdram_data[7] sdram_data[8] sdram_data[9] sdram_data[10] sdram_data[11] sdram_data[12] sdram_data[13] sdram_data[14] sdram_data[15] sdram_ldqm sdram_ras_n sdram_udqm sdram_we_n}]