[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA基础篇连载-25 RGB转HDMI显示方案

文档创建者:FPGA课程
浏览次数:183
最后更新:2024-09-03
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 1-FPGA基础入门实验
本帖最后由 FPGA课程 于 2024-9-3 13:47 编辑


软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1概述
本实验通过FPGA内部资源实现HDMI协议,使用HDMI直接驱动HDMI接口显示器,这是成本非常低廉的一种方案,可以实现HDMI输出1080P@60fps的视频图像。本实验需要用到前面课程中的VTC模块产生视频时序,以及TPG模块产生测试图形。关于VTC视频时序参数的设置,读者可以阅读前面VTC相关的课程内容。
2系统框图
9e44d216e897473fafc735806f00732e.jpg
3顶层调用接口源码
关于VTC ip 和TPG ip的源码在前文中已经给出,这里我们主要看下顶层调用接口以及PLL部分设置。
  1. /*************HDMI 视频输出测试*************
  2. --版本号1.1
  3. --使用VTC产生视频时序
  4. --使用TPG产生测试图像数据
  5. --使用HDMI输出IP,把RGB数据转为HDMI数据输出
  6. *********************************************************************/
  7. `timescale 1ns / 1ns //仿真时间刻度/精度

  8. module display
  9. (
  10. input  I_sysclk_p,
  11. input  I_sysclk_n,       //系统时钟输入
  12. output O_hdmi_clk_p,     //HDMI输出时钟P端
  13. output O_hdmi_clk_n,     //HDMI输出时钟N端
  14. output [2:0]O_hdmi_tx_p, //HDMI输出数据P端
  15. output [2:0]O_hdmi_tx_n  //HDMI输出数据N端
  16. );


  17. wire I_clk;
  18. IBUFGDS CLK_U(
  19. .I(I_sysclk_p),
  20. .IB(I_sysclk_n),
  21. .O(I_clk)
  22. );

  23. wire vtc_rst,vtc_clk,vtc_vs,vtc_hs,vtc_de;//vid 视频相关信号
  24. wire pclkx1,pclkx5,locked;//HDMI输出需要2个时钟,pclkx1是和内部视频同步的时钟,pclkx5是HDMI IP内部用于产生输出数据和输出时钟
  25. wire [7 :0] rgb_r ,rgb_g ,rgb_b;// 定义寄存器保存图像的颜色数据
  26. assign vtc_clk = pclkx1; // 内部像素时钟
  27. assign vtc_rstn = locked; //用PLL 的LOCK信号复位

  28. //MMCM/PLL时钟管理IP 输出 pclkx1和pclkx5以及locked信号
  29. clk_wiz_0 clk_wiz0_inst(.clk_out1(pclkx1),.clk_out2(pclkx5),.locked(locked),.clk_in1(I_clk));

  30. //例化HDMI输出IP,把TPG产生的测试图像经过HDMI输出
  31. uihdmitx #
  32. (
  33. .FAMILY("7FAMILY")  //选择芯片所支持的系列"7FAMILY" "UFAMILY"     
  34. )
  35. uihdmitx_inst
  36. (
  37. .I_rstn(locked),//复位
  38. .I_hs(vtc_hs), //hs信号
  39. .I_vs(vtc_vs), //vs信号
  40. .I_de(vtc_de),//de信号
  41. .I_rgb({rgb_r,rgb_g,rgb_b}), //RGB数据
  42. .I_pclkx1(pclkx1), //像素时钟
  43. .I_pclkx2_5(1'b0), //2.5倍像素时钟,只有UFAMILY需要
  44. .I_pclkx5(pclkx5), //5倍像素时钟
  45. .O_hdmi_tx_clk_p(O_hdmi_clk_p), //HDMI时钟输出P端
  46. .O_hdmi_tx_clk_n(O_hdmi_clk_n), //HDMI时钟输出N端
  47. .O_hdmi_tx_p(O_hdmi_tx_p),      //HDMI输出数据P端
  48. .O_hdmi_tx_n(O_hdmi_tx_n)       //HDMI输出数据N端
  49. );

  50. uivtc#
  51. (
  52. .H_ActiveSize(1280),          //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
  53. .H_FrameSize(1280+88+44+239), //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
  54. .H_SyncStart(1280+88),        //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号
  55. .H_SyncEnd(1280+88+44),       //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分
  56. .V_ActiveSize(720),           //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
  57. .V_FrameSize(720+4+5+28),     //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
  58. .V_SyncStart(720+4),          //视频时间参数,场同步开始,即多少行数后开始产生场同步信号
  59. .V_SyncEnd (720+4+5)       //视频时间参数,场同步结束,即多少行数后停止产生场同步信号,之后就是场有效数据部分
  60. )
  61. uivtc_inst
  62. (
  63. .I_vtc_clk(vtc_clk),  //系统时钟
  64. .I_vtc_rstn(vtc_rstn),//系统复位
  65. .O_vtc_vs(vtc_vs),    //场同步输出
  66. .O_vtc_hs(vtc_hs),    //行同步输出
  67. .O_vtc_de_valid(vtc_de),      //视频数据有效
  68. .O_vtc_user(),     //满足stream时序产生 user 信号,用于帧同步
  69. .O_vtc_last()      //满足stream时序产生 later 信号,用于每行结束
  70. );

  71. uitpg uitpg_inst   
  72. (
  73. .I_tpg_clk(vtc_clk),   //系统时钟
  74. .I_tpg_rstn(vtc_rstn), //系统复位
  75. .I_tpg_vs(vtc_vs),     //图像的vs信号
  76. .I_tpg_hs(vtc_hs),     //图像的hs信号
  77. .I_tpg_de(vtc_de),     //de数据有效信号
  78. .O_tpg_vs(),//和vtc_vs信号一样
  79. .O_tpg_hs(),//和vtc_hs信号一样
  80. .O_tpg_de(),//和vtc_de信号一样      
  81. .O_tpg_data({rgb_r,rgb_g,rgb_b})//测试图像数据输出         
  82. );

  83. endmodule
复制代码

以上源码中,关键有2个地方需要设置好

3.1 PLL时钟设置
对于PLL的设置需要产生1:5的时钟,对于演示demo中720P的设置如下:
31fd52b830484ef0b70ef77863f8c472.jpg
3.2 VTC参数设置
关于VTC参数设置具体阅读前面课程video timing controller相关内容,这里针对75M的PCLK参数如下:
  1. .H_ActiveSize(1280),
  2. .H_FrameSize(1280+88+44+239),
  3. .H_SyncStart(1280+88),
  4. .H_SyncEnd(1280+88+44),
  5. .V_ActiveSize(720),
  6. .V_FrameSize(720+4+5+28),
  7. .V_SyncStart(720+4),
  8. .V_SyncEnd (720+4+5)
复制代码

3.3 HDMI输出IP
为了能够输出测试图像,需要调用HDMI IP,这个IP是开源的。由于本文不计划对HDMI IP进行分析,这里只给出调用方法。
be20449886bc484cb1902b78cb345280.jpg
在参数接口中,输入”7FAMILY”代表支持7系列的FPGA,如果输入”UFAMILY”代表支持ultrascale或者ultrascale+的FPGA.
PCLKX1_i代表像素时钟;
PCLKX2_5_i代表2.5倍的像素时钟,这个时钟仅在使用ultrascale或者ultrascale+的FPGA.的时候需要配置;
PCLKX5_i代表5倍的像素时钟;
  1. //例化HDMI输出IP,把TPG产生的测试图像经过HDMI输出
  2. uihdmitx #
  3. (
  4. .FAMILY("7FAMILY")  //选择芯片所支持的系列"7FAMILY" "UFAMILY"     
  5. )
  6. uihdmitx_inst
  7. (
  8. .I_rstn(locked),//复位
  9. .I_hs(vtc_hs), //hs信号
  10. .I_vs(vtc_vs), //vs信号
  11. .I_de(vtc_de),//de信号
  12. .I_rgb({rgb_r,rgb_g,rgb_b}), //RGB数据
  13. .I_pclkx1(pclkx1), //像素时钟
  14. .I_pclkx2_5(1'b0), //2.5倍像素时钟,只有UFAMILY需要
  15. .I_pclkx5(pclkx5), //5倍像素时钟
  16. .O_hdmi_tx_clk_p(O_hdmi_clk_p), //HDMI时钟输出P端
  17. .O_hdmi_tx_clk_n(O_hdmi_clk_n), //HDMI时钟输出N端
  18. .O_hdmi_tx_p(O_hdmi_tx_p),      //HDMI输出数据P端
  19. .O_hdmi_tx_n(O_hdmi_tx_n)       //HDMI输出数据N端
  20. );
  21. dmi_tx_n(O_hdmi_tx_n)       //HDMI输出数据N端
  22. );
复制代码

4FPGA工程
fpga工程的创建过程不再重复,如有不清楚的请看前面实验
bb3c28da8ef740e6a3941863cef032a0.jpg
米联客的代码管理规范,在对应的FPGA工程路径下创建uisrc路径,并且创建以下文件夹
01_rtl:放用户编写的rtl代码
02_sim:仿真文件或者工程
03_ip:放使用到的ip文件
04_pin:放fpga的pin脚约束文件或者时序约束文件
05_boot:放编译好的bit或者bin文件(一般为空)
06_doc:放本一些相关文档(一般为空)
40389b9c249342b8a3571dce8f355b7d.jpg

5下载演示
下载程序前,先确保FPGA工程已经编译好。
5.1硬件连接
(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)
请确保下载器和开发板已经正确连接,另外需要把核心板上的2P模式开关设置到JTAG模式,即ON ON,并且开发板已经上电。(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)
c977807242d14a1d8797919211dafaa0.jpg
5.2运行结果
显示器循环输出测试图形
25b76f71a6f14056b4f4bfed14f6fa08.jpg




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则