ADC DDR时序约束问题源同步约束
时序如图所示,在fpga中的PLL用了源同步模式,约束如下,看了一下时序分析图,应该是set_input_delay的值计算的有问题,不知道这么算错在哪里?另外,直接set_input_delay的值用tskew的值也出现时序不稳定。
- create_clock -name virt_clk -period 121MHz
- create_clock -name input_clock -period 121MHz [get_ports ADC_DCO]
- create_generated_clock -name rx_clock -source adc_pll_inst|altpll_component|auto_generated|pll1|inclk[0] \ adc_pll_inst|altpll_component|auto_generated|pll1|clk[1] -phase 90
- set tPD_min 4.1
- set tPD_max 5.2
- set tDCO_min 4.7
- set tDCO_max 5.8
- set Tco_max [expr $tPD_max - $tDCO_min]
- set Tco_min [expr $tPD_min - $tDCO_max]
- set freqDCO 121
- set period [expr 1000.0/$freqDCO]
- set phi_pll_adc 90
- set delta_t [expr $phi_pll_adc * $period / 360.0]
- set data_delay_max [expr $Tco_max - $delta_t]
- set data_delay_min [expr $Tco_min - $delta_t]
-
- set_input_delay -max -clock [get_clocks virt_clk] $data_delay_max [get_ports {ADC_D[*]}]
- set_input_delay -min -clock [get_clocks virt_clk] $data_delay_min [get_ports {ADC_D[*]}]
- set_input_delay -max -clock [get_clocks virt_clk] -clock_fall $data_delay_max [get_ports {ADC_D[*]}] -add
- set_input_delay -min -clock [get_clocks virt_clk] -clock_fall $data_delay_min [get_ports {ADC_D[*]}] -add
-
- set_false_path -setup -rise_from [get_clocks virt_clk] \
- -fall_to [get_clocks rx_clock]
- set_false_path -setup -fall_from [get_clocks virt_clk] \
- -rise_to [get_clocks rx_clock]
- set_false_path -hold -rise_from [get_clocks virt_clk] \
- -rise_to [get_clocks rx_clock]
- set_false_path -hold -fall_from [get_clocks virt_clk] \
- -fall_to [get_clocks rx_clock]
很久不搞ADC接口了,一些建议如下:
1)AN433(altera)详细的介绍了如何进行源同步的时序约束。
2)个人的理解的一些简单的约束的办法。
a. 用示波器测量时钟和数据(所有bit)的建立和保持时间。
b.假设建立时间为Ts 那么max_delay 就是Ts。 假设保持时间为Th 那么min_delay 就是-Th。
c.当然你能根据手册推到出送到FPGA接口的virtual_clk和Data的关系也可以,约束办法如上。
d.还有一些注意实行就是,用一个数据UI的70%减去Ts得到Th,这样把Skew的余量留出来。
总而言之,你要清晰的告诉FPGA的综合工具,送到FPGA的始终和数据的时序关系是怎么样的,这个可以通过手册推导,也可以通过示波器测量。
说了很多,很多疏漏的地方,请见谅。
# set multi cycle ,供参考
set_multicycle_path -setup -end 0 -rise_from [get_clocks virtual_clk] -rise_to [get_clocks input_clock]
set_multicycle_path -setup -end 0 -fall_from [get_clocks virtual_clk] -fall_to [get_clocks input_clock]
set_multicycle_path -hold -end -1 -rise_from [get_clocks virtual_clk] -rise_to [get_clocks input_clock]
set_multicycle_path -hold -end -1 -fall_from [get_clocks virtual_clk] -fall_to [get_clocks input_clock]
你好,按照AN433试了,手头上不太好用示波器测试,现在只能不停的调整PLL来采集,很难找到一个合适的phase。
- set tPD_min 4.1
- set tPD_max 5.2
- set tDCO_min 4.7
- set tDCO_max 5.8
- set Tco_max [expr $tPD_max - $tDCO_min]
- set Tco_min [expr $tPD_min - $tDCO_max]
- set freqDCO 121
- set period [expr 1000.0/$freqDCO]
- set phi_pll_adc 90
- set delta_t [expr $phi_pll_adc * $period / 360.0]
- set data_delay_max [expr $Tco_max - $delta_t]
- set data_delay_min [expr $Tco_min - $delta_t]
data_delay_max = (5.2-4.7)- [90*1000/121/360] = -1.566
data_delay_min = (4.1-5.8)- [90*1000/121/360] = -3.766
这两个参数似乎是有问题的,因为一般情况下,data_delay_max是正的,不要考虑PLL的问题,内部的综合工具会自动的把相应的延时计算进去。
建议去掉delta_t, 试一下:
data_delay_max = (5.2-4.7)= 0.5
data_delay_min = -1.7
有点过约束,只要器件性能可以,应该能满足。
另外,用PLL调相,你是用在线的动态重配,还是重新编版本?
如果是重新编版本的话,综合工具会综合你的调相后的结果重新布局布线,所以相当于没调。
再试一下。
对了Multi_cycle 也要加上,这个也很重要
set_multicycle_path 需要加上,设置set_input_delay -max和-min直接用Tskew的max和min就可以了,只要PCB布线没有额外的延时可以准确的采样到数据。我再RGMII接口的设计就是这样约束的,
假设TSKEW的min、typ、max分别是0.3、0.5、0.7。这样试试:
create_clock -name input_clock -period 8.264 -waveform{0.5 4.632} [get_ports ADC_DCO]
set data_delay_max 0.2
set data_delay_min -0.2
其它约束不改动。
学习一下,小编辛苦,顶一下!3026827905
adc本身可以通过配置寄存器来调整随路时钟跟数据相位关系。这个调试起来应该会更简单一点。
