0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA的TMDS编码简析

FPGA技术江湖 来源:FPGA技术江湖 2024-03-26 09:03 次阅读

在我们之前的学习中,了解到HDMI是一种全数字化视频和声音发送接口,可以发送音频以及视频信号。HDMI向下兼容DVI,DVI只能传输视频信号。HDMI和DVI接口协议在物理层均使用TMDS标准来传输音频或视频信号,接下来就着重了解一下TMDS编码。

TMDS(最小化传输差分信号)中,有四个通道,其中包含了三个数据通道和一个时钟通道。其中数据通道用来传输颜色、音频、控制等信号。HDMI默认使用RGB(RGB888)三个数据通道,当然也可以是亮度和色度信息(YCrCb,44或者42)。

681ba772-eb09-11ee-a297-92fbcf53809c.png

上图为HDMI的链接框架;

通道0传输的数据为:B分量的视频数据、行场同步信号、音频信号。

通道0传输的数据为:G分量的视频数据、控制信号、音频信号。

通道0传输的数据为:R分量的视频数据、控制信号、音频信号。

不同的数据在TMDS数据通道中在三种不同的周期中发送。

682af9de-eb09-11ee-a297-92fbcf53809c.png

在TMDS传输标准中,不论是视频信号、控制信号还是辅助信号,都是以10bit的数据传输,所以需要对这三个信号进行编码,分别采用不同的编码方式。

683e9c82-eb09-11ee-a297-92fbcf53809c.png

在此,我们着重说一下视频编码,在Xilinx官方给出的一个编码示意图中,我们可以清楚整个的编码流程:

684ab846-eb09-11ee-a297-92fbcf53809c.png

图中也体现出了控制信号的编码方式:

6867d462-eb09-11ee-a297-92fbcf53809c.png

会对应特定的四个值中的一个。

编码如下:

1    `timescale 1 ps / 1ps
2  
3    module dvi_encoder (
4      input            clkin,    // pixel clock input
5      input            rstin,    // async. reset input (active high)
6      input      [7:0] din,      // data inputs: expect registered
7      input            c0,       // c0 input
8      input            c1,       // c1 input
9      input            de,       // de input
10     output reg [9:0] dout      // data outputs
11   );
12 
13     ////////////////////////////////////////////////////////////
14     // Counting number of 1s and 0s for each incoming pixel
15     // component. Pipe line the result.
16     // Register Data Input so it matches the pipe lined adder
17     // output
18     ////////////////////////////////////////////////////////////
19     reg [3:0] n1d; //number of 1s in din
20     reg [7:0] din_q;
21 
22   //计算像素数据中“1”的个数
23     always @ (posedge clkin) begin
24     n1d <=#1 din[0] + din[1] + din[2] + din[3] + din[4] + din[5] + din[6] + din[7];
25 
26     din_q <=#1 din;
27     end
28 
29     ///////////////////////////////////////////////////////
30     // Stage 1: 8 bit -> 9 bit
31     // Refer to DVI 1.0 Specification, page 29, Figure 3-5
32     ///////////////////////////////////////////////////////
33     wire decision1;
34 
35     assign decision1 = (n1d > 4'h4) | ((n1d == 4'h4) & (din_q[0] == 1'b0));
36 
37     wire [8:0] q_m;
38     assign q_m[0] = din_q[0];
39     assign q_m[1] = (decision1) ? (q_m[0] ^~ din_q[1]) : (q_m[0] ^ din_q[1]);
40     assign q_m[2] = (decision1) ? (q_m[1] ^~ din_q[2]) : (q_m[1] ^ din_q[2]);
41     assign q_m[3] = (decision1) ? (q_m[2] ^~ din_q[3]) : (q_m[2] ^ din_q[3]);
42     assign q_m[4] = (decision1) ? (q_m[3] ^~ din_q[4]) : (q_m[3] ^ din_q[4]);
43     assign q_m[5] = (decision1) ? (q_m[4] ^~ din_q[5]) : (q_m[4] ^ din_q[5]);
44     assign q_m[6] = (decision1) ? (q_m[5] ^~ din_q[6]) : (q_m[5] ^ din_q[6]);
45     assign q_m[7] = (decision1) ? (q_m[6] ^~ din_q[7]) : (q_m[6] ^ din_q[7]);
46     assign q_m[8] = (decision1) ? 1'b0 : 1'b1;
47 
48     /////////////////////////////////////////////////////////
49     // Stage 2: 9 bit -> 10 bit
50     // Refer to DVI 1.0 Specification, page 29, Figure 3-5
51     /////////////////////////////////////////////////////////
52     reg [3:0] n1q_m, n0q_m; // number of 1s and 0s for q_m
53     always @ (posedge clkin) begin
54     n1q_m  <=#1 q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7];
55     n0q_m  <=#1 4'h8 - (q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7]);
56     end
57 
58     parameter CTRLTOKEN0 = 10'b1101010100;
59     parameter CTRLTOKEN1 = 10'b0010101011;
60     parameter CTRLTOKEN2 = 10'b0101010100;
61     parameter CTRLTOKEN3 = 10'b1010101011;
62 
63     reg [4:0] cnt; //disparity counter, MSB is the sign bit
64     wire decision2, decision3;
65 
66     assign decision2 = (cnt == 5'h0) | (n1q_m == n0q_m);
67     /////////////////////////////////////////////////////////////////////////
68     // [(cnt > 0) and (N1q_m > N0q_m)] or [(cnt < 0) and (N0q_m > N1q_m)]
69     /////////////////////////////////////////////////////////////////////////
70     assign decision3 = (~cnt[4] & (n1q_m > n0q_m)) | (cnt[4] & (n0q_m > n1q_m));
71 
72     ////////////////////////////////////
73     // pipe line alignment
74     ////////////////////////////////////
75     reg       de_q, de_reg;
76     reg       c0_q, c1_q;
77     reg       c0_reg, c1_reg;
78     reg [8:0] q_m_reg;
79 
80     always @ (posedge clkin) begin
81     de_q    <=#1 de;
82     de_reg  <=#1 de_q;
83     
84     c0_q    <=#1 c0;
85     c0_reg  <=#1 c0_q;
86     c1_q    <=#1 c1;
87     c1_reg  <=#1 c1_q;
88 
89     q_m_reg <=#1 q_m;
90     end
91 
92     ///////////////////////////////
93     // 10-bit out
94     // disparity counter
95     ///////////////////////////////
96     always @ (posedge clkin or posedge rstin) begin
97     if(rstin) begin
98       dout <= 10'h0;
99       cnt <= 5'h0;
100    end else begin
101      if (de_reg) begin
102      if(decision2) begin
103        dout[9]   <=#1 ~q_m_reg[8]; 
104        dout[8]   <=#1 q_m_reg[8]; 
105        dout[7:0] <=#1 (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];
106
107        cnt <=#1 (~q_m_reg[8]) ? (cnt + n0q_m - n1q_m) : (cnt + n1q_m - n0q_m);
108      end else begin
109        if(decision3) begin
110        dout[9]   <=#1 1'b1;
111        dout[8]   <=#1 q_m_reg[8];
112        dout[7:0] <=#1 ~q_m_reg[7:0];
113
114        cnt <=#1 cnt + {q_m_reg[8], 1'b0} + (n0q_m - n1q_m);
115        end else begin
116        dout[9]   <=#1 1'b0;
117        dout[8]   <=#1 q_m_reg[8];
118        dout[7:0] <=#1 q_m_reg[7:0];
119
120        cnt <=#1 cnt - {~q_m_reg[8], 1'b0} + (n1q_m - n0q_m);
121        end
122      end
123      end else begin
124      case ({c1_reg, c0_reg})
125        2'b00:   dout <=#1 CTRLTOKEN0;
126        2'b01:   dout <=#1 CTRLTOKEN1;
127        2'b10:   dout <=#1 CTRLTOKEN2;
128        default: dout <=#1 CTRLTOKEN3;
129      endcase
130
131      cnt <=#1 5'h0;
132      end
133    end
134    end
135    
136  endmodule

编码完成后,对数据我们需要进行并串转换,此操作我们可以使用原语OSERDES2实现10-to-1的过程。最后用OBUFDS将串行数据转换为差分信号输出即可。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593201
  • RGB
    RGB
    +关注

    关注

    4

    文章

    763

    浏览量

    57412
  • HDMI接口
    +关注

    关注

    1

    文章

    114

    浏览量

    33729
  • TMDS
    +关注

    关注

    1

    文章

    17

    浏览量

    15258
  • 信号编码
    +关注

    关注

    0

    文章

    3

    浏览量

    6230

原文标题:基于FPGA的TMDS编码

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA的片内资源

    FPGA的片内资源
    发表于 01-08 22:12

    基于FPGATMDS编码

    音频或视频信号,接下来就着重了解一下TMDS编码TMDS(最小化传输差分信号)中,有四个通道,其中包含了三个数据通道和一个时钟通道。其中数据通道用来传输颜色、音频、控制等信号。HDMI默认
    发表于 04-09 15:45

    通过DM368输出的RGB信号,编码TMDS,输出DVI端子,这样可以吗?

    ,再用编码片子SII7170编码TMDS,通过DVI端子输出。请帮忙确认这种方式是否可行?3. TMS320DM368是否支持非标的分辨率RGB输出?4.TMS320DM368的C_WE_FIELD脚,是不是可以当做DE来使用
    发表于 06-15 03:16

    【设计技巧】rtos的核心原理

    rtos的核心原理rtos全称real-time operating system(实时操作系统),我来简单分析下:我们都知道,c语句中调用一个函数后,该函数的返回地址都是放在堆栈中的(准确
    发表于 07-23 08:00

    如何在xapp495中获得正常模拟TMDS信号?

    /xapp495_S6TMDS_Video_Interface.pdf但是我有一些奇怪的观点如下,正如您所看到的那样,TMDS不会切换。如何在xapp495中获得正常模拟TMDS信号?当我使用相同的代码实现
    发表于 08-12 07:25

    插值滤波器设计-明德扬至设计与应用FPGA

    插值滤波器设计-明德扬至设计与应用FPGA
    发表于 08-16 10:34

    【至设计案例系列】基于FPGA的曼彻斯特编码解码设计

    案例系列基于FPGA的曼彻斯特编码解码设计实验简述将输入的数据流经过曼彻斯特编码编码后经过解码器恢复为原来的输入序列。1.1 曼彻斯特
    发表于 04-24 14:22

    Armv8.1-M PAC和BTI扩展

    1、Armv8.1-M PAC和 BTI 扩展Armv8-M通过Trustzone for Armv8-M, Memory Protection Unit (MPU) 和Privileged
    发表于 08-05 14:56

    RK3288 Android6.0系统RT5640播放时的Codec寄存器列表

    1、RT5640播放时的Codec寄存器列表Platform: RockchipOS: Android 6.0Kernel: 3.10.92Codec: RT5640此文给调试RT5640播放
    发表于 11-24 18:12

    OpenHarmony智慧设备开发-芯片模组RK3568

    产品需求。 典型应用场景: 影音娱乐、智慧出行、智能家居,如烟机、烤箱、跑步机等。 *附件:OpenHarmony智慧设备开发-芯片模组RK3568.docx
    发表于 05-16 14:56

    OpenHarmony应用核心技术理念与需求机遇

    一、核心技术理念 图片来源:OpenHarmony官方网站 二、需求机遇 新的万物互联智能世界代表着新规则、新赛道、新切入点、新财富机会;各WEB网站、客户端( 苹果APP、安卓APK)、微信
    发表于 09-22 16:12

    ISL54105 pdf datasheet (TMDS R

    ISL54105 TMDS Regenerator  The ISL54105 is a high-performance TMDS timing regenerator
    发表于 09-21 22:27 15次下载

    TMDS361B 3 选 1 HDMI 开关

    电子发烧友网为你提供TI(ti)TMDS361B相关产品参数、数据手册,更有TMDS361B的引脚图、接线图、封装手册、中文资料、英文资料,TMDS361B真值表,TMDS361B管脚
    发表于 10-16 10:08
    <b class='flag-5'>TMDS</b>361B 3 选 1 HDMI 开关

    TMDS181 TMDS181x 6Gbps TMDS 重定时器

    电子发烧友网为你提供TI(ti)TMDS181相关产品参数、数据手册,更有TMDS181的引脚图、接线图、封装手册、中文资料、英文资料,TMDS181真值表,TMDS181管脚等资料,
    发表于 10-16 10:08
    <b class='flag-5'>TMDS</b>181 <b class='flag-5'>TMDS</b>181x 6Gbps <b class='flag-5'>TMDS</b> 重定时器

    TMDS171 TMDS171 3.4Gbps TMDS 重定时器

    电子发烧友网为你提供TI(ti)TMDS171相关产品参数、数据手册,更有TMDS171的引脚图、接线图、封装手册、中文资料、英文资料,TMDS171真值表,TMDS171管脚等资料,
    发表于 10-16 10:08
    <b class='flag-5'>TMDS</b>171 <b class='flag-5'>TMDS</b>171 3.4Gbps <b class='flag-5'>TMDS</b> 重定时器