从零构建 LVDS 高速通信链路:基于 Vivado IP 核的实战指南
面对高速 ADC 数据采集任务时,传感器通过 LVDS 接口输出 1.2 Gbps 原始数据流,而 FPGA 板子频频丢帧、采样错乱的情况并不少见。示波器上看眼图闭合严重,ILA 抓出来的数据跳变无序——问题通常出在 PCB 走线匹配、时钟相位未对齐或内部采样逻辑上。
本文将深入探讨如何基于 Xilinx Vivado 官方 IP 核和 SelectIO 原语,实现一套稳定可靠的 LVDS 高速通信系统。全程不依赖任何第三方模块,你不需要精通 SerDes 硬核原理,但能真正理解'为什么这样接就通了'。
一、为什么选 LVDS?
如果你的应用涉及中高带宽(>100 Mbps)、长距离传输(>15 cm)且抗干扰要求高,LVDS 几乎是绕不开的选择。
| 特性 | 对比传统 CMOS |
|---|---|
| 工作电压 | ~350mV 差分摆幅 |
| 功耗 | 恒流驱动,功耗低 |
| EMI 辐射 | 差分抵消磁场,极小 |
| 抗噪能力 | 天然抑制共模噪声 |
| 最大速率 | 单通道可达 1.6+ Gbps(7 系列) |
在 FPGA 平台上,Xilinx 把 LVDS 的物理层支持做进了 IO Bank 里。只要管脚支持 LVDS_25 标准,就能直接用顶层逻辑控制高速差分信号。真正的挑战在于如何让数据稳稳地落在采样窗口中央。
二、硬件结构拆解
典型的点对点 LVDS 链路如下:
[外部设备] ↓ 差分数据 + 随路时钟(可选) [FPGA LVDS IO] ↓ IBUFDS → IDELAY → IDDR → FIFO → 用户逻辑
我们重点关注 FPGA 侧的接收路径设计。发送端相对简单,但接收端才是最容易翻车的地方。
| 模块 | 作用 | 是否必须 |
| --- | --- |
| IBUFDS | 将外部 LVDS 差分信号转为单端信号 | ✅ 必须 |
| IDELAY | 调节输入延迟,补偿 PCB 走线与时钟偏移 | ⚠️ 建议使用 |
| IDDR | 双沿采样,将 DDR 数据还原为并行格式 | ✅ 必须 |
| FIFO | 缓冲跨时钟域数据,防溢出 | ✅ 强烈建议 |
很多初学者以为只要接上 IBUFDS 再连个寄存器就能采样,结果发现偶尔正常、重启后又失败。根本原因是忽略了建立保持时间约束和采样边沿对齐。
三、核心实现:搭建 LVDS 接收通路
1. 创建工程与设置 IO 标准
打开 Vivado,新建 RTL 工程,选择 FPGA 型号(如 XC7K325T-2FFG900C)。在 XDC 约束文件中声明差分端口及其电气特性:
# 输入数据(4 位 LVDS)
set_property PACKAGE_PIN AB10 [get_ports rx_data_p[0]]
set_property PACKAGE_PIN AB9 [get_ports rx_data_n[0]]
set_property IOSTANDARD LVDS_25 [get_ports rx_data_p[0]]
set_property DIFF_TERM TRUE [get_ports rx_data_p[0]]
# 输入随路时钟
set_property PACKAGE_PIN Y9 [get_ports rx_clk_p]
set_property PACKAGE_PIN Y8 [get_ports rx_clk_n]
set_property IOSTANDARD LVDS_25 [get_ports rx_clk_p]
set_property DIFF_TERM TRUE [get_ports rx_clk_p]
注意:DIFF_TERM TRUE 启用片内 100Ω终端电阻;管脚必须位于支持 LVDS 的 IO Bank 内;差分对的 P/N 引脚必须成对分配。
2. 恢复随路时钟
随路时钟是从源端同步发出的,用于接收方采样。我们需要先把它恢复出来:

