Xilinx的vivado设计套件中,对于lvds的使用可以选择两种方式,一是使用原语,例如IDDR ODDR这类进行双边沿数据传输的原语,也有IBUFDS等差分转单端的原语,这些原语为LVDS的不同方式提供解决方案。

而我更多的是去使用selectIO这个IP核来实现lvds的传输。

一、LVDS介绍

LVDS(Low-Voltage Differential Signaling)低电压差分信号,这种传输技术可以达到155Mbps以上。

在FPGA上一般可以配置专门的bank作为lvds的用途。而其由于电压幅度(Ex: LVDS 2.5V)低于一般的(CMOS 3.3V),因此可以达到更高得到传输速度。

对于Xilinx FPGA的LVDS25接口,其最高速度可达600Mbsps。

二、AD9736

AD9736是ADI的一块14bit 1200MSPS的DAC。其功能框图如下

img

从功能框图中可以看到,AD9736为了匹配高速做好同步,芯片会给出一个时钟DATACLK_OUT,此外它还具有SPI控制的内部寄存器等。

在设计上,DATACLK_OUT给FPGA,FPGA给出数据与DATACLK_IN,而DAC_CLK则由pll锁相环芯片来产生,一般的FPGA的时钟输出没有pll锁相环来的干净,稳定。

通过阅读数据手册,可以知道通过寄存器的配置,可以配置AD9736为2x模式或者1x模式。具体如下图所示

img

在2x模式下,其内部会有一个插值滤波器,在两个数据间进行插值,从而使数据时钟可以只要300MHz即可。

此外数据手册也给出了编程的方案,如下图所示

img

根据上图,可以看出,其为DDR的传输模式,且为OPPOSITE_EDGE模式。

此外还有一种SAME_EDGE模式,如下图所示,

img

由于DDR的一个时钟会给出两个数据,可以从他给出的是时序图看出,他有两个数据D1 D2组合然后发送给DB输出,这会在后续SelectIO配置中看出来。

三、SelectIO配置

img

如上图所示,Interface Template采用Custom;

Data Bus Direction由于是DAC所以是output输出模式;

Data Rate采用DDR模式,此外SDR即为Single Data Rate,比较好的区分,就是看他传输时一个时钟会发送几个数据。DDR一个时钟会给出两个数据,而SDR只给一个。

External Data Width根据DAC是几位的配置成几位,此外selectIO可以通过Serialization Factor进行并转串,进一步提高数据吞吐量。

IO Signaling 则是差分以及LVDS 25

最后的Output DDR Data Alignment则为Opposite Edge。这个的选择前面已经讲过。

img

第二页如上图配置,其中Clock Signaling同样是差分 LVDS25电平标准

Clocking Options采用的是外部时钟,因为AD9736有一个DATACLK_OUT,我们将这个时钟输出作为该IP核的时钟,而右边DDR Clk Buffer则是选择相应的原语,将该时钟转化为时钟域的时钟

Clock Forwarding中选择Clock Forwarding,此时该IP核会输出一个差分时钟,这个差分始终与数据同步,供给AD9736的DATA_CLK_IN。

img

第三页则是一些时钟与数据的延迟,为了更好的做同步,这里没有配置。

当配置完整个selectIO,会发现他的数据输入有28位,而不是14位(DAC的位数),这是因为DDR是双边沿,所以他的数据是其位数的两倍。

四、仿真

img

img

计算可得结果符合预期。

附、参考文献

1、【电路】LVDS 差分接口 - KevinChase - 博客园 (cnblogs.com)

2、AD9736 | 标准高速数模转换器 | 亚德诺(ADI)半导体 (analog.com)

3、xilinx IDDR原语时序图_u011600372的博客-CSDN博客