目录
一.HDMI简介
1.1含义
HDMI(High Definition Multimedia Interface)高清多媒体接口。可以同时传输视频和音频。HDMI 向下兼容 DVI,但是 DVI(数字视频接口)只能用来传输视频,而不能同时传输音频,这是两者最主要的差别。
DVI 和 HDMI 接口协议在物理层使用 TMDS 标准传输音视频数据。TMDS(Transition Minimized Differential Signaling,最小化传输差分信号)是美国 Silicon Image 公司开发的一项高速数据传输技术,在DVI 和 HDMI 视频接口中使用差分信号传输高速串行数据。
1.2HDMI引脚介绍
共有四根数据线,数据0,1,2是用来依次传输RGB数据,其中的屏蔽线是用来增加抗干扰能力,还有一根用来传输时钟。
1.3原语介绍
本实验用到的HDMI接口不同于lcd彩条实验,这是因为启明星开发板上 RGB TFT-LCD 接口可以直接读取RGB信号和行场同步信号,而HDMI接口需要使用 TMDS 标准传输音视频数据,即需要对RGB信号和行场同步等信号进行编码(10位并行数据),编码完成后需要再并转串(单端数据),再单端转差分,方可进行传输显示。
1.3.1原语含义
英文名称Primitive,是Xilinx针对其器件特征开发的一系列常用模块名称,涵盖了FPGA开发过程中的常用领域,方便用户直接调用FPGA的底层组件。
优点: 原语可以看作是库函数,可以直接例化调用,使用方便,功能全面,可以有效提高开发效率。
1.3.2原语分类
以Xilinx为例,共分为10类:计算组件、IO端口组件、寄存器/锁存器、时钟组件、处理器组件、移位寄存器、配置和检测组件、RAM/ROM组件、Slice/CLB组件以及G-tranceiver。
1.3.3本实验用到的原语
本实验中用到的并转串OSERDES、单端转差分OBUFDS属于IO端口组件。
OSERDESE2:并行转串行原语,可以调用Xilinx 7系列FPGA的IO逻辑资源,其主要功能是将并行数据转换成串行数据。
又因为TMDS将8位RGB信号编码位10位并行数据,这样一片OSERDESE2进行并转串不够用,因为一片OSERDESE2只能进行8转1,故需要将两片OSERDESE2级联起来进行使用。
二.实验任务
三.模块设计
3.1整体模块设计
PLL模块:由该模块产生后续并转串时钟以及驱动hdmi口的时钟。
video_driver模块:该模块产生行场同步信号以及像素点值,还有用于对某个像素点赋值的(x,y)坐标。
video_display模块:根据(x,y)确定该像素点的位置,对其赋值。
dvi_transmitter_top模块:将video_driver模块中产生的信号进行编码、并转串、单端转串口等操作,通过hdmi发送到显示屏进行显示。lcd可没有这一模块,因为启明星开发板上 RGB TFT-LCD 接口可以直接识别行场信息还有像素值信息,可以直接显示。
3.2 dvi_transmitter_top模块
由于在板级上,不同逻辑块距离复位信号的位置不一样,这样撤销复位时就会导致有的模块已经恢复至非复位状态有的还在复位状态,针对此问题,就需要以下模块来同步下复位信号,即在时钟信号下对复位信号进行打拍,将异步复位信号同步到clk下,从而解决以上问题。
以下是编码模块,即对video_driver模块的输出信号进行编码,将其编码为10位并行数据[9:0]。由于需要进行的编码有GRB三种信号,故此模块需要重复用三个。时钟信号之所以不用因为时钟信号类似方波信号,一段1,一段0,直接赋值10‘b11111_00000即可。
以下为并转串模块,即对上一模块编码完成后的信号进行转串操作,将10位信号转为一位。 由于一共有R、G、B和clk四路信号,故该模块需要重复用四个。
以下为单端转差分模块,将上一模块转换好的串行数据进行转成差分信号,即可通过hdmi传递出去进行显示。这里也需要重复用四个。
经过上面分析后,整体的dvi_transmitter整体模块框图如下。
四.代码解读
4.1编码模块代码
编码模块就是将行场同步信号和rgb信号由8位转换为10位,下面为编码流程图。该编码机制大致上实现了传输过程中的直流平衡,即一段时间内传输的高电平(数字“1”)的个数大致等于低电平(数字“0”)的个数。同时,每个编码后的 10-bit字符中状态跳转(“由 1 到 0”或者“由 0 到 1”)的次数将被限制在五次以内。
以下解释上面为何进行打拍(为了时序对齐)。
1. 因为不能直接对像素数据进行操作,因此这里对像素值进行打拍得到din_q,方便后续使用。但该数据(din_q)相较于原数据晚了一个时钟周期。得到的q_m与din_q是时序对齐的。
2.以下为获取q_m中的1和0的个数,但是该步骤还是在always语句中进行赋值的,故相较于原始数据晚了两个时钟周期。
3.经过上面两个工作后,如果进一步进行编码,则c0,c1,de都需要打两拍才能保证时序对齐,由于q_m是晚了一个时钟周期,因此打一拍即可。
4.2Serializer 并转串模块代码
这里并转串模块并不需要去实现,直接调用1.3.3中提到的原语即可(可以理解为类,使用时直接配置输入参数)。又因为TMDS将8位RGB信号编码位10位并行数据,这样一片OSERDESE2进行并转串不够用,因为一片OSERDESE2只能进行8转1,故需要将两片OSERDESE2级联起来进行使用。
第一片OSERDESE配置如下。因为第一片是主模块,因此红色圈里要配置为“MASTER”,“DDR”代表采用双边沿时钟进行并转串操作。D1~D8为待转信号的低8位,因为这里是两片OSERDESE级联,因此用于扩展的端口SHIFTIN1/2要和第二片OSERDESE的SHIFTOUT1/2相连接。这里定义两根线cascade1/2将两片级联起来。
第二片 OSERDESE配置如下,这片是从模块,因此红色框里需要配置为“SLAVE”,D3~D4接带转换数据的高两位,这是官方规定。
4.3OBUFDS单端转差分模块代码
这里也是调用了原语,通过配置参数即可完成单端转差分功能。 输入为R,G,B,CLK某一路的串行数据tmds_data_serial[i],输出转换完成后的两路差分信号tmds_data_p[i],tmds_data_n[i]。
五.modelsim仿真
由于别的模块仿真在lcd实验中都已经分析过,因此这里只对encoder模块仿真波形稍作解析。din为输入的8位并行数据,首先n1d统计din中1的个数,为8,接着判断第一个条件decision1,为真,则q_m按位采取同或操作,紧接着统计q_m中1的个数和0的个数,剩下编码操作均与4.1中的编码流程图一致。可以看出最后的dout中0个数多,dout[9]就赋值为1,当1个数比较多时,dout[9]就赋值为0,从而保证直流平衡,因为电容有通交阻直的作用,因此防止数据传输过程中产生错误,这里就需要保证数据中0和1的个数保持平衡。