在xilinx的FPGA中,要实现高频时钟的输出,并保证时钟质量,最有效的方案是使用ODDR来产生。
例如,需要输出的时钟为CLK,用CLK来驱动ODDR,让ODDR在CLK的上升沿输出0或1,在CLK的下降沿输出1或0,从而产生一个时钟脉冲CLKOUT,CLKOUT的时钟频率和CLK完全相同。
ODDR位于IOB里面,如果CLK是由BUFG驱动的,那么从CLK到ODDR的路径在每次实现中是确定,从OODR到FPGA芯片PAD的路径和延迟也是确定的,由ODDR产生的时钟是一个稳定的高质量时钟。
一种常见的错误做法是:用CLK由BUFG驱动以后,直接连接到某个具有时钟输入能力的管脚(CC管脚)。因为,CC管脚只有用作时钟输入时才能直接输入到BUFG中,而BUFG输出到CC管脚,效果等同于输出到任何一个普通管脚。
这样应用方法是无法保证从BUFG到FPGA芯片PAD的走线长度的,而且一部分走线使用的是非专用布线资源。这种方法产生的时钟脉冲质量并不好。
SPartan6FPGA中, PLL产生的时钟不能直接连到FPGA的通用I/O上。如果硬件已经连上了,可通过在PLL输出与通用I/O之间增加ODDR2模块缓冲来解决。
ODDR2 #(
.DDR_ALIGNMENT ("NONE" ), // Sets output alignment to "NONE", "C0" or "C1"
.INIT (1'b0 ), // Sets initial state of the Q output to 1'b0 or 1'b1
.SRTYPE ("SYNC" ) // Specifies"SYNC" or "ASYNC" set/reset
) U_ODDR2_clkname (
.Q (oddr2_I/O-pin ), // 1-bit DDR output data
.C0 (clkname ), // 1-bit clock input
.C1 (~clkname ), // 1-bit clock input
.CE (1'b1 ), // 1-bit clock enable input
.D0 (1'b1 ), // 1-bit data input (associated with C0)
.D1 (1'b0 ), // 1-bit data input (associated with C1)
.R (1'b0 ), // 1-bit reset input
.S (1'b0 )/ / 1-bit set input
);