这一篇在干嘛?
demo-31 里我们用 FPGA 把彩条「推」给了显示器,这一篇反过来了:把 PC 作为 HDMI 源,画面经开发板解码后再编码输出到另一台显示器——也就是「环出(loop-through)」。实验本身代码不多,但它把 HDMI 收发两侧的链路串了起来:输入解码、时钟检测、EDID 协商、输出编码,一个都不少。这篇原文很精炼,我们在忠实于原文操作步骤的基础上,把直通架构的原理适当展开讲透。
实验目标与系统架构
实现要求
- 视频输入:PC 端
- 输入格式:HDMI 输入
- 分辨率:1280*720
- 视频输出:HDMI 显示屏
- 输出格式:HDMI 输出
- 视频输出在 HDMI 显示器上稳定显示
系统示意图如下:

图 1 系统示意图
直通架构里发生了什么
回顾 demo-31 的知识:HDMI 的物理层是 TMDS,三个数据通道(RGB)加一个时钟通道,发送端做 8B/10B 编码加 10:1 并串转换。直通实验等于同时实现这条链路的收端和发端:
- 输入侧(TMDS 解码):PC 送来的高速串行差分信号先经过 FPGA 的输入缓冲,用 ISERDES 一类的高速串并转换原语把串行数据恢复为 10 位字符,再做 8B/10B 译码,同时从数据流里恢复出像素时钟和 DE/HS/VS 时序,最终还原成并行 RGB 视频流;
- 时钟域处理:输入像素时钟由 PC 决定(720P@60Hz 时约 74.25MHz),它是随视频内容异步到来的,设计里要用时钟检测电路确认输入时钟锁定,这也是下面 LED1 的判据来源;
- 输出侧(TMDS 编码):把还原出来的 RGB 数据重新做 8B/10B 编码和并串转换,从 HDMIB 口发给显示器。发送部分与 demo-31 的彩条实验是同一套逻辑,只是数据源从「内部彩条发生器」换成了「HDMI 接收模块」。
一个容易忽视的环节是 EDID:显示器上电后会通过 DDC 通道(IIC 总线)向源端读 EDID,告诉 PC「我支持哪些分辨率」。在本设计中,开发板插在 PC 和显示器中间,PC 读的是开发板提供的 EDID,所以设计里有一个通过 IIC 配置/应答的 EDID 模块,它决定了 PC 会输出什么分辨率。本设计最高支持 720P 输入。
为什么直通实验必须先吃透 demo-31
直通 = 接收 + 发送。发送端在 demo-31 已经验证过;本实验新增的只有接收解码与跨芯片的视频通路。调试时如果显示器无画面,先用 demo-31 的彩条工程验证「发送链路 + 显示器」没问题,把故障范围二分到接收侧,是效率最高的排障方法。
数据链路分步拆解
把一帧画面从 PC 到显示器的完整旅程逐步列出来,有助于建立全局图景:
- PC 发送:PC 显卡按 720P 时序逐像素编码 TMDS 串行差分信号,经 HDMI 线送到开发板 HDMIA;
- 时钟恢复:FPGA 从独立的 TMDS 时钟通道恢复像素时钟(720P@60Hz 时约 74.25MHz),LED1 监测的就是这一步;
- 串并转换:高速串行数据(像素时钟的 10 倍速率)被高速接收原语转成 10 位并行字符;
- 8B/10B 译码:10 位字符还原成 8 位颜色分量,同时提取出控制字符对应的 HS/VS/DE 时序,LED2 监测的是解码是否成功;
- 视频通路:还原出的 RGB 并行视频流在 FPGA 内部直通到发送侧(这正是「直通」名字的由来——中间不做任何处理);
- 重编码与发送:发送侧重新做 8B/10B 编码和并串转换,从 HDMIB 输出给显示器;
- 显示器接收:显示器按同样的 TMDS 协议解码,重建图像。
整条链路中 FPGA 是「透明的」,但它承担了两次协议转换(串行→并行→串行),每一次都对时序精度提出要求。这也是为什么约束文件中的通道延时值如此重要:输入侧三个数据通道与时钟通道之间的偏差,直接决定第 4 步译码的成败。
与 demo-31 彩条实验的对应关系
把两个实验对照着看,能更清楚直通架构里每个模块的位置:
| 环节 | demo-31 彩条实验 | 本实验直通 |
|---|---|---|
| 数据来源 | 内部彩条发生器(TPG) | HDMI 接收模块 |
| 时序来源 | FPGA 内部自产 HS/VS/DE | 从输入数据流中恢复 |
| 像素时钟 | PLL 产生 | 从 PC 输入恢复 |
| 编码发送 | TMDS 编码 + 并串转换 | 完全相同 |
| 输出口 | HDMIA(本例程约束) | HDMIB |
可以看出,发送部分两个实验是同一套逻辑,直通实验真正的「新内容」全部在接收侧。而 EDID 模块则是直通特有的:它替显示器「回答」了 PC 的分辨率询问。
实现步骤
实现方法
把 PC 端作为 HDMI 输入源,使用 HDMI 线将 PC 与开发板的 HDMIA 相连,将开发板的 HDMIB 与显示器相连,烧录 bit 流后,PC 将自动识别分辨率并输出。具体实现效果如图 2 所示:

图 2 具体实现效果
注意连接顺序:HDMIA 只接 PC(输入),HDMIB 只接显示器(输出),插反了链路不通。
注意事项
-
若无法显示信号输出请观察 LED 灯进行判断:
1.1 LED1 闪烁证明 HDMI 输入时钟正常,即 HDMI 输入正常,若 LED 不亮,请更换 HDMI 输入源;
1.2 LED2 亮说明解码正常,请检查 HDMI 输出端;若 LED2 灭请检查输出分辨率是否为 720P;
1.3 若 PC 输出分辨率中未出现 720P 选项,可尝试更换 HDMI 线。
-
若出现显示颜色不准确、抖动或噪点过多等情况,尝试重新插拔 HDMI 输入连接线,或调整设计约束文件中三个通道的延时值。
-
若要实现其他分辨率输出,请更改 IIC 中的 EDID 模块,本代码最高支持 720P 分辨率的输入。
这三个 LED 判断点正好对应直通链路的三段:LED1 对应输入时钟恢复(TMDS 时钟通道能锁住,说明 PC 确实在发信号);LED2 对应解码完成(8B/10B 译码与视频时序提取成功);显示器有无画面对应输出链路。逐段检查,很快能定位问题在哪一环。
延时值(IDELAY)是画质的关键
TMDS 数据速率很高,PCB 走线与引脚的偏差会让三个数据通道与时钟通道之间存在相位差。约束文件中的通道延时值(IDELAY)就是用来对齐采样相位的。颜色错位、雪花噪点往往是延时没调好或线缆质量差导致采样眼图闭合——先换线,再微调延时。
上板流程
- 按「PC → HDMIA」「HDMIB → 显示器」接好两根 HDMI 线;
- 插好下载线,给开发板上电,烧录 bit 流;
- PC 通过 EDID 协商自动识别分辨率并输出 720P;
- 观察开发板 LED:LED1 闪烁(输入正常)、LED2 常亮(解码正常);
- 显示器上应出现与 PC 屏幕一致的稳定画面。
推荐的调试顺序
第一次做这个实验时,建议按「从中间断开」的二分法排查,而不是从头到尾瞎猜:
- 先验发送链路:烧录 demo-31 彩条工程,确认显示器、HDMIB 接口与发送逻辑都正常;
- 再验输入时钟:切回直通工程,看 LED1 是否闪烁——它等价于「PC 是否真的在向 HDMIA 发信号」;
- 再验解码:看 LED2 是否常亮,不亮则检查 PC 分辨率设置里有没有 720P、EDID 是否被正确读取;
- 最后看画面质量:有噪点再动约束文件里的通道延时值。
每一步都只依赖前一步的结论,任何一步卡住都能把问题范围缩小一半。这种调试思路比「重新编译一遍试试」要有效得多,也适用于以后所有的视频链路项目。
现象与总结
正常情况下,显示器上稳定显示 PC 输出的 1280*720 画面,播放视频时也没有明显卡顿和噪点——说明接收、解码、重编码、输出整条链路的带宽和时序都满足要求。
常见现象与对应结论汇总:
| 现象 | LED1 | LED2 | 结论与处理 |
|---|---|---|---|
| 显示器无信号,LED1 不亮 | 不亮 | — | 输入时钟没恢复,换 HDMI 输入源或检查 HDMIA 连接 |
| 显示器无信号,LED1 闪、LED2 灭 | 闪烁 | 灭 | 解码未成功,检查输出分辨率是否为 720P |
| 显示器无信号,LED 正常但无画面 | 闪烁 | 亮 | 输出端问题,检查 HDMIB 与显示器 |
| 画面噪点多、颜色不对 | 闪烁 | 亮 | 重新插拔输入线,或调整约束文件中三个通道的延时值 |
| PC 找不到 720P 选项 | — | — | 更换 HDMI 线(EDID 读取不稳定) |
这个实验的意义在于:它把开发板变成了一个最小的 HDMI 中继器。在它的框架上稍作改造,就能做画面截取、OSD 叠加、图像处理(比如灰度化、边缘检测后再输出)等应用——因为「接收 → 处理 → 发送」的结构中,处理部分是自由替换的。配合后面的千兆网实验,还可以把 HDMI 采集的画面通过网络发出去,构成一个简单的视频采集卡。
延伸练习建议
把直通跑通之后,可以按难度递增做几个改造练习,每个都只动「接收与发送之间」的那一小段:
- 画面缩放观察:把恢复出的并行视频接到 VGA 输出口(开发板同时有 VGA 座),观察同一画面在两种接口下的输出,理解时序转换;
- 灰度化处理:在视频通路中把 RGB 替换为其亮度加权和,再送输出编码器,做一个「黑白模式」开关;
- 帧冻结:加一块帧缓存 RAM,按键时停止刷新输入、重复输出最后一帧,实现「定格画面」;
- 分辨率协商实验:修改 IIC 中的 EDID 内容,观察 PC 输出分辨率选项的变化,体会 EDID 在即插即用中的作用。
这些练习共用同一套收发框架,改动都局限在数据处理段,是检验你是否真正理解直通架构的好办法。
自测
自测
- HDMI 直通链路中,输入侧的 TMDS 解码需要完成哪几件事?
- LED1 闪烁和 LED2 常亮分别代表链路的哪个环节正常?
- EDID 在本实验中起什么作用?为什么 PC 会「自动识别分辨率」?
- 显示画面出现噪点或颜色不准确时,可以从哪两个方面入手排查?
- 为什么本设计最高支持 720P 输入?如果要支持 1080P 需要改动哪里?