• 协议——HDMI


      之前的博客详细介绍了 VGA 的原理和基本使用,这次换成 HDMI,增加一个技能点。

    一、HDMI 基本介绍

      HDMI 系统构架由发送端和接收端两部分组成,既可以传输视频,也可以传输音频,我们主要使用 HDMI 的发送视频到显示器端。HDMI 包含四对差分信号线,其中一对用来传输差分时钟,另外三对传输音、视频数据。如图所示为 HDMI 的总线框图,其中 TMDS 为最小化传输差分信号。
     

    二、HDMI 图像发送原理

      HDMI视频发送包含三个部分,VGA控制时序,8B/10B编码,并串转换,再将串行数据转换成一对差分信号传输到FPGA的引脚。总体框图如下图所示,由VGA控制器将图片源传来的数据转为R、G、B三个通道,每个通道的数据位宽均为8bit,然后由8B/10B编码码模块将8bit数据转为10bit,此目的主要是为了保证直流平衡,最后由并行转串行模块将10bit数据转成串行数据,再有单端转差分模块,将数据一对差分信号输出到FPGA的引脚端时钟源不需要进行8B/10B编码,可以由固定的数据代替,即10’b11111_00000。

    三、HDMI 模块构成

      HDMI 模块可以封装成一个独立模块方便后面的使用。如图所示:

    1、VGA模块

      之前的博客已经有详细叙述了,直接拿来用即可,注意根据分辨率不同,需要更改一下参数。

    2、hdmi_trans模块

      设计一个专门的 VGA 转 HDMI 模块,封装一下 8B/10B 编码模块和并转串差分输出模块,后面用起来就方便多了。

    (1)8B/10B编码:encode

      8B10B 编码是可以从 Xilinx 官网下载到此模块,模块名为 encode,此模块把 8 比特的数据进行从新映射为 10bit 数据,防止连续的 0 和 1 出现导致直流不平衡造成误码率升高。

    //==========================================================================
    //==    encode 例化,RGB三个通道
    //==========================================================================
    encode inst_encode_red
    (
        .clkin              (clk1x                  ),
        .rstin              (sysrst                 ),
        .din                (vga_r                  ),
        .c0                 (1'b0                   ),
        .c1                 (1'b0                   ),
        .de                 (vga_de                 ),
        .dout               (dored                  )
    );
    
    encode inst_encode_green
    (
        .clkin              (clk1x                  ),
        .rstin              (sysrst                 ),
        .din                (vga_g                  ),
        .c0                 (1'b0                   ),
        .c1                 (1'b0                   ),
        .de                 (vga_de                 ),
        .dout               (dogreen                )
    );
    encode inst_encode_blue
    (
        .clkin              (clk1x                  ),
        .rstin              (sysrst                 ),
        .din                (vga_b                  ),
        .c0                 (vga_hsync              ),
        .c1                 (vga_vsync              ),
        .de                 (vga_de                 ),
        .dout               (doblue                 )
    );

    (2)并转串差分输出模块:Serializer10_1

    ① 并转串模块:OSERDESE2原语

      详细介绍见Xilinx官方提供的UG768手册。

      OSERDESE2 原语模型:

      OSERDESE2 获取途径:

      OSERDESE2 级联:

      OSERDESE2原语的文档中介绍有:该原语可以进行8:1、10:1、14:1转换,当进行8:1转换的时候,采用一个原语即可,当采用10:1或者14:1转换的时候,需要采用两个原语级联的方式。我们需要将10bit数据进行串行化,因此根据文档说明,我们需要使用两个OSERDESE2原语进行级联,级联后的框图如下图所示。OSERDESE2 原语的 master 端承接 10bit 数据的低8位,OSERDESE2 原语的 slave 端的D1,D2不使用,D3 和 D4 承接10bit数据的高 2bit,(若是14:1则可以继续使用D5,D6,D7,D8,依然不使用D1,D2)。并将 slave 的输出 SHIFTOUT1, SHIFTOUT2 连接到 master 的 SHIFTIN1, SHIFTIN2,输入的 10bit 数据将会按照由低位到高位的顺序从 DataOut 端输出。

    ②差分输出模块:OBUFDS原语

      详情见Xilinx官方提供的 UG471 手册。

      OBUFDS原语模型

      OBUFDS获取途径:

      差分输出:

      最后将串行的数据输入到 OBUFDS 原语的输入端,转换成对应的差分进行输出到 FPGA 引脚端即可。

    四、上板现象

      如果成功,那么 HDMI 接口的屏幕会显示乱序的彩条,表明此次实验设计成功。

    参考资料:威三学院FPGA教程

  • 相关阅读:
    MySQL大表优化方案
    写一个简单脚本检测mysql主从是否正常
    Nginx配置基于ip的虚拟主机
    推荐一些好的linux学习网站
    shell基础入门(一)
    centos7和linux防火墙配置入门
    centos7.0之vsftpd随笔
    获取系统相关属性
    linux 文件管理操作入门
    ANSI文件操作
  • 原文地址:https://www.cnblogs.com/xianyufpga/p/12114497.html
Copyright © 2020-2023  润新知