2回答

0收藏

[评测分享] Perf-V开发板试用分享三:HDMI显示彩条

#板卡评测 #板卡评测 5964 人阅读 | 2 人回复 | 2018-12-10

本帖最后由 武器哈12 于 2018-12-10 23:55 编辑

     身边没有VGA线,只有一根HDMI线,所以在Perf-V开发板上做一下HDMI显示吧,嘿嘿
      先来介绍一下HDMI:高清多媒体接口(英语:High Definition Multimedia Interface,简称是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。
      如图一是HDMI图像传输结构,可以看出HDMI cable由3组差分信号传输TMDS数据,1组差分信号传输clock。此外,HDMI还有一个DDC的通道连接到sink的EDID。CEC和HEAC都是HDMI的可选协议。
     

图一 HDMI图像传输结构

     

图二 HDMI接口引脚定义

       HDMI传输由三组TMDS通道和一组TMDS clock通道组成,TMDS clock的运行频率是video信号的pixel频率,在每个cycle,每个TMDS data通道发送10bit数据。

       上图是HDMI传输的示意图,从图中可知,HDMI传输如下四种类型数据:
(1)Preamble控制信息,图中的CTLx,可用来表示后面传输的是data island还是video data。通过channel1和2的D[1:0]传输,占用4bit。
(2)Data Island,即数据包,如Audio数据包。通过3个channel的D[3:0]传输,占用12bit。
(3)Video Data,视频数据。示意图中传输的是RGB格式图像,R,G,B分别通过channel2,1,0传输,每个颜色8bit,共24bit。
(4)HSYNC, VSYNC。使用channel0的D[1:0]传输,占用2bit。
8bit的数据在source经过TMDS encoder后得到10bit数据,经过serializer后串行输出;在sink端先进行复原成10bit的数据,再通过TMDS decoder得到8bit的源数据。 此外,HDMI视频是stream式的传输,不涉及packet式的传输。
上图是传输720x480p video的hdmi timing图。
在video data period,有效的video数据进行传输;
在data island period,audio和auxiliary数据以包的形式进行传输;
在control period,CTLx和HSYNC, SYNC进行传输。
data island period和control period都是在消隐区进行。图中行消隐占用138像素,场消隐占45行。

Control Period

       只有两种类型的preamble信息组合,CTL0:3=1000代表接下来的是video data period,CTL0:3=1010代表接下来的是data island period。HSYNC, VSYNC此时也有可能发生变化。

Video Data Period
video data period以2个字符(pixel)长度的leading gurad band开始,guard band如下:
ch0: q_out[9:0] = 0b1011001100
ch1: q_out[9:0] = 0b0100110011
ch2: q_out[9:0] = 0b1011001100

Data Island Period
data island period传输audio数据和辅助数据,辅助数据包括Infoframe和其他用于音视频信息描述的数据。data island period以2个字符长度的leading guard band开始,并以2个字符宽度的trailing guard band 结束。guard band如下:
ch0: q_out[9:0] = n.a
ch1: q_out[9:0] = 0b0100110011
ch2: q_out[9:0] = 0b0100110011
data island传输的packet类型和格式详见spec说明。
三个传输阶段的过渡过程如下图所示:

(1) 左一是control period, 分别占用三个channel的D[1:0],channel 0传输HSYNC, VSYNC, channel1,2 传输Preamble
(2) 左二是data island period,分别占用了三个channel的D[3:0],channel 0的D[1:0]传输HSYNC, VSYNC, channel0的D[3:2]传输packet header, channel 1,2的D[3:0]传输packet。并且两端以guard band隔离
(3)右二接下来又是control period
(4)右一是 video data island, 占用了全部三个通道,并且开始以guard band 隔离

   感兴趣的同学可以看考HDMI协议规范:
HDMI_1.3a说明文档.pdf (4.52 MB, 下载次数: 7)

   

   开始我们的实验,Digital公司提供了VGA转HDMI的IP核,所以这里直接拿过来使用,毕竟HDMI协议比较复杂,哈哈,主要编写了VGA_TOP模块,产生VGA时序,根据x/y轴地址来输出彩条块的颜色,核心代码如下:
always@(posedge clk or posedge rst)
begin
        if(rst)
                begin
                        rgb_r_reg <= 8'h00;
                        rgb_g_reg <= 8'h00;
                        rgb_b_reg <= 8'h00;
                end
        else if(video_active)
                if(active_x == 12'd0)
                        begin
                                rgb_r_reg <= WHITE_R;
                                rgb_g_reg <= WHITE_G;
                                rgb_b_reg <= WHITE_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 1)
                        begin
                                rgb_r_reg <= YELLOW_R;
                                rgb_g_reg <= YELLOW_G;
                                rgb_b_reg <= YELLOW_B;
                        end                        
                else if(active_x == (H_ACTIVE/8) * 2)
                        begin
                                rgb_r_reg <= CYAN_R;
                                rgb_g_reg <= CYAN_G;
                                rgb_b_reg <= CYAN_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 3)
                        begin
                                rgb_r_reg <= GREEN_R;
                                rgb_g_reg <= GREEN_G;
                                rgb_b_reg <= GREEN_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 4)
                        begin
                                rgb_r_reg <= MAGENTA_R;
                                rgb_g_reg <= MAGENTA_G;
                                rgb_b_reg <= MAGENTA_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 5)
                        begin
                                rgb_r_reg <= RED_R;
                                rgb_g_reg <= RED_G;
                                rgb_b_reg <= RED_B;
                        end
                else if(active_x == (H_ACTIVE/8) * 6)
                        begin
                                rgb_r_reg <= BLUE_R;
                                rgb_g_reg <= BLUE_G;
                                rgb_b_reg <= BLUE_B;
                        end        
                else if(active_x == (H_ACTIVE/8) * 7)
                        begin
                                rgb_r_reg <= BLACK_R;
                                rgb_g_reg <= BLACK_G;
                                rgb_b_reg <= BLACK_B;
                        end
                else
                        begin
                                rgb_r_reg <= rgb_r_reg;
                                rgb_g_reg <= rgb_g_reg;
                                rgb_b_reg <= rgb_b_reg;
                        end                        
        else
                begin
                        rgb_r_reg <= 8'h00;
                        rgb_g_reg <= 8'h00;
                        rgb_b_reg <= 8'h00;
                end
end
代码:
hdmi_test_ok.zip (1.12 MB, 下载次数: 2)
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

qiaokechen

发表于 2021-4-3 23:46:13 | 只看该作者

老哥,你会基于蜂鸟的HDMI显示设计吗
回复 支持 反对

使用道具 举报

板凳

trucy

发表于 2023-5-24 06:38:53 | 只看该作者

这个是FPGA,开始以为纯MCU呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条