LCD显示技术完全指南:原理·制造·驱动·FPGA实现之点屏四 LVDS

篇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),并避免频繁热插拔。

相关推荐
第二层皮-合肥16 小时前
【数据采集专栏】利用TDC提高外部触发精度
fpga开发
尤老师FPGA17 小时前
HDMI数据的接收发送实验(十三)
fpga开发
博览鸿蒙1 天前
[特殊字符]AI+FPGA 全栈学习大纲【就业版】定位
人工智能·学习·fpga开发
燎原星火*1 天前
AD/DA硬件电路设计
fpga开发
GateWorld1 天前
LCD显示技术完全指南:原理·制造·驱动·FPGA实现之点屏三
fpga开发·lcd显示·fpga点亮屏幕·minilvds
XINVRY-FPGA1 天前
XC7Z035-2FFG900I Xilinx/AMD Zynq-7000 SoC FPGA
人工智能·嵌入式硬件·计算机视觉·fpga开发·硬件工程·dsp开发·fpga
zlinear数据采集卡2 天前
基准电压电路深度解析:从理论参数到ZLinear采集卡的精准参考实战
c语言·单片机·嵌入式硬件·fpga开发·自动化
ALINX技术博客2 天前
【黑金云课堂】FPGA技术教程Vitis开发:PS端SD读写
fpga开发·vitis·sd读写
尤老师FPGA2 天前
LVDS系列50:Xilinx Ultrascale系 ADC LVDS接口参考方法(十二)
fpga开发