回答

收藏

[评测分享] 【PGL22G开发板】+HMDI彩条驱动

#板卡评测 #板卡评测 1695 人阅读 | 0 人回复 | 2023-05-13

本帖最后由 feifeiz 于 2023-5-13 23:33 编辑

一、前言

在上一篇文章中学习了IP之FIFO,对IP以及FIFO进行了解,通过开发板测试以及仿真分析验证了设计思想,说到IP,一直打算在PGL22G开发板上实现一个软核,但是没找到相关资料以及相关说明,唯一找到过一个集创赛有一个Cortex-M1 SoC,可惜没有放出来,如果有资料,很愿意尝试软核的搭建使用。软核当前是搭建不了了,因此本次选用了一个其他功能进行试验,本次实现HDMI彩条输出试验。


二、HDMI简介

HDMI,全称为(High Definition Multimedia Interface)高清多媒体接口,主要用于传输高清音视频信号,是新一代的多媒体接口标准。它能够同时传输视频和音频,简化了设备的接口和连线;同时提供了更高的数据传输带宽,可以传输无压缩的数字音频及高分辨率视频信号。
引脚接口定义:

其中主要的硬件为TMDS,SCL,SDA,HOT PLUG,+5V,TMDS引脚包括TMDS CLOCK、TMDS DATA[2:0],用于传输RGB数字信号、音频信号等,SCL、SDA引脚主要用于获取显示器的EDID信息。HOT PLUG该引脚主要用于显示器通知主机是否插好。


三、实验目标

使用板载的HDMI接口驱动电脑显示屏上显示彩条,由于板板子只支持720P,电脑屏幕为1080P的,在实际显示的时候不能显示在整个屏幕上。


四、硬件设计

HDMI 的三个数据通道HDMI_D[2:0]和一个时钟通道 HDMI_CLK 直接与 FPGA 的 TMDS 差分引脚相连,硬件原理图如下

管脚分配如下:
  信号名称
  
  方向
  
  管脚
  
  说明
  
  Sys_clk
  
  input
  
  B5
  
  系统时钟,50M
  
  Sys_rst_n
  
  input
  
  G5
  
  系统复位
  
  tmds_data_p[2]
  
  output
  
  R16
  
  TMDS 数据通道2(正极)
  
  tmds_data_p[1]
  
  output
  
  U14
  
  TMDS 数据通道1(正极)
  
  tmds_data_p[0]
  
  output
  
  U15
  
  TMDS 数据通道0(正极)
  
  tmds_clk_p
  
  output
  
  P17
  
  TMDS 时钟通道(正极)
  
  tmds_data_n[2]
  
  output
  
  T16
  
  TMDS 数据通道2(负极)
  
  tmds_data_n[1]
  
  output
  
  V14
  
  TMDS 数据通道1(负极)
  
  tmds_data_n[0]
  
  output
  
  V15
  
  TMDS 数据通道0(负极)
  
  tmds_clk_n
  
  output
  
  P18
  
  TMDS 时钟通道(负极)
  


五、程序设计

总体设计,HDMI彩条实验只需要显示图像,不需要识别显示器是否插入,不需要识别显示器的EDID数据,此时可以将HDMI当作DVI接口去驱动。总体框图如下:

在顶层模块中,video_display模块负责产生RGB888格式的彩条图案,然后在video_driver模块的驱动下按照工业标准的VGA显示时序输出视频信号、行场同步信号以及视频有效信号。这些信号作为RGB2DVI模块的输入,最终转换成DVI/HDMI接口标准的TMDS串行数据输出到HDMI接口。
顶层模块设计:
modulehdmi_colorbar_top(
input sys_clk,
input sys_rst_n,
output tmds_clk_p, // TMDS 时钟通道
output tmds_clk_n,

output [2:0] tmds_data_p, // TMDS数据通道

output [2:0] tmds_data_n
);

//wire define
wire pixel_clk;
wire pixel_clk_5x;
wire clk_locked;

wire [10:0] pixel_xpos_w;
wire [10:0] pixel_ypos_w;
wire [23:0] pixel_data_w;

wire video_hs;
wire video_vs;
wire video_de;
wire [23:0] video_rgb;

//*****************************************************
//** main code
//*****************************************************

//例化PLL IP核
pll_clk u_pll_clk(
.pll_rst (~sys_rst_n),
.clkin1 (sys_clk),
.clkout0 (pixel_clk), //像素时钟
.clkout1 (pixel_clk_5x), //5倍像素时钟
.pll_lock (clk_locked)
);

//例化视频显示驱动模块
video_driver u_video_driver(
.pixel_clk (pixel_clk),
.sys_rst_n (sys_rst_n),

.video_hs (video_hs),
.video_vs (video_vs),
.video_de (video_de),
.video_rgb (video_rgb),

.pixel_xpos (pixel_xpos_w),
.pixel_ypos (pixel_ypos_w),
.pixel_data (pixel_data_w)
);

//例化视频显示模块
video_display u_video_display(
.pixel_clk (pixel_clk),
.sys_rst_n (sys_rst_n),

.pixel_xpos (pixel_xpos_w),
.pixel_ypos (pixel_ypos_w),
.pixel_data (pixel_data_w)
);

//例化HDMI驱动模块
dvi_transmitter_top u_rgb2dvi_0(
.pclk (pixel_clk),
.pclk_x5 (pixel_clk_5x),

.reset_n (sys_rst_n &clk_locked),

.video_din (video_rgb),
.video_hsync (video_hs),
.video_vsync (video_vs),
.video_de (video_de),
.tmds_clk_p (tmds_clk_p),
.tmds_clk_n (tmds_clk_n),
.tmds_data_p (tmds_data_p),
.tmds_data_n (tmds_data_n)
);

endmodule
显示模块:
模块实现1280x720的分辨率。模块输入变量为像素点横纵坐标,来自于video_driver模块;根据像素坐标,输出该像素坐标的数据。
module  video_display(
    input                pixel_clk,
    input                sys_rst_n,
   

    input        [10:0] pixel_xpos,  //像素点横坐标

    input        [10:0] pixel_ypos,  //像素点纵坐标

    output  reg [23:0]  pixel_data   //像素点数据

);

//parameter define

parameter  H_DISP =11'd1280;                       //分辨率——行

parameter  V_DISP =11'd720;                        //分辨率——列


localparam WHITE  =24'b11111111_11111111_11111111;  //RGB888白色

localparam BLACK  =24'b00000000_00000000_00000000;  //RGB888黑色

localparam RED    =24'b11111111_00001100_00000000;  //RGB888红色

localparam GREEN  =24'b00000000_11111111_00000000;  //RGB888绿色

localparam BLUE   =24'b00000000_00000000_11111111;  //RGB888蓝色

   
//*****************************************************
//**                    main code
//*****************************************************

//根据当前像素点坐标指定当前像素点颜色数据,在屏幕上显示彩条
always @(posedge pixel_clk ) begin
    if (!sys_rst_n)

        pixel_data <=16'd0;

    else begin

        if((pixel_xpos >=0) && (pixel_xpos < (H_DISP/5)*1))

            pixel_data <=WHITE;

        else if((pixel_xpos>= (H_DISP/5)*1) && (pixel_xpos < (H_DISP/5)*2))

            pixel_data <=BLACK;  

        else if((pixel_xpos>= (H_DISP/5)*2) && (pixel_xpos < (H_DISP/5)*3))

            pixel_data <=RED;  

        else if((pixel_xpos>= (H_DISP/5)*3) && (pixel_xpos < (H_DISP/5)*4))

            pixel_data <=GREEN;

        else

            pixel_data <=BLUE;

    end
end

endmodule


六、实验现象

编译工程,生成.sbit文件

连接开发板

下载

运行结果:



分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条