FPGA 进阶 16:LVDS 源同步接口——ISERDESE、IDELAY 与 bitslip 对齐
本文是
fpga/进阶层第 20 篇。高速 ADC/DAC、CMOS 图像传感器、CameraLink、很多并串转换芯片都用 LVDS 差分对传数据,速率几百 Mbps 到 1Gbps+。这个速率下普通 IO 触发器直接采必然亚稳态,必须动用 FPGA 的专用资源:ISERDESE2/OSERDESE2 串并转换、IDELAYE2 相位校准、随路时钟网络 BUFIO/BUFR、以及 bitslip 字对齐。这篇把源同步 LVDS 接收的工程方法讲完整。RGMII(进阶 18)其实就是源同步 DDR 的一个特例,这里讲通用原理。
本文要回答的问题
- 什么是源同步?为什么必须用随路时钟而不是系统时钟采?
- ISERDESE2/OSERDESE2 解决什么问题?BUFIO/BUFR 怎么分工?
- IDELAYE2/IDELAYCTRL 怎么把采样点调到眼图中央?
- 7:1 SerDes 的 bitslip 字对齐怎么做?
- 并行字怎么跨到系统时钟域?XDC 怎么约束?
- 怎么验证采样稳定、误码率为零?
一、源同步:跟着数据一起来的时钟
普通同步设计里,所有触发器共用一个系统时钟。但高速 LVDS 接口(ADC、摄像头、SerDes 并口)是源同步的:
发送端(ADC/传感器) 接收端(FPGA)
数据 D0 D1.. ──LVDS差分对──► ISERDESE2 ┄┄
数据 Dn ──LVDS差分对──► ISERDESE2 ┄┄ 并行字
随路时钟 CLK ──LVDS差分对──► BUFIO ──────► (驱动上面的ISERDESE)
└─BUFR─► 并行域逻辑 ──异步FIFO──► 系统时钟域- 发送端把数据和一个随路时钟一起发,两者同源头、相位固定;
- FPGA 用随路时钟采数据(而不是系统时钟),因为它和数据严格同频同相;
- 随路时钟经 BUFIO(只驱动 I/O 串并转换器的高速时钟网络)驱动 ISERDESE,经 BUFR(区域时钟)给并行侧逻辑;
- 解出的并行字在随路时钟域,最后用异步 FIFO 跨到系统时钟域(CDC)。
差分 LVDS 输入在 FPGA 端用 IBUFDS(差分输入缓冲)把 P/N 一对转成单端信号,时钟用 IBUFGDS + BUFIO/BUFR。
二、ISERDESE2 / OSERDESE2:IO 里的串并转换
数据率到几百 Mbps 以上时,串行 bit 间隔只有 1~2ns,内部逻辑时钟来不及逐 bit 处理。专用并串转换器解决这个问题:
- ISERDESE2(输入,串→并):在高速随路时钟(BUFIO,可 DDR 双沿)驱动下逐位移入串行 bit,攒够 2/4/6/7/8 位后,一次输出一个并行字到较慢的 BUFR 域——相当于在 IO 里完成降速;
- OSERDESE2(输出,并→串):反向,把并行字加载后按高速时钟逐 bit 串行发出;
- 支持 DDR(上下边沿各采/发一位,等效速率翻倍);
- 内置 BITSLIP 端口用于字对齐(见第四节),可直连 IDELAY。
7:1 模式(7 个串行 bit 凑一个数据字 + 一路随路时钟,常见于 ADC、LVDS 视频)单级 ISERDESE 宽度不够时,用两级 ISERDESE 级联(master/slave)凑出 7/8 位。
三、IDELAYE2 / ODELAYE2:把采样点挪到眼图中央
随路时钟和数据到达 FPGA 内部时,由于走线、封装、对端相位偏差,采样沿未必落在数据有效窗口中央。IDELAYE2 是每个输入引脚的可编程延迟线:
- 每 tap 约 78ps(7 系列)、共 32 tap,可对输入数据(或时钟)延迟;
- IDELAYCTRL:用 200MHz 参考时钟持续校准 tap 步长,使其不随 PVT(工艺/电压/温度)漂移——同一个 bank 用了 IDELAY 就必须例化 IDELAYCTRL 并供 200MHz,否则延迟不准;
- ODELAYE2 用于输出侧(配合 OSERDESE)。
眼图扫描标定法:让对端发固定训练码(PRBS 或翻转码),FPGA 从 0 到 31 扫 IDELAY tap,每个值统计解出的字是否正确,得到一段「通过窗口」,取窗口中点锁定。中点采样裕量最大,温度电压漂移也不容易出错。
误码率
高 | XXXX XXXX (X=出错)
| X X----------------------------X X
低 | X X [通过窗口] X X
|__X__X____________________________X__X____ tap
边沿 边沿
▲ 取窗口中点锁定四、bitslip:字与帧对齐
串并转换时,移位寄存器从串行流的哪个 bit 开始攒是不确定的,攒出的「字节」可能整体 bit 错位(7:1 还要对齐 7 bit 边界)。BITSLIP 让 ISERDESE 每触发一次就把采样窗口滑动一个 bit(SDR 滑 1 位;DDR 模式下滑移顺序跨上下边沿,需按手册时序),改变并行字的起点。
对齐流程(让对端发训练字 TRAIN_WORD):
// bitslip 对齐状态机(简化)
localparam S_SEARCH=0, S_SLIP=1, S_CHECK=2, S_LOCK=3;
reg [1:0] state; reg [7:0] good_cnt;
always @(posedge div_clk) begin
if (rst) begin state <= S_SEARCH; bitslip <= 1'b0; good_cnt <= 0; end
else case (state)
S_SEARCH:
if (parallel_word == TRAIN_WORD) begin // 当前已对齐
good_cnt <= good_cnt + 1;
if (good_cnt >= 8'd8) state <= S_LOCK; // 连续8个对 -> 锁定
end else begin
good_cnt <= 0; state <= S_SLIP; // 不对 -> 滑一位
end
S_SLIP: begin bitslip <= 1'b1; state <= S_CHECK; end // 拉一拍bitslip
S_CHECK: begin bitslip <= 1'b0; state <= S_SEARCH; end // 滑完重新比
S_LOCK: ; // 对齐锁定,正常收数
endcase
end- bitslip 是脉冲:拉高一个并行时钟周期后要等几拍(ISERDESE 重新装载)再判断新字;
- 字对齐(bit 边界)用训练字;帧对齐再靠协议帧头(如摄像头 SOF、ADC 帧同步)做更高一层定位;
- 多条数据通道(多路 LVDS)要各自 bitslip 独立对齐到同一个随路时钟。
五、时钟结构与跨域
| 资源 | 作用 |
|---|---|
| IBUFDS/IBUFGDS | LVDS 差分 P/N → 单端 |
| BUFIO | 高速时钟网络,只驱动 ISERDESE/OSERDESE,不驱动逻辑、不能做普通时钟 |
| BUFR | 区域时钟,可分频,驱动 ISERDESE 的并行侧(CLKDIV)和本地逻辑 |
| IDELAYCTRL | 校准 IDELAY tap(需 200MHz refclk) |
| 异步 FIFO | 解出的并行字从随路时钟域(BUFR)跨到系统时钟域 |
数据在 BUFR 域解出后,因为系统逻辑用另一个时钟,标准做法是写进异步 FIFO(进阶 08),系统时钟侧读出,彻底隔离 CDC。
六、时序约束要点
- 随路时钟(BUFIO/BUFR)是从引脚进来的真实时钟,要
create_clock约束其频率/周期(在差分时钟输入端口);BUFR 分频出来的并行时钟用create_generated_clock关联; - 数据经 IDELAY + ISERDESE 到 CLKDIV 域的路径由原语保证,随路时钟到数据的相位是刻意用 IDELAY 调的,按源同步接口约束(输入延迟/原语约束),不要把 BUFIO/BUFR 域到系统时钟域的逻辑路径当同步路径——它们之间靠异步 FIFO 隔离,FIFO 两侧做相应的
set_false_path/异步时钟组约束(set_clock_groups -asynchronous); - IDELAYCTRL 的 200MHz 参考时钟也要约束,并确保放置在用到 IDELAY 的同一 bank 附近;
- LVDS 引脚要放在支持 ISERDESE/IDELAY 的 HP(high-range/high-performance)bank,电平标准设为
LVDS(或LVDS_25/DIFF_{...},依器件和外部端接)。
七、调试验证清单(目标:误码率为零)
- 硬件/管脚:LVDS 差分对在支持的 bank、引脚电平/端接正确、随路时钟和数据同组同 bank(避免跨 bank 延迟差);
- 时钟进来:ILA/IBUFDS 后能看到随路时钟翻转、频率对(先用计数器测频);IDELAYCTRL 的
rdy拉高(200MHz 参考正常); - 解串出数据:ISERDESE 并行口有非全 0/全 1 的跳动;
- IDELAY 眼图扫描:发训练码,扫 0~31 tap,画出通过窗口,确认有足够宽的窗口并锁定中点(窗口很窄或没有 → 查时钟相位/极性、IO 标准、走线);
- bitslip 锁定:状态机进入 LOCK、连续大量训练字无错;
- 长流量误码率:对端发 PRBS/已知数据,FPGA 侧比对,跑几分钟/上亿字节统计误码——必须 0 误码才算通;温度拉偏/降频复测裕量;
- 跨域:异步 FIFO 不溢出、系统侧数据连续不错位(见 FIFO 水位)。
相关与延伸
前置/配套:CDC 亚稳态、异步 FIFO(跨域落点)、XDC 约束、静态时序分析。源同步思想同样用于 RGMII 以太网(那是 4bit DDR 的特例)。 更高速率(数 Gbps、8b/10b、CDR 时钟恢复)超出 LVDS 源同步范畴,要用 GTP/GTX 高速收发器,见专家层「高速收发器使用」「收发器深水区(8b10b·CDR)」规划篇。
一句话总结:LVDS 源同步接口要用随路时钟(IBUFDS→BUFIO 驱动 ISERDESE2)在 IO 里直接做 DDR 串并转换、用 IDELAYE2 + IDELAYCTRL(200MHz 校准)把采样点扫到眼图中点、用 bitslip 按训练字对齐字节边界,解出的并行字经 BUFR 域异步 FIFO 跨到系统时钟;XDC 把随路时钟当真实时钟、跨域路径按异步处理;验收标准是训练字锁定后长流量零误码且有足够延迟裕量。