【FPGA开发】HDMI通信协议解析及FPGA实现
本篇文章包含的内容
- 一、HDMI简介
- 1.1 HDMI引脚解析
- 1.2 HDMI工作原理
- 1.3 DVI编码
- 1.4 TMDS编码
- 二、并串转换、单端差分转换原语
- 2.1 原语简介
- 2.2 原语:IO端口组件
- 2.3 IOB 输入输出缓冲区
- 2.4 并转串原语`OSERDESE2`
- 2.4.1 `OSERDESE2` 工作原理
- 2.4.2 `OSERDESE2` 级联示意图
- 2.4.3 `OSERDESE2` 工作时序图
- 2.4.4 `OSERDESE2` 原语调用实例
- 2.5 单端转差分原语`OBUFDS`
笔者在这里使用的开发板是正点原子的达芬奇开发板,FPGA型号为XC7A35TFGG484-2。参考的课程是正点原子的课程手把手教你学达芬奇&达芬奇Pro之FPGA开发篇。
一、HDMI简介

HDMI,全称为High Definition Multimedia Interface,即高清多媒体接口。它不仅可以传输视频信号,还可以传输音频信号。上图所示的HDMI接口即为最常见的HDMI-A型接口。有19个引脚,尺寸为13.9×4.45mm,广泛应用于笔记本,投影仪,显示器等,工作频率约为160MHz。MDMI有不同的协议版本,比较重要的几个协议版本如1.0(2002.12)、1.3(2006.6)、2.0(2013.9)、2.1(2017.1),协议版本越高级,HDMI信号的传输速率、支持的分辨率以及帧率就越高。目前主流的HDMI协议版本为2.0。
1.1 HDMI引脚解析
HDMI的引脚及其定义如下图所示:

在HDMI协议中,总共有4组差分线,每组分别由+信号、-信号、屏蔽信号组成。四组信号线分别传输R、G、B信号以及时钟信号。CEC为HDMI的扩展功能,可以使用这一条线传输两个设备之间的控制信息,SCL、SDA是HDMI的I2C接口,可以实现不同设备之间EDID信息传输(Extended Display Identification Data 、外部显示设备标识数据——指DDC通讯中传输的显示设备数据)。热插拔检测线用于检测是否有从机连接到主机。
1.2 HDMI工作原理
HDMI的工作原理图如下所示。图中,TMDS指最小化传输差分信号(Transition Minimized Differential Signaling),是指被转换后的传输信号。视频信号Video和音频信号Audio通过一种特定的编码方式转换为10bit的串行差分信号,这种信号即成为TMDS信号。在主机上进行编码,在从机上进行解码,从而实现两个设备之间的信息交互。


上图展示了RGB-888格式下的TMDS信号和TERC4转换以及连接方式。视频信息采用TMDS进行编码,音频信号采用TERC4进行编码。每一路信号都是并行信号,HSYNC和VSYNC是显示的水平同步信号和竖直同步信号,这两个信号只和蓝色通道一起编码。绿色通道和红色通道的CTL0-3用来传输控制信号。TERC4频编码较为复杂,本文章不涉及。时钟信号也需要编码,但是较为简单,上图中没有展示出来。
1.3 DVI编码

当HDMI只传递视频信息不传递音频信息,HDMI协议就可以退化为DVI协议。DVI也使用
TMDS进行编码。DVI编码中有一个视频数据使能VDE信号,当它拉高时传递像素信号,当它拉低时传递控制信号和水平数值同步信号。
1.4 TMDS编码
TMDS指最小化传输差分信号(Transition Minimized Differential Signaling),主要适用于HDMI和DVI视频信号的编码。它的编码方式是将原有的8bit数据编码为10bit数据。
- 前
8bit数据:通过同或/异或算法得到。 bit9:反映前8bit数据的运算方式,如果是0,则说明前8bit通过异或非(同或)方式得到的,如果是1,就说明是通过异或方式得到的。bit10:直流平衡位。在高速的差分信号传输中,通常在接口处采用交流耦合,即会在接口处添加一个隔直电容去掉交流量。如果传输的信号长时间保持不变,就有可能在信号接收端出现直流偏移,导致解码错误。所以我们在编码时添加一个直流平衡位,如果前面数据1比较多,那么bit10 = 0,反之,如果前面数据0比较多,那么bit10 = 1。

TMDS的编码过程可以由下图所示:

| 参数名称 | 含义 |
|---|---|
D C1 C0 DE | D是视频信号, C是控制信号, DE是使能信号 |
Cnt(t) | 寄存器参数,用来存储第t次编码中1的个数比0的个数多多少(为了满足TMDS减少上冲下冲和确保直流平衡的要求) |
N1{x} | 输入信号中1的个数 |
N0{x} | 输入信号中0的个数 |
q_m | 临时寄存的数据输出 |
q_out | 编码输出 |
二、并串转换、单端差分转换原语
2.1 原语简介
原语:英文名称Primitive,是Xilinx针对其器件特征开发的一系列常用模块名称,涵盖了FPGA开发过程中的常用领域,方便用户直接调用FPGA的底层组件。以Xilinx为例,共分为10类:计算组件、IO端口组件、寄存器/锁存器、时钟组件、处理器组件、移位寄存器、配置和检测组件、RAM/ROM组件、Slice/CLB组件以及G-tranceiver。可以将原语理解为一段特殊的代码。实际上,调用原语是在实例化某个Xilinx的内置模块。
原语的好处在于原语可以之间看作为“库函数”,可以直接例化调用,比创建IP要更加方便,功能也更全面,可以有效提高开发效率。
2.2 原语:IO端口组件
IO端口组件是Xilinx的一类原语。IO组件中一共包含了21个原语,对应21个功能。在本次实验中主要采用并转串OSERDES和单端转差分OBUFDS两个原语。

IO组件的结构如下图所示。图中IDELAYE2和ODELAYE2分别是输入延迟和输出延迟,主要作用是为了解决高速信号传输中信号线可能不等长的问题(等待最长的一根线数据到来后再读取数据)。ILOGICE2和OLOGICE2中主要包含了IDDR和ODDR的资源,用于双边沿取样。ISERDESE2的作用是将单端输入的串行数据转换为并行数据,OSERDESE2的作用是将并行数据转换为单端串行数据输出。
达芬奇使用的FPGA芯片为A7系列,其中没有
HPBANK,所以没有ODELAYE2。ZYNQ也只有7030以上系列才有HPBANK,所以一般使用的FPGA芯片是没有ODELAYE2的。

2.3 IOB 输入输出缓冲区
IOB的结构如下所示,在本次实验中它主要完成单端转差分的操作。因为差分信号至少需要两条线,所以一个IOB是无法完成的,至少需要两个IOB才能完成这个功能。

2.4 并转串原语OSERDESE2
2.4.1 OSERDESE2 工作原理
对于一个并行数据,要想把它转换为串行数据有以下两种做法:
- 一个时钟周期内有10bit数据,将该时钟作10倍频,倍频后的时钟每一个周期存放一个数据。这种做法易于理解,但是最大的问题是将时钟进行10倍频后芯片以及外部设备可能不支持这样高的频率。
- 一个时钟周期内有10bit数据,将该时钟作5倍频,倍频后的时钟的上升沿和下降沿都进行数据转换输出,即DDR双边沿采样。这样可以有效缓解倍频给时钟带来的压力。
OSERDESE2的结构如下图所示。该组件可以分成三部分,上面的TCE,TBYTEIN和一部分电路组成三态控制;中间的CLK、CLKIDIV、RST组成时钟控制部分,CLK为快速时钟(5倍频),CLKDIV是低速时钟(1倍频);下面的OCE、D1-D8、OQ、OFB等组成并转穿的转换部分。数据转换数据只有8个数据输入口,要想实现10转1,则需要将两个OSERDESE2级联使用。


2.4.2 OSERDESE2 级联示意图
级联时需要注意:根据硬件的硬性要求,从模式的OSERDESE2的D1-D2不支持输入,只能从D3开始输入引脚,即可以选择D3-D8。

2.4.3 OSERDESE2 工作时序图
下面是OSERDESE2工作在普通模式和三态模式的两种时序工作图。第一张图数据为8位并行转串行,CLK和CLKDIV的周期之比为4:1。第二张图数据为4位并行转串行,并且包含T1-T4三态门控制,CLK和CLKDIV的周期之比为2:1。

T1-T4均为高电平有效,对应TQ将要输出的数据。且在当前CLKDIV周期采样,下个周期输出。在TQ高电平期间,可以执行输入操作。

2.4.4 OSERDESE2 原语调用实例

在原语调用实例中,需要特别注意以下几个参数:
.DATA_RATE_OQ("DDR"):采用双边沿采样;.DATA_WIDTH(10):将要转换的数据宽度;.SERDES_MODE("MASTER"):设置级联下的主从模式;.SHIFTOUT1/2(SHIFTOUT1/2)、.SHIFTIN1/2(SHIFTIN1/2):级联下的数据线连接方式,注意不要连错。
OSERDESE2 #(.DATA_RATE_OQ("DDR"), // DDR, SDR.DATA_RATE_TQ("DDR"), // DDR, BUF, SDR.DATA_WIDTH(10), // Parallel data width (2-8,10,14).INIT_OQ(1'b0), // Initial value of OQ output (1'b0,1'b1).INIT_TQ(1'b0), // Initial value of TQ output (1'b0,1'b1).SERDES_MODE("MASTER"), // MASTER, SLAVE.SRVAL_OQ(1'b0), // OQ output value when SR is used (1'b0,1'b1).SRVAL_TQ(1'b0), // TQ output value when SR is used (1'b0,1'b1).TBYTE_CTL("FALSE"), // Enable tristate byte operation (FALSE, TRUE).TBYTE_SRC("FALSE"), // Tristate byte source (FALSE, TRUE).TRISTATE_WIDTH(4) // 3-state converter width (1,4)) OSERDESE2_inst (.OFB(OFB), // 1-bit output: Feedback path for data.OQ(OQ), // 1-bit output: Data path output// SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each).SHIFTOUT1(SHIFTOUT1),.SHIFTOUT2(SHIFTOUT2),.TBYTEOUT(TBYTEOUT), // 1-bit output: Byte group tristate.TFB(TFB), // 1-bit output: 3-state control.TQ(TQ), // 1-bit output: 3-state control.CLK(CLK), // 1-bit input: High speed clock.CLKDIV(CLKDIV), // 1-bit input: Divided clock// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each).D1(D1),.D2(D2),.D3(D3),.D4(D4),.D5(D5),.D6(D6),.D7(D7),.D8(D8),.OCE(OCE), // 1-bit input: Output data clock enable.RST(RST), // 1-bit input: Reset// SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each).SHIFTIN1(SHIFTIN1),.SHIFTIN2(SHIFTIN2),// T1 - T4: 1-bit (each) input: Parallel 3-state inputs.T1(T1),.T2(T2),.T3(T3),.T4(T4),.TBYTEIN(TBYTEIN), // 1-bit input: Byte group tristate.TCE(TCE) // 1-bit input: 3-state clock enable);
2.5 单端转差分原语OBUFDS
OBUFDS的调用较为简单,直接按照如下的格式调用即可。
OBUFDS OBUFDS_inst (.O(O), // 1-bit output: Diff_p output (connect directly to top-level port).OB(OB), // 1-bit output: Diff_n output (connect directly to top-level port).I(I) // 1-bit input: Buffer input);
持续不定期更新完善中……
原创笔记,码字不易,欢迎点赞,收藏~ 如有谬误敬请在评论区不吝告知,感激不尽!博主将持续更新有关嵌入式开发、FPGA方面的学习笔记。
相关文章:
【FPGA开发】HDMI通信协议解析及FPGA实现
本篇文章包含的内容 一、HDMI简介1.1 HDMI引脚解析1.2 HDMI工作原理1.3 DVI编码1.4 TMDS编码 二、并串转换、单端差分转换原语2.1 原语简介2.2 原语:IO端口组件2.3 IOB 输入输出缓冲区2.4 并转串原语OSERDESE22.4.1 OSERDESE2 工作原理2.4.2 OSERDESE2 级联示意图2.…...
[NSSRound#16 Basic]Web
1.RCE但是没有完全RCE 显示md5强比较,然后md5_3随便传 md5_1M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&md5_2M%C9h%FF%0E%E3%5C%20%95r%D4w…...
[职场] 会计学专业学什么 #其他#知识分享#职场发展
会计学专业学什么 会计学专业属于工商管理学科下的一个二级学科,本专业培养具备财务、管理、经济、法律等方面的知识和能力,具有分析和解决财务、金融问题的基本能力,能在企、事业单位及政府部门从事会计实务以及教学、科研方面工作的工商管…...
docker (五)-docker存储-数据持久化
将数据存储在容器中,一旦容器被删除,数据也会被删除。同时也会使容器变得越来越大,不方便恢复和迁移。 将数据存储到容器之外,这样删除容器也不会丢失数据。一旦容器故障,我们可以重新创建一个容器,将数据挂…...
飞行路线(分层图+dijstra+堆优化)(加上题目选数复习)
飞行路线 这一题除了堆优化和dijstra算法和链式前向星除外还多考了一个考点就是,分层图,啥叫分层图呢?简而言之就是一个三维的图,按照其题意来说有几个可以免费的点就有几层,而且这个分层的权值为0(这样就相…...
云计算基础-快照与克隆
快照及克隆 什么是快照 快照是数据存储的某一时刻的状态记录,也就是把虚拟机当前的状态保存下来(快照不是备份,快照保存的是状态,备份保存的是副本) 快照优点 速度快,占用空间小 快照工作原理 在了解快照原理前,…...
使用 RAG 创建 LLM 应用程序
如果您考虑为您的文件或网站制作一个能够回应您的个性化机器人,那么您来对地方了。我可以帮助您使用Langchain和RAG策略来创建这样一个机器人。 了解ChatGPT的局限性和LLMs ChatGPT和其他大型语言模型(LLMs)经过广泛训练,以理解…...
第13章 网络 Page744~746 asio核心类 ip::tcp::endPoint
2. ip::tcp::endpoint ip::tcp::socket用于连接TCP服务端的 async_connect()方法的第一个入参是const endpoint_type& peer_endpoint. 此处的类型 endpoint_type 是 ip::tcp::endpoint 在 在 ip::tcp::socket 类内部的一个别名。 libucurl 库采用字符串URL表达目标的地…...
面试浏览器框架八股文十问十答第一期
面试浏览器框架八股文十问十答第一期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)什么是 XSS 攻击&#…...
多线程的基本原理学习
由一个问题引发的思考 线程的合理使用能够提升程序的处理性能,主要有两个方面,第一个是能够利用多核cpu以及超线程技术来实现线程的并行执行;第二个是线程的异步化执行相比于同步执行来说,异步执行能够很好的优化程序的处理性能提…...
C/C++进制转换
十进制转化为二进制 进制转化#include <iostream> using namespace std;void change(int); int main() {int num;cout << "请输入一个十进制数: ";cin >> num;cout << "转化后的二进制数为: ";change(num);return 0; } void chan…...
使用 Coze 搭建 TiDB 助手
导读 本文介绍了使用 Coze 平台搭建 TiDB 文档助手的过程。通过比较不同 AI Bot 平台,突出了 Coze 在插件能力和易用性方面的优势。文章深入讨论了实现原理,包括知识库、function call、embedding 模型等关键概念,最后成功演示了如何在 Coze…...
Arduino程序简单入门
文章目录 一、结构1.1 setup()1.2 loop() 二、结构控制2.1 if2.2 if...else2.3 switch case2.4 for2.5 while2.6 do...while2.7 break2.8 continue2.9 return2.10 goto 三、扩展语法3.1 ;(分号)3.2 {}(花括号)3.3 //(单…...
QT+OSG/osgEarth编译之八十三:osgdb_ogr+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ogr)
文章目录 一、osgdb_ogr介绍二、文件分析三、pro文件四、编译实践一、osgdb_ogr介绍 osgDB是OpenSceneGraph(OSG)库中的一个模块,用于加载和保存3D场景数据。osgDB_ogr是osgDB模块中的一个插件,它提供了对OGR(开放地理空间联盟)库的支持。 OGR是一个开源的地理空间数据…...
开年炸裂-Sora/Gemini
最新人工智能消息 谷歌的新 Gemini 模型 支持多达 1M的Token,可以分析长达一小时的视频 1M Token可能意味着分析700,000 个单词、 30,000 行代码或11 小时的音频、总结、改写和引用内容。 Comment:google公司有夸大的传统,所以真实效果需要上…...
vue前端系统启动报错Module not found: Error: Can‘t resolve ‘sass-loader‘
1、确认项目中是否已安装 node-sass 包。sass-loader 是依赖于 node-sass 包的,如果没有安装 node-sass 包,也会导致无法找到 sass-loader 包。 npm ls node-sass安装 node-sass 包: npm install --save-dev node-sass2、确认项目中是否已安…...
HTML | DOM | 网页前端 | 常见HTML标签总结
文章目录 1.前端开发简单分类2.前端开发环境配置3.HTML的简单介绍4.常用的HTML标签介绍 1.前端开发简单分类 前端开发,这里是一个广义的概念,不单指网页开发,它的常见分类 网页开发:前端开发的主要领域,使用HTML、CS…...
乡政府|乡政府管理系统|基于Springboot的乡政府管理系统设计与实现(源码+数据库+文档)
乡政府管理系统目录 目录 基于Springboot的乡政府管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、活动信息管理 3、新闻类型管理 4、新闻动态管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…...
存储系统如何规避数据静默错误SDC?
存储系统规避数据静默错误(Silent Data Corruption, SDC)是一项复杂且关键的任务,涉及多个层次的技术和策略。数据静默错误是指在存储或传输过程中发生的错误,这些错误未被检测出来,因此无法立即纠正,可能导…...
《Linux 简易速速上手小册》第8章: 安全性与加固(2024 最新版)
文章目录 8.1 防火墙与安全策略8.1.1 重点基础知识8.1.2 重点案例:配置 iptables 以保护 Web 服务器8.1.3 拓展案例 1:使用 firewalld 配置动态防御区域8.1.4 拓展案例 2:配置 ufw 以简化管理 8.2 SSH 安全最佳实践8.2.1 重点基础知识8.2.2 重…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...
【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...
