本篇主要介绍HDMI常见接口以及TMDS传输技术。
一、HDMI简介
HDMI(High-Definition Multimedia Interface):高清多媒体接口
能够同时传输视频和音频,简化了设备的接口和连线;
提供了更高的数据传输带宽,可以传输无压缩的数字音频及高分辨率视频信号;
可以向下兼容DVI接口(数字视频接口)
常见接口:
其中Type A型接口最常见,下面对A型接口展开介绍
DVI 和 HDMI 接口协议在物理层使用 TMDS 标准传输音视频数据。
- TMDS:最小化传输差分信号
- 在DVI和HDMI视频接口中使用差分信号传输高速串行数据。
- TMDS差分传输技术使用两个引脚来传输一路信号,利用这两个引脚间的电压差的正负极性和大小来决定传输数据的数值(0或1)。
二、TMDS传输技术
TMDS传输技术包括三部分:
“编/解码”(encoder) 、 “并/串转换”(serializer)、差分输出
1.编码(encoder)
在编码阶段:编码器将视频源中的像素数据、HDMI的音频附加数据,以及行同步和场同步信号分别编码成10位的字符流。
在视频数据传输期间:TMDS编码器将图像的RGB数据转换为10位TMDS码,并插入HSYNC和VSYNC信号的状态。
在控制模式期间:TMDS编码器传输特定的控制符号来表示HSYNC和VSYNC信号。这些符号被编码成10位TMDS码,并通过数据通道传输到接收端。
注:目前的HDMI显示项目中,仅对三个颜色通道进行编码即可
2.并转串(serializer)——OSERDESE2原语
注意:这里需要并转串的数据包括:rgb数据、时钟信号
其中10bit的时钟信号定义为:assign clk_10bit = 10’b1111100000
这里需要使用OSERDESE2源语,接口如下图所示:
一个oserdese2最大实现8:1的并串转换,那如何实现10:1的并串转换呢?
答:通过使用两个oserdese2,位扩展实现10:1的转换。
两个oserdese2的连接方式如上,一个(master)oserdese2,一个(slave)oserdese2。
源语使用方式如下:
OSERDESE2 #(
.DATA_RATE_OQ ("DDR"), // 设置双倍数据速率
.DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR
.DATA_WIDTH (10), // 输入的并行数据宽度为10bit
.SERDES_MODE ("MASTER"), // 设置为Master,用于10bit宽度扩展
.TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE)
.TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE)
.TRISTATE_WIDTH (1) // 3-state converter width (1,4)
)
OSERDESE2_Master (
.CLK (serial_clk_5x), // 串行数据时钟,5倍时钟频率
.CLKDIV (paralell_clk), // 并行数据时钟
.RST (reset), // 1-bit input: Reset
.OCE (1'b1), // 1-bit input: Output data clock enable
.OQ (serial_data_out), // 串行输出数据
.D1 (paralell_data[0]), // D1 - D8: 并行数据输入
.D2 (paralell_data[1]),
.D3 (paralell_data[2]),
.D4 (paralell_data[3]),
.D5 (paralell_data[4]),
.D6 (paralell_data[5]),
.D7 (paralell_data[6]),
.D8 (paralell_data[7]),
.SHIFTIN1 (cascade1), // SHIFTIN1 用于位宽扩展
.SHIFTIN2 (cascade2), // SHIFTIN2
.SHIFTOUT1 (), // SHIFTOUT1: 用于位宽扩展
.SHIFTOUT2 (), // SHIFTOUT2
.OFB (), // 以下是未使用信号
.T1 (1'b0),
.T2 (1'b0),
.T3 (1'b0),
.T4 (1'b0),
.TBYTEIN (1'b0),
.TCE (1'b0),
.TBYTEOUT (),
.TFB (),
.TQ ()
);
//例化OSERDESE2原语,实现并串转换,Slave模式
OSERDESE2 #(
.DATA_RATE_OQ ("DDR"), // 设置双倍数据速率
.DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR
.DATA_WIDTH (10), // 输入的并行数据宽度为10bit
.SERDES_MODE ("SLAVE"), // 设置为Slave,用于10bit宽度扩展
.TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE)
.TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE)
.TRISTATE_WIDTH (1) // 3-state converter width (1,4)
)
OSERDESE2_Slave (
.CLK (serial_clk_5x), // 串行数据时钟,5倍时钟频率
.CLKDIV (paralell_clk), // 并行数据时钟
.RST (reset), // 1-bit input: Reset
.OCE (1'b1), // 1-bit input: Output data clock enable
.OQ (), // 串行输出数据
.D1 (1'b0), // D1 - D8: 并行数据输入
.D2 (1'b0),
.D3 (paralell_data[8]),
.D4 (paralell_data[9]),
.D5 (1'b0),
.D6 (1'b0),
.D7 (1'b0),
.D8 (1'b0),
.SHIFTIN1 (), // SHIFTIN1 用于位宽扩展
.SHIFTIN2 (), // SHIFTIN2
.SHIFTOUT1 (cascade1), // SHIFTOUT1: 用于位宽扩展
.SHIFTOUT2 (cascade2), // SHIFTOUT2
.OFB (), // 以下是未使用信号
.T1 (1'b0),
.T2 (1'b0),
.T3 (1'b0),
.T4 (1'b0),
.TBYTEIN (1'b0),
.TCE (1'b0),
.TBYTEOUT (),
.TFB (),
.TQ ()
);
需要注意的是:该源语需要使用两个时钟信号
其中:Pixel clk为并行数据时钟,Pixel clk x5为串行数据时钟,是Pixel clk的5倍。
问:将10位的并行数据转换成串行数据,串行时钟为什么不是并行时钟的10倍而是五倍呢?
答:OSERDESE2通常工作在DDR模式下,在这种模式下,数据在时钟的上升沿和下降沿都被传输,因此串行数据时钟只需要并行数据时钟的5倍即可。
3.单端转差分——OBUFDS源语
原语使用方式如下: