欢迎各位朋友关注“郝旭帅电子设计团队”公众号,本公众号会定时更新相关技术类资料、软件等等,感兴趣的朋友可以浏览一下本公众号的其他“模块”,希望各位朋友都能在本公众号获得一些自己想要的“东西”。
本篇为各位朋友介绍基于FPGA的hdmi驱动设计--第一版--郝旭帅电子设计团队。
功能说明:
1. 利用hdmi接口输出,使外部显示器显示出彩条。
2. 利用Xilinx A7的FPGA直接控制hdmi接口(FPGA与接口中没有hdmi转换芯片)。
3. 不控制音频或者附加信息的输出。
使用平台:本次设计应用Xilinx的平台设计(芯片:XC7A35T-2FGG484)。
开发软件: Vivado 2019.2
开发语言:Verilog HDL
作者QQ:746833924
说明:当其他板卡电路不同时,会导致不同的现象出现,如有需要修改代码请联系作者;如需作者使用的板卡,请联系作者;
在学习hdmi之前,疯狂推荐学习本公众号推出的关于VGA的相关资料。
基于FPGA的VGA驱动设计--第一版(全屏一个颜色、黑白棋盘)
高清多媒体接口(High Definition Multimedia Interface,HDMI )是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。HDMI可用于机顶盒、DVD播放机、个人计算机、电视、游戏主机、综合扩大机、数字音响与电视机等设备。HDMI可以同时发送音频和视频信号,由于音频和视频信号采用同一条线材,大大简化系统线路的安装难度。
在设备上,一般会有hdmi的母座,无论是输出设备(例:PC),还是接受设备(例:显示器);
输出设备和输入设备中间需要靠一条两头都是公头的hdmi连接线进行连接。
上图是hdmi连接线的一端。
上图是hdmi公头的银角说明图。
1.2.3这三个管脚是一组,1和3是一组差分数据线,用于传输数据;2是屏蔽线,一般不屏蔽,会在输出端直接接地。
4.5.6和7.8.9的功能和1.2.3相同。
10.11.12这三个管脚是一组,10和12是一组差分时钟线,用于传输时钟(接收方利用此时钟同步数据);11是屏蔽线,一般不屏蔽,会在输出端直接接地。
13 cec信号为Consumer Electronics Control,消费类电子控制。CEC功能为用户带来许多方便,它允许终端用户使用一个遥控器控多个支CEC的HDMI设备,从而无需使用多个遥控器来控制电子设备(关闭HDMI输出设备后,HDMI输出设备可以通过此信号控制HDMI接收设备进行关机;开机操作也是相同的)。一般此管脚通过上拉电阻拉高。CEC有自己通信协议,在此不在介绍,感兴趣的小伙伴可以自行查询。
14作为保留。
15.16是一组IIC接口(Display Data Channel:DDC通道),此接口用于输出设备去读取接收设备可以支持的分辨率等信息,用于配置自己的输出格式。在此不在介绍,感兴趣的小伙伴可以自行查询。
17为cec和ddc通道的GND。
18为+5V的电源,由输出设备提供。
19为热插拔检测接口:输出接口不断去检测此信号,当没有连接到输入设备时,此信号空置,由输出设备下拉电阻拉低;当连接到输入设备时,由输入设备拉高;当输出设备检测到此号由低电平变为高电平,得知有输入设备连接成功,此时控制CEC和DDC通道去获取输入设备相关信息,并且开始输出。
在一些板卡或者设备上,主控芯片与HDMI接口之间会设计有HDMI转换芯片(例:ADV7513),主控芯片输出常见接口协议,由此芯片转换为HDMI接口协议。
为了省略掉中间的转换芯片,我们可以将此转换芯片的编码规则利用FPGA来进行实现(需要考虑FPGA能否输出较高频率的HDMI的信号以及是否支持HDMI的电平标准),进而节省部分成本(转换芯片成本和PCB成本)。
在xilinx A7 的XC7A35T-2FGG484此款芯片中,是能够支持常见的输出标准(例:1080P)的HDMI信号和电平标准的。那么此时,FPGA与HDMI接头之间就可以直接互联了。
Source为源端,也就是HDMI的输出设备(例:PC)
Sink为宿端,也就是HDMI的接收设备(例:显示器)
输出设备与输入设备之间的音频和视频数据信息通过四个通道进行传输(三个数据通道和一个时钟通道)。
数据通道0:负责传递视频信号中的蓝色分量、视频同步信号以及其他信息(附加信息或者音频信息)。
数据通道1:负责传递视频信号中的绿色分量以及其他信息(附加信息或者音频信息)。
数据通道2:负责传递视频信号中的红色分量以及其他信息(附加信息或者音频信息)。
本次介绍只介绍视频传输,在视频传输期间,数据通道采用TMDS编解码,将外部视频信息进行传输。
最小化传输差分信号(TMDS)作为电气电平的标准。被应用于发送数字视频接口(DVl)及高清晰度多媒体接口(HDMl)的数据。
TMDS编码(encoder)的原理为:
视频输入的格式为VGA的格式,格式与VGA输出大致相同,只是会多出一个像素点有效标志。
通过tmds的编码,就可以将视频信号中的红、绿、蓝以及同步信号编码为10个bit的数据。然后就需要利用串化器(serializer)将此10bit的信号串行发出,为了保证规定的视频格式,所以串行输出的速率为原来的10倍。
时钟通道是不需要进行TMDS编码的,如果和上述数据通道采用同样的串化器作为输出时,直接输出5个1和5个0即可。
由于输出的速率较高,我们无法采用FPGA内部的LUT和FF进行并串转换输出。
Xilinx的A7 FPGA中我们可以用OSERDESE2(FPGA内部专门并串转换的高速专用电路)进行并串转换。
OSERDESE2
# (
.DATA_RATE_OQ ("DDR"),
.DATA_RATE_TQ ("SDR"),
.DATA_WIDTH (10),
.TRISTATE_WIDTH (1),
.SERDES_MODE ("MASTER"))
oserdese2_master (
.D1 (oserdes_d[13][pin_count]),
.D2 (oserdes_d[12][pin_count]),
.D3 (oserdes_d[11][pin_count]),
.D4 (oserdes_d[10][pin_count]),
.D5 (oserdes_d[9][pin_count]),
.D6 (oserdes_d[8][pin_count]),
.D7 (oserdes_d[7][pin_count]),
.D8 (oserdes_d[6][pin_count]),
.T1 (1'b0),
.T2 (1'b0),
.T3 (1'b0),
.T4 (1'b0),
.SHIFTIN1 (ocascade_sm_d[pin_count]),
.SHIFTIN2 (ocascade_sm_t[pin_count]),
.SHIFTOUT1 (),
.SHIFTOUT2 (),
.OCE (clock_enable),
.CLK (clk_in),
.CLKDIV (clk_div_in),
.OQ (data_out_to_pins_predelay[pin_count]),
.TQ (),
.OFB (),
.TFB (),
.TBYTEIN (1'b0),
.TBYTEOUT (),
.TCE (1'b0),
.RST (io_reset));
OSERDESE2
# (
.DATA_RATE_OQ ("DDR"),
.DATA_RATE_TQ ("SDR"),
.DATA_WIDTH (10),
.TRISTATE_WIDTH (1),
.SERDES_MODE ("SLAVE"))
oserdese2_slave (
.D1 (1'b0),
.D2 (1'b0),
.D3 (oserdes_d[5][pin_count]),
.D4 (oserdes_d[4][pin_count]),
.D5 (oserdes_d[3][pin_count]),
.D6 (oserdes_d[2][pin_count]),
.D7 (oserdes_d[1][pin_count]),
.D8 (oserdes_d[0][pin_count]),
.T1 (1'b0),
.T2 (1'b0),
.T3 (1'b0),
.T4 (1'b0),
.SHIFTOUT1 (ocascade_sm_d[pin_count]),
.SHIFTOUT2 (ocascade_sm_t[pin_count]),
.SHIFTIN1 (1'b0),
.SHIFTIN2 (1'b0),
.OCE (clock_enable),
.CLK (clk_in),
.CLKDIV (clk_div_in),
.OQ (), //data_out_to_pins_predelay[pin_count]),
.TQ (),
.OFB (),
.TFB (),
.TBYTEIN (1'b0),
.TBYTEOUT (),
.TCE (1'b0),
.RST (io_reset));
输出的差分信号可以由内部的OBUFDS进行完成。
OBUFDS
#(.IOSTANDARD ("TMDS_33"))
obufds_inst
(.O (data_out_to_pins_p [pin_count]),
.OB (data_out_to_pins_n [pin_count]),
.I (data_out_to_pins_int[pin_count]));
如果不太了解OSERDESE2和OBUFDS原语设计的话,也可以采用Selectio 这个ip去完成上述功能。
配置第一页如下:
其他保持默认即可。
下面给出例子:利用hdmi输出全屏的红色(1080P的分辨率),
整体架构如下:
利用时钟管理单元产生视频输出时序的时钟148MHz和并串转换所需要的148MHz X 5 的740MHz。
并串转换采用DDR的模式输出,所以只需要5倍的速率即可完成10倍的速率输出。
利用VGA驱动模块产生视频输出时序。
利用tmds模块将R、G、B(B通道加上VSYNC和HSYNC)的输出进行编码。
利用Selectio的ip进行并串转换和差分输出。
参考例程链接:
通过百度网盘分享的文件:hdmi驱动设计第一版
链接:https://pan.baidu.com/s/1N0Xd0kgIH5hrk5g0NCdqQQ
提取码:s165
实现现象如下:
通过屏幕的信息,我们可以看到输入源为HDMI,输入分辨率为1920x1080 60Hz。
END
往期精选
FPGA技术江湖广发江湖帖
无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。
FPGA技术江湖微信交流群
加群主微信,备注姓名+公司/学校+岗位/专业进群
FPGA技术江湖QQ交流群
备注姓名+公司/学校+岗位/专业进群