SDRAM
Clock通常是E0输出或者C2输出,E0和C2都是PLL专用于输出外部时钟的,有比较小的抖动。由于一个FPGA中通常有若干个PLL,综合后使用哪个PLL是由输入时钟Extern
Clock决定的,所以SDRAM Clock必须和Extern
Clock是同一个PLL的专用输入管腿和专用输出管腿。调试SDRAM和Nios II
的最关键是调整SDRAM Clock的相位。下面推导SDRAM Clock和Extern
Clock的相位关系。
用实线向上箭头表示Extern
Clock的上升沿,用虚线向上箭头表示Sdram
Clock的上升沿。先看第一种情况:FPGA输出数据,而SDRAM采样数据。FPGA在Extern
Clock上升沿的时候送出数据,经过最大Tcoutmax(FPGA)的时间在FPGA的管腿输出,由于SDRAM的输入建立时间为Tsu(SDRAM),所以Sdram
Clock的采样时机必须在信号到达SDRAM后再等Tsu(SDRAM)。忽略PCB板传输延时,有:
Tlead=T-(Tcoutmax(FPGA)+
Tsu(SDRAM));其中Tlead 为SDRAM
Clock相对Extern Clock的最大提前量,T为时钟周期。
在下一个时钟上升沿来了后,FPGA会驱动新的信号,在经过最小Tcoutmin(FPGA)的时间(相当于输出保持时间)可能把先前驱动的信号冲掉,而SDRAM要求输入信号要求在采样的时候保持Tih(SDRAM)的时间,所以SDRAM的采样时机必须在Tcoutmin(FPGA)到来之前Tih(SDRAM)。忽略PCB板传输延时,有:
Tlag=Tcoutmin(FPGA)-Tih(SDRAM);其中Tlag
为SDRAM Clock相对Extern
Clock的最大落后量,Tih(SDRAM)为SDRAM输入保持时间。
第二种情况:SDRAM输出数据,FPGA采样数据。分析和上面类似,最后有:
Tlead=Tcoutmin(SDRAM)-Tih(FPGA);
Tlag=
T-(Tcoutmax(SDRAM)+ Tsu(FPGA));
选取最小的Tlead和最小的TlagSDRAM
Clock的允许最大提前量和最大的落后量。举个例子:Nios II 和
SDRAM(MT48LC4M32B2-7)相连主频100MHz。其数据如下:
- Data In: Tsu = 2 ns, Tih = 1 ns
- Data Out: Toh (Tcoutmin )=
2.5 ns, Thz/tac (Tcoutmax)= 5.5 ns (CL=3)
l 2.5 – 5.5 ns (Data Undefined)
FGPA的数据可以在编译报告的时序分析部分得到,Tcoutmax(FPGA)
,Tsu(FPGA),Tih(FPGA)分别可以从Tco,Tsu,Th部分得到各个SDRAM相关信号的最大值。而Tcoutmin(FPGA)则可以运行Fast
timing model timing analyzer 来得到。
比如:
- Data In: Tsu = 1.75 ns, Tih = 0 ns
- Data Out: Tcoutmin(FPGA) = 2 ns,
Tcoutmax(FPGA)=5.5 ns
Tlead=T-(Tcoutmax(FPGA)+
Tsu(SDRAM))=10ns-5.5ns-2ns=2.5ns
Tlead=Tcoutmin(SDRAM)-Tih(FPGA)=2.5ns-0ns=2.5ns
选一个小的,仍然是2.5ns。即Tlead=2.5ns
Tlag=Tcoutmin(FPGA)-Tih(SDRAM)=2ns-1ns=1ns
Tlag= T-(Tcoutmax(SDRAM)+
Tsu(FPGA))=10-5.5ns-1.75ns=2.75ns
选一个小的,即Tlag=1ns。
所以SDRAM Clock的相对External
Clock相位为-2.5ns~+1ns之间。在生成PLL时指定在这个范围内的相位偏移就可以了。
注意:因为FPGA的时序分析报告都是以External
Clock来算的,所以我们并没有使用System Clock来分析。