这一篇在干嘛?

这篇笔记带你从零读懂安路 EG4S20 的《LVDS.IP 设计概述》。我们按”LVDS 是什么 → 要实现什么功能 → 协议长啥样 → 发送端怎么做 → 接收端怎么做 → 怎么自适应对齐 → 怎么配置”的顺序,把官方手册的每个重要章节都翻译成大白话。

先认识几个词

看手册之前,先把几个缩写摆平,后面就不会晕了:

缩写全称人话解释
LVDSLow-Voltage Differential Signaling低电压差分信号,本篇主角
VESAVideo Electronics Standards Association视频电子标准协会(美国那边的标准)
JEIDAJapan Electronic Industry Development Association日本电子产业发展协会(日本那边的标准)
TTLTransistor-Transistor Logic晶体管-晶体管逻辑电平,老的并行传输方式
RSDSReduced Swing Differential Signal低摆幅差分信号,LVDS 的”亲戚”
MIPIMobile Industry Processor Interface移动产业处理器接口,手机屏幕常用

这里有两个”标准协会”的名字要特别记住:VESA 和 JEIDA。它们是液晶屏 LVDS 传输的两大协议流派,后面会反复出现。

LVDS 到底是个啥?

LVDS(低电压差分信号)是一种信号传输方式。它的核心思路是:用一对信号线(一正一负)来传数据,接收端看的是这两根线的电压差,而不是单根线对地的电压。

这带来几个好处:

  • 抗干扰强:外界噪声一般会同时砸到两根线上(共模干扰),一减就没了,差值不受影响。
  • 速率高:因为摆幅小、抗噪好,可以跑很高的速率。
  • 功耗低、协议简单

所以液晶屏的数据传输方式虽然有 TTL、LVDS、RSDS、MIPI 好几种,LVDS 凭借高速、低功耗、抗干扰强、协议简单这几板斧,在液晶屏上应用特别广。

那为什么用 FPGA 来做?因为 FPGA 有三大优势:可编程灵活性(协议随便改)、IO 多电平标准支持(LVDS 电平直接支持)、高速串行接口支持。所以在液晶屏驱动、传输协议转换这些场合,FPGA 是常客。

小提醒

手册里说:本文涉及的 LVDS,若无特殊说明,默认指** LVDS 在液晶屏上的传输方式**。也就是说这不是泛泛讲 LVDS 物理层,而是聚焦”怎么把视频画面用 LVDS 甩到屏幕上”这件事。

这个设计要实现什么功能?

手册分两块列了需求,其实就是”能力清单”:

功能需求——支持什么:

  1. 支持 VESA 标准协议
  2. 支持 JEIDA 标准协议
  3. 支持用户自定义协议
  4. 支持 6bit、8bit、10bit 数据模式(每通道色深的位数)
  5. 支持单路、双路、四路传输方式
  6. 支持自适应接收:数据包边界自动识别、数据采样位置自动对准

性能需求——跑多快:

传输方式带宽能传的视频
单路3.2 Gbps1280×720@60Hz 或同等带宽视频
双路6.4 Gbps1920×1080@60Hz 或同等带宽视频
四路12.8 Gbps2K@60Hz 或 4K@30Hz 或同等带宽视频

记忆窍门

单路 3.2 Gbps,双路翻倍 6.4,四路再翻倍 12.8——路数每加一倍,带宽线性翻倍,屏幕分辨率上限也就水涨船高。

两大协议:VESA 和 JEIDA

LVDS 在液晶显示上有两个标准协议,区别主要在于 bit 的排列映射方式不一样(同一个像素数据的各个位放在哪个通道、哪个时隙)。

VESA 协议的位映射长这样:

VESA 协议位映射图,展示各 LVDS 通道上像素数据位的排列顺序

JEIDA 协议则长这样:

JEIDA 协议位映射图,展示与 VESA 不同的数据位分配方式

常见的坑

屏幕点不亮或者颜色乱跳,第一件要查的事就是:屏要求的协议和 FPGA 发的协议是不是同一种。VESA 和 JEIDA 的位序不同,接错了轻则花屏、重则黑屏。买屏时一定问清楚屏支持哪种协议。

发送接口:FPGA 往屏里”灌”数据

先看发送端对外长什么样:

LVDS 发送接口框图,左侧为视频输入信号,右侧为 LVDS 差分输出通道

管脚一栏表(发送端):

管脚名方向位宽说明
CLKinput1视频像素时钟
VSinput1视频场同步信号
HSinput1视频行同步信号
DEinput1视频像素使能信号
RGBinput18-30视频像素信号
LVDS_TX_CLKoutput1LVDS 发送时钟
LVDS_TX_LINE0output3-5LVDS 发送通道 0
LVDS_TX_LINE1output3-5LVDS 发送通道 1
LVDS_TX_LINE2output3-5LVDS 发送通道 2
LVDS_TX_LINE3output3-5LVDS 发送通道 3

用人话串一遍:你把**像素数据(RGB)+ 三个指挥信号(VS 场同步、HS 行同步、DE 像素使能)+ 像素时钟(CLK)**喂给模块,模块把它们打包成串行差分流,从 LVDS_TX_CLK(时钟对)和 LINE03(数据对)甩出去。RGB 位宽是 1830 位,正好对应 6bit/8bit/10bit 模式下三个颜色分量的总位数(6×3=18,8×3=24,10×3=30);LINE03 位宽 35,是因为每根数据线在物理上是一对差分线。

接收接口:把屏那边(或别处)的 LVDS 收回来

接收端就是发送端的镜像,信号方向整体反过来:

LVDS 接收接口框图,左侧为 LVDS 差分输入,右侧还原出视频并行信号

管脚一栏表(接收端):

管脚名方向位宽说明
CLKoutput1视频像素时钟
VSoutput1视频场同步信号
HSoutput1视频行同步信号
DEoutput1视频像素使能信号
RGBoutput18-30视频像素信号
LVDS_RX_CLKinput1LVDS 发送时钟
LVDS_RX_LINE0input3-5LVDS 发送通道 0
LVDS_RX_LINE1input3-5LVDS 发送通道 1
LVDS_RX_LINE2input3-5LVDS 发送通道 2
LVDS_RX_LINE3input3-5LVDS 发送通道 3

对比一下就能发现规律:发送端的 input 到了接收端全变成 output,反之亦然。接收端吃进差分线,吐出还原好的并行视频流。注意 RX 侧的 LINE 管脚说明里写的也是”LVDS 发送通道”——手册这里沿用发送端的叫法,指的都是同一组物理线对。

发送端内部怎么转?——3.5 倍时钟的魔法

发送框图如下:

LVDS 发送框图,包含锁相环、相位同步、协议处理和并串转换输出结构

流程用一句话概括:视频时钟进锁相环,倍频出 3.5 倍时钟,用这个 3.5 倍时钟做并串转换,最后以 ODDR 方式输出。

为什么是 3.5 倍?因为 VESA/JEIDA 协议里,每个像素时钟周期内每根 LVDS 数据线要传 7 个 bit。用 3.5 倍时钟做双边沿采样(上升沿+下降沿都干活),3.5 × 2 = 7 个时隙,正好把 7 个 bit 依次排上流水线。

框图里几个模块各司其职:

  • 相位同步模块:保证输出的 LVDS 数据和 LVDS 时钟满足 VESA/JEIDA 协议要求的相位关系。
  • 协议处理模块:选择 VESA 或 JEIDA 协议,把视频数据按协议映射成并行数据。
  • 宏定义模块:整个发送端的配置开关,可选协议类型(VESA/JEIDA/自定义)、色深(6/8/10bit)、通道数(单/双/四)。所有配置通过宏定义选择,代码内部用条件编译处理。

设计风格

这个 IP 用”宏定义 + 条件编译”来做配置,编译期就定死所有参数,不占任何运行时资源——对 FPGA 来说这是很省资源、也很稳妥的做法,代价是改配置要重新综合一遍。

接收端内部怎么转?——自适应是灵魂

接收框图如下:

LVDS 接收框图,展示时钟恢复、自适应采样与协议解析各模块的连接关系

接收模块要干的事:数据时钟恢复、采样位置自适应调节、数据包边界自适应识别、VESA/JEIDA 协议解析

其中相位跟踪、相位同步、误码率统计、采样相位调节这 4 个模块,是实现 LVDS 自适应接收的关键。

宏定义模块除了发送端那些选项(协议、色深、通道数),还多一个选择:手动采样相位还是自适应调节相位

自适应接收原理:用 1100011 找到边界

这是全篇最有意思的部分。先说前提条件,自适应接收成立要满足两条:

  1. LVDS 时钟和数据延时相等(时钟线和数据线延迟一致,才好对齐)。
  2. 数据最高速率 < 1/(IO 寄存器建立时间 + IO 寄存器保持时间 + 时钟抖动 + 数据抖动)。通俗讲:跑得不能太快,得给采样留出足够的”安全窗口”。

时钟和数据的采样关系如下图:

数据与时钟采样关系图,展示采样窗口与时钟相位的关系

那怎么知道采样位置对不对呢?这里用了一个很聪明的技巧。以 VESA 协议为例,看下面这张图(红色时钟是 LVDS 接收时钟的 3.5 倍频):

VESA 协议与恢复时钟采样关系图,红色为 3.5 倍频采样时钟

关键知识:LVDS_CLK 本身是个先验已知的信号,它高低电平的比例是 4:3。如果我们用 LVDS_CLK 的 7 倍时钟单边沿采样(或 3.5 倍时钟双边沿采样),那么采到的时钟序列一定是 1100011,或者 1100011 的各种移位版本。

于是判据就来了:

  • 用 LVDS_CLK_3P5X 去采 LVDS_CLK,如果结果不是 1100011 及其移位——说明采样时钟没对齐安全采样区间,就动锁相环的移相功能,挪一点再采,直到采样结果永远是 1100011 及其移位为止。
  • 如果采样结果刚好是 1100011——此时采样时刻正对应数据包的起始位置,边界找到了!

精髓一句话

拿”已知形状”的时钟线当标尺去校准采样相位——采样图案对上 1100011,就说明眼睛睁在了正确的位置。这就是”数据包边界自动识别 + 采样位置自动对准”的全部秘密。 手册还补了一句:LVDS 有 7 个相位可配置,PLL 可选内置或外部。

怎么配置:软件接口

发送端和接收端都通过宏定义来配置。发送端的配置界面如图:

LVDS 发送配置接口图,展示宏定义参数列表

接收端的配置参数直接看代码更清楚:

`define VESA        // 模块处理VESA协议
`define JEIDA       // 模块处理JEIDA协议
`define USER        // 模块处理用户自定义协议
 
`define RGB6        // 图像数据使用6bit模式
`define RGB8        // 图像数据使用8bit模式
`define RGB10       // 图像数据使用10bit模式
 
`define CHAN_NUM1   // 使用单通道传输
`define CHAN_NUM2   // 使用双通道传输
`define CHAN_NUM4   // 使用四通道传输
 
`define AUTO_PHASE  // LVDS接收采用自适应相位识别
`define FIXED_PHASE // LVDS接收采用手动相位配置
parameter PHASE = 0; // 配置LVDS3.5倍时钟相位

配置逻辑就是”四选一 + 四选一”:协议三选一(VESA/JEIDA/USER),色深三选一(RGB6/8/10),通道数三选一(1/2/4),相位模式二选一(AUTO/FIXED)。注意 AUTO_PHASEFIXED_PHASE 只有接收端才有——发送端不需要对齐,发送时相位是它自己说了算的。

别忘了你的屏是谁

配置前先弄清楚三件事:屏的协议(VESA 还是 JEIDA)、屏的色深(6/8/10bit)、要走几路。这三个宏选错任何一个,出来的图像都不会正常。

收个尾

回顾一下整条链路:视频并行数据(RGB+同步信号)进来 → 按协议(VESA/JEIDA)映射成 7bit 一组的串行帧 → 锁相环产生 3.5 倍时钟做并串转换 → ODDR 差分输出;接收端反着来,先用 1100011 图案自适应对齐采样相位、找到数据包边界,再解协议还原并行视频。整个设计的灵活性全靠宏定义开关,跑多快、传多大屏看路数:单路 3.2 Gbps 传 720p,双路 6.4 Gbps 传 1080p,四路 12.8 Gbps 传 2K/4K。