文章目录
9.3 DDR SDRAM接口(DDR SDRAM Interface)
D D R S D R A M DDR\,\, SDRAM DDRSDRAM接口可以看作是上一节中所介绍的 S R A M SRAM SRAM接口的一种扩展。就像 S R A M SRAM SRAM接口一样,有两条主要的总线,图9-9说明了 D U A DUA DUA和 S D R A M SDRAM SDRAM之间的总线及其方向。由命令、地址和控制引脚(通常称为 C A C CAC CAC)组成的第一条总线将使用以下标准方案:在存储器时钟的一个时钟沿(或每个时钟周期一次)处发送信息。双向总线由 D Q DQ DQ(数据总线)和 D Q S DQS DQS(数据选通脉冲)组成, D D R DDR DDR接口的不同之处就在于双向数据选通 D Q S DQS DQS。 D Q S DQS DQS选通脉冲可用于一组数据信号,这使得数据信号(每字节一个或每半字节一个)与选通脉冲的时序紧密匹配。如果时钟是整个数据总线共用的时钟,那么使用时钟信号进行这种紧密匹配可能不可行。双向选通信号 D Q S DQS DQS可用于读操作和写操作,并且在选通脉冲的两个边沿(下降沿和上升沿,或称双倍数据速率)上都可捕获数据。在 S D R A M SDRAM SDRAM的读模式期间, D Q DQ DQ总线与数据选通引脚 D Q S DQS DQS(而不是存储器的时钟引脚)同步,即 D Q DQ DQ和 D Q S DQS DQS从 S D R A M SDRAM SDRAM中被输出时彼此是对齐的。而对于另一个方向,即当 D U A DUA DUA发送数据时, D Q S DQS DQS将相移 90 90 90度。请注意,数据 D Q DQ DQ和选通 D Q S DQS DQS的沿均来自 D U A DUA DUA内部的存储器时钟。
![](https://i-blog.csdnimg.cn/blog_migrate/e523b2a31482a91e319cc36dabe685a7.png)
如上所述,对于一组 D Q DQ DQ信号( 4 4 4个或 8 8 8个bit)存在一个数据选通 D Q S DQS DQS。这样做是为了使 D Q S DQS DQS和 D Q DQ DQ的所有bit之间的偏斜平衡(skew balancing)要求更容易满足。例如,如果对于一个字节使用一个 D Q S DQS DQS,则一组中只需平衡 9 9 9个信号( 8 8 8个DQ和 1 1 1个 D Q S DQS DQS),这比平衡 72 72 72位的数据总线和时钟要容易得多。
上面的描述并不是对 D D R S D R A M DDR\,\, SDRAM DDRSDRAM接口的完整说明,但足以说明这种接口的时序要求。
图9-10显示了典型 D D R S D R A M DDR\,\, SDRAM DDRSDRAM接口中 C A C CAC CAC总线(在 D U A DUA DUA处)的 A C AC AC特性。
![](https://i-blog.csdnimg.cn/blog_migrate/0514fa7305c13e3dbc93adcc19077522.png)
# DDRCLK is typically a generated clock of the PLL
# clock internal to DUA:
create_generated_clock -name DDRCLK \
-source [get_pins UPLL0/CLKOUT]\
-divide_by 1 [get_ports DDRCLK]
# Set output constraints for each bit of CAC:
set_output_delay -max 0.75 -clock DDRCLK [get_ports CAC]
set_output_delay -min -0.75 -clock DDRCLK [get_ports CAC]
在某些情况下,尤其是与无缓冲(unbuffered)存储器模块接口时,地址总线可能会比时钟驱动更大的负载。在这种情况下,地址信号对存储器的延迟要比时钟信号大,并且这种延迟差异可能会导致 A C AC AC特性不同于图9-10中所示(???)。
D Q S DQS DQS和 D Q DQ DQ的对齐方式在读周期和写周期中有所不同,以下小节将对此进行进一步探讨。
9.3.1 读周期(Read Cycle)
在读周期中,存储器输出的数据与 D Q S DQS DQS是边沿对齐(edge-aligned)的,如图9-11中波形所示。图中的 D Q DQ DQ和 D Q S DQS DQS代表存储器引脚上的信号。数据( D Q DQ DQ)由存储器在 D Q S DQS DQS的每个沿上发出,并且 D Q DQ DQ改变数据的时刻也与 D Q S DQS DQS的下降沿和上升沿对齐。
![](https://i-blog.csdnimg.cn/blog_migrate/5fe988641ab53c874959b44fa85baba8.png)
由于 D Q S DQS DQS选通信号和 D Q DQ DQ数据信号彼此对齐,因此 D U A DUA DUA内部的存储控制器(memory controller)通常使用 D L L DLL DLL(或其它替代方法来实现四分之一周期延迟)来延迟 D Q S DQS DQS,从而使 D Q S DQS DQS的边沿对齐于数据有效窗口的中心。
即使 D Q DQ DQ和 D Q S DQS DQS在存储器中彼此对齐,但 D Q DQ DQ和 D Q S DQS DQS选通信号也可能无法再在 D U A DUA DUA内部的存储控制器上对齐,这可能是由于 I O IO IO缓冲器之间的延迟差以及 P C B PCB PCB互连走线等因素所导致的。
图9-12中为基本的数据读取原理图。上升沿触发的触发器在 D Q S _ D L L DQS\_DLL DQS_DLL的上升沿捕获数据 D Q DQ DQ,而下降沿触发的触发器在 D Q S _ D L L DQS\_DLL DQS_DLL的下降沿捕获数据 D Q DQ DQ。虽然图中的 D Q DQ DQ路径上没有 D L L DLL DLL,但某些设计可能在数据路径上也会放置一个 D L L DLL DLL。这样可以用来延迟信号(以解决由于PVT或互连走线长度或其它差异引起的变化),以便可以在数据有效窗口的中间准确地采样数据。
![](https://i-blog.csdnimg.cn/blog_migrate/587d22c9be2a26888166612b9c7bbe56.png)
为了对存储控制器上的读接口进行约束,我们在 D Q S DQS DQS上定义了一个时钟,并相对于该时钟在数据上指定了输入延迟。
create_clock -period 5 -name DQS [get_ports DQS]
假定存储器读接口以 200 M H z 200MHz 200MHz(当在两个时钟沿上都传输数据时相当于 400 M b p s 400Mbps 400Mbps)的频率进行工作,这对应于每 2.5 n s 2.5ns 2.5ns采样一次 D Q DQ DQ数据信号。由于数据是在两个边沿上捕获的,因此需要为每个边沿分别指定输入约束。
# For rising clock edge:
set_input_delay 0.4 -max -clock DQS [get_ports DQ]
set_input_delay -0.4 -min -clock DQS [get_ports DQ]
# This is with respect to clock rising edge (default).
# Similarly for falling edge:
set_input_delay 0.35 -max -clock DQS -clock_fall \
[get_ports DQ]
set_input_delay -0.35 -min -clock DQS -clock_fall \
[get_ports DQ]
# The launch and capture are on the same edge:
set_multicycle_path 0 -setup -to UFF0/D
set_multicycle_path 0 -setup -to UFF5/D
输入延迟命令指定了 D U A DUA DUA引脚上 D Q DQ DQ和 D Q S DQS DQS沿之间的延迟差,即使这两个信号通常是从存储器中同时输出的,但由于不同存储器的规格,在时序上仍会存在偏差。因此, D U A DUA DUA内的控制器设计应考虑到两个信号之间可能存在偏斜(skew)。以下是两个触发器建立时间检查的路径报告。假设捕获触发器的建立时间要求为 0.05 n s 0.05ns 0.05ns、保持时间要求为 0.03 n s 0.03ns 0.03ns,且 D L L DLL DLL延迟设置为 1.25 n s 1.25ns 1.25ns,即四分之一周期。
![](https://i-blog.csdnimg.cn/blog_migrate/75c122dc54c0778a3c72f4f15f6305f4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/44a949e2162de853ad58bb588144970c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ff6ecb72df97a0772a834ec5230fa49f.png)
以下是保持时间检查的路径报告:
![](https://i-blog.csdnimg.cn/blog_migrate/b256c5fb357603705fcaa4c005b24e74.png)
![](https://i-blog.csdnimg.cn/blog_migrate/95382212ed031de6d9c3817e5c31ce24.png)
9.3.2 写周期(Write Cycle)
在写周期中, D Q S DQS DQS沿会与从 D U A DUA DUA内存储控制器输出的 D Q DQ DQ信号相差四分之一周期,因此存储器可以直接使用 D Q S DQS DQS选通脉冲去捕获数据。
图9-13显示了存储器引脚上所需的波形,在存储器引脚处, D Q S DQS DQS信号必须与 D Q DQ DQ数据窗口的中心对齐。请注意,仍然是由于 I O IO IO缓冲器延迟不匹配或者 P C B PCB PCB互连走线的变化,仅在存储控制器( D U A DUA DUA内部)中对齐 D Q DQ DQ和 D Q S DQS DQS还不足以使这些信号在 S D R A M SDRAM SDRAM存储器引脚处真正的对齐。因此, D U A DUA DUA通常在写周期中使用额外的 D L L DLL DLL去进行控制,以实现 D Q S DQS DQS和 D Q DQ DQ信号之间所需的四分之一周期偏移(offset)。
![](https://i-blog.csdnimg.cn/blog_migrate/e660d98b6c0f83ceef530153eaad887e.png)
如何约束此模式的输出取决于控制器中时钟的生成方式,接下来我们考虑两种不同情况。
情况1:内部二倍频时钟(Case 1: Internal 2x Clock)
如果内部时钟是 D D R DDR DDR时钟频率的两倍,则输出逻辑可以类似于图9-14中所示。 D L L DLL DLL提供了一种必要时使 D Q S DQS DQS时钟偏斜的机制,从而满足存储器引脚上的建立时间和保持时间要求。在某些情况下,可以不使用 D L L DLL DLL,而是使用负沿触发的触发器来获得 90 90 90度的偏移。
![](https://i-blog.csdnimg.cn/blog_migrate/c918fd7687ad3db5f680bd633fe35a71.png)
对于图9-14中所示情况,可以进行如下输出延迟约束:
# 166MHz (333Mbps) DDR; 2x clock is at 333MHz:
create_clock -period 3 [get_ports CLK2X]
# Define a 1x generated clock at the output of flip-flop:
create_generated_clock -name pre_DQS -source CLK2X \
-divide_by 2 [get_pins UFF1/Q]
# Create the delayed version as DQS assuming 1.5ns DLL delay:
create_generated_clock -name DQS -source UFF1/Q \
-edges {1 2 3} -edge_shift {1.5 1.5 1.5} [get_ports DQS]
D Q DQ DQ输出引脚上的时序必须相对于衍生时钟 D Q S DQS DQS进行约束。
假设 D D R S D R A M DDR\,\, SDRAM DDRSDRAM的 D Q DQ DQ和 D Q S DQS DQS引脚之间建立时间要求分别为 D Q DQ DQ上升沿的 0.25 n s 0.25ns 0.25ns和下降沿的 0.4 n s 0.4ns 0.4ns。类似地,假设 D Q DQ DQ引脚上升沿和下降沿的保持时间要求分别为 0.15 n s 0.15ns 0.15ns和 0.2 n s 0.2ns 0.2ns。 D Q S DQS DQS输出上的 D L L DLL DLL延迟已设置为四分之一周期,即 1.5 n s 1.5ns 1.5ns,所有波形如下图9-15所示:
![](https://i-blog.csdnimg.cn/blog_migrate/21d8c938f2f51a516ecb5055bad684bc.png)
set_output_delay -clock DQS -max 0.25 -rise [get_ports DQ]
# Default above is rising clock.
set_output_delay -clock DQS -max 0.4 -fall [get_ports DQ]
# If setup requirements are different for falling edge of DQS,
# that can be specified by using the -clock_fall option.
set_output_delay -clock DQS -min -0.15 -rise DQ
set_output_delay -clock DQS -min -0.2 -fall DQ
以下是通过输出 D Q DQ DQ路径的建立时间检查报告。建立时间检查从 0 n s 0ns 0ns处发起 D Q DQ DQ的 C L K 2 X CLK2X CLK2X上升沿到 1.5 n s 1.5ns 1.5ns处的 D Q S DQS DQS上升沿进行。
![](https://i-blog.csdnimg.cn/blog_migrate/aa2f917eb2faa1158f5c2c55fe113608.png)
请注意,上述报告中的四分之一周期延迟出现在了时钟 D Q S DQS DQS上升沿的第一行中,而不是在 D L L DLL DLL实例 U D L L 0 UDLL0 UDLL0的那行中。这是因为 D L L DLL DLL延迟已被建模为了衍生时钟 D Q S DQS DQS定义的一部分,而不是 D L L DLL DLL时序弧中的一部分。
以下是通过输出 D Q DQ DQ路径的保持时间检查报告。保持时间检查从 3 n s 3ns 3ns处发起 D Q DQ DQ的时钟 C L K 2 X CLK2X CLK2X上升沿到 1.5 n s 1.5ns 1.5ns处的 D Q S DQS DQS前一个上升沿。
![](https://i-blog.csdnimg.cn/blog_migrate/3ce488a5e100d7eead1bd4115398d5dd.png)
情况2:内部一倍频时钟(Case 2: Internal 1x Clock)
当内部只有一倍频时钟可用时,输出电路通常可能类似于图9-16所示的电路。
![](https://i-blog.csdnimg.cn/blog_migrate/fdc98f0d87298f2bed2480ff63782e3e.png)
有两个触发器用于生成 D Q DQ DQ数据:第一个触发器 N E G E D G E _ R E G NEGEDGE\_REG NEGEDGE_REG由时钟 C L K 1 X CLK1X CLK1X的负沿触发,而第二个触发器 P O S E D G E _ R E G POSEDGE\_REG POSEDGE_REG由时钟 C L K 1 X CLK1X CLK1X的正沿触发。每个触发器会锁存适当的边沿数据,然后使用 C L K 1 X CLK1X CLK1X作为多路复用器的选择信号来多路复用该数据: C L K 1 X CLK1X CLK1X为高电平时,触发器 N E G E D G E _ R E G NEGEDGE\_REG NEGEDGE_REG的输出发送到 D Q DQ DQ;而当 C L K 1 X CLK1X CLK1X为低电平时,触发器 P O S E D G E _ R E G POSEDGE\_REG POSEDGE_REG的输出发送到 D Q DQ DQ。因此,数据会在时钟 C L K 1 X CLK1X CLK1X的两个边沿都到达输出 D Q DQ DQ。请注意,每个触发器都有半个周期将数据传播到多路复用器的输入端,以确保在由 C L K 1 X CLK1X CLK1X边沿选择输入数据之前,已在多路复用器的输入端口上准备好了输入数据。相关波形如图9-17所示。
![](https://i-blog.csdnimg.cn/blog_migrate/0b6b1f1704237fbcffd4269faf6e1eea.png)
这种情况的输出延迟约束如下:
# Create the 1x clock:
create_clock -name CLK1X -period 6 [get_ports CLK1X]
# Define a generated clock at DQS. It is a divide-by-1 of
# CLK1X. Assume a quarter-cycle delay of 1.5ns on UDLL0:
create_generated_clock -name DQS -source CLK1X \
-edges {1 2 3} -edge_shift {1.5 1.5 1.5} [get_ports DQS]
# Define a setup check of 0.25 and 0.3 between DQ and DQS
# pins on rising and falling edge of clock:
set_output_delay -max 0.25 -clock DQS [get_ports DQ]
set_output_delay -max 0.3 -clock DQS -clock_fall \
[get_ports DQ]
set_output_delay -min -0.2 -clock DQS [get_ports DQ]
set_output_delay -min -0.27 -clock DQS -clock_fall \
[get_ports DQ]
建立时间和保持时间检查可验证从多路复用器到输出的时序。建立时间检查之一是从多路复用器输入处的 C L K 1 X CLK1X CLK1X上升沿(发起 N E G E D G E _ R E G NEGEDGE\_REG NEGEDGE_REG数据)到 D Q S DQS DQS的上升沿。另一个建立时间检查是从多路复用器输入处的 C L K 1 X CLK1X CLK1X下降沿(发起 P O S E D G E _ R E G POSEDGE\_REG POSEDGE_REG数据)到 D Q S DQS DQS的下降沿。同样,保持时间检查是从(与建立时间检查)相同的 C L K 1 X CLK1X CLK1X边沿到 D Q S DQS DQS的前一个下降沿或上升沿。
以下是通过 D Q DQ DQ端口的建立时间检查报告,该检查在(选择输出 N E G E D G E _ R E G NEGEDGE\_REG NEGEDGE_REG的) C L K 1 X CLK1X CLK1X的上升沿和 D Q S DQS DQS的上升沿之间进行。
![](https://i-blog.csdnimg.cn/blog_migrate/832539f2302af3cd13af9e21164d12e7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7a0358ea82a1b07936818ff9414d3276.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c9209ada9e5e205728c3f14cf76768b1.png)
这是通过 D Q DQ DQ端口的另一个建立时间检查报告,该检查在(选择输出 P O S E D G E _ R E G POSEDGE\_REG POSEDGE_REG的) C L K 1 X CLK1X CLK1X的下降沿和 D Q S DQS DQS的下降沿之间进行。
![](https://i-blog.csdnimg.cn/blog_migrate/5176f5aa49aa00d5e078e7a4bd189a1c.png)
这是通过 D Q DQ DQ端口的保持时间检查报告,该检查在 C L K 1 X CLK1X CLK1X的上升沿和 D Q S DQS DQS的前一个下降沿之间进行。
![](https://i-blog.csdnimg.cn/blog_migrate/06d6fc1ec9c922e7fc330785dcd9aae9.png)
这是另一个通过 D Q DQ DQ端口的保持时间检查报告,该检查在 C L K 1 X CLK1X CLK1X的下降沿和 D Q S DQS DQS的前一个上升沿之间进行。
![](https://i-blog.csdnimg.cn/blog_migrate/1561c65dc6f01964955add4214e378c1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e1242f64f7da9006963329846841f28a.png)
尽管以上接口时序分析已忽略了任何负载对输出的影响,但我们也可以指定额外的负载(使用set_load
命令)来提高准确性。
S
T
A
STA
STA同样可以通过电路仿真来补充,以实现可靠的
D
R
A
M
DRAM
DRAM时序。
D D R DDR DDR接口的 D Q DQ DQ和 D Q S DQS DQS信号通常在读模式和写模式下使用终端电阻 O D T ODT ODT(On-Die Termination),以减少由于 D R A M DRAM DRAM和 D U A DUA DUA处的阻抗不匹配而引起的任何反射(reflection)。在使用 O D T ODT ODT的情况下,用于 S T A STA STA的时序模型将无法提供足够的精度。设计人员可以使用另一种机制,例如详尽的电路级仿真,来验证信号完整性和 D R A M DRAM DRAM接口的时序。
9.4 DAC接口(Interface to a Video DAC)
考虑下图9-18的一个典型 D A C DAC DAC接口,其中高速时钟将数据传输到 D A C DAC DAC的低速时钟接口。
![](https://i-blog.csdnimg.cn/blog_migrate/07254e5c53f71cc1c5a8c3b677f5665a.png)
时钟 D A C _ C L K DAC\_CLK DAC_CLK是时钟 X P L L _ C L K XPLL\_CLK XPLL_CLK的 2 2 2分频, D A C DAC DAC建立时间和保持时间检查针对的是 D A C _ C L K DAC\_CLK DAC_CLK的下降沿。
在这种情况下,即使可以根据需要将从快时钟域到慢时钟域的接口指定为多周期路径,但也可以将建立时间视作单周期( X P L L _ C L K XPLL\_CLK XPLL_CLK)路径。如图9-18所示, X P L L _ C L K XPLL\_CLK XPLL_CLK的上升沿发起数据,而 D A C _ C L K DAC\_CLK DAC_CLK的下降沿捕获数据。以下是建立时间检查的路径报告:
![](https://i-blog.csdnimg.cn/blog_migrate/836cba1c205b81e1d5215e838e813796.png)
请注意,该接口是从较快的时钟域到较慢的时钟域,因此如有必要,完全可以将其设置为两周期路径。以下是保持时间检查的路径报告:
![](https://i-blog.csdnimg.cn/blog_migrate/fd994669803986ebf8d97b464096b92b.png)
保持时间检查是在建立时间捕获沿之前一个周期完成的。在这种接口情况下,最关键的保持时间检查是在发起沿和捕获沿重合处执行的,这在以上保持时间检查的报告中可以看出。