读了GoldSunMonkey 写的IO结构,很有启发,萌发冲动,针对spartan6的ddr设计,写写最近读的资料心得。
注意:ddr不是指内存条,而是一种时序结构,即时钟的上下边沿都触发数据。
spartan6的实现非常简单,我们可以从物理通道分析:
时钟信号经过IBUFGDS,信号名为ClkCtrl_InClk,一路送给IOB中的D触发器,一路经过IDLEAY、BUFIO,变为时钟ClkCtrl_MonClk,时钟ClkCtrl_MonClk对信号ClkCtrl_InClk采样。
数据信号经过IBUFDS,送给IOB中的D触发器.
假设PCB板上data和clk迹线长度相等,且数据在沿处变化(这个不是很关键,只要在fpga pad上数据和时钟有很确切的关系)。首先ClkCtrl_MonClk读取采样的clkCtrl_InClk值,如果正好采样在ClkCtrl_InClk边沿,采样值前后会不一致,记录下来,IDELAY延迟一个tap,继续采样,直到稳定,稳定后知道前一次是上升沿还是下降沿。不断增加IDELAY tap,直到检测下一次的沿。记录两次沿的tap值,设置最终的tap为平均值,可保证ClkCtrl_MonClk在ClkCtrl_InClk中间采样。
data的相位与clk相位相同,所以可保证ClkCtrl_MonClk在数据中央采样
上述有个假设,即IBUFDS、IBUFGDS延迟基本相等,出来之后到D触发器延迟基本相等,这个可以参照手册。
详细过程参考xapp866 An Interface for Texas Instruments Analog-to-Digital Converters with Serial LVDS Outputs.pdf |