一、TMDS简介

HDMI和DVI协议使用TMDS作为它们的物理层。支持高达225MHz的传输速率,一个传输链路能满足高2048*1536分辨率电视信号。一般来说,一个HDMI/DVI接口包含四个TMDS通道,三条数据通道和一条时钟通道,每条通道采用差分电平传输,即一条通道要2根线,正极和负极。TMDS编解码算法可以使得被传输信号过渡过程的上冲和下冲减小,传输的数据趋于直流平衡,使信号对传输线的电磁干扰减少,提高信号传输的速度和可靠性。

二、TMDS编码

q_out[9]表示q_out[0:7]与q_m[0:7]的关系,q_out[9]==1表示q_out[0:7] = ~q_m[0:7],q_out[9]==0表示q_out[0:7] = q_m[0:7]

q_out[8]表示q_m[0:7]是用什么方式产生的,q_out[8]==1表示q_m[0:7]是用XOR方式产生的,q_out[8]==0表示q_m[0:7]是用XNOR方式产生的,q_out[8]永远等于q_m[8]

在算法流程上,首先,它会根据输入的8bit数据中1的个数来决定中间值q_m的产生方式,这里大概是为了满足最后输出数据的跳变次数要求。对于输入8bit像素数据,其输出的10bit数据中0-1或1-0的跳变次数要小于5次;对于输入控制数据,其输出的10bit数据中0-1或1-0的跳变次数要大于等于7次。然后,它根据上一次记录的cnt值(该值表示了上次输出的10bit数据中1的个数比0的个数多几个,最高位为符号位,取值范围为-7~7)和本次生成的中间值的0、1个数比,来决定输出的10bit数据q_out与中间值的关系。大致思路如下:上一次输出1的个数偏多了,这一次如果中间值还是1多,那么把中间值每个位取反,这一次如果中间值还是0多,那么照常输出,保证这一次的输出可以补偿上一次的不足,已达到直流平衡。最后,它会计算这一次输出的10bit数据中1比0多了几个,存到变量cnt中。

Verilog实现l:

`timescale 1 ps / 1psmodule dvi_encoder (input            clkin,    // pixel clock inputinput            rstin,    // async. reset input (active high)input      [7:0] din,      // data inputs: expect registeredinput            c0,       // c0 inputinput            c1,       // c1 inputinput            de,       // de inputoutput reg [9:0] dout      // data outputs
);// Counting number of 1s and 0s for each incoming pixel// component. Pipe line the result.// Register Data Input so it matches the pipe lined adder// outputreg [3:0] n1d; //number of 1s in dinreg [7:0] din_q;//计算像素数据中“1”的个数always @ (posedge clkin) beginn1d <=#1 din[0] + din[1] + din[2] + din[3] + din[4] + din[5] + din[6] + din[7];din_q <=#1 din;end///// Stage 1: 8 bit -> 9 bit// Refer to DVI 1.0 Specification, page 29, Figure 3-5///wire decision1;assign decision1 = (n1d > 4'h4) | ((n1d == 4'h4) & (din_q[0] == 1'b0));wire [8:0] q_m;assign q_m[0] = din_q[0];assign q_m[1] = (decision1) ? (q_m[0] ^~ din_q[1]) : (q_m[0] ^ din_q[1]);assign q_m[2] = (decision1) ? (q_m[1] ^~ din_q[2]) : (q_m[1] ^ din_q[2]);assign q_m[3] = (decision1) ? (q_m[2] ^~ din_q[3]) : (q_m[2] ^ din_q[3]);assign q_m[4] = (decision1) ? (q_m[3] ^~ din_q[4]) : (q_m[3] ^ din_q[4]);assign q_m[5] = (decision1) ? (q_m[4] ^~ din_q[5]) : (q_m[4] ^ din_q[5]);assign q_m[6] = (decision1) ? (q_m[5] ^~ din_q[6]) : (q_m[5] ^ din_q[6]);assign q_m[7] = (decision1) ? (q_m[6] ^~ din_q[7]) : (q_m[6] ^ din_q[7]);assign q_m[8] = (decision1) ? 1'b0 : 1'b1;/// Stage 2: 9 bit -> 10 bit// Refer to DVI 1.0 Specification, page 29, Figure 3-5/reg [3:0] n1q_m, n0q_m; // number of 1s and 0s for q_malways @ (posedge clkin) beginn1q_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];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]);endparameter CTRLTOKEN0 = 10'b1101010100;parameter CTRLTOKEN1 = 10'b0010101011;parameter CTRLTOKEN2 = 10'b0101010100;parameter CTRLTOKEN3 = 10'b1010101011;reg [4:0] cnt; //disparity counter, MSB is the sign bitwire decision2, decision3;assign decision2 = (cnt == 5'h0) | (n1q_m == n0q_m);/// [(cnt > 0) and (N1q_m > N0q_m)] or [(cnt < 0) and (N0q_m > N1q_m)]/assign decision3 = (~cnt[4] & (n1q_m > n0q_m)) | (cnt[4] & (n0q_m > n1q_m));// pipe line alignmentreg       de_q, de_reg;reg       c0_q, c1_q;reg       c0_reg, c1_reg;reg [8:0] q_m_reg;always @ (posedge clkin) beginde_q    <=#1 de;de_reg  <=#1 de_q;c0_q    <=#1 c0;c0_reg  <=#1 c0_q;c1_q    <=#1 c1;c1_reg  <=#1 c1_q;q_m_reg <=#1 q_m;end///// 10-bit out// disparity counter///always @ (posedge clkin or posedge rstin) beginif(rstin) begindout <= 10'h0;cnt <= 5'h0;end else beginif (de_reg) beginif(decision2) begindout[9]   <=#1 ~q_m_reg[8]; dout[8]   <=#1 q_m_reg[8]; dout[7:0] <=#1 (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];cnt <=#1 (~q_m_reg[8]) ? (cnt + n0q_m - n1q_m) : (cnt + n1q_m - n0q_m);end else beginif(decision3) begindout[9]   <=#1 1'b1;dout[8]   <=#1 q_m_reg[8];dout[7:0] <=#1 ~q_m_reg[7:0];cnt <=#1 cnt + {q_m_reg[8], 1'b0} + (n0q_m - n1q_m);end else begindout[9]   <=#1 1'b0;dout[8]   <=#1 q_m_reg[8];dout[7:0] <=#1 q_m_reg[7:0];cnt <=#1 cnt - {~q_m_reg[8], 1'b0} + (n1q_m - n0q_m);endendend else begincase ({c1_reg, c0_reg})2'b00:   dout <=#1 CTRLTOKEN0;2'b01:   dout <=#1 CTRLTOKEN1;2'b10:   dout <=#1 CTRLTOKEN2;default: dout <=#1 CTRLTOKEN3;endcasecnt <=#1 5'h0;endendendendmodule

三、TMDS解码

Verilog实现

module dvi_decoder(input        sys_clk,input        sys_rst,input [9:0]  Blue_out,output [7:0] data
);reg [7:0]    data_frame;reg [7:0]    data_frame1;reg [9:0]    data_in_frame;reg [9:0]    data_in_frame14;wire         desion1;wire         desion2;assign desion1 = (Blue_out[9]== 1)?1'b1:1"b0;assign desion2 =(Blue_out[8]== 1)?1"b1:1"bO;alwayse(posedge sys_clk or negedge sys_rst)beginif(!sys_rst) data_in_frame <= 'd0;else data_in_frame <= Blue_out;endalways@(posedge sys_clk or negedge sys_rst)beginif(!sys_rst)begindata_frame <= "d0;data_frame1 <= "d0;data_in_frame1 <= "d0;endelse if(desion1)begindata_in_frame1[7:0]<= ~data_in_frame[7:0];data_frame1[0]<= (desion2)?data_in_frame1[0]:data_in_frame1[0];data_frame1[1]<=(desion2)?data_in_frame1[1]^ data_in_frame1[0]:data_in_frame1[0]^~data in_frame1[1];data_frame1[2]<=(desion2)?data_in_frame1[2]^ data_in_frame1[1];:data_in_frame1[1]^-data_in frame1[2];data_frame1[3]<=(desion2)?data_in_frame1[3]^ data_in_frame1[2]:data_in_frame1[2]^~data_in_frame1[3];data_frame1[4]<=(desion2)?data_in_frame1[4]^ data_in_frame1[3]:data_in_frame1[3]^-data_in_frame1[4];data_frame1[5]<=(desion2)?data_in_frame1[5]^ data_in_frame1[4]:data_in_frame1[4]^~data_in_frame1[5];data_frame1[6]<=(desion2)?data_in_frame1[6]^ data _in_frame1[5]:data_in_frame1[5]^-data _in frame1[6];data_frame1[7]<= (desion2)?data_in_frame1[7]^ data_in_frame1[6]:data in_frame1[6]^~data_in_frame1[7];endelse if( !desion1)begindata_frame[0]<= (desion2)?data_in_frame[0]:data_in_frame[0];data_frame[1]〈=(desion2)?data_in_frame[1]^ data_in_frame[0]:data_in_frame[0]^~data_in_frame[1];data_frame[2]<=(desion2)?data_in_frame[2]^ data_in_frame[1]:data_in_frame[1]^~data in_frame[2];data_frame[3]<=(desion2)?data_in_frame[3]^ data_in_frame[2]:data_in_frame[2]^~data_in_frame[3];data_frame[4]<=(desion2)?data_in_frame[4]^ data_in_frame[3]:data_in_frame[3]^~data_in_frame[4];data_frame[5]<=(desion2)?data_in_frame[5]^ data_in_frame[4]:data_in_frame[4]^~-data_in_frame[5];data_frame[6]<=(desion2)?data_in_frame[6] ^ data_in_frame[5]:data_in_frame[5]^data_in_frame[6];data_frame[7]〈= (desion2)?data_in_frame[7]^ data_in_frame[6]:data_in_frame[6]^~data_in_frame[7];endendassign data =(desion1)?data_frame1[7:0]: data_frame;
endmodule

TMDS编解码原理与实现相关推荐

  1. 哈夫曼编解码原理与实现【转载】

    1. 哈夫曼编解码原理 霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编 ...

  2. yolov5的anchors及bbox的编解码原理

    yolov5的anchors的编解码原理 yolov5的anchors及bbox的编解码原理 1.anchor的生成 1)base anchor的生成 2)base anchor的平移和复制 2.bb ...

  3. Base64编解码原理并用Java手工实现Base64编解码

    Base64编解码原理 目前Base64已经成为网络上常见的传输8比特字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后进行签名或加密,之后再次Bas ...

  4. 一文读懂视频编解码原理

    引子 谈到视频的编解码,我们会自然地想到H.264.HEVC/H.265这些权威的视频编解码标准:谈到标准,有人觉得这个是有专门机构去研究的,我们关心应用就好:即使有兴趣读了标准和相关技术,面对更多的 ...

  5. MPEG4编解码原理

    ### Date: 2017/3/19 ### Author: SoaringLee ###Content: MPEG4 ASP编解码原理 一.MPEG4的编码原理 1 编码原理MPEG-4编码器主要 ...

  6. adpcm编解码原理及其代码实现

    目录 1. 源代码 adpcm.h adpcm.c 2. adpcm编解码原理 1.adpcm编码原理 2.adpcm解码原理 注释说明 3. ADPCM数据存放形式 1. adpcm 数据块介绍 2 ...

  7. WAV系列之二:ADPCM编解码原理及代码实现

    参考自:<adpcm编解码原理及其代码实现> <ADPCM编码与解码学习笔记> <音频编码:ADPCM> 文章目录 1.PCM 1.1.采样 1.2.量化编码 2. ...

  8. HDMI/DVI中TMDS编解码算法的理解

    HDMI/DVI中TMDS编解码算法的理解 TMDS简介 TMDS编码 TMDS解码 TMDS简介 HDMI和DVI协议使用TMDS作为它们的物理层.支持高达225MHz的传输速率,一个传输链路能满足 ...

  9. 一文读懂视频编解码原理[通俗易懂]

    一文读懂视频编解码原理[通俗易懂] 引子 谈到视频的编解码,我们会自然地想到H.264.HEVC/H.265这些权威的视频编解码标准:谈到标准,有人觉得这个是有专门机构去研究的,我们关心应用就好:即使 ...

最新文章

  1. Oracle记录被另一个用户锁住
  2. TabelView嵌套CollectionView高度适应
  3. python支持的几种并发方式进行简单的总结
  4. pic10f220 c语言,PIC10F200 LED流水灯程序
  5. lwip+freeRTOS 故障容错 客户端主动发起连接
  6. html中怎样实现在输入框中出现提示
  7. Vue源码后记-vFor列表渲染(3)
  8. 分贝、声功率级、声强级和声压级
  9. caffe的Matlab接口的使用方法
  10. 安装java环境好_一键安装Java环境的好工具 你用了吗
  11. IT民工金鱼哥从业8年的历程与感悟
  12. Vant上传多个图片或视频,更改视频预览图
  13. 去年做路由器的那帮兄弟都去哪儿了?
  14. [Codeforces Round #628]1325C - Ehab and Path-etic MEXs[思维][图]
  15. FFmpeg获取视频帧率fps,tbr
  16. UDS诊断系列介绍07-2E服务
  17. H323Client-1 H323协议族概述
  18. cocoapods——更新
  19. matlab画分形图的具体思路,分形几何中一些经典图形的Matlab画法
  20. ERP系统 应付分析供应商账龄

热门文章

  1. springboot集成hadoop实战
  2. 基于STM32F103单片机的智能药盒喂食器智能插座系统
  3. 程序员如何修炼成系统分析员
  4. 找工作的程序员应该这样优化简历【内附120套优质简历模板】
  5. Unity DOTween Yoyo循环运动
  6. 用 TensorFlow 追踪千年隼号
  7. 2022-2027年中国教育云行业市场调研及未来发展趋势预测报告
  8. kafka分区副本机制
  9. 【CVPR2022教程】普渡大学《通过大气湍流成像:理论、模拟和恢复》教程
  10. setsockopt和getsockopt函数