是木科技

  • 97 主题
  • 285 帖子
  • 2536 积分
  • 身份:版主
  • 优秀版主
  • E币:1457

【MYD-C7Z010/20开发板 试用体验】HDMI(不使用IP)简单color bars 实验

2019-11-27 21:02:50 显示全部楼层
本帖最后由 是木科技 于 2019-11-28 14:26 编辑

23.png         年底了还是比较忙碌的,但是还是在晚上利用仅有的时间来分享试用的心得。想起来当初申请开发的目的,是想做个简单的视频采集卡。那么针对板卡本身的资源,HDMI的输出肯定是要了解的,那么这期,就来学习一下简单的HDMI彩条实验。这里是没用用到zynq的HDMI的IP的哦。

先简单介绍一下HDMI原理:
    HDMI 采用和 DVI 相同的传输原理——TMDS(Transition Minimized Differentialsignal),最小化传输差分信号。TMDS 传输系统分为分为两个部分:发送端和接收端。TMDS 发送端收到 HDMI 接口传来的表示 RGB 信号的 24 位并行数据(TMDS 对每个像素的 RGB 三原色分别按 8bit 编码,即 R 信号有 8 位,G 信号有 8 位,B 信号有 8 位),然后对这些数据进行编码和并/串转换,再将表示 3 个 RGB 信号的数据分别分配到独立的传输通道发送出去。接收端接收来自发送端的串行信号,对其进行解码和串/并转换,然后发送到显示器的控制端。与此同时也接收时钟信号,以实现同步。每一个 TMDS 链路都包括 3 个传输 RGB 信号的数据通道和 1 个传输时钟信号的通道。每一个数据通道都通过编码算法,将 8 位的视、音频数据转换成最小化传输、直流平衡的 10 位数据。这使得数据的传输和恢复更加可靠。最小化传输差分信号是通过异或及异或非等逻辑算法将原始 8 位信号数据转换成 10 位,前 8 为数据由原始信号经运算后获得,第 9 位指示运算的方式,第 10 位用来对应直流平衡。一般来说,HDMI 传输的编码格式中要包含视频数据、控制数据和数据包(数据包中包含音频数据和附加信息数据,例如纠错码等)。TMDS 每个通道在传输时要包含一个 2bit 的控制数据、8bit 的视频数据或者 4bit 的数据包即可。在 HDMI 信息传输过程中,可以分为三个阶段:视频数据传输周期、控制数据传输周期和数据岛传输周期,分别对应上述的三种数据类型。
下面介绍 TMDS 中采用的技术:
1.传输最小化
    8 位数据经过编码和直流平衡得到 10 位最小化数据,这仿佛增加了冗余位,对传输链路的带宽要求更高,但事实上,通过这种算法得到的 10 位数据在更长的同轴电缆中传输的可靠性增强了。下图是一个例子,说明对一个 8 位的并行 RED 数据编码、并/串转换。
  

01.png
第一步:将 8 位并行 RED 数据发送到 TMDS 发送端。
第二步:并/串转换.
第三步:进行最小化传输处理,加上第 9 位,即编码过程。第 9 位数据称为编码位。  
2.直流平衡
     直流平衡(DC-balanced)就是指在编码过程中保证信道中直流偏移为零。方法是在原来的 9 位数据的后面加上第 10 位数据,这样,传输的数据趋于直流平衡,使信号对传输线的电磁干扰减少,提高信号传输的可靠性。
3.差分信号
    TMDS 差分传动技术是一种利用 2 个引脚间电压差来传送信号的技术。传输数据的数值(“0”或者“1”)由两脚间电压正负极性和大小决定。即,采用 2 根线来传输信号,一根线上传输原来的信号,另一根线上传输与原来信号相反的信号。这样接收端就可以通过让一根线上的信号减去另一根线上的信号的方式来屏蔽电磁干扰,从而得到正确的信号。
    另外,还有一个显示数据通道(DDC),是用于读取表示接收端显示器的清晰度等显示能力的扩展显示标识数据(EDID)的信号线。搭载 HDCP(High-bandwidth Digital ContentProtection,高带宽数字内容保护技术)的发送、接收设备之间也利用 DDC 线进行密码键的认证。
    说了这么多,我们开始我们的实验吧。这次是简单的HDMI彩条实验,没有音频信号 ,所以难度降低了很多。先看下硬件原理框图,我们是把视频信号以YcbCr的格式给到HDMI解码芯片SiL9022A,然后由解码芯片SiL9022A把信号解析完成并输出,如图:

02.png
HDMI部分原理图也贴出来看一下吧
03.png
那么开始搭建实验工程了,之前的新建项目之类的就省略了,直接从添加内核IP开始,先添加zynq内核IP,并且导入demo项目中的.tcl配置文件,把相对应的线配置好,如图:
04.jpg
还要添加一个clk模块,并且把频率设置成148.5Mhz,把输入输出修改成1进1出,把reset去掉,如图:
05.jpg
把clk模块连接到主模块FCLK_CLK0,FCLK_RESET_N_0上,还要添加两个外部端口,FCLK_CLK0,FCLK_RESET_N_0,如下图:
06.png
最后添加一个constant IP,双击IP把位宽设置为1位,并且连接到SDIO1_CDN上,如下图:
07.jpg
接下来生成顶层文件,并且添加约束文件,根据原理图,约束代码如下:

  1. set_property IOSTANDARD LVCMOS33 [get_ports hdmi_hs]
  2. set_property IOSTANDARD LVCMOS33 [get_ports hdmi_vs]
  3. set_property PACKAGE_PIN V18 [get_ports hdmi_hs]
  4. set_property PACKAGE_PIN V17 [get_ports hdmi_vs]

  5. set_property IOSTANDARD LVCMOS33 [get_ports hdmi_clk]
  6. set_property IOSTANDARD LVCMOS33 [get_ports hdmi_de]
  7. set_property PACKAGE_PIN N18 [get_ports hdmi_de]
  8. set_property PACKAGE_PIN P19 [get_ports hdmi_clk]

  9. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[15]}]
  10. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[14]}]
  11. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[13]}]
  12. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[12]}]
  13. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[11]}]
  14. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[10]}]
  15. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[9]}]
  16. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[8]}]
  17. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[7]}]
  18. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[6]}]
  19. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[5]}]
  20. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[4]}]
  21. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[3]}]
  22. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[2]}]
  23. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[1]}]
  24. set_property IOSTANDARD LVCMOS33 [get_ports {hdmi_data[0]}]

  25. set_property PACKAGE_PIN T14 [get_ports {hdmi_data[0]}]
  26. set_property PACKAGE_PIN T15 [get_ports {hdmi_data[1]}]
  27. set_property PACKAGE_PIN U18 [get_ports {hdmi_data[2]}]
  28. set_property PACKAGE_PIN U19 [get_ports {hdmi_data[3]}]
  29. set_property PACKAGE_PIN T16 [get_ports {hdmi_data[4]}]
  30. set_property PACKAGE_PIN U17 [get_ports {hdmi_data[5]}]
  31. set_property PACKAGE_PIN V16 [get_ports {hdmi_data[6]}]
  32. set_property PACKAGE_PIN W16 [get_ports {hdmi_data[7]}]
  33. set_property PACKAGE_PIN R16 [get_ports {hdmi_data[8]}]
  34. set_property PACKAGE_PIN R17 [get_ports {hdmi_data[9]}]
  35. set_property PACKAGE_PIN N17 [get_ports {hdmi_data[10]}]
  36. <table cellpadding="0" cellspacing="0" border="0" width="100%" style="box-sizing: border-box; border-spacing: 0px; background-color: rgb(255, 255, 255); color: rgb(100, 100, 100); font-family: myFont, "Microsoft YaHei"; font-size: 12px;"></table>set_property PACKAGE_PIN P18 [get_ports {hdmi_data[11]}]
  37. set_property PACKAGE_PIN T17 [get_ports {hdmi_data[12]}]
  38. set_property PACKAGE_PIN R18 [get_ports {hdmi_data[13]}]
  39. set_property PACKAGE_PIN W18 [get_ports {hdmi_data[14]}]
  40. set_property PACKAGE_PIN W19 [get_ports {hdmi_data[15]}]
启动SDK,利用helloworld模板,把demo代码copy进去,最后编译,生成镜像文件,通过SD卡烧录到办卡里面,先把硬件连接好:
IMG_20191124_165948.jpg
如此,上电实验结果如图:

205557eya7ywmntcnsprpr.jpg
奉上代码: hdmi_test.rar (10.46 MB, 下载次数: 3)

最新评论

楼层直达:

dmm8

  • 37 主题
  • 74 帖子
  • 633 积分
  • 身份:LV3 中级技术员
  • E币:367
dmm8 2019-11-28 11:10:32 显示全部楼层
不错 参考一下  代码下不下来?

dmm8

  • 37 主题
  • 74 帖子
  • 633 积分
  • 身份:LV3 中级技术员
  • E币:367
dmm8 2019-11-28 11:11:03 显示全部楼层
dmm8 发表于 2019-11-28 11:10
不错 参考一下  代码下不下来?

哦 可以可以
我要评论
2
2
广告
关闭 热点推荐上一条 /1 下一条