wind330

SDR数据输出的较佳方式

0
阅读(3677)

SDR数据输出的较佳方式 (by Wind330)

   


概述

FPGA的常用场合用于数据接口转换,DSP运算等,而这一切的前提都需要数据能正确的输入至FPGA,并正确的输出至外部芯片。

SDR输出实现方法

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特性和计算,于是就有了下面的方式。

DDR方式输出时钟

从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可以忽略不计,保证了数据和时钟信号是中间对齐的,对任何时钟频率都适用。