目录
- 1、创作背景
- 工程概述
- 免责声明
- 2、相关方案推荐
- 我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目
- 我已有的FPGA图像处理方案
- 我已有的4K/8K视频处理解决方案
- 3、详细设计方案
- 设计框图
- FPGA内部测试彩条
- MSA与主链路成帧
- 主链路发送流水线
- AUX通道子系统
- 链路训练状态机
- GTP高速收发器物理层
- 时钟方案
- vivado工程源码架构
- 4、Vivado工程源码1详解-->Artix7-35T版本
- 5、Vivado工程源码2详解-->Artix7-100T版本
- 6、Vivado工程源码2详解-->Artix7-200T版本
- 7、工程移植说明
- vivado版本不一致处理
- FPGA型号不一致处理
- 其他注意事项
- 8、上板调试验证并演示
- 准备工作
- DP视频发送演示
- 9、福利:工程源码获取
FPGA纯verilog实现DP视频接口,支持2K60帧分辨率,提供3套工程源码和技术支持
1、创作背景
Display Port(简称 DP),VESA 视频电子标准协会定义的高速包交换型数字显示接口,2006 年首发,免费无专利授权费,目标替代 VGA/DVI/LVDS,分外部 DP、内置 eDP(笔记本屏),同时支持 USB‑C DP Alt Mode。
DP和 HDMI 最大本质区别:
HDMI 是流传输;DP 是微包(Micro-Packet)架构,视频、音频、辅助信息全部打包分时在主链路传输,更灵活,天然支持 MST 多流、带宽动态分配。
Xilinx系列FPGA实现DP视频接口现状:
目前Xilinx系列FPGA实现DP视频方案,主流做法是调用Xilinx官方的IP核,比如Video PHY Controller + DisplayPort 1.4 TX/RX Subsystem这一整套;这套方案确实好用,但有几个绕不开的问题:
一是官方DP Subsystem IP需要License,没有License只能上板跑评估版,时间一到就断链路;
二是IP核是个黑盒,内部训练怎么跑、DPCD怎么读写、扰码怎么加,出了问题只能看信号猜,想改一行协议行为都无从下手;
三是IP核体积不小,小容量的7系列片子塞进去之后资源所剩无几。
那有没有不用官方IP、纯verilog手写、在7系列FPGA上就能跑通的DP方案?有,就是本篇要介绍的这个工程。
DP接口本身并不复杂,依赖于FPGA内置的高速收发器资源,很适合用来做DP协议的物理层,所以FPGA做DP接口协议可谓手拿把掐。
本设计正是基于此,使用Xilinx 7系列FPGA的GTP高速收发器资源实现DP视频接口协议,最高支持2560×1440@60Hz分辨率。
工程概述
本设计基于Xilinx Artix-7系列FPGA的GTP高速收发器原语,用纯verilog HDL实现了DisplayPort视频发送接口,最高支持2560x1440@60Hz(2K60帧)视频输出;工程没有调用任何Xilinx官方的DP相关IP,DP物理层的8b/10b编码使用GTP高速收发器原语,其他部分,比如链路训练、AUX通道、DPCD读写、EDID读取,以及主链路的MSA成帧、扰码、训练码型插入,全部用verilog一行一行写出来,代码全部可读、可改、可移植;
整个视频通路是这样的:
工程内部自带三档彩条测试源(1080p/2Lane、1080p/4Lane、1440p/4Lane),彩条源产生视频时序骨架和MSA参数,像素数据以PIX占位符的形式嵌入符号流;符号流先经过Idle码型插入补齐消隐期的BS/VB-ID符号,再在每帧第512个BS处插入SR扰码复位符号,然后进入16级LFSR扰码器(生成多项式G(X)=X16+X5+X4+X3+1,DP 1.1a规范值),随后由训练码型插入模块在链路训练期间把有效数据替换为TPS1/TPS2训练码型,最后经过4通道skew对齐,送入GTP高速收发器做8b/10b编码和并串转换,2.7Gbps的差分信号直接从GTP BANK输出到DP连接器;显示器一侧的DP接收端在AUX通道的配合下完成链路训练后,即可点亮屏幕输出彩条画面;
与DP接收方向不同,DP发送端要主动完成链路初始化的全部工作:
上电后先通过AUX读取EDID确认显示器存在,再读DPCD能力寄存器(0x00100~0x00107)获取对方支持的最大速率和Lane数,然后按"设置速率→设置Lane数→时钟恢复训练(TPS1)→符号对齐训练(TPS2)→关闭训练使能扰码"的顺序把链路建立起来,全程约50个状态的训练状态机自动完成,训练失败还会自动降摆幅换预加重重试,最多9组电压组合轮询;这套状态机是整个工程里最核心的部分,也是纯verilog方案和官方IP方案差距最大的地方——官方IP替你做了,本博客方案则带你一步步做;
针对目前市面上主流的项目需求,本博客共设计了3套工程源码,详情如下:
现对上述3套工程源码做如下解释,方便读者理解:
工程源码1
开发板FPGA型号为Xilinx-Artix7-35T–xc7a35tfgg484-2;
DP视频输出源使用工程内部的彩条测试源模拟,配置参数USE_TPG=2,输出分辨率为2560x1440@60Hz(CVT-RB时序,像素时钟241.5MHz),也就是常说的2K60帧,使用DP的4个Lane发送,RGB 4:4:4 8bpc色彩格式;链路速率为2.7Gbps(HBR),总带宽4x2.7x0.8=8.64Gbps,视频有效带宽约5.3Gbps,占用率约62%,在HBR速率下稳定输出2K60;
本设计使用Xilinx-GTP高速收发器,适用于Xilinx-7系列FPGA实现DP视频发送应用;
工程源码2
开发板FPGA型号为Xilinx-Artix7-100T–xc7a100tfgg484-2;
DP视频输出源使用工程内部的彩条测试源模拟,配置参数USE_TPG=2,输出分辨率为2560x1440@60Hz(CVT-RB时序,像素时钟241.5MHz),也就是常说的2K60帧,使用DP的4个Lane发送,RGB 4:4:4 8bpc色彩格式;链路速率为2.7Gbps(HBR),总带宽4x2.7x0.8=8.64Gbps,视频有效带宽约5.3Gbps,占用率约62%,在HBR速率下稳定输出2K60;
本设计使用Xilinx-GTP高速收发器,适用于Xilinx-7系列FPGA实现DP视频发送应用;
工程源码3
开发板FPGA型号为Xilinx-Artix7-200T–xc7a200tfbg484-2;
DP视频输出源使用工程内部的彩条测试源模拟,配置参数USE_TPG=2,输出分辨率为2560x1440@60Hz(CVT-RB时序,像素时钟241.5MHz),也就是常说的2K60帧,使用DP的4个Lane发送,RGB 4:4:4 8bpc色彩格式;链路速率为2.7Gbps(HBR),总带宽4x2.7x0.8=8.64Gbps,视频有效带宽约5.3Gbps,占用率约62%,在HBR速率下稳定输出2K60;
本设计使用Xilinx-GTP高速收发器,适用于Xilinx-7系列FPGA实现DP视频发送应用;
本博客详细描述了Xilinx 7系列FPGA纯verilog实现DP视频接口的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网以及其他开源免费获取渠道等等),若大佬们觉得有所冒犯,请私信批评教育;部分模块源码转载自上述网络,版权归原作者所有,如有侵权请联系我们删除;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。
2、相关方案推荐
我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目
其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往
我已有的FPGA图像处理方案
我的主页目前有FPGA图像处理专栏,改专栏收录了我目前手里已有的FPGA图像处理方案,包括图像缩放、图像识别、图像拼接、图像融合、图像去雾、图像叠加、图像旋转、图像增强、图像字符叠加等等;以下是专栏地址:
点击直接前往
我已有的4K/8K视频处理解决方案
我的主页有FPGA 4K/8K视频处专栏,该专栏有4K/8K视频处理,包括简单的4K/8K视频收发、4K/8K视频缩放、4K/8K视频拼接等等;以下是专栏地址:
点击直接前往
3、详细设计方案
设计框图
本设计的工程详细设计方案框图如下:
整个工程按时钟域和功能天然分成三段:
左边是AUX管理域,跑在100MHz管理时钟上,负责HPD检测、EDID读取、DPCD读写和链路训练状态机,是整个链路的"大脑";
右上角是视频域,跑在像素时钟(148.5MHz或241.5MHz)上,由彩条源产生视频符号流;中间靠右是符号域,跑在135MHz符号时钟上,五级流水线把符号流加工成符合DP规范的码流,最后交给GTP物理层串化输出;
三段各自独立,靠跨时钟域握手衔接,耦合极低,移植的时候基本只需要动GTP那一层的约束;
本工程实现的DP发送端性能参数如下:
●支持DisplayPort 1.1a发送端(Source)功能,主链路编码8b/10b;
●链路速率2.7Gbps(HBR),通过DPCD 0x00100=0x0A告知接收端;
●动态Lane数支持:1 Lane / 2 Lane / 4 Lane,通过DPCD 0x00101配置;
●动态色彩格式支持:RGB 4:4:4,8bpc(每颜色分量8bit);
●最高支持2560x1440@60Hz(2K60帧)分辨率输出;
●AUX通道速率1Mbps,半双工Manchester编码,支持Native AUX与I2C-over-AUX;
●支持EDID读取(最多8个128字节块)与DPCD寄存器读写;
●支持完整的链路训练:TPS1时钟恢复训练 + TPS2符号对齐训练;
●支持训练失败的自动重试:电压摆幅3档(0.4/0.6/0.8V)x 预加重3档(0/3.5/6dB)共9组组合轮询;
●支持HPD热插拔检测与链路中断后的自动重训练;
●支持Downspread扩频时钟(DPCD 0x00107=0x10,0.5%下扩频);
●支持主链路MSA成帧、VB-ID虚拟字节、Mvid/Maud时钟恢复参数;
●扰码多项式G(X)=X16+X5+X4+X3+1,符合DP 1.1a规范第3.3节;
●全部模块纯verilog实现,不依赖任何Xilinx官方DP相关IP核;
需要说明的是,本工程按DP 1.1a实现,能力上限是2.7Gbps x 4 Lane;比1.1a更高的DP 1.2(5.4Gbps HBR2)、DP 1.4(8.1Gbps HBR3)需要在GTP上跑更高的线速率并增加TPS3/TPS4训练码型,架构上本工程已预留扩展空间,详见第7节的移植说明:
DP版本能力矩阵与本工程落点如下图:
FPGA内部测试彩条
DP视频源使用工程内部的彩条测试源模拟,不需要外部输入设备;彩条源并不直接产生像素值,而是产生"时序骨架 + 占位符号 + MSA参数"三样东西:行内计数器和行计数器决定何时发BS/BE/FS/FE这些控制符号,有效区内发送PIX(0xCC)占位符,真正的颜色由后级的像素替换模块按像素横坐标查表填入8段彩条;这样做的好处是时序生成与颜色生成解耦,换分辨率只需换一个彩条源模块,其余流水线一行代码不用动;
本设计代码设计了3种彩条,均由FPGA内部纯verilog代码生成,具体如下:
彩条1:1920×1080@60Hz,RGB888,像素时钟148.5M,使用DP接口的2条Lane;资源占用最低,适合资源紧张的场合;
彩条2:1920×1080@60Hz,RGB888,像素时钟148.5M,使用DP接口的4条Lane;4 Lane配置与主流DP显示器兼容性最好;
彩条2:2560×1440@60Hz,RGB888,像素时钟241.5M,使用DP接口的4条Lane;分辨率最高;
FPGA内部测试彩条代码架构如下:
接口描述如下:
彩条源的生成、选择与像素替换如下如:
三档彩条源通过一个编译期参数USE_TPG选择,分别对应1080p/2Lane、1080p/4Lane和1440p/4Lane三套工程;每套彩条源同时输出完整的MSA参数包:Mvid/Nvid时钟恢复比值(18/0或9/0)、H_visible/V_visible有效区尺寸、H_total/V_total总尺寸、同步宽度与极性、色彩空间标志(RGB/YCC、4:4:4/4:2:2、BT.601/709、量化范围)等24个信号,这些参数在MSA插入模块中被组包成Secondary Data Packet插入主链路;
MSA与主链路成帧
MSA(Main Stream Attributes)是DP主链路的"元数据",告诉接收端这帧视频的分辨率、时序和色彩格式长什么样;
本工程的MSA插入模块在每帧的BS符号之后插入一组SS…SE包裹的MSA字节包,内容包括Mvid/Nvid(接收端靠它做时钟恢复,本工程2 Lane时为18/0,即链路符号率与像素钟之比的整数近似)、Hstart/Vstart、Hsync宽度、Htotal/Vtotal、H/V极性、同步时钟标志、色彩格式标志、位深、Lane数编码等;
这部分代码架构如下:
TU内符号顺序与MSA的多通道分布如下图:MSA之后是TU(Transfer Unit)传输单元的组装;TU是主链路带宽分配的基本单位,每行视频的有效像素被切成若干个TU,每个TU在4 Lane上按符号轮流分发;TU的尺寸由链路带宽和像素带宽的比值算出来,比如1080p@2Lane的配置,链路每行可用符号数约2640个,视频需要2200个,每个TU装64个像素符号,剩余的余量用填充符号补齐;这部分算不准会导致屏幕撕裂或者花屏,是DP发送端调试时最容易出问题的地方;
链路预算与TU计算示例如下图:
主链路发送流水线
主链路发送采用五级流水线结构,从像素域到GTP接口依次为:Idle码型插入 → SR扰码复位插入 → 多通道扰码 → 训练码型插入 → 4通道Skew对齐;每一级都只做一件小事,级与级之间位宽清晰(72bit符号流进、80bit符号流出),这也是纯verilog方案的优势——每一级都可以单独挂ILA观察,哪级出问题一眼定位;
各级流水线的功能如下:
这里有个纯verilog实现特有的细节值得展开:DP规范要求每Lane使用独立的扰码器,且扰码器只在帧内复位(SR符号处),帧间不清零;更关键的是K码(K28.5、K28.0等控制符号)永远不参与扰码,必须原样直通——实现时如果图省事把整个符号都过了LFSR,屏幕上就会看到规律性的花屏,这是很多初学者自己写DP扰码时踩的第一个坑;本工程的扰码模块对每bit判断K标志,只有数据bit进入异或网络,K码bit直接旁路;
AUX通道子系统
AUX是DP的"管理通道",1Mbps半双工,Manchester编码,物理上是一对差分线,逻辑上承载DPCD寄存器读写和I2C-over-AUX的EDID读取;没有AUX,DP发送端连显示器是谁都不知道,更谈不上训练链路;
此部分代码架构如下:
AUX报文格式与响应处理如下图:
本工程的AUX子系统分为三层:
最底下是AUX物理层(Manchester编解码、16字节收发FIFO、400us超时检测);
中间是报文查表层,把"读DPCD 0x00200"、"写DPCD 0x00100=0x0A"这类操作翻译成AUX线上的字节序列(命令4bit + 地址20bit + 长度 + 数据);
最上层是链路管理状态机,约50个状态,覆盖从HPD检测、EDID读取、能力协商到时钟训练、对齐训练、重试、错误处理的完整生命周期;
链路训练状态机
链路训练是DP发送端最核心的逻辑,也是本工程代码量最大的模块;训练的目的只有一个:让GTP的输出参数(速率、摆幅、预加重)与显示器的接收能力匹配,并把每个Lane的符号对齐;
链路训练状态机主干流程如下图:
训练流程如下:
HPD拉高后,状态机先通过AUX读EDID确认显示器存在,再读DPCD能力寄存器组(0x00100链路速率带宽、0x00101最大Lane数、0x00103~0x00106最大摆幅与预加重、0x00107扩频能力);
然后依次写入:0x00108=0x01(选择8b/10b编码)、0x00100=0x0A(2.7Gbps)、0x00101(Lane数)、0x00107=0x10(扩频);
接着进入时钟恢复训练,主链路发TPS1码型(D10.2重复序列),写DPCD 0x00102=0x21告知接收端,等100us后读0x00202~0x00203的LANE_STATUS,检查每个Lane的时钟恢复标志;
时钟训练通过后进入符号对齐训练,主链路发TPS2码型(K28.5交替极性),写0x00102=0x22,等100us后再查状态,这次除了时钟恢复还要检查符号对齐和通道间偏斜;
两阶段全部通过后写0x00102=0x00关闭训练码型、使能扰码,链路建立,进入正常视频传输;
任何一步检查失败,状态机不会直接报错放弃,而是自动降低电压摆幅或调整预加重档位重试(3档摆幅x3档预加重共9种组合),轮询一圈还不行才进入error状态并等待HPD重新拉起重训;这个重试机制在链路质量差的板子上(比如DP走线过长、没有隔直电容的转接板)非常关键,官方IP文档里不会告诉你这些,但上板就会遇到;
GTP高速收发器物理层
GTP是7系列FPGA的低速收发器硬核,本工程把GTPE2_CHANNEL原语配置为DP发送模式:线速率2.7Gbps,参考时钟135MHz经CPLL倍频,TX_DATA_WIDTH=20、TXOUT_DIV=2,即每个TXUSRCLK2周期送入2个10bit符号,2.7G/20bit=135MHz,与符号时钟自洽;8b/10b编码由GTP内部的TX8B10BEN硬件完成,本工程只需送入8bit数据+K码标志+极性控制位;
此部分代码架构如下:
GTP通道内部发送通路与时钟树如下图:
发射档位映射是纯verilog方案绕不开的活:
DP协议的电压摆幅和预加重各有3档,需要映射成GTP的TXDIFFCTRL(摆幅,0x20/0x30/0x40分别对应约0.4/0.6/0.8V)和TXPRECURSOR(预加重,0x00/0x16/0x26对应0/3.5/6dB)两组寄存器的值;
这组映射表是本工程根据Xilinx官方UG482文档和实际示波器测试标定的,训练状态机的9组重试组合直接查这张表;
GTP的复位时序遵循UG482规范:CPLL先上电锁定,再复位通道,等待TXRESETDONE后拉高tx_running,主链路流水线才开始发数据;复位顺序错了会导致CPLL锁不上或者输出无信号,是GTP调试最常见的坑;
时钟方案
整个工程三个时钟域:100MHz管理时钟(AUX状态机与DPCD译码)、像素时钟(148.5MHz或241.5MHz,随工程配置变化)、135MHz符号时钟(由GTP的TXOUTCLK经BUFG输出,反哺并行侧);跨时钟域的信号不多,1bit信号用两级同步器,多bit参数(分辨率、Lane数、训练结果)用"源域稳定后拉使能、目的域使能下采样"的策略,这也是小规模跨域设计最稳妥的做法;
时钟域划分与跨时钟域处理图下图:
vivado工程源码架构
提供3套工程源码,以工程源码1为例,综合后的源码架构如下:
4、Vivado工程源码1详解–>Artix7-35T版本
开发板FPGA型号:Xilinx-Artix7-35T–xc7a35tfgg484-2;
FPGA开发环境:Vivado2019.1;
输入:FPGA内部彩条,1920x1080@60Hz和2560×1440@60Hz可选;
输出:DP1.1a,分辨率1920x1080@60Hz或2560×1440@60Hz;
DP物理层方案:纯verilog封装GTPE2_CHANNEL原语,CPLL,2.7Gbps,8B10B编解码;
DP协议层方案:纯verilog实现,AUX训练状态机+五级主链路流水线;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:让读者掌握FPGA纯verilog实现DP接口的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
5、Vivado工程源码2详解–>Artix7-100T版本
开发板FPGA型号:Xilinx-Artix7-100T–xc7a100tfgg484-2;
FPGA开发环境:Vivado2019.1;
输入:FPGA内部彩条,1920x1080@60Hz和2560×1440@60Hz可选;
输出:DP1.1a,分辨率1920x1080@60Hz或2560×1440@60Hz;
DP物理层方案:纯verilog封装GTPE2_CHANNEL原语,CPLL,2.7Gbps,8B10B编解码;
DP协议层方案:纯verilog实现,AUX训练状态机+五级主链路流水线;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:让读者掌握FPGA纯verilog实现DP接口的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
6、Vivado工程源码2详解–>Artix7-200T版本
开发板FPGA型号:Xilinx-Artix7-200T–xc7a200tfbg484-2;
FPGA开发环境:Vivado2019.1;
输入:FPGA内部彩条,1920x1080@60Hz和2560×1440@60Hz可选;
输出:DP1.1a,分辨率1920x1080@60Hz或2560×1440@60Hz;
DP物理层方案:纯verilog封装GTPE2_CHANNEL原语,CPLL,2.7Gbps,8B10B编解码;
DP协议层方案:纯verilog实现,AUX训练状态机+五级主链路流水线;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:让读者掌握FPGA纯verilog实现DP接口的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
7、工程移植说明
vivado版本不一致处理
1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;
2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件–>另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解决如下:
打开工程后会发现IP都被锁住了,如下:
此时需要升级IP,操作如下:
FPGA型号不一致处理
如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:
更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;
其他注意事项
1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;
2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;
3:纯FPGA移植到Zynq需要在工程中添加zynq软核;
8、上板调试验证并演示
准备工作
FPGA开发板,带GTP BANK和DP输出接口(或DP转HDMI转接板);
DP显示器一台,建议支持2K分辨率;
DP线缆一根;
以工程源码1为例,开发板连接如下:
DP视频发送演示
DP视频发送演示如下:
9、福利:工程源码获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务: