使用DDR4这个IP核时,时钟如何架构十分关键,DDR4 IP对时钟有特殊的要求,可以是差分时钟也可以是No buffer的单端时钟,在IP核的配置界面可以配置。如果选择的是差分时钟,可以直接与硬件的差分端口直接连接,如果选择的是No buffer,顶层输入的差分时钟利用差分转单端的原语转换成单端时钟即可。
IBUFDS IBUFDS_inst (
.O(O), // 1-bit output: Buffer output
.I(I), // 1-bit input: Diff_p buffer input (connect directly to top-level port)
.IB(IB) // 1-bit input: Diff_n buffer input (connect directly to top-level port)
);
但是,我们的时钟显然不能只给DDR4这个IP核使用,我们其他的模块也需要时钟,不同频率的时钟,因此,我们需要PLL生成我们需要的不同频率的时钟。但是DDR4对时钟要求很高,PLL生成的时钟质量抖动不合格,编译的过程中会直接报错。另外,我们用给DDR4的时钟去另外生成一个PLL也是不行的,编译时也会直接报错。通过下面的时钟树也能看出,从时钟管脚输入的时钟到DDR4 之间不能有其他的PLL或者MMCM,因此如果我们想要生成一个PLL,只能把PLL放在DDR4之后,我们可以使用ui_clk或者在IP配置界面的Additional Clock Outputs中输出一个时钟,用这个时钟生成PLL。都是血的教训啊!!!