ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FPGA HDMI环路输出实验:TMDS解码与时序对齐全解析

FPGA HDMI环路输出实验:TMDS解码与时序对齐全解析 FPGA的学习路径走到HDMI这步基本就进入视频设备的分水岭了。前头的流水灯、UART回环、SDRAM读写都还可以在仿真里自嗨做到HDMI输入和环路输出意味着你的板子要跟真实世界的播放器、显示器、录像机打交道各种奇怪问题也会跟着冒出来。黑金云课堂里这个HDMI环路输出实验我在不同板卡上做过好几遍折腾掉不少头发。今天不打算复述一遍课程PPT而是想把这套实验背后真正关键的事讲透环路输出到底在跑什么数据流、TMDS解码需要处理哪些细节、两个接口之间的时钟关系怎么设计以及上板以后那些最让人抓狂的黑屏问题该怎么定位。文章适合已经把跑马灯和串口玩明白、想真正进入视频类FPGA设计的读者也适合准备应聘图像处理方向岗位的朋友拿来当基本功复习。1. 先说清楚“环路输出”到底在做什么——它和视频直通有什么本质区别1.1 环路输出在真实设备里是干什么的环路输出在专业视频设备里非常常见。你去看看监控行业用的采集卡很多都带一个“环路输出”口采集图像的同时把原始信号再送一给本地监看舞台租赁用的LED发送盒也经常靠环路输出去级联下一台设备医疗内窥镜、工业视觉系统里一个HDMI信号既要进处理算法又要给操作员实时监视环路输出就是最基本的方案。不少初学者把环路输出想得很简单输入引脚和输出引脚之间拉根线就完了不是这么回事。HDMI是高速串行数字信号内部是经过8b/10b编码的TMDS差分链路你无法像处理模拟视频那样直接并联复制。要实现环路输出必须先在FPGA内部把HDMI输入完整解码成并行RGB像素流再经过你自己的数据通路重新编码成HDMI输出。整个过程不是“接线”而是“翻译再复述”。1.2 环路输出 vs 视频直通差在哪视频直通通常指某种Agent由硬件自动完成的信号转发不关心内容、不处理像素。环路输出则强调两条路径并存一路给本地输出一路继续进后端处理。真正的环路输出设备往往还要求本地输出延迟尽量低否则操作员看到监视画面比实际发生晚几十毫秒在手术、舞台控场这些场景是没法接受的。所以做这个实验之前你心里得先立一个指标延迟做到多少纯FPGA直接旁路延迟可以控制在几十纳秒到一行像素内如果中间插入DDR3帧缓存延迟就是1到2帧也就是16毫秒到33毫秒。黑金这个基础的HDMI环路实验路线应当是“输入TMDS解码后先进异步FIFO再直接进TX重新编码”重点不在缓存和处理而在把整条通路跑通。1.3 这个实验能给你带来什么完成这个实验你至少能搞明白三件事TMDS差分信号怎么进FPGA、ISERDES/OSERDES怎么完成串并转换、两个视频接口之间的同步时序怎么处理。这三件事几乎是所有视频FPGA项目的地基。后来你做图像缩放、边缘检测、多路拼接、SDI转HDMI拆到最后都是这套东西。面试官问“你做过视频项目吗”你把环路输出的数据链路讲清楚可信度就已经很高了。2. 黑金板上的硬件资源HDMI座、TMDS网络和时钟拓扑2.1 板卡选型与接口布局做HDMI环路实验核心硬件条件是板卡上至少有两个HDMI接口一个输入、一个输出。黑金多款FPGA开发板都带了这样的接口布局常用的Artix-7系列上HDMI RX和TX座子分别引出四对差分线三对数据、一对时钟。我第一次拿到板子第一件事就是翻原理图和PCB丝印确认这几个关键点HDMI座子上的TMDS差分线是直接进FPGA普通IO还是经过了外部PHY芯片引脚分配在哪个Bank该Bank的VCCO供电是多少。黑金这块实验板走的是直连方案没有外挂HDMI PHY所有TMDS信号靠FPGA的SelectIO资源接收和驱动。这省掉了PHY配置的麻烦但要求你理解FPGA侧的电气特性差分输入需要合适的IOSTANDARD和端接输出则需要足够的驱动能力。2.2 “无源HDMI座”和“有源PHY”的区别很多新手容易在这栽跟头。HDMI座子本身是无源器件它不像网络接口那样自带变压器和PHY。如果一个板卡写着“HDMI接口”你要先看原理图上接口和FPGA之间有没有芯片。如果有SiI9134、ADV7511这类HDMI发送芯片那么FPGA只需要输出并行RGB和像素时钟给芯片剩下编码由芯片完成如果没有PHY直接用OSERDES输出TMDS电平时序就要完全由FPGA的IO资源承担。黑金这个实验属于后者好处是没有芯片配置门槛坏处是你得自己处理IO约束。我会在后面专门讲引脚约束和时序收敛的坑。2.3 时钟拓扑一个输入源就带进来一组时钟HDMI输入和普通视频接口最大的不同是它的像素时钟由源端直接送过来。TMDS通道里有单独一对差分时钟频率在25MHz到165MHz之间HDMI 1.4最多到1080p60时约148.5MHz像素时钟每条数据通道的比特率就是像素时钟的10倍约1.485Gbps。环路输出实验里最稳妥的做法是把输入时钟直接当作输出时钟用。这样输入像素流和输出像素流天然同频同相省去了一堆跨时钟域问题。黑金基础例程一般也是拿恢复出来的输入像素时钟作为TX侧的参考时钟配合BUFIO/BUFR把时钟送进BUFR或者MMCM里给ISERDES和OSERDES使用。3. HDMI输入侧先要搞定的事TMDS解码、EDID回读和像素时序恢复3.1 TMDS的本质三对串行数据加一对时钟HDMI物理层用的是TMDS每条数据通道本质是高速串行比特流每个像素周期传输10bit。接收端需要用串行时钟把数据并起来然后做解码。HDMI通常按RGB 8bit模式算三个通道各对应一个颜色分量再加上一个专门负责将HSYNC/VSYNC/DE打包进蓝通道的机制。光理解“串行转并行”还不够。TMDS编码和解码遵循一个复杂的控制字符机制在视频有效区10bit编码表对8bit像素数据编码在消隐区则传输控制符号或者辅助数据比如HDMI的音频包、InfoFrame都藏在消隐区。基础环路实验可以暂时不解析消隐区里的数据但你至少要知道DE信号是怎么恢复的因为后级所有数据通路全靠DE来判断有效像素。3.2 解码方案选型不用付费IP怎么做Xilinx官方有HDMI 1.4/2.0的收发IP但对大多数学习板来说授权并不免费很多黑金例程采用自研的解码逻辑实现。核心是几条硬核资源IBUFDS接收差分时钟BUFIO/BUFR给IO逻辑分配时钟ISERDESE2完成1:8或1:10串并转换IDELAYE2做比特级相位微调。如果你没有现成例程我会建议先找开源的DVI/HDMI解码工程做参考。DVI和HDMI在视频数据通道上极其相似先跑通DVI解码再补HDMI的控制字符逻辑是比较平稳的路径。自己手写整套解码时最痛苦的是设置IDELAY和Bitslip对齐。所谓Bitslip就是把10bit桶移位让接收到的串行数据落在正确的字节边界上。这里一个常见误区是一次性把所有通道当成齐头并进实际上每条通道各自的延迟都不同必须做逐通道对齐。3.3 EDID与DDC没有这个模块播放器根本不给你信号上板那天我以为方案已经全通了结果用笔记本电脑接HDMI输入到黑金板显示器“无信号”电脑那边只提示“已连接但显示器未响应”。查了半天最后发现是DDC通道没通。HDMI源在上电时会通过I2C总线去读取显示器端的EDID了解显示器支持的分辨率和刷新率。如果FPGA端没有一个I2C从机返回可靠的EDID数据源端会认为没有任何显示设备直接关闭TMDS输出。所以环路输出实验里你必须在FPGA里实现一个I2C从机模块或者借助板载的EEPROM来回放EDID。黑金的例程通常包含EDID处理模块但很多人会忽略这个模块的重要性。我当时花了大半个小时把EDID的128字节用逻辑分析仪一条一条对确认厂商ID和时序描述块都对上了电脑才终于送出来信号。给一个实操建议先别自己编EDID直接从Xilinx官方参考设计或者显示器实际读取的EDID里抓一份1080p60的模板改成自己板卡的厂商信息先把链路调通。等后面需要支持4K或者特殊时序再深入去研究CEA扩展块的格式。3.4 时钟恢复和像素对齐的完整流程TMDS输入进FPGA后时钟恢复并不是用CDR那种方式因为HDMI单独给了一对时钟你直接差分接收就行。但这不代表简单。像素时钟进入MMCM/PLL后要为ISERDES的串行时钟做一个高速倍频还要生成并行时钟送后续逻辑。串行数据要在眼部中间采样这就需要IDELAYE2做延迟补偿。建议的稳定流程是这样先等MMCM锁定然后让系统处于复位状态接着用ILA观察各通道的Bitslip状态逐个通道调整IDELAY tap直到能稳定解出控制字符和DE信号。如果你看到画面是整屏斜纹或者颜色错乱大概率是通道没有对齐或者IDELAY相位不在采样窗口内。调试时强烈建议把解码后的pixel_clk、de、hsync、vsync和rgb[23:0]全部拉到ILA里触发条件设成“de上升沿”数据量不用多1024深度就够定位问题了。4. 环路输出的数据通路设计异步FIFO、场同步和延时取舍4.1 最省事的直通结构解码完直接送TX如果输出端和输入端使用同一个像素时钟最简环路就是解码器出来的24bit RGB、DE、HSYNC、VSYNC打两拍寄存器后直接进TX编码器。这里有个关键点TX编码器要求DE、HSYNC、VSYNC和RGB数据严格对齐哪怕只差一个时钟周期画面都会出现偏色或行场错位。所以不要看到“直通”就只在组合逻辑上连根线中间务必用寄存器同步打拍。我最早做实验为了图省事在 always 块里直接赋值结果综合后的关键路径乱飞HDMI输出闪个不停。后来老老实实加了两级寄存器一切才正常。这背后的原因不只是时序对齐还有组合逻辑毛刺高速视频信号上任何毛刺都会被编码器当成数据画面直接花掉。4.2 什么时候必须上异步FIFO如果输出时钟和输入时钟不是同一个源比如你希望用板载晶振生成稳定的148.5MHz时钟来驱动输出或者输入信号来自一个不稳定设备那么两个时钟域之间存在频率偏差和相位抖动必须在中间插入异步FIFO。异步FIFO用双口RAM实现写时钟用输入恢复时钟读时钟用输出像素时钟。写使能由解码后的DE控制读使能由TX侧的时序生成器控制。注意读写两边的DE频率必须基本一致如果输入是59.94Hz而输出是60HzFIFO会慢慢溢出或者读空。所以“异步FIFO解决一切”是个误解它只能解决相位和瞬时抖动无法解决长时间帧率不一致。真想解决帧率转换得上帧缓存DDR3这就不是基础实验的范畴了。4.3 为什么我不建议一上来就加DDR3帧缓存有朋友看到“环路输出”第一反应是“我直接加个DDR3帧缓存读出来再输出不就随便玩了吗”。技术上行但会把你拖进另一堆麻烦DDR3控制器要初始化、要处理行缓冲、要处理跨时钟域还得面对帧同步和撕裂问题。1080p60一帧数据大约有150万个像素RGB888一帧约4.5MBDDR3轻松装下但调试复杂度会剧增。基础实验阶段强烈建议先把无帧缓存的直通做扎实。等你能在一个HDL文件里清晰描述“输入有效像素—FIFO—输出有效像素”这条流水线再去加DDR3、加缩放器、加OSD都会顺手很多。视频项目最常见的返工不是功能不会写而是数据通路不清导致后面加模块时到处是异步打架。4.4 输出重建时那些细小的时序参数TX编码器侧除了RGB数据还要重建行场同步信号。HDMI标准允许HSYNC和VSYNC有不同的极性源端的VIC视频标识码决定了具体参数。环路直通时最保险的做法是原封不动地转发解码器提取出的HSYNC/VSYNC极性不要自己做转换。很多花屏问题就是因为你强行把HSYNC极性改了而显示器和源端之间没有约定好。另外DE信号必须覆盖完整有效行。如果解码器输出的DE宽度少了几个像素画面会出现右侧一条黑带或者左边错位。遇到这种问题用ILA抓取DE和HSYNC的相对位置对比HDMI标准时序基本一眼就能看出来。5. 上板实测与踩坑记录黑屏、花屏和时序违例怎么定位5.1 先把TX通路单独验证一遍任何闭环问题都很难定位所以我的习惯是先砍掉输入侧单独验证FPGA的HDMI输出通道能不能出图。写一个简单的测试图案发生器用板载或者PLL生成的148.5MHz时钟直接产生1080p60的彩条信号送进TX编码器。如果电视机上能正常显示彩条说明输出侧的引脚约束、OSERDES配置、TX编码逻辑都没问题这时候再启用HDMI输入环路如果出问题嫌疑就集中在输入侧或者两级拼接处。这个“分而治之”的思路在视频调试里特别重要。因为你面对的是几十个信号、高速差分对、I2C配置、时钟PLL全部混在一起很难靠肉眼判断。一次性只让一个环节工作可以让问题概率收敛。5.2 黑屏的几类原因按概率排序黑屏永远是HDMI实验里最常见的现象。我做了几个项目后总结出一张排查表现象可能原因排查手段完全无信号设备不识别未返回EDIDDDC不通ILA抓I2C总线看是否有读请求设备识别但屏幕黑源端受HDCP保护基础工程不解密HDCP换非受保护信号源指示灯正常但无画面TX引脚没约束或OSERDES没输出检查XDC用IO Probe抓输出有画面但雪花剧烈输入TMDS时钟未锁PLL抖动看MMCM locked信号画面上有规则条纹DE/H/VS时序不对用ILA对比标准时序这里要单独说HDCP因为这是新手最容易碰到的沮丧时刻。电脑、蓝光机、游戏机会对授权内容做HDCP加密如果FPGA工程没有HDCP解密模块输入信号就是一堆无法正确解码的密文画面自然黑的。黑金基础实验不会、也不应该去处理HDCP这涉及版权和授权问题。解决办法是换用不带HDCP的测试源比如用HDMI测试图案发生器或者某些开源板卡/树莓派配置为输出非HDCP信号。不要试图去“绕过”那不是学习FPGA的正路。5.3 花屏和颜色错乱的定位链路花屏比黑屏稍微友好一点因为至少链路通了。常见三种斜纹条纹、画面左右错位、红蓝互换。斜纹条纹十有八九是通道对齐问题。TMDS三条数据通道各自经过不同的PCB走线和IDELAY延迟必须在接收端通过Bitslip机制把每个通道的10bit边界对齐。你可以在工程里预留一个调试状态寄存器分别读出每通道的当前Bitslip值然后在ILA里观察只有三条通道都对齐画面才会干净。红蓝互换不是“电视机识别错”而是你把输入通道的映射搞反了。HDMI三对数据分别对应R、G、B但FPGA输入端子的命名有时是D[2:0]没有明确颜色。你需要在解码模块里确认d2对应的是红色还是蓝色然后在RGB拼接时做对应调整。我调过一台工程样机输出偏紫查了两个小时最后发现是D0和D2接反了。5.4 引脚约束与时序收敛的实操细节环路输出实验里XDC至少要做这几件事输入差分时钟的create_clock、所有TMDS引脚的set_property、ISERDES/OSERDES相关IO的false path设置。很多朋友直接在Vivado里跑默认约束然后看timing报告一堆violation怀疑自己代码写错了。其实高速IO项目你需要显式告诉工具哪些信号是同一簇并给输入输出延时留出合理窗口。引脚号以你手上的原理图为准我不贴具体物理引脚但骨架是这样set_property PACKAGE_PIN xx [get_ports {hdmi_rx_clk_p}] set_property IOSTANDARD TMDS_33 [get_ports {hdmi_rx_clk_p}] set_property PACKAGE_PIN xy [get_ports {hdmi_rx_clk_n}] set_property IOSTANDARD TMDS_33 [get_ports {hdmi_rx_clk_n}] create_clock -name rx_pixel_clk -period 6.734 [get_ports {hdmi_rx_clk_p}]TMDS_33这个IOSTANDARD要确保你使用的Bank的VCCO确实是3.3V否则上板风险很大。再强调一次物理引脚一定要对着自己的板卡原理图来填千万不要在网上抄一串就锁进去高速差分引脚接错是可能损坏FPGA IO的。5.5 HDMI供电电流一个经常被忽略的物理问题HDMI座子上的5V引脚通常能为DDC和部分有源Dongle提供最大约50mA的电流。这是热词里很关心的问题“HDMI供电电流需要多大”。实际上源端输出的5V有电流上限如果你的板卡HDMI输入座还去给一些有源转换器供电电流可能不够导致EDID读取不稳定。我踩过一次坑一个HDMI转接器插在FPGA板输入口上转接器又从同一路5V取电结果是偶尔识别、偶尔黑屏非常飘。后来给转接器单独供电问题立刻消失。所以在你的环路实验里如果用了信号转换器或者延长线优先给它们配独立电源别依赖HDMI的5V输出。6. 做完环路之后还能怎么扩展图像处理、多路分发和时序整形6.1 把环路替换成图像处理管线环路输出只是起点很多人做完之后第一件事就是想在里面插图像处理。这个思路完全对但有一个必须注意的问题图像处理模块的流水线延迟会改变像素数据和DE之间的相对位置。比如你写了3x3的卷积核需要若干行缓冲输出像素比输入像素晚了3行如果DE、HSYNC、VSYNC没有同步延迟同样多的周期你会看到图像和同步信号错位画面撕裂或偏移。解决办法是在处理模块旁边加一个“同步延迟FIFO”专门把DE和行场信号的延迟修正到和像素输出一致。凡是做过视频处理加速器的人都会对这句话深有体会数据处理永远是小事同步时序处理才是大事。6.2 一进多出的HDMI分发环路输出可以很自然地扩展到多路分发。FPGA内部把解码后的RGB数据扇出到多路TX编码器每路独立驱动一个HDMI座子就能做成低成本的HDMI分配器。相比去买专用HDMI分配芯片FPGA方案的优势是可以在每条输出上做不同的OSD、不同的分辨率缩放、不同的裁剪区域。限制因素主要是FPGA的引脚数量和IO功耗。每路1080p60的TMDS输出占4对差分引脚三路4K就需要考虑Bank的供电能力。这类设计在会议室矩阵、多屏拼接、直播导播台里有大量应用。做分发时特别留意各路TX的复位不能和输入复位共用一个异步复位信号否则某些路出现初始化不同步画面会有一路黑一路好。正确做法是每一路TX独立生成一个“像素时钟稳定后拉高”的复位释放信号。6.3 音频信号为什么没声音很多做完环路输出的朋友问我图像转了声音怎么没有。原因很简单HDMI音频数据藏在消隐区的辅助数据包里基础实验的TX编码器没有解析甚至没有接收音频。要真正让音频一起走需要解码器从消隐期提取I2S音频流再在TX侧根据源端提供的CTS/N值重新生成音频时钟重新打包进输出流。这一步涉及到音频时钟恢复和精确的包调度难度比视频本身高不少。黑金的这个基础实验不处理音频很正常。你只需明确记住视频同步和音频同步是两套独立机制音响设备里常说的“音画不同步”根源就在CTS/N参数和缓冲延迟不一致。真做带音频的HDMI项目阶段目标是先把Audio InfoFrame和音频FIFO跑通再考虑和视频拼接。6.4 什么时候升级到DDR3帧缓存如果你发现直通环路已经不能满足需求比如要做画中画、运动检测、任意分辨率缩放那就必须引入帧缓存。帧缓存带来的额外延迟在实际系统中通常可以接受因为现在大部分视频处理链路都在做“1帧延迟”甚至“3帧延迟”。专业视频设备追求低延迟但也只会在特定档位牺牲画质。升级到DDR3后环路输出实验就从“直通实验”变成了“视频处理平台实验”。你可以把DDR3当作中间帧池输入写一帧处理器读一帧输出再读一帧三个端口用DDR带宽仲裁。1080p60的RGB888总带宽约1.5GB/s一般DDR3足够但你需要认真处理Bank管理、行激活策略和写读切换效率否则带宽利用率可能只有50%关键路径一高就卡。基于我自己的经验做这些高级功能前先把环路输出那套“解码—FIFO—编码”的心智模型刻在脑子里。再怎么复杂的视频系统最后拆到数据通路上也就是“写时间、微处理和读时序”三个动作。你把这个实验吃透了后面接HDMI 2.0、MIPI、DP逻辑都是相通的。如果你手头正好在做这个黑金HDMI环路实验卡在某一步我建议你按本文顺序重新捋一遍先确认RX侧EDID和TMDS解码再验证TX侧彩条输出然后把两者拼起来。千万不要一上来就怀疑FPGA的性能或者线的质量绝大多数问题都出在时序对齐和同步信号上。把眼睛盯住DE和高低有效极性这两根线你能少走很多弯路。
返回列表