这一篇在干嘛?

HDMI 是当今最普及的音视频接口,电脑、电视、投影仪上都有它。本实验驱动达芬奇开发板上的 HDMI 接口,在显示器上输出彩条图像。我们会弄清楚三件事:HDMI 接口的电气本质是什么、TMDS 协议怎么把 24 位像素变成串行差分信号、以及安路 FPGA 靠什么硬件资源把这一切实现出来。

实验目标与原理

实验任务

HDMI 接口在消费类电子行业,如电脑、液晶电视、投影仪等产品中得到了广泛的应用。一些专业的视频设备如摄像机、视频切换器等也都集成了 HDMI 接口。本实验学习如何驱动达芬奇开发板上的 HDMI 接口,了解 HDMI 接口性能、输出的信号控制关系,并掌握设计方法。

HDMI 简介

HDMI 是新一代的多媒体接口标准,英文全称是 High-Definition Multimedia Interface,即高清多媒体接口。它能够同时传输视频和音频,简化了设备的接口和连线;同时提供了更高的数据传输带宽,可以传输无压缩的数字音频及高分辨率视频信号。HDMI 1.0 版本于 2002 年发布,最高数据传输速度为 5Gbps;而 2017 年发布的 HDMI 2.1 标准的理论带宽可达 48Gbps。

HDMI 向下兼容 DVI,但是 DVI(数字视频接口)只能用来传输视频,而不能同时传输音频,这是两者最主要的差别。此外,DVI 接口的尺寸明显大于 HDMI 接口,如下图所示:


图 6-1 接口(左)和 HDMI 接口(右)实物图
图 6-1 右侧是生活中最常见的 A 型 HDMI 接口,其引脚定义如下图所示:


图 6-2 HDMI 接口引脚定义

TMDS 传输协议

DVI 和 HDMI 接口协议在物理层使用 TMDS 标准传输音视频数据。TMDS(Transition Minimized Differential Signaling,最小化传输差分信号)是美国 Silicon Image 公司开发的一项高速数据传输技术,在 DVI 和 HDMI 视频接口中使用差分信号传输高速串行数据。TMDS 差分传输技术使用两个引脚(如图 21.1.2 中的「数据 2+」和「数据 2-」)来传输一路信号,利用这两个引脚间的电压差的正负极性和大小来决定传输数据的数值(0 或 1)。差分传输抗共模干扰能力强,这正是它能跑到几百 Mbps 以上速率的关键。

安路在器件中加入了 TMDS 接口标准的支持,用于在 FPGA 内部实现 DVI 和 HDMI 接口。由于本次实验只是使用 HDMI 接口来显示图像,不需要传输音频,因此我们只需要实现 DVI 接口的驱动逻辑即可。不过在此之前我们还需要简单地了解一下 TMDS 视频传输协议。图 6-3 是 TMDS 发送端和接收端的连接示意图。DVI 或 HDMI 视频传输所使用的 TMDS 连接通过四个串行通道实现。对于 DVI 来说,其中三个通道分别用于传输视频中每个像素点的红、绿、蓝三个颜色分量(RGB 4:4:4 格式)。HDMI 默认也是使用三个 RGB 通道,但是它同样可以选择传输像素点的亮度和色度信息(YCrCb 4:4:4 或 YCrCb 4:2:2 格式)。第四个通道是时钟通道,用于传输像素时钟。独立的 TMDS 时钟通道为接收端提供接收的参考频率,保证数据在接收端能够正确恢复。


图 6-3 TMDS 连接示意图

如果每个像素点的颜色深度为 24 位,即 RGB 每个颜色分量各占 8 位,那么每个通道上的颜色数据将通过一个 8B/10B 的编码器(Encoder)来转换成一个 10 位的像素字符。然后这个 10 位的字符通过并串转换器(Serializer)转换成串行数据,最后由 TMDS 数据通道发送出去。这个 10:1 的并转串过程所生成的串行数据速率是实际像素时钟速率的 10 倍。

在传输视频图像的过程中,数据通道上传输的是编码后的有效像素字符。而在每一帧图像的行与行之间,以及视频中不同帧之间的时间间隔(消隐期)内,数据通道上传输的则是控制字符。每个通道上有两位控制信号的输入接口,共对应四种不同的控制字符。这些控制字符提供了视频的行同步(HZYNC)以及帧同步(VSYNC)信息,也可以用来指定所传输数据的边界(用于同步)。

对于 DVI 传输,整个视频的消隐期都用来传输控制字符。而 HDMI 传输的消隐期除了控制字符之外,还可以用于传输音频或者其他附加数据,比如字幕信息等。这就是 DVI 和 HDMI 协议之间最主要的差别。从图 6-3 中也可以看出这一差别,即「Auxiliary Data」接口标有「HDMI Only」,即它是 HDMI 所独有的接口。

从前面的介绍中我们可以看出,TMDS 连接从逻辑功能上可以划分成两个阶段:编码和并串转换。在编码阶段,编码器将视频源中的像素数据、HDMI 的音频/附加数据,以及行同步和场同步信号分别编码成 10 位的字符流。然后在并串转换阶段将上述的字符流转换成串行数据流,并将其从三个差分输出通道发送出去。

DVI 编码器在视频有效数据段输出像素数据,在消隐期输出控制数据,如图 6-4 所示。其中 VDE(Video Data Enable)为高电平时表示视频数据有效,为低电平代表当前处于视频消隐期。


图 6-4 DVI 编码输出示意图

系统框图

由于本次实验只需要通过 HDMI 接口显示图像,因此将其当成 DVI 接口进行驱动。另外我们只需要实现图像的发送功能。由此得出本次实验的系统框图如下所示:


图 6-5 输出示意图


图 6-6 RTL 原理图

为什么要给一个 5 倍像素时钟?

TMDS 的并转串比例是 10:1,但安路 EG4 的 IO 逻辑每半个时钟周期翻转一次数据(DDR 方式),因此串行化只需要 5 倍时钟:像素时钟下每个通道锁存 10 位字符,5 倍时钟下用双沿寄存器(ODDR/SERDES)把它串行打出去。例程里 PLL 同时输出 pixel_clkpixel_clk_5x 就是这个用途。

硬件接口

在 HX4S20 板装配了 2 个 HDMI 口,2 口可同时作为输入输出,原理图如图 6-7:


图 6-7 HDMI 接口原理图

注意原理图中 TMDS 差分对只把正端(P)接到 FPGA,负端在板上接地处理,这是这类低成本 HDMI 电路的常见做法。

设计代码

顶层文件:

module hdmi_top( input PXLCLK_I, input PXLCLK_5X_I, input RST_I, input DEN_TPG, input [3:0] TPG_mode, input LOCKED_I, //HDMI output HDMI_CLK_P, output HDMI_D2_P, output HDMI_D1_P, output HDMI_D0_P, output SERDES_CLK_TEST, output SERDES_DATA1_TEST, output SERDES_DATA2_TEST, output ODDR_CLK_TEST, output ODDR_DATA1_TEST, output ODDR_DATA2_TEST, output VGA_HS, output VGA_VS, output [7:0] VGA_R, output [7:0] VGA_G, output [7:0] VGA_B ); wire [15:0] addr; wire VGA_DE; wire [11:0] VGA_D; assign VGA_R = {VGA_D[11:8],4’b0}; assign VGA_G = {VGA_D[7:4],4’b0}; assign VGA_B = {VGA_D[3:0],4’b0}; /* video_tpg_12801024p u2_tpg( .PCLK(PXLCLK_I), .Reset(RST_I), .DEN_TPG(DEN_TPG), .TPG_mode(TPG_mode), .PDEN(VGA_DE), .HSYNC(VGA_HS), .VSYNC(VGA_VS ), .PDATA(VGA_RGB) ); //color //color to VGA_D vga_disp u_vga_disp( .clk25M (PXLCLK_I), .reset_n (RST_I), //.rgb (rgb), //output .VGA_HSYNC (VGA_HS), .VGA_VSYNC (VGA_VS), .VGA_EN (VGA_DE), //.addr (addr), .VGA_D (VGA_D)

); hdmi_tx #(.FAMILY(“EG4”)) //EF2、EF3、EG4、AL3、PH1 u3_hdmi_tx ( .PXLCLK_I(PXLCLK_I), .PXLCLK_5X_I(PXLCLK_5X_I), .RST_N (RST_I), //VGA .VGA_HS (VGA_HS ), .VGA_VS (VGA_VS ), .VGA_DE (VGA_DE ), .VGA_RGB({VGA_R,VGA_G,VGA_B}), //HDMI .HDMI_CLK_P(HDMI_CLK_P), .HDMI_D2_P (HDMI_D2_P ), .HDMI_D1_P (HDMI_D1_P ), .HDMI_D0_P (HDMI_D0_P ) ); endmodule 显示控制: module hdmi_tx_display ( input sys_clk , //系统时钟 input sys_rst_n , //系统复位,低电平有效 //hdmi 接口 output HDMI_CLK_P, output HDMI_D2_P, output HDMI_D1_P, output HDMI_D0_P, //VGA_TEST output VGA_HS, output VGA_VS, output [7:0] VGA_R, output [7:0] VGA_G, output [7:0] VGA_B ); clk_wize u_clk_wize ( .refclk(sys_clk),

.reset(1’b0),

.clk0_out(pixel_clk_5x),

.clk1_out(pixel_clk)

);

//例化 HDMI 驱动模块

hdmi_top u_hdmi_top(

.PXLCLK_I(pixel_clk),

.PXLCLK_5X_I(pixel_clk_5x),

.RST_I(sys_rst_n),

.DEN_TPG(1’b0),

.VGA_HS(VGA_HS),

.VGA_VS(VGA_VS),

.VGA_R(VGA_R),

.VGA_G(VGA_G),

.VGA_B(VGA_B),

.HDMI_CLK_P (HDMI_CLK_P),

.HDMI_D2_P (HDMI_D2_P),

.HDMI_D1_P (HDMI_D1_P),

.HDMI_D0_P (HDMI_D0_P)

);

endmodule

代码结构可以拆成三层来读:

  • hdmi_tx_display(顶层):例化锁相环 clk_wize,把 50MHz 系统时钟倍频出 pixel_clkpixel_clk_5x 两路,再例化 hdmi_top
  • hdmi_top(中层):产生测试图像(彩条发生器 TPG 或 vga_disp 显示逻辑),把图像以 VGA 时序的形式(HS/VS/DE/RGB)交给 hdmi_tx
  • hdmi_tx(底层):TMDS 编码 + 并串转换。注意它例化时带了参数 #(.FAMILY("EG4")),用于适配不同安路系列的 IO 原语——EF2、EF3、EG4、AL3、PH1 都可以选。

hdmi_topassign VGA_R = {VGA_D[11:8],4'b0}; 这一句值得留意:内部图像数据是 12 位(每色 4 位),低位补零扩展成 8 位再送给 TMDS 编码器。

锁相环设计


图 6-8 PLL

锁相环同时输出像素时钟与其 5 倍频时钟,二者的相位关系由 PLL 硬件保证,这正是 DDR 串行化所要求的。

引脚约束

表 6-1 是 HDMI A 口引脚分配,并给出引脚约束。

表 6-1 HDMI 彩条显示实验管脚分配

信号名方向管脚端口说明电平标准
sys_clkinputR7系统时钟,50MLVCMOS33
sys_rst_ninputA2系统复位,低有效LVCMOS33
tmds_data_p[2]outputB3TMDS数据通道2(正极)LVDS_33
tmds_data_p[1]outputE3TMDS数据通道1(正极)LVDS_33
tmds_data_p[0]outputF5TMDS数据通道0(正极)LVDS_33
tmds_clk_poutputK1TMDS时钟通道(正极)LVDS_33
set_pin_assignment { HDMI_CLK_P } { LOCATION = K1; IOSTANDARD = LVDS33; PULLTYPE = NONE; }
set_pin_assignment { HDMI_D0_P } { LOCATION = F5; IOSTANDARD = LVDS33; PULLTYPE = NONE; }
set_pin_assignment { HDMI_D1_P } { LOCATION = E3; IOSTANDARD = LVDS33; PULLTYPE = NONE; }
set_pin_assignment { HDMI_D2_P } { LOCATION = B3; IOSTANDARD = LVDS33; PULLTYPE = NONE; }
set_pin_assignment { sys_clk } { LOCATION = R7; IOSTANDARD = LVCMOS33; PULLTYPE = NONE; }
set_pin_assignment { sys_rst_n } { LOCATION = A2; IOSTANDARD = LVCMOS33; PULLTYPE = NONE; }

注意 TMDS 通道的电平标准不是 LVCMOS33 而是 LVDS33——高速差分输出要按 LVDS 的电气规格驱动,这也是它区别于普通 IO 的地方。

上板验证

将 HDMI 线缆一端连接核心板一端连接显示器,插好下载线,下载程序至开发板内,按动复位键,此时可以在显示器上看到彩条信号。

说明:开发板上有 HDMIA/B 口,两个口电路一样,都可以选择作为输入输出口,在例程中分别做了两个口的实验,只是引脚不同。

现象与总结

显示器点亮后应出现整齐的彩条图案。如果显示器提示「无信号」,按顺序检查:HDMI 线是否插在例程约束对应的那个口(A 口还是 B 口)、复位是否按下过一次、显示器是否支持当前输出的分辨率时序。

本实验最大的收获是理解了 TMDS 的两级流水——8B/10B 编码和 10:1 并串转换——以及安路 EG4 如何用 IO 原语加内部逻辑把它们实现出来。后面做 HDMI 输入(demo36 直通实验)时,接收端正好是这个发送端的镜像。

自测