当前位置:   article > 正文

FPGA——基于verilog编写HDMI接口屏幕显示_模拟hdmi代码

模拟hdmi代码

目录

一、HDMI介绍

二、显示原理

2.1 DVI介绍    

2.2 TMDS连接

2.2.1 TMDS编码算法

2.2.2 DVI编码

2.2.2 HDMI编码

2.3 HDMI引脚定义 

三、逻辑原理图

3.1 系统框图

 3.2 top原理图

 3.3 核心HDMI_CTRL控制模块

 3.3.1 编码功能模块

3.3.2 par_to_ser功能模块

3.3.3 顶层控制代码

四、总结


一、HDMI介绍

        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。 

2.1 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等接口所替代,因此在选择设备时需要考虑其兼容性和功能需求。

2.2 TMDS连接

        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编码算法如下:

2.2.1 TMDS编码算法

TMDS编码算法主要是将8bit的数据扩展为10bit的数据,以方便进行解码。

TMDS编码算法在官网也有提供,地址为:amd - Sign In

2.2.2 DVI编码

        在传软视频图像的过程中,数据通道上传输的是编码后电有效像素字符。
        而在每一帧图像的行与行之间,以及视频中不同帧之间的时间间隔(消隐期)内,数据通道上传输的则是控制字符。

        每个通道上有两位控制信号的输入接口,共对应四种不同的控制字符。
        这些控制字符提供了视频的行同步(HZYNC)以及帧同步(VSYNC)信息,在蓝色通道传输。

2.2.2 HDMI编码

         HDMI传输的消隐期除了控制字符之外,还可以用于传输音频或者其他附加数据,比如字幕信息等。

        4-bit音频和附加数据将通过TERC4编码机制转换成10-bit TERC4字符,然后在绿色和红色通道上传输。

这里为了简单流程,因此采用DVI编码与TMDS编码算法。

2.3 HDMI引脚定义 

三、逻辑原理图

3.1 系统框图

 3.2 top原理图

 3.3 核心HDMI_CTRL控制模块

 3.3.1 编码功能模块

 其中encode采用官方提供的代码。

3.3.2 par_to_ser功能模块

其中主要包括并转串、单脉冲信号转换为差分信号。

        1、并转串模块

注:主要使用OSERDESE2原语,具体参考手册

  1. `timescale 1ns / 1ps
  2. module par_to_ser(
  3. input [9:0] paralell_data,
  4. input clk_5x,
  5. input reset,
  6. input paralell_clk,
  7. output serial_data_out
  8. );
  9. wire cascade1;
  10. wire cascade2;
  11. //例化OSERDESE2原语,实现并串转换,Master模式
  12. OSERDESE2 #(
  13. .DATA_RATE_OQ ("DDR"), // 设置双倍数据速率
  14. .DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR
  15. .DATA_WIDTH (10), // 输入的并行数据宽度为10bit
  16. .SERDES_MODE ("MASTER"), // 设置为Master,用于10bit宽度扩展
  17. .TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE)
  18. .TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE)
  19. .TRISTATE_WIDTH (1) // 3-state converter width (1,4)
  20. )
  21. OSERDESE2_Master (
  22. .CLK (clk_5x), // 串行数据时钟,5倍时钟频率
  23. .CLKDIV (paralell_clk), // 并行数据时钟
  24. .RST (reset), // 1-bit input: Reset
  25. .OCE (1'b1), // 1-bit input: Output data clock enable
  26. .OQ (serial_data_out), // 串行输出数据
  27. .D1 (paralell_data[0]), // D1 - D8: 并行数据输入
  28. .D2 (paralell_data[1]),
  29. .D3 (paralell_data[2]),
  30. .D4 (paralell_data[3]),
  31. .D5 (paralell_data[4]),
  32. .D6 (paralell_data[5]),
  33. .D7 (paralell_data[6]),
  34. .D8 (paralell_data[7]),
  35. .SHIFTIN1 (cascade1), // SHIFTIN1 用于位宽扩展
  36. .SHIFTIN2 (cascade2), // SHIFTIN2
  37. .SHIFTOUT1 (), // SHIFTOUT1: 用于位宽扩展
  38. .SHIFTOUT2 (), // SHIFTOUT2
  39. .OFB (), // 以下是未使用信号
  40. .T1 (1'b0),
  41. .T2 (1'b0),
  42. .T3 (1'b0),
  43. .T4 (1'b0),
  44. .TBYTEIN (1'b0),
  45. .TCE (1'b0),
  46. .TBYTEOUT (),
  47. .TFB (),
  48. .TQ ()
  49. );
  50. //例化OSERDESE2原语,实现并串转换,Slave模式
  51. OSERDESE2 #(
  52. .DATA_RATE_OQ ("DDR"), // 设置双倍数据速率
  53. .DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR
  54. .DATA_WIDTH (10), // 输入的并行数据宽度为10bit
  55. .SERDES_MODE ("SLAVE"), // 设置为Slave,用于10bit宽度扩展
  56. .TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE)
  57. .TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE)
  58. .TRISTATE_WIDTH (1) // 3-state converter width (1,4)
  59. )
  60. OSERDESE2_Slave (
  61. .CLK (clk_5x), // 串行数据时钟,5倍时钟频率
  62. .CLKDIV (paralell_clk), // 并行数据时钟
  63. .RST (reset), // 1-bit input: Reset
  64. .OCE (1'b1), // 1-bit input: Output data clock enable
  65. .OQ (), // 串行输出数据
  66. .D1 (1'b0), // D1 - D8: 并行数据输入
  67. .D2 (1'b0),
  68. .D3 (paralell_data[8]),
  69. .D4 (paralell_data[9]),
  70. .D5 (1'b0),
  71. .D6 (1'b0),
  72. .D7 (1'b0),
  73. .D8 (1'b0),
  74. .SHIFTIN1 (), // SHIFTIN1 用于位宽扩展
  75. .SHIFTIN2 (), // SHIFTIN2
  76. .SHIFTOUT1 (cascade1), // SHIFTOUT1: 用于位宽扩展
  77. .SHIFTOUT2 (cascade2), // SHIFTOUT2
  78. .OFB (), // 以下是未使用信号
  79. .T1 (1'b0),
  80. .T2 (1'b0),
  81. .T3 (1'b0),
  82. .T4 (1'b0),
  83. .TBYTEIN (1'b0),
  84. .TCE (1'b0),
  85. .TBYTEOUT (),
  86. .TFB (),
  87. .TQ ()
  88. );
  89. endmodule

3.3.3 顶层控制代码

里面例化编码模块、并转串、以及OBUFDS原语(单脉冲信号转换为差分信号)。还要一个复位信号的转化。

  1. 注:转换复位信号
  2. module asyn_rst_syn(
  3. input clk, //目的时钟域
  4. input reset_n, //异步复位,低有效
  5. output syn_reset //高有效
  6. );
  7. //reg define
  8. reg reset_1;
  9. reg reset_2;
  10. assign syn_reset = reset_2;
  11. //对异步复位信号进行同步释放,并转换成高有效
  12. always @ (posedge clk or negedge reset_n) begin
  13. if(!reset_n) begin
  14. reset_1 <= 1'b1;
  15. reset_2 <= 1'b1;
  16. end
  17. else begin
  18. reset_1 <= 1'b0;
  19. reset_2 <= reset_1;
  20. end
  21. end
  22. endmodule

  1. module dvi_transmitter_top(
  2. input pclk, // pixel clock
  3. input pclk_x5, // pixel clock x5
  4. input reset_n, // reset
  5. input [23:0] video_din, // RGB888 video in
  6. input video_hsync, // hsync data
  7. input video_vsync, // vsync data
  8. input video_de, // data enable
  9. output tmds_clk_p, // TMDS 时钟通道
  10. output tmds_clk_n,
  11. output [2:0] tmds_data_p, // TMDS 数据通道
  12. output [2:0] tmds_data_n,
  13. output tmds_oen // TMDS 输出使能
  14. );
  15. //wire define
  16. wire reset;
  17. //并行数据
  18. wire [9:0] red_10bit;
  19. wire [9:0] green_10bit;
  20. wire [9:0] blue_10bit;
  21. wire [9:0] clk_10bit;
  22. //串行数据
  23. wire [2:0] tmds_data_serial;
  24. wire tmds_clk_serial;
  25. //*****************************************************
  26. //** main code
  27. //*****************************************************
  28. assign tmds_oen = 1'b1;
  29. assign clk_10bit = 10'b1111100000;
  30. //异步复位,同步释放
  31. asyn_rst_syn reset_syn(
  32. .reset_n (reset_n),
  33. .clk (pclk),
  34. .syn_reset (reset) //高有效
  35. );
  36. //对三个颜色通道进行编码
  37. dvi_encoder encoder_b (
  38. .clkin (pclk),
  39. .rstin (reset),
  40. .din (video_din[7:0]),
  41. .c0 (video_hsync),
  42. .c1 (video_vsync),
  43. .de (video_de),
  44. .dout (blue_10bit)
  45. ) ;
  46. dvi_encoder encoder_g (
  47. .clkin (pclk),
  48. .rstin (reset),
  49. .din (video_din[15:8]),
  50. .c0 (1'b0),
  51. .c1 (1'b0),
  52. .de (video_de),
  53. .dout (green_10bit)
  54. ) ;
  55. dvi_encoder encoder_r (
  56. .clkin (pclk),
  57. .rstin (reset),
  58. .din (video_din[23:16]),
  59. .c0 (1'b0),
  60. .c1 (1'b0),
  61. .de (video_de),
  62. .dout (red_10bit)
  63. ) ;
  64. //对编码后的数据进行并串转换
  65. serializer_10_to_1 serializer_b(
  66. .reset (reset), // 复位,高有效
  67. .paralell_clk (pclk), // 输入并行数据时钟
  68. .serial_clk_5x (pclk_x5), // 输入串行数据时钟
  69. .paralell_data (blue_10bit), // 输入并行数据
  70. .serial_data_out (tmds_data_serial[0]) // 输出串行数据
  71. );
  72. serializer_10_to_1 serializer_g(
  73. .reset (reset),
  74. .paralell_clk (pclk),
  75. .serial_clk_5x (pclk_x5),
  76. .paralell_data (green_10bit),
  77. .serial_data_out (tmds_data_serial[1])
  78. );
  79. serializer_10_to_1 serializer_r(
  80. .reset (reset),
  81. .paralell_clk (pclk),
  82. .serial_clk_5x (pclk_x5),
  83. .paralell_data (red_10bit),
  84. .serial_data_out (tmds_data_serial[2])
  85. );
  86. serializer_10_to_1 serializer_clk(
  87. .reset (reset),
  88. .paralell_clk (pclk),
  89. .serial_clk_5x (pclk_x5),
  90. .paralell_data (clk_10bit),
  91. .serial_data_out (tmds_clk_serial)
  92. );
  93. //转换差分信号
  94. OBUFDS #(
  95. .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
  96. ) TMDS0 (
  97. .I (tmds_data_serial[0]),
  98. .O (tmds_data_p[0]),
  99. .OB (tmds_data_n[0])
  100. );
  101. OBUFDS #(
  102. .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
  103. ) TMDS1 (
  104. .I (tmds_data_serial[1]),
  105. .O (tmds_data_p[1]),
  106. .OB (tmds_data_n[1])
  107. );
  108. OBUFDS #(
  109. .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
  110. ) TMDS2 (
  111. .I (tmds_data_serial[2]),
  112. .O (tmds_data_p[2]),
  113. .OB (tmds_data_n[2])
  114. );
  115. OBUFDS #(
  116. .IOSTANDARD ("TMDS_33") // I/O电平标准为TMDS
  117. ) TMDS3 (
  118. .I (tmds_clk_serial),
  119. .O (tmds_clk_p),
  120. .OB (tmds_clk_n)
  121. );
  122. endmodule

四、总结

        HMDI的控制模块整体代码并不复杂,但是需要整体理解逻辑思路。同时需要熟练的使用原语的使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/629306
推荐阅读
相关标签
  

闽ICP备14008679号