[X]关闭
0

S01-CH08 HDMI输出接口测试

摘要: 软件版本:VIVADO2017.4 操作系统:WIN10 64bit硬件平台:适用XILINX 7系列FPGA(包括A7/K7/Z7/ZU/KU等)米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!8.1 概述 HDMI既高清晰度多媒体接口 ...

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用XILINX 7系列FPGA(包括A7/K7/Z7/ZU/KU等)

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

8.1 概述

       HDMI既高清晰度多媒体接口(High Definition Multimedia Interface),这是一种数字视频/音频接口,相比较前面介绍的VGA接口,它传输的信息量大,色彩度高,传输速度快等显著优点。开发板上面采用了PL IO模拟的方式来实现HDMI功能,这章就将带领大家使用我们封装好的IP核来设计一个HDMI接口的测试实验。

8.2 新建工程文件

Step1:启动VIVADO,单击Create Project

Step2:单击NEXT

Step3:工程名字命名为hdmi_display_Demon,并且设置保存的路径,单击NEXT

Step4:选择RTL Project并且勾选复选框,之后单击NEXT

Step5:选择芯片的型号和封装速度等级:

Step:6 单击Finish完成工程创建。

8.3 添加工程文件

Step1:打开VIVADO软件

Step2:单击 Add Sources

Step3:选择单击Add or Create Design Sources 然后单击NEXT

Step4:单击Create File 来创建文件

Step5:创建一个HDMI_Display_Demon的文件,并且文件类型选择Verilog

Step6:添加完成后如下图所示之后单击finish完成文件的创建

Step7:继续弹出的对话空中,可以设置一些端口,但是我们现在什么都不做。单击OK

Step8:创建完成后可以看到Design Sources文件夹中有了HDMI_Display_Demon.v这个文件

Step9:创建完成后可以看到Design Sources文件夹中有了HDMI_Display_Demon.v这个文件,这个文件就是我们可以

编写verilog程序的文件。

Step10:双击HDMI_Display_Demon.v打开程序源码如下

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer:

//

// Create Date: 2018/05/01 20:54:49

// Design Name:

// Module Name: HDMI_Display_Demon

// Project Name:

// Target Devices:

// Tool Versions:

// Description:

//

// Dependencies:

//

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

//  

//////////////////////////////////////////////////////////////////////////////////



module HDMI_Display_Demon(


    );

endmodule


可以看出这是一个空的工程,我们现在要添加代码同时也要添加工程信息。

Step11:编写程序并且添加工程信息

module HDMI_display_Demon(

    input       clk_100M,

    input       KEY,

    

    output      HDMI_CLK_P,

    output      HDMI_CLK_N,

    output      HDMI_D2_P,

    output      HDMI_D2_N,

    output      HDMI_D1_P,

    output      HDMI_D1_N,

    output      HDMI_D0_P,

    output      HDMI_D0_N,

    output  [3:0]   LED

);


wire pixclk;

wire[7:0]   R,G,B;

wire HS,VS,DE;

hdmi_data_gen u_hdmi_data_gen

(

    .pix_clk            (pixclk),

    .turn_mode          (KEY),

    .VGA_R              (R),

    .VGA_G              (G),

    .VGA_B              (B),

    .VGA_HS             (HS),

    .VGA_VS             (VS),

    .VGA_DE             (DE),

    .mode                (LED)

);


wire serclk;

wire lock;

wire[23:0]  RGB;

assign RGB={R,G,B};

HDMI_FPGA_ML_0 u_HDMI

(

    .PXLCLK_I           (pixclk),

    .PXLCLK_5X_I        (serclk),

    .LOCKED_I           (lock),

    .RST_N              (1'b1),

    .VGA_HS             (HS),

    .VGA_VS             (VS),

    .VGA_DE             (DE),

    .VGA_RGB            (RGB),

    .HDMI_CLK_P         (HDMI_CLK_P),

    .HDMI_CLK_N         (HDMI_CLK_N),

    .HDMI_D2_P          (HDMI_D2_P),

    .HDMI_D2_N          (HDMI_D2_N),

    .HDMI_D1_P          (HDMI_D1_P),

    .HDMI_D1_N          (HDMI_D1_N),

    .HDMI_D0_P          (HDMI_D0_P),

    .HDMI_D0_N          (HDMI_D0_N)

);


clk_wiz_0   u_clk

(

    .clk_in1            (clk_100M),

    .resetn             (1'b1),

    .clk_out1           (pixclk),

    .clk_out2           (serclk),

    .locked             (lock)

);

endmodule


Step13:按照之前的方法再添加一个hdmi_data_gen的文件,并添加下面的程序。

这个文件设置要输出的分辨率,这里设置输出分辨率为1080P@60HZ。

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer:

//

// Create Date:

// Design Name:

// Module Name: hdmi_data_gen

// Project Name:

// Target Devices:

// Tool Versions:

// Description:

//

// Dependencies:

//

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

//

//////////////////////////////////////////////////////////////////////////////////



module hdmi_data_gen

(

input pix_clk,

input turn_mode,

output [7:0] VGA_R,

output [7:0] VGA_G,

output [7:0] VGA_B,

output VGA_HS,

output VGA_VS,

output VGA_DE,

output [3:0]    mode

);



//-------------------------------//

// 水平扫描参数的设定1024*600    60HZ      

//-------------------------------//

/********************************************

//水平

parameter H_Total = 1344; //2200

parameter H_Sync = 136;

parameter H_Back = 160;//2-4

parameter H_Active = 1024;   //1920

parameter H_Front = 24;

parameter H_Start = 296; //2-3

parameter H_End = 1320;

//垂直

parameter V_Total = 628;  //1125

parameter V_Sync = 4;

parameter V_Back = 4;

parameter V_Active = 600;   //1080

parameter V_Front = 0;

parameter V_Start = 8;

parameter V_End = 628;

********************************************/



//---------------------------------//

// 水平扫描参数的设定1280*720  60HZ

//--------------------------------//

/***********************************************

//水平

parameter H_Total = 1650; //e

parameter H_Sync = 40;  //a

parameter H_Back = 220; //b

parameter H_Active = 1280;          //c

parameter H_Front = 110;      //d

parameter H_Start = 260;

parameter H_End = 1540;

//垂直

parameter V_Total = 750;

parameter V_Sync = 5;

parameter V_Back = 20;

parameter V_Active = 720;

parameter V_Front = 5;

parameter V_Start = 25;

parameter V_End = 745;

*********************************************/



//---------------------------------//

// 水平扫描参数的设定1280*800  60HZ

//--------------------------------//

/*****************************************

//水平

parameter H_Total = 1680; //e

parameter H_Sync = 136;  //a

parameter H_Back = 200; //b

parameter H_Active = 1280;          //c

parameter H_Front = 64;      //d

parameter H_Start = 336;

parameter H_End = 1616;

//垂直

parameter V_Total = 828;

parameter V_Sync = 3;

parameter V_Back = 24;

parameter V_Active = 800;

parameter V_Front = 1;

parameter V_Start = 27;

parameter V_End = 827;

**********************************************/


//---------------------------------//

// 水平扫描参数的设定1980*1080  60HZ

//--------------------------------//

//***********************************************

//水平

parameter H_Total = 2200; //2200

parameter H_Sync = 44; //44

parameter H_Back = 148;//148

parameter H_Active = 1920;   //1920

parameter H_Front = 88; //88

parameter H_Start = 192; //192

parameter H_End = 2112;  //2112

//垂直

parameter V_Total = 1125;  //1125

parameter V_Sync = 5;   //5

parameter V_Back = 37; //37

parameter V_Active = 1080;  //1080

parameter V_Front = 3; //3

parameter V_Start = 42; //42

parameter V_End = 1122;  //1122

/*********************************************/


reg[11:0] x_cnt;

always @(posedge pix_clk) //水平计数

begin

if(1'b0)

x_cnt <= 1;

else if(x_cnt==H_Total)

x_cnt <= 1;

else

x_cnt <= x_cnt + 1;

end


reg hsync_r;

reg hs_de;

always @(posedge pix_clk)

begin

if(1'b0)

hsync_r <= 1'b1;

else if(x_cnt==1)

hsync_r <= 1'b0;

else if(x_cnt==H_Sync)

hsync_r <= 1'b1;


if(1'b0)

hs_de <= 1'b0;

else if(x_cnt==H_Start)

hs_de <= 1'b1;

else if(x_cnt==H_End)

hs_de <= 1'b0;

end


reg[11:0] y_cnt;

always @(posedge pix_clk)

begin

if(1'b0)

y_cnt <= 1;

else if(y_cnt==V_Total)

y_cnt <= 1;

else if(x_cnt==H_Total)

y_cnt <= y_cnt + 1;

end


reg vsync_r;

reg vs_de;

always @(posedge pix_clk)

begin

if(1'b0)

vsync_r <= 1'b1;

else if(y_cnt==1)

vsync_r <= 1'b0;

else if(y_cnt==V_Sync)

vsync_r <= 1'b1;


if(1'b0)

vs_de <= 1'b0;

else if(y_cnt==V_Start)

vs_de <= 1'b1;

else if(y_cnt==V_End)

vs_de <= 1'b0;

end


reg[7:0] grid_data_1;

reg[7:0] grid_data_2;

always @(posedge pix_clk) //格子图像

begin

if((x_cnt[4]==1'b1)^(y_cnt[4]==1'b1))

grid_data_1 <= 8'h00;

else

grid_data_1 <= 8'hff;


if((x_cnt[6]==1'b1)^(y_cnt[6]==1'b1))

grid_data_2 <= 8'h00;

else

grid_data_2 <= 8'hff;

end


reg[23:0] color_bar;

/*

always @(posedge pix_clk)

begin

if(x_cnt==260)

color_bar <= 24'hff0000;

else if(x_cnt==420)

color_bar <= 24'h00ff00;

else if(x_cnt==580)

color_bar <= 24'h0000ff;

else if(x_cnt==740)

color_bar <= 24'hff00ff;

else if(x_cnt==900)

color_bar <= 24'hffff00;

else if(x_cnt==1060)

color_bar <= 24'h00ffff;

else if(x_cnt==1220)

color_bar <= 24'hffffff;

else if(x_cnt==1380)

color_bar <= 24'h000000;

else

color_bar <= color_bar;

end

*/

always @(posedge pix_clk)

begin

if(x_cnt==336)

color_bar <= 24'hff0000;

else if(x_cnt==496)

color_bar <= 24'h00ff00;

else if(x_cnt==656)

color_bar <= 24'h0000ff;

else if(x_cnt==816)

color_bar <= 24'hff00ff;

else if(x_cnt==976)

color_bar <= 24'hffff00;

else if(x_cnt==1136)

color_bar <= 24'h00ffff;

else if(x_cnt==1296)

color_bar <= 24'hffffff;

else if(x_cnt==1432)

color_bar <= 24'h000000;

else

color_bar <= color_bar;

end


reg[16:0] key_counter;

reg[3:0] dis_mode;

assign mode=dis_mode;

always @(posedge pix_clk) //按键处理程序

begin

if(turn_mode==1'b0)

key_counter <= 14'b0;

else if((turn_mode==1'b1)&(key_counter<=17'h11704))

key_counter <= key_counter + 1'b1;


if(key_counter==17'h11704)

begin

if(dis_mode==4'd12)

dis_mode <= 4'd0;

else

dis_mode <= dis_mode + 1'b1;

end

end


reg[7:0] VGA_R_reg;

reg[7:0] VGA_G_reg;

reg[7:0] VGA_B_reg;

always @(posedge pix_clk)

begin  

if(1'b0)

begin

VGA_R_reg<=0;

   VGA_G_reg<=0;

   VGA_B_reg<=0;  

end

   else

     case(dis_mode)

         4'd0:begin

        VGA_R_reg<=0;            //LCD显示彩色条

                 VGA_G_reg<=0;

                 VGA_B_reg<=0;

end

4'd1:begin

        VGA_R_reg<=8'b11111111;                 //LCD显示全白

                 VGA_G_reg<=8'b11111111;

                 VGA_B_reg<=8'b11111111;

end

4'd2:begin

        VGA_R_reg<=8'b11111111;                //LCD显示全红

                 VGA_G_reg<=0;

                 VGA_B_reg<=0;  

         end   

      4'd3:begin

        VGA_R_reg<=0;                          //LCD显示全绿

                 VGA_G_reg<=8'b11111111;

                 VGA_B_reg<=0;

         end   

         4'd4:begin     

        VGA_R_reg<=0;                         //LCD显示全蓝

                 VGA_G_reg<=0;

                 VGA_B_reg<=8'b11111111;

end

         4'd5:begin     

        VGA_R_reg<=grid_data_1;               // LCD显示方格1

                 VGA_G_reg<=grid_data_1;

                 VGA_B_reg<=grid_data_1;

         end   

         4'd6:begin     

        VGA_R_reg<=grid_data_2;               // LCD显示方格2

                 VGA_G_reg<=grid_data_2;

                 VGA_B_reg<=grid_data_2;

end

   4'd7:begin     

        VGA_R_reg<=x_cnt[7:0];                //LCD显示水平渐变色

                 VGA_G_reg<=x_cnt[7:0];

                 VGA_B_reg<=x_cnt[7:0];

end

   4'd8:begin     

        VGA_R_reg<=y_cnt[8:1];                 //LCD显示垂直渐变色

                 VGA_G_reg<=y_cnt[8:1];

                 VGA_B_reg<=y_cnt[8:1];

end

   4'd9:begin     

        VGA_R_reg<=x_cnt[7:0];                 //LCD显示红水平渐变色

                 VGA_G_reg<=0;

                 VGA_B_reg<=0;

end

   4'd10:begin     

        VGA_R_reg<=0;                          //LCD显示绿水平渐变色

                 VGA_G_reg<=x_cnt[7:0];

                 VGA_B_reg<=0;

end

   4'd11:begin     

        VGA_R_reg<=0;                          //LCD显示蓝水平渐变色

                 VGA_G_reg<=0;

                 VGA_B_reg<=x_cnt[7:0];

end

   4'd12:begin     

        VGA_R_reg<=color_bar[23:16];            //LCD显示彩色条

                 VGA_G_reg<=color_bar[15:8];

                 VGA_B_reg<=color_bar[7:0];

end

   default:begin

        VGA_R_reg<=8'b11111111;                //LCD显示全白

                 VGA_G_reg<=8'b11111111;

                 VGA_B_reg<=8'b11111111;

end   

         endcase

end


assign VGA_HS = hsync_r;

assign VGA_VS = vsync_r;

assign VGA_DE = hs_de & vs_de;

assign VGA_R = (hs_de & vs_de)?VGA_R_reg:8'h0;

assign VGA_G = (hs_de & vs_de)?VGA_G_reg:8'h0;

assign VGA_B = (hs_de & vs_de)?VGA_B_reg:8'h0;

endmodule

Step15:在output clocks选项卡下如下图设置,其余参数默认配置即可,然后单击OK。

设置输出的分辨率是1080P@60HZ,Clocking Wizard IP 设置如下所示。

Step16:单击Generate。

Step17: 单击Project settings,对工程进行设置。

Step18: 选择IP选项,再选择Repository,单击+号将本章需要使用的IP核路径添加进来,最后单击OK,完成工程的配置

注意:例程提供自定义IP位置:工程文件夹àuser_ip。

  

Step20:输入IP的名字,双击之后单击OK不做任何改动,将其添加到工程当中。

Step21:单击Generate。

这样我们就编写好了代码下面还要添加管脚约束文件。

8.4 添加管脚约束文件

Step1:单击(和添加.v文件一样)

Step2:选择Add or create constraints 然后单击NEXT

Step3: 单击Add Files

Step4:将要例程提供的.xdc文件添加进来,然后点击OK。

Step5:点击Finish完成约束文件的添加

8.5 编译并且产生bit文件

Step1:单击综合

Step2:单击执行

Step3:单击产生bit

8.6 下载程序

Step1:给开发板通电,并且连接下载器

Step2:单击OpenTarget 然后单击Auto Connect

Step3:连接成功后如下图所示:

Step4:单击Program Device

Step5:单击Program Device(也可以从顶部单击Program device), 然后选择 XC7K160t_0。

  

Step6:弹出的对话框中有我们要下载的Bit文件

Step7:下载过程

8.7实验结果

下载完成后,按动SW1一次按键,切换一次显示的图像,这些都是我们在程序部分定义的图像。(屏幕最开始输出显示为白色,按动按键进行图像切换)

1

路过

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (1 人)

本文作者
2019-10-15 10:55
  • 1
    粉丝
  • 2664
    阅读
  • 0
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
热门评论
排行榜