FPGA的常用场合用于数据接口转换,DSP运算等,而这一切的前提都需要数据能正确的输入至FPGA,并正确的输出至外部芯片。
wind330工作大部分涉及数据接口的转换,其中最常用的数据传输方式就是 SDR(Singal Data Rate) ,如何保证数据能被外部器件正确接收,也即保证数据信号与时钟信号存在一个稳定的相位差,而最好的情况是时钟信号的采集边沿处在数据信号的正中央,即 Center Aligned 。中心对齐(Center Aligned)确保下一级芯片有二分之一时钟周期的建立时间和保持时间。
那如何保证FPGA的数据流输出是中心对齐?wind330在学习FPGA前期的理解是,将数据输出寄存器约束在IO模块上,并将时钟取反(相移180°)输出。从原理上说,这种方法并没有错,但是在FPGA实际使用过程中,我们无法预知时钟信号是通过如何路径到达IO口的,在器件资源利用差异较大时,时钟路径也会产生较大的差异。也许有人会说,FPGA的全局时钟资源不是通过专用布线资源到达整个器件吗?wind330在博文BUFGMUX使用注意事项就有提到:全局时钟资源只能到达每个Slice中的FlipFlop,并不包括Slice中的LUT等资源,也就是全局时钟资源不会直接连至IO口,需要用普通布线资源到达IO口。
后来慢慢地,学会了给时钟输出路径添加约束,只要设置合理,就能保证后级器件的建立时间和保持时间。还是觉得麻烦,总是需要查阅器件IO特性和计算,于是就有了下面的方式。
从CycloneIII开始,IO模块就里有5个Registers,可以查阅博文Cyclone2 vs Cyclone3(二),而Spartan3更是有6个Registers,所有IO都支持DDR输入和输出。
Xilinx参考代码如下:
CLKOUT : FDDRRSE
port map (
Q => CLKO,
C0 => CLK180,
C1 => CLK,
CE => '1',
D0 => '1',
D1 => '0',
R => '0',
S => '0');
利用这种方法,时钟输出和数据输出都是通过IO模块的寄存器输出,而触发时钟到达各个寄存器的skew可以忽略不计,保证了数据和时钟信号是中间对齐的,对任何时钟频率都适用。
用户1122702 2010-3-22 09:20
用户62408 2010-3-21 12:54
用户900892 2007-7-27 15:20
现在深圳太热了!不到必不得已.打死不出门!
用户900892 2007-3-5 11:56
在深圳特区,公园的山坡上白天一年四季都有人!人还不少!
晚上也能隐隐约约看到草地上一对一对的。
再问:谁没有过花前月下?哈哈
用户1053025 2007-3-2 09:55
那你的同事,一定是晚上出去瞎逛悠了。北方的冬天是没有户外夜生活滴。。。
用户900892 2007-3-1 16:11
深圳不能和北京比,
我有同事在北京边出差,回来就给我们大讲特讲北京的晚上有多冷!我没有到过北方,不知他说的是不是真的。
用户19679 2007-3-1 15:40
羡慕啊,北京今年虽然暖冬,但是回来还是很冷得说