下面我们来进行约束SDRAM
对于输出延迟,不管时钟和数据相同还是时钟和数据相反的情况
output delay max = Tdata(pcb) - skew(ext) + Tsu
output delay min = Tdata(pcb) - skew(ext) - Th
对于输入延迟,不管时钟和数据方向相同的情况还是时钟和数据方向相反的情况
input delay max = Tdata(pcb) - skew(ext) + Tco(max)
input delay min = Tdata(pcb) - skew(ext) + Tco(min)
FPGA往SDRAM里面写数据,就是控制最大输出延迟和最小输出延迟,此时数据和时钟方向相同
最大输出延迟output delay max = Tdata(pcb) -Tclk2(ext) + Tsu
最小输出延迟output delay min = Tdata(pcb) - Tclk2(ext) - Th
另外,数据和时钟线等长,那么 Tdata(pcb) == Tclk2(ext)
所以
最大输出延迟output delay max = Tsu
最小输出延迟output delay min = -Th
查看SDRAM的数据手册
数据手册
可以看到这些控制命令的输入时间中,tcms为上升沿到来之前的时间,即建立时间Tsu,tcmh为上升沿到来之后的时间,即保持时间Th
数据手册中显示tcms=1.5ns,tcmh=0.8ns
所以
最大输出延迟output delay max = Tsu = 1.5ns
最小输出延迟output delay min = -Th = -0.8ns
FPGA从SDRAM里面取数据,就是控制最大输入延迟和最小输入延迟,此时数据和时钟方向相反,
最大输入延迟input delay max = Tco(max) + Tdata(pcb) + Tclk1(ext)
最小输入延迟input delay min = Tco(min) + Tdata(pcb) + Tclk1(ext)
数据和时钟线等长,那么 Tdata(pcb) == Tclk1(ext)
所以
最大输入延迟input delay max = Tco(max) + 2Tdata(pcb)
最小输入延迟input delay min = Tco(min) + 2Tdata(pcb)
Tdata(pcb)是可以通过PCB走线长度计算出来(5555mil/ns)
根据自己的硬件设备,sdram到fpga的距离计算Tdata(pcb),我们这里采用AC620开发板,Tdata(pcb)约为0.5ns
下面查看数据手册找出Tco
查看Read Timing,看到上升沿到数据有效的时间为Tac,这个时间就是Tco,
可以看到Tac最大为6ns,即Tco=6ns,没有给出最小值
所以
最大输入延迟input delay max = Tco(max) + 2*Tdata(pcb) = 6 + 2 0.5 = 7ns
最小输入延迟input delay min = Tco(min) + 2Tdata(pcb) < 7ns
总结
最大输出延迟output delay max = Tsu = 1.5ns
最小输出延迟output delay min = -Th = -0.8ns
最大输入延迟input delay max = Tco(max) + 2*Tdata(pcb) = 6 + 2 0.5 = 7ns
最小输入延迟input delay min = Tco(min) + 2Tdata(pcb) < 7ns
下面进行软件实际操作约束
打开TimeQuest软件
因为SDRAM的时钟是由FPGA的PLL生成的,所以首先是生成时钟进行绑定
从代码中可以看到sdram的是c1时钟
目标时钟
接着约束output delay
先是最大输出延迟
然后最小输出延迟
最大输入延迟
最小输入延迟低于7ns就好,我们设定5ns
设置完后,生成SDC文件,在Quartus软件中重新全编译
重编译后,打开TimeQuest查看报告
首先看失败的路径
可以看到,节点从外部的sdram_dp到内部4端口控制器,Launch Clock是clk_sdram,Latch Clock是clk[0],Relationship = 2.5ns,即400M,但是这两个时钟是100M,所在问题存在这里,Relationship存在错误
我们查看路径的波形图
怎么会是2.5ns呢,我们查看这两个的时钟,Launch Clock是clk_sdram,而clk_sdram是绑定clk[1],Latch Clock是clk[0],可以看到,clk[1] 与 clk[0]这两个时钟是存在90度的相位差,clk[1]比clk[0]提前了2.5ns,
问题是Launch Clock与Latch Clock差2.5ns,Launch Clock到来,开始发数据,2.5ns后,Latch Clock到来,开始接收数据,然而这个2.5ns的时间过短,Tco的时间都要7ns,也就是说Launch Clock到来,数据还没有稳定到达输出端,Latch Clock就来了,开始接收数据了,这是肯定取不到数据的,所以这就有问题,应该在 Latch Clock下一个上升沿的地方进行取数据,那么Relationship = 2.5+10=12.5ns
我们需要告知软件Relationship=12.5ns
这里面有两个选项,是Set Multicycle(between nodes),Set Multicycle(between clock),一个是设置节点之间,一个是设置时钟之间,从报错的信息来看,单设定节点,需要设置很多次,而所有的报错的路径的时钟都相同,所以我们统一设置时钟就可以了
这里面Value是指从Launch Clock出发,经过第几个上升沿的Latch Clock来计算Relationship,Latch Clock显然是2
设定后,再去查看,发现没有错误了,我们查看设定的路径信息
可以看到此时的Relationship=12.5ns
至此设定完毕,保存到SDC,再重新编译查看报告,此时,没有任何错误了