图像处理二:HDMI显示(一)

作者:安平博,Xilinx高级工程师;来源:AI加速微信公众号

引言

做图像处理没有显示怎么能行,所以用两章来介绍HDMI的协议以及编码实现。HDMI的编码,仿真和调试会花费较长时间,特别是第一次在windows环境下部署UVM环境,对于刚刚入门UVM的我来说,这块也花费了很长时间。截止目前设计和仿真的代码都已经做完。所以这章主要介绍HDMI的协议以及设计的架构,之后再用一章来介绍HDMI的实现和驱动编写。

HDMI协议简介

HDMI包含物理层和链路层结构,物理层定义了信号的物理接口,以及物理层物理层编码方式。链路层定义了帧格式,包含了图像,声音,和控制信息。

1)物理层信号

TMDS Data:采用差分传输,共有三路。

TMDS Data shield:

TMDS clock:A类型的时钟频率小于55MHz,即最大传输165M pixels/sec。

TMDS clock shield:

SCL:串口通信时钟。

SDA:串口通信数据通路。

CEC:用户可以通过CEC协议对设备进行控制。

Hot Plug Detect:对供电电源进行检测信号,提示电源超过或者不足。

图1.1 物理层信号定义

图1.1 物理层信号定义

2)链路层结构

链路层主要包含如下信息:

图1.2 链路层包含信息

图1.2 链路层包含信息

整个传输的帧时序结构如图1.3:其中HSYNC、VSYNC是图像同步信号,都为高电平,表示是有效图像数据。Preamble用于区分数据类型,具体如图1.4。video数据以2bit的leading gurad band开头,之后是连续的一行图像数据。Data island用于传输声音信息,一些音视频描述信息等。Data island被放置于非有效video图像区域。这部分不是必须的,我们进行图像处理仅仅用于显示处理,所以不进行data island字段设计。这部分介绍略过。

图1.3 帧时序结构

内容

图1.4 preamble结构

图1.4 preamble结构

3)物理层编码

控制信号包括HSYNC、VSYNC以及CTL0……2。其具体映射到物理传输线上为:

Case(D1, D0):

0, 0: q = 10b1101010100;

0, 1: q = 10b0010101011;

1, 0: q = 10b0101010100;

1, 1: q = 10b1010101011;

Endcase

Video数据8bit被编码为10bit,这样可以降低TMDS物理路径上电位转变次数。算法如下:


图1.5 video data物理层编码

图1.5 video data物理层编码

HDMI设计架构
HDMI设计中不包含data island的结构解析,因为仅仅用于显示。整体结构如图2.1。包含两大部分:

1)hdmi_link

用于从ddr中获得图像数据,并封装成链路层格式。其中cfg是通过arm端实现寄存器配置,包括图像的起始地址,大小,图像长宽,blank的大小等。Ctrl是实现对HDMI的整体控制,包括使能HDMI发送,处理hotplug以及产生HDMI传输中断等。Img_reader通过axi总线从DDR中获得图像数据,pack是完成链路层格式的打包,并发送到物理层。

2)hdmi_phy

这层主要是将链路层帧结构进行物理编码,并转换为串行数据发送出去。Encoder就是对帧结构进行编码,每8bit转换为10bit数据。Serial中用到了芯片的SERDERS,将并行10bit数据转化为高速串行数据。

3)PLL

产生两种时钟信号:一种用于链路层数据打包和读取等,而tmds_clk是高速串行时钟。用于提供给物理接口。

图2.1 HDMI设计结构

图2.1 HDMI设计结构

验证架构

这部分用UVM来实现的,利用了UVM的基本架构。大致如图3.1。

1)img_seq,img_drv

产生图像并通过axi发送给DUT,同时将数据发送给img_monitor用于产生对比数据。

2)sw config

模拟软件行为,配置寄存器数据。

3)img_monitor

获取原始img数据产生对比文件,然后拉取DUT中link层和phy层数据,进行对比。输出对比结果。

图3.1 UVM验证架构

图3.1 UVM验证架构

总结
简单介绍了HDMI协议,并设计了HDMI显示架构。完成了设计和仿真代码。下一章将会介绍仿真和调试过程。

文章转载自:AI加速

推荐阅读