一、基础知识
1、HDMI传输
HDMI传输是一种可以传输视频、音频文件的传输协议。HDMI有19个引脚,其中依据TMDS传输协议传输的4对引脚最为重要,TMDS提供四个差分线对,组成TMDS数据和时钟通道(三对数据通道和一对时钟信号),这些通道用于传递视频,音频和辅助数据。
其传输系统工作方式为:TMDS将HDMI传输的24位图像数据分成三个部分(R,G,B),由并行信号转换为串行信号,R、G、B(各8位)分别通过0、1、2通道发送出去,接收端对其进行解码和串并转换实现传输。
其中每一通道都通过编码算法,将 8 位的视频、音频数据转换成最小化传输、直流平衡的 10 位数据。
2、其实现方式大致分为两步,如下:
一、编码:
1、最小化编码处理,
2、加上第九位,表示编码过程、
3、直流平衡:加上第十位,使得数据中0、1数据数量相等使信号对传输线的电磁干扰减少,提高信号传输的可靠性。
二、串并转换:
1、单沿输入改成双沿输入(调用ip核),
2、串并转换,
3、信号差分处理,传输一对相反的信号。
二、框图、波形图绘制
1、整体框图如下:
(1)首先是产生数据信号data,行、场信号,DE数据使能信号,时钟信号。这里可以使用前面的vga彩条输出模块,但是需要引出数据使能信号(在vga_ctrl中可发现rgb_valid寄存器正好实现该功能),如下:
(2)第二步是使用hdmi_ctrl模块,将上述输入信号(数据信号data,行、场信号,DE数据使能信号,时钟信号),通过编码(encode),串并转换,两个步骤,输出四对差分信号。其框图如下:
其中,编码模块有四个,每个分别将8位并行数据,转换为10位串行数据。注意,并行数据采用单边跳变,25MHZ系统时钟,完成10位的串行数据输出需要在25MHZ一个时钟周期内完成(注意这里单沿转双沿的操作使用组合逻辑),即串行数据的时钟频率需要是并行时钟频率的十倍,即250MHZ,这里采用双边跳变,缩减为125MHZ,即五倍系统时钟。这里调用ip核ddrout输出。
在串并、差分信号转换模块中,时钟那对差分信号数据输入00000_11111,即占空比50%的数据。
三、代码编写
1、encode模块
这里使用TMDS官方手册流程图进行编写:
数据时序关系如下:除此之外,C0和C1信号由流程图可以看出,在DE使能信号判断后需要用到,故也需要打两拍。
关键代码解读:
1、对于true和false的判断语句,使用一个reg型变量表征,如ctrl_1。
2、这里的打拍操作主要是因为流程图下面的某一步会使用到上面的数据,这时上面的数据就需要打拍。
3、cnt打拍:在上面cnt(t-1)时刻正好和D1数据对应,是因为经过流程图中多个if-else嵌套语句后(在一个always块中,只算一次打拍),正好对应cnt(t-1)。
4、cnt最高位是符号位,在写判断条件时,涉及到cnt与0的大小关系判断,这里使用cnt最高位,即cnt[4]是1还是0来判断。(0是正,1是负)
2、串并转换(par to ser)
串并转换这个模块主要实现三个目的:
①将单沿数据转换为双沿数据
②将单输出转换为差分双输出
③将并行信号转换位串行信号
对于第一个问题,这里使用一个ip核:ALTDDIO_OUT
这其中主要使用的端口为:
其中,outclock是输入的五倍系统时钟,OE是使能信号,datain_h和datain_l分别是五位的输入信号(是串行信号),对于前列的十位并行信号(低位先输入),datain_h是其中的奇位,datain_l是偶位。dataout是输出的双沿信号,此时同时实现并转串。
波形图如上,其中使用data_rise和data_fall分别将原来的10位输入数据分成两队分别在上升沿采取和下降沿采取的数据(这里注意是组合逻辑)。这里data_rise_s和data_fall_s是将并行的数据分别右移,取最低位,取成串行。
关键代码解读:
1、这里调用ip核时,outlook的选择是clk_5x取反,是因为想在data_rase_s的中间值时,将数据传输给ip核。
2、选用两个ip核,一个输入数据取反可以使输出双端差分信号。