TMDS编解码原理与实现
一、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. 哈夫曼编解码原理 霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编 ...
- yolov5的anchors及bbox的编解码原理
yolov5的anchors的编解码原理 yolov5的anchors及bbox的编解码原理 1.anchor的生成 1)base anchor的生成 2)base anchor的平移和复制 2.bb ...
- Base64编解码原理并用Java手工实现Base64编解码
Base64编解码原理 目前Base64已经成为网络上常见的传输8比特字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后进行签名或加密,之后再次Bas ...
- 一文读懂视频编解码原理
引子 谈到视频的编解码,我们会自然地想到H.264.HEVC/H.265这些权威的视频编解码标准:谈到标准,有人觉得这个是有专门机构去研究的,我们关心应用就好:即使有兴趣读了标准和相关技术,面对更多的 ...
- MPEG4编解码原理
### Date: 2017/3/19 ### Author: SoaringLee ###Content: MPEG4 ASP编解码原理 一.MPEG4的编码原理 1 编码原理MPEG-4编码器主要 ...
- adpcm编解码原理及其代码实现
目录 1. 源代码 adpcm.h adpcm.c 2. adpcm编解码原理 1.adpcm编码原理 2.adpcm解码原理 注释说明 3. ADPCM数据存放形式 1. adpcm 数据块介绍 2 ...
- WAV系列之二:ADPCM编解码原理及代码实现
参考自:<adpcm编解码原理及其代码实现> <ADPCM编码与解码学习笔记> <音频编码:ADPCM> 文章目录 1.PCM 1.1.采样 1.2.量化编码 2. ...
- HDMI/DVI中TMDS编解码算法的理解
HDMI/DVI中TMDS编解码算法的理解 TMDS简介 TMDS编码 TMDS解码 TMDS简介 HDMI和DVI协议使用TMDS作为它们的物理层.支持高达225MHz的传输速率,一个传输链路能满足 ...
- 一文读懂视频编解码原理[通俗易懂]
一文读懂视频编解码原理[通俗易懂] 引子 谈到视频的编解码,我们会自然地想到H.264.HEVC/H.265这些权威的视频编解码标准:谈到标准,有人觉得这个是有专门机构去研究的,我们关心应用就好:即使 ...
最新文章
- Oracle记录被另一个用户锁住
- TabelView嵌套CollectionView高度适应
- python支持的几种并发方式进行简单的总结
- pic10f220 c语言,PIC10F200 LED流水灯程序
- lwip+freeRTOS 故障容错 客户端主动发起连接
- html中怎样实现在输入框中出现提示
- Vue源码后记-vFor列表渲染(3)
- 分贝、声功率级、声强级和声压级
- caffe的Matlab接口的使用方法
- 安装java环境好_一键安装Java环境的好工具 你用了吗
- IT民工金鱼哥从业8年的历程与感悟
- Vant上传多个图片或视频,更改视频预览图
- 去年做路由器的那帮兄弟都去哪儿了?
- [Codeforces Round #628]1325C - Ehab and Path-etic MEXs[思维][图]
- FFmpeg获取视频帧率fps,tbr
- UDS诊断系列介绍07-2E服务
- H323Client-1 H323协议族概述
- cocoapods——更新
- matlab画分形图的具体思路,分形几何中一些经典图形的Matlab画法
- ERP系统 应付分析供应商账龄