篇11:LVDS接口深潜------差分信号与高速显示
前面我们用RGB接口点亮了屏幕,但那是并行的TTL电平,线多、速度慢、抗干扰差。当你需要驱动一块7寸以上、分辨率超过800×480的屏幕时,RGB接口的局限性就暴露了------PCLK冲到50MHz以上,十几根数据线同时跳变,EMI和串扰让你头痛不已。
LVDS(Low Voltage Differential Signaling) 就是为解决这些问题而生的。它用几对差分线取代了二十多根并行线,用几百mV的摆幅实现了几百Mbps的速率。这一篇,我们深入LVDS的物理层、协议层和FPGA实现,让你彻底搞懂:为什么LVDS能跑这么快,以及怎么用FPGA驱动一块LVDS接口的屏幕。
一、为什么需要LVDS?
1.1 并行RGB接口的"三座大山"
| 问题 | 具体表现 |
|---|---|
| 线束太多 | 24位RGB + 3个同步信号 + PCLK = 28根线,FPC排线粗、成本高、易断 |
| 频率瓶颈 | 高分辨率下PCLK过高(如1080p@60需~150MHz),信号完整性极差 |
| EMI严重 | 多个CMOS信号同时跳变(地弹、串扰),辐射超标,过不了EMC认证 |
1.2 LVDS如何破局
- 差分传输 :一对线传输一个信号,正负相减抵消共模噪声,抗干扰能力强
- 低压摆幅 :350mV(vs CMOS的3.3V),功耗低、电磁辐射小
- 串行化 :将多路并行数据合并成几路高速串行流,线数从28根降到8~10根
一个比喻 :并行RGB是很多辆小车并排走,车道多但每辆车跑得慢,还互相干扰;LVDS是把小车上的货物卸下来装到几辆大卡车(串行数据流)上,卡车跑得快、车道少、互不干扰。
二、LVDS电气特性速览
2.1 关键参数
| 参数 | 典型值 | 说明 |
|---|---|---|
| 差分摆幅(Vod) | 250~450mV | 通常350mV,驱动电流3.5mA×100Ω |
| 共模电压(Vcm) | 1.2V | 对地平均值,允许±50mV漂移 |
| 终端电阻 | 100Ω | 接收端跨接在差分对上,必须匹配 |
| 数据速率 | 100Mbps ~ 1Gbps | 取决于传输距离和线材 |
| 传输距离 | 最长10米(但屏内<30cm) |
2.2 为什么是100Ω?
差分线的特性阻抗通常设计为100Ω(±10%)。在接收端并接100Ω电阻:
- 消除反射,保证信号完整性
- 将电流信号转换为电压信号(I×R = V)
⚠️ 踩坑预警 :很多工程师忘记在接收端加100Ω终端电阻,或者加错位置(应该靠近接收器引脚)。没有终端电阻时,信号会反射,导致眼图闭合,屏幕出现雪花或闪烁。
2.3 LVDS不是唯一的差分标准
市面上还有 miniLVDS (摆幅更低,用于屏内)、 MIPI D-PHY (有HS/LP两种模式)、 SubLVDS (用于图像传感器)。它们的电气层略有差异,不能混接。本篇聚焦标准LVDS(ANSI/TIA/EIA-644),也就是大多数工控屏和笔记本屏使用的接口。
三、串行化与映射:把并行数据塞进差分线
3.1 常见LVDS通道配置
| 通道数 | 串行化比 | 每周期传输位数 | 典型应用 |
|---|---|---|---|
| 1对数据+1对时钟 | 7:1 | 7 | 小尺寸(≤800×480),18位色 |
| 2对数据+1对时钟 | 7:1 | 14 | 800×480~1024×768 |
| 4对数据+1对时钟 | 7:1 | 28 | 最常见 ,支持24位色,1366×768以上 |
| 8对数据+1对时钟 | 7:1 | 56 | 大尺寸4K电视(需更高带宽) |
核心概念 :串行化因子7:1的意思是:每个像素时钟周期内,每条数据线串行发送7个比特。因此4通道LVDS每周期共发送28比特,正好可以打包24位RGB + 3位同步信号 + 1位保留。
3.2 标准映射表(VESA vs JEIDA)
24位色的映射存在两个互不兼容的标准:
| 标准 | 数据映射特点 | 常见于 |
|---|---|---|
| VESA | 按照R7:0、G7:0、B7:0顺序排列,高位在低通道 | 欧美、台湾屏 |
| JEIDA | 与VESA相比,RGB的高低bit反转(高位变低位) | 日本屏(如Sharp) |
示例(VESA,4通道,7:1映射) :
| 通道 | 每周期7位(位6~位0) |
|---|---|
| CH0 | R2, R1, R0, G2, G1, G0, B2 |
| CH1 | R5, R4, R3, G5, G4, G3, B5 |
| CH2 | B4, B3, R7, R6, G7, G6, B7 |
| CH3 | B6, DE, VSYNC, HSYNC, B1, B0, 保留 |
注意 :不同芯片厂商的映射表可能不同。TI的DS90CF384与NS的对应型号略有差异。 使用前必须核对规格书 ,否则颜色会完全错乱(红蓝互换、色阶颠倒)。
3.3 串行化的时钟关系
LVDS接口需要两种时钟:
- 像素时钟(PCLK) :频率与RGB接口的PCLK相同,决定了每秒钟传输的像素数。例如1024×768@60,PCLK≈65MHz。
- 串行时钟(Serializer Clock) :频率 = PCLK × 串行化因子。对于7:1,串行时钟 = 7×PCLK。例如PCLK=65MHz,串行时钟=455MHz。
LVDS差分时钟对的频率等于 串行时钟 ,而不是PCLK。接收端用这个时钟来采样串行数据。
四、FPGA实现LVDS发送器
4.1 硬件要求
- I/O电平支持LVDS :Xilinx 7系列及以上的HP Bank支持LVDS_25;某些Artix-7的HR Bank可能只支持LVCMOS,需要外部电平转换。
- 高速串行接口 :需要 OSERDES (并行转串行)和 OBUFDS (差分输出)。
- PLL :用于生成串行时钟(7×PCLK)以及内部的并行时钟。
4.2 模块结构
PCLK (并行时钟) ──┬──> 并行数据锁存 ──> OSERDES ──> OBUFDS ──> LVDS_P/N
│
└──> PLL ──> 串行时钟(7×PCLK) ──> OSERDES的CLK
│
└──> 差分时钟输出 (另一对OBUFDS)
4.3 OSERDESE2原语配置(Xilinx 7系列)
以4通道LVDS,7:1串行化为例。每个通道需要一个OSERDESE2,配置为:
- 宽度扩展模式 :将一个字节(8位)转换成串行,但我们需要7位,所以使用两个OSERDES级联(Master+Slave),设置DATA_RATE_TQ = "DDR",DATA_WIDTH = 7。
- 时钟 :CLK为串行时钟(7×PCLK),CLKDIV为PCLK。
- 并行数据输入 :D1~D8,其中D8不用(或接0)。
关键代码 (一个通道,CH0):
verilog
OSERDESE2 #(
.DATA_RATE_OQ("DDR"),
.DATA_RATE_TQ("DDR"),
.DATA_WIDTH(7),
.SERDES_MODE("MASTER"),
.TRISTATE_WIDTH(1)
) oserdes_master (
.CLK(serial_clk), // 7×PCLK
.CLKDIV(pclk), // 像素时钟
.D1(parallel_data[0]),
.D2(parallel_data[1]),
.D3(parallel_data[2]),
.D4(parallel_data[3]),
.D5(parallel_data[4]),
.D6(parallel_data[5]),
.D7(parallel_data[6]),
.D8(1'b0),
.OCE(1'b1),
.RST(rst),
.OQ(serial_out),
.SHIFTIN1(slave_shiftin1),
.SHIFTIN2(slave_shiftin2),
// ... 其他端口
);
OSERDESE2 #(
.DATA_RATE_OQ("DDR"),
.DATA_WIDTH(7),
.SERDES_MODE("SLAVE"),
...
) oserdes_slave (
.CLK(serial_clk),
.CLKDIV(pclk),
.D1(1'b0),
.D2(parallel_data[7]), // 第8位(实际不用)
.D3(1'b0),
.D4(1'b0),
.D5(1'b0),
.D6(1'b0),
.D7(1'b0),
.D8(1'b0),
.SHIFTOUT1(slave_shiftin1),
.SHIFTOUT2(slave_shiftin2),
// ...
);
4.4 OBUFDS:差分输出
verilog
OBUFDS #(.IOSTANDARD("LVDS_25")) obufds_inst (
.O(lvds_p),
.OB(lvds_n),
.I(serial_out)
);
时钟通道类似:将串行时钟(7×PCLK)直接送给OBUFDS,注意也需要100Ω端接在接收端。
4.5 并行数据打包逻辑
我们需要将24位RGB + HSYNC/VSYNC/DE打包成4个7位通道。以VESA映射为例,写一个组合逻辑:
verilog
wire [6:0] ch0_data, ch1_data, ch2_data, ch3_data;
assign ch0_data = {R[2:0], G[2:0], B[2]};
assign ch1_data = {R[5:3], G[5:3], B[5]};
assign ch2_data = {B[4:3], R[7:6], G[7:6], B[7]};
assign ch3_data = {B[6], DE, VSYNC, HSYNC, B[1:0]}; // 保留位填0
然后每个PCLK周期,将这4个7位数据锁存到寄存器,再分别送入四个OSERDES。
五、时序约束与信号完整性
5.1 关键时序约束
LVDS发送器的时序要求主要是 数据与时钟的对齐 。接收端使用差分时钟的边沿来采样串行数据。因此,发送端必须保证串行数据的跳变沿相对于时钟边沿的建立/保持时间满足接收端的要求。
在FPGA中,我们通过PLL相位调整来优化这个关系。通常将串行时钟设置为0°相位,数据由OSERDES直接输出,内部已经对齐。但受限于布线延迟,可能需要在输出IOB中插入延迟。
XDC约束示例 :
tcl
set_output_delay -clock [get_clocks serial_clk] -max 1.5 [get_ports {lvds_data_p[*]}]
set_output_delay -clock [get_clocks serial_clk] -min 0.5 [get_ports {lvds_data_p[*]}]
5.2 PCB布线注意事项
- 差分对等长 :P与N之间的长度差控制在5mil以内。
- 对内等长 :同一通道的P/N需要严格匹配。
- 对间等长 :不同数据通道之间的长度差控制在50mil以内,时钟与数据通道的长度差控制在100mil以内(取决于速率)。
- 阻抗控制 :差分阻抗100Ω±10%,单端阻抗50Ω。
- 避免过孔 :差分线上尽量不要有过孔,若必须则成对打过孔。
- 终端电阻 :100Ω电阻尽可能靠近接收端引脚。
踩坑经历 :曾经有一个项目,LVDS屏偶尔闪屏,查了三天发现是FPC排线的地线不够,导致共模噪声超标。最后在排线两端加共模扼流圈解决。
5.3 眼图测试
调试LVDS接口时,眼图是最直观的工具。理想眼图应该:
- 眼睛张开高度 ≥ 200mV
- 眼睛宽度 ≥ 0.7 UI
- 抖动小,交叉点清晰
如果眼图闭合,检查:终端电阻、差分走线、电源噪声、时钟抖动。
六、接收端视角(反向理解)
虽然我们通常只做发送端(FPGA驱动屏),但理解接收端有助于调试。LVDS接收器内部有:
- 时钟恢复 (当没有独立时钟通道时):从数据流中恢复时钟(CDR)
- 串并转换 (ISERDES):将串行数据转换为并行
- 字对齐 (bitslip):找到7位数据的边界
这正是我们将在下一篇(miniLVDS)中详细讲解的内容。
七、调试实战:LVDS屏幕点不亮怎么办?
| 现象 | 排查步骤 |
|---|---|
| 屏幕完全不亮(背光亮) | 1. 测量LVDS差分时钟是否有信号(频率=7×PCLK)2. 测量各数据通道是否有活动3. 检查终端电阻是否焊接 |
| 显示内容错位、颜色异常 | 1. 确认映射表(VESA/JEIDA)是否正确 2. 检查RGB位顺序(是否高低位反转)3. 检查同步信号极性 |
| 屏幕闪烁、噪点 | 1. 用示波器看眼图(可能信号质量差)2. 降低PCLK频率测试(排除时序问题)3. 检查FPGA IO电平标准是否为LVDS_25 |
| 图像有水平条纹 | 串行化因子配置错误(如8:1而不是7:1) |
| 图像颜色偏紫 | 缺少一个颜色通道(如蓝色通道没数据),检查CH2或CH3输出 |
终极工具 :逻辑分析仪无法直接抓取LVDS(需要适配器),但可以用示波器的数学函数做差动测量(CH_A - CH_B)。
八、☕ 工程师私房话
面试题:LVDS为什么用7:1而不是8:1?
答案 :历史原因。早期的LVDS芯片(如DS90C031)设计为7位并行输入,因为当时RGB 18位色(6+6+6)加同步信号正好21位,3通道每通道7位。后来24位色扩展为4通道,仍然沿用7:1。8:1存在(如某些HDMI到LVDS桥片),但非主流。7:1还有一个好处:串行时钟频率不是整倍数关系,减少EMI峰值。
设计经验:FPGA LVDS输出的电流驱动能力
Xilinx LVDS_25的驱动电流固定为3.5mA,对应350mV摆幅(100Ω)。如果需要更长距离(如2米线),可以尝试使用LVDS_25_HP或外部驱动器。不要试图用LVCMOS模拟LVDS------电平不匹配,会烧接收端。
冷知识:LVDS信号可以热插拔吗?
理论上可以,因为LVDS是电流驱动,短路电流被限制在3.5mA左右。但实际插拔时可能会产生过冲,损坏ESD保护二极管。建议设计时在FPC接口上加ESD器件(如RCLAMP0524P),并避免频繁热插拔。