赞
踩
目录
HDMI(High-Definition Multimedia Interface)是一种高清晰度多媒体接口,用于在各种电子设备之间传输高质量的音频和视频信号。HDMI接口常用于连接电视、显示器、投影仪、音频设备、电脑等各种消费电子设备。
HDMI接口的主要优点是可以提供高质量的数字音频和视频传输,支持高清晰度的影像输出。它可以传输全高清(1080p)甚至4K超高清分辨率的视频,以及有损和无损的多声道音频。
HDMI接口还具有多种功能和特性,例如支持3D影像传输、支持高动态范围(HDR)显示、支持音频回传(Audio Return Channel,ARC)等。它还可以传输网络数据和控制信号,以便按需连接互联网和进行设备之间的互动。
HDMI接口采用小型、方便连接的接头,相较于传统的模拟接口(如VGA、AV接口等),具有更高的传输质量和更简单的连接方式。通过使用HDMI线缆,用户可以方便地将各种电子设备连接在一起,享受高质量的音视频体验。
需要注意的是,HDMI接口有几个不同的版本(如HDMI 1.4、HDMI 2.0、HDMI 2.1等),每个版本支持不同的特性和功能。因此,在选择HDMI接口时,需要根据设备的需求和兼容性来选择适当的版本。
值得注意的是HDMI是向下兼容DVI的,因此下面我们来简单的介绍一下DVI。
DVI(Digital Visual Interface)是一种数字化视频接口,用于在电子设备之间传输数字视频信号。DVI接口最初是为了替代模拟接口(如VGA)而设计的,以提供更好的图像质量和更高的分辨率支持。
DVI接口支持多种视频信号格式,包括单链接(Single Link)和双链接(Dual Link)。单链接DVI可以传输较低的分辨率(如1920x1200),而双链接DVI可以支持更高的分辨率(如2560x1600)。双链接DVI还可以提供更高的带宽,支持更高的刷新率和更丰富的颜色深度。
DVI接口还可以通过适配器或转换器与其他类型的视频接口兼容,如HDMI、VGA和DisplayPort。这意味着您可以使用适当的适配器来连接DVI设备与其他类型的显示设备。
与HDMI接口相比,DVI接口没有传输音频信号的能力。因此,在连接DVI设备时,您可能需要另外使用音频线缆来传输音频信号。
总的来说,DVI接口是一种常见的数字视频接口,可用于连接计算机显示器、显卡、投影仪等设备。它提供了较高的图像质量和分辨率支持,是一个可靠且广泛使用的接口标准。然而,由于它不支持音频传输并且逐渐被HDMI和DisplayPort等接口所替代,因此在选择设备时需要考虑其兼容性和功能需求。
TMDS(Transition Minimized Differential Signaling)是一种用于传输数字信号的技术,常用于接口标准如DVI和HDMI中。
TMDS连接通过使用差分信号传输来减少信号干扰和损失。它使用一对相互翻转的信号线(正负两条)传输数据。通过将数据分成多个位(bit)并使用时钟信号进行同步,TMDS可以高效地传输大量的数字数据。
在TMDS连接中,发送方将数字信号转换为差分信号,即将每个位的高低电平分别对应为正负两个电平。接收方通过比较两个差分信号的电平差异来恢复原始的数字信号。这种差分传输方式能够减少电磁干扰和传输距离上的信号损失,从而提供更可靠的数据传输。
TMDS连接常用于视频接口标准,如DVI和HDMI。在DVI接口中,TMDS连接用于传输图像数据。在HDMI接口中,TMDS连接不仅可以传输视频数据,还可以传输音频和其他控制信号。
总的来说,TMDS连接是一种通过差分信号传输数字数据的技术。它在数字接口标准中起到了重要的作用,提供了可靠和高质量的数据传输。
其中包括T.M.D.S.transmitter编码过程,具体TMDS编码算法如下:
TMDS编码算法主要是将8bit的数据扩展为10bit的数据,以方便进行解码。
TMDS编码算法在官网也有提供,地址为:amd - Sign In
在传软视频图像的过程中,数据通道上传输的是编码后电有效像素字符。
而在每一帧图像的行与行之间,以及视频中不同帧之间的时间间隔(消隐期)内,数据通道上传输的则是控制字符。
每个通道上有两位控制信号的输入接口,共对应四种不同的控制字符。
这些控制字符提供了视频的行同步(HZYNC)以及帧同步(VSYNC)信息,在蓝色通道传输。
HDMI传输的消隐期除了控制字符之外,还可以用于传输音频或者其他附加数据,比如字幕信息等。
4-bit音频和附加数据将通过TERC4编码机制转换成10-bit TERC4字符,然后在绿色和红色通道上传输。
这里为了简单流程,因此采用DVI编码与TMDS编码算法。
其中encode采用官方提供的代码。
其中主要包括并转串、单脉冲信号转换为差分信号。
1、并转串模块
注:主要使用OSERDESE2原语,具体参考手册。
- `timescale 1ns / 1ps
-
- module par_to_ser(
- input [9:0] paralell_data,
- input clk_5x,
- input reset,
- input paralell_clk,
-
- output serial_data_out
- );
-
- wire cascade1;
- wire cascade2;
-
- //例化OSERDESE2原语,实现并串转换,Master模式
- 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 (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 (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 ()
- );
-
- endmodule
里面例化编码模块、并转串、以及OBUFDS原语(单脉冲信号转换为差分信号)。还要一个复位信号的转化。
- 注:转换复位信号
-
- module asyn_rst_syn(
- input clk, //目的时钟域
- input reset_n, //异步复位,低有效
-
- output syn_reset //高有效
- );
-
- //reg define
- reg reset_1;
- reg reset_2;
-
- assign syn_reset = reset_2;
-
- //对异步复位信号进行同步释放,并转换成高有效
- always @ (posedge clk or negedge reset_n) begin
- if(!reset_n) begin
- reset_1 <= 1'b1;
- reset_2 <= 1'b1;
- end
- else begin
- reset_1 <= 1'b0;
- reset_2 <= reset_1;
- end
- end
-
- endmodule
- module dvi_transmitter_top(
- input pclk, // pixel clock
- input pclk_x5, // pixel clock x5
- input reset_n, // reset
-
- input [23:0] video_din, // RGB888 video in
- input video_hsync, // hsync data
- input video_vsync, // vsync data
- input video_de, // data enable
-
- output tmds_clk_p, // TMDS 时钟通道
- output tmds_clk_n,
- output [2:0] tmds_data_p, // TMDS 数据通道
- output [2:0] tmds_data_n,
- output tmds_oen // TMDS 输出使能
- );
-
- //wire define
- wire reset;
-
- //并行数据
- wire [9:0] red_10bit;
- wire [9:0] green_10bit;
- wire [9:0] blue_10bit;
- wire [9:0] clk_10bit;
-
- //串行数据
- wire [2:0] tmds_data_serial;
- wire tmds_clk_serial;
-
- //*****************************************************
- //** main code
- //*****************************************************
- assign tmds_oen = 1'b1;
- assign clk_10bit = 10'b1111100000;
-
- //异步复位,同步释放
- asyn_rst_syn reset_syn(
- .reset_n (reset_n),
- .clk (pclk),
-
- .syn_reset (reset) //高有效
- );
-
- //对三个颜色通道进行编码
- dvi_encoder encoder_b (
- .clkin (pclk),
- .rstin (reset),
-
- .din (video_din[7:0]),
- .c0 (video_hsync),
- .c1 (video_vsync),
- .de (video_de),
- .dout (blue_10bit)
- ) ;
-
- dvi_encoder encoder_g (
- .clkin (pclk),
- .rstin (reset),
-
- .din (video_din[15:8]),
- .c0 (1'b0),
- .c1 (1'b0),
- .de (video_de),
- .dout (green_10bit)
- ) ;
-
- dvi_encoder encoder_r (
- .clkin (pclk),
- .rstin (reset),
-
- .din (video_din[23:16]),
- .c0 (1'b0),
- .c1 (1'b0),
- .de (video_de),
- .dout (red_10bit)
- ) ;
-
- //对编码后的数据进行并串转换
- serializer_10_to_1 serializer_b(
- .reset (reset), // 复位,高有效
- .paralell_clk (pclk), // 输入并行数据时钟
- .serial_clk_5x (pclk_x5), // 输入串行数据时钟
- .paralell_data (blue_10bit), // 输入并行数据
-
- .serial_data_out (tmds_data_serial[0]) // 输出串行数据
- );
-
- serializer_10_to_1 serializer_g(
- .reset (reset),
- .paralell_clk (pclk),
- .serial_clk_5x (pclk_x5),
- .paralell_data (green_10bit),
-
- .serial_data_out (tmds_data_serial[1])
- );
-
- serializer_10_to_1 serializer_r(
- .reset (reset),
- .paralell_clk (pclk),
- .serial_clk_5x (pclk_x5),
- .paralell_data (red_10bit),
-
- .serial_data_out (tmds_data_serial[2])
- );
-
- serializer_10_to_1 serializer_clk(
- .reset (reset),
- .paralell_clk (pclk),
- .serial_clk_5x (pclk_x5),
- .paralell_data (clk_10bit),
-
- .serial_data_out (tmds_clk_serial)
- );
-
- //转换差分信号
- OBUFDS #(
- .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
- ) TMDS0 (
- .I (tmds_data_serial[0]),
- .O (tmds_data_p[0]),
- .OB (tmds_data_n[0])
- );
-
- OBUFDS #(
- .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
- ) TMDS1 (
- .I (tmds_data_serial[1]),
- .O (tmds_data_p[1]),
- .OB (tmds_data_n[1])
- );
-
- OBUFDS #(
- .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
- ) TMDS2 (
- .I (tmds_data_serial[2]),
- .O (tmds_data_p[2]),
- .OB (tmds_data_n[2])
- );
-
- OBUFDS #(
- .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
- ) TMDS3 (
- .I (tmds_clk_serial),
- .O (tmds_clk_p),
- .OB (tmds_clk_n)
- );
-
- endmodule
HMDI的控制模块整体代码并不复杂,但是需要整体理解逻辑思路。同时需要熟练的使用原语的使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。