DDR调试问题汇总,以及时钟例化问题。
一、 问题描述:
ERROR:NgdBuild:455 - logical net 'clk400m_p' has multiple driver(s)
ERROR:NgdBuild:455 - logical net 'clk400m_n' has multiple driver(s)
解决办法:
DDR生成后有一个顶层的源文件,在那里面找到一个关于原语写的BUFG也不知是IBUFG,将这个原语跳过就可以,保存然后在编译就不报错了。
原因分析:
DCM出来的时钟经进了BUFG,而DDR的输入时钟是从IBUFG进入的,在底层结构上BUFG不能联到IBUFG。
二、问题描述:
在Translate过程中出现如下错误:
"ERROR:ConstraintSystem:59 - Constraint< xxx >: NET/INST "xxx" 未找到。Please verify that:
1. The specified design element actually exists in the design.
2. The specified object is spelled correctly in the constraint source file.
解决办法:
为了防止综合工具删除 net,应为 net 应用 "KEEP"
另外注意检查管脚约束UCF文件中,是否有对多余的IO信号分配了同一个管脚。
三、 问题描述:
在implement时点击translate后,出现如下错误:
ERROR:NgdBuild:924- input pad net 'clk' is driving non-buffer primitive。
意为输入信号clk未经buffer就用来驱动其他primitives了
原因分析:
输入时钟clk_in在作为DCM输入引脚的时候又为其他module的输入,也就是说clk有两个load,连接PLL时,输入信号先要连接到内部buffer以产生较强
的驱动能力,从而保证时钟的时序质量。但是由于输入信号的另一分支不经过任何电路就直接连接到了输出Pad ,所以存在一种可能,即连接buffer的
分支会被短路,从而失去预期的效果。即输入clk两个分支,一个直接连到模块fsm;一个连在了DCM的输入时钟源。由于经过DCM时会自动加一个buffer
缓冲器,而到fsm会直接连在一起,这样会造成DCM这一路短路出现错误。正因为如此,ISE给出了错误警告。
解决办法:
clk只是连接一个load,就是DCM。DCM两个输出一个CLKFX_OUT_1,另外一个用CLK0_OUT,此信号和clk无论相位还是频率是一样的。
另外: chipscope 不能用晶振输入时钟来作为采样时钟
四、 问题描述:
PLL或者DLL产生的时钟直接接到核上,出现如下错误
ERROR:NgdBuild:770 - BUFG 'test_ddr2_inst/memc3_infrastructure_inst/se_input_clk.u_ibufg_sys_clk'
And BUFG 'pll_200m_inst/clkout1_buf' on net 'clk_200m' are lined up in series.
Buffers of the same direction cannot be placed in series.
原因分析:
IBUFG和BUFG串一块儿了。
解决办法:
进到PLL或者DDR2模块里,把相应的BUFG(IBUFG)屏蔽掉。
五、ddr2 ip系统时钟
在ip配置过程中,如果配置成差分形式,必须从板级差分输入时钟提供,
如果配置成单端的形式,可以从板级输入或者从内部锁相环输出来提供。
解决问题四的案例:
我在XILINX平台上做DDR2,需要200m的时钟信号,我就用DCM倍频了一个,直接接在DDR2的ipcore上面,出现了如下错误,请大神指点一二,不胜感激!!
ERROR:NgdBuild:770 - IBUFG'test_ddr2_inst/memc3_infrastructure_inst/se_input_clk.u_ibufg_sys_clk' and
BUFG 'pll_200m_inst/clkout1_buf' on net 'clk_200m' are lined up in series.
Buffers of the same direction cannot be placed in series.
我的程序代码如下:
//**** PLL产生200Mhz时钟信号
然后我直接把clk_200m给了DDR2的系统时钟信号,如下图所示:
这样会出现问题,不知道怎么解决了呢?
之前测试DDR2的时候,我是把外部的时钟直接接在DDR2的ipcore上面,用的是150M的时钟,现在板子上面只有一个50M的时钟了,只能自己用DCM倍频了,应该是可以通过一个原语解决的,但是不知道是哪个?我胡乱测试了一下,都不行。
我用的是xilinx14.7的版本,也尝试设置了XST的这项设置,去掉Add I/O buffer 但是没用。
问题解决,我首先尝试修改PLL的源代码,把下面代码注释掉 ;
大功告成,编译就没问题了!!