FPGA纯verilog实现DP视频接口,支持2K60帧分辨率,提供3套工程源码和技术支持

目录

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名片。

网盘资料如下:

此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:

相关推荐
MetaEnchanter9 小时前
视频章节怎么整理:填好时间点,导出前检查这几处
音视频
ChaseVLSI11 小时前
FPGA与ASIC的区别详解:内部结构、开发成本与适用场景,项目选型到底该选哪个
嵌入式硬件·fpga开发·硬件架构·硬件工程
小豆庄12 小时前
测试视频里的人脸车牌敏感信息自动化脱敏方案
计算机视觉·目标跟踪·ffmpeg·音视频·边缘计算·视频·敏捷流程
光泽雨13 小时前
WPF 音视频四大核心方案对比
wpf·音视频
揽秀亭长14 小时前
音频转乐谱如何实现?四类AI 扒谱工具的流程
音视频
敢敢のwings1 天前
SimpleMemVLA 深度解读:把原生视频上下文变成机器人的记忆
数码相机·机器人·音视频
9527华安1 天前
FPGA实现ARINC818总线协议,基于GT Transceivers Wizard高速收发器,提供7套工程源码和技术支持
fpga开发·transceivers·arinc818
小蘇的FPGA1 天前
fpga-wide-data-crc32
fpga开发
ck0135792 天前
视频片段提取与视频修剪的区别:多时间段选择及导出流程
人工智能·音视频·视频