HDMI的FPGA实现(二)

前面简单提了下HDMI的理论部分,这篇就涉及到“实战”,下面先放张效果图,实现的黑白方格(因为是在晚上拍的,效果不是很好)。
效果图
再来说说实现环境:
实现环境
本工程采用的米联的MZ20B的板子(这块板子1500大洋呢,不过功能真的很强),这块板子上搭载了一块HDMI接口,采用I/O模拟HDMI信号,输出可以达到1080P 60Hz高清传输,输入可以到720P 60Hz。原理图如下
原理图
对应引脚如下
对应引脚
工程文件包含2个IP核,2个.v文件,IP核一个是vivado中自带的clocking wizard,这个IP主要用来产生时钟信号,输入时钟为100MHz,输出有2个时钟,一个当作VGA时序信号的工作时钟(本工程采用的分辨率为1280*768 60HZ),另一个是时序信号时钟的5倍,具体的用处在下面会提到。
在这里插入图片描述
另一个IP核的作用在本工程中至关重要,不是xilinx提供的,需要自己添加,它的作用就是将产生的VGA时序信号进行编码输出。它会用到2个时钟,一个就是VGA的工作时钟,一个为VGA工作时钟的5倍,主要的输入信号为VGA_HS VGA_VS VGA_DE VGA_RGB[23:0],这些都是从VGA工作时序中产生的,输出信号在前面的理论中已经提到。我上传了2个IP在这里HDMI的IP。2个IP实现方法差不多。
在这里插入图片描述
.v文件主要的是hdmi_data_gen文件,主要实现VGA时序的程序设计,VGA时序我传的文档在这里VGA分辨率时序。具体实现代码如下:


module hdmi_data_gen
	(
	input				pix_clk,
	output [7:0]	    VGA_R,
	output [7:0]		VGA_G,
	output [7:0]		VGA_B,
	output				VGA_HS,
	output				VGA_VS,
	output				VGA_DE
	);

//---------------------------------//
// 水平扫描参数的设定1280*720  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;
//-------------------------------//
// 垂直扫描参数的设定1280*720	60HZ  	
//-------------------------------//
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;

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[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


wire  hs_de = (x_cnt<H_Start)? 0:(x_cnt<=H_End)?1:0;
wire  vs_de = (y_cnt<V_Start)? 0:(y_cnt<=V_End)?1:0;



reg [7:0] grid_data;

always @(posedge pix_clk)begin//格子信号产生
if((x_cnt[4] == 1'b1)^(y_cnt[4]==1'b1))
  grid_data <=8'h00;
else
  grid_data <=8'hff;
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
    begin
		VGA_R_reg<=grid_data;
        VGA_G_reg<=grid_data;
        VGA_B_reg<=grid_data;
	end			
end

assign VGA_HS = (x_cnt==1'b0)? 1:(x_cnt<H_Sync)?0:1;
assign VGA_VS = (y_cnt==1'b0)? 1:(y_cnt<V_Sync)?0:1;

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

接下来就是例化文件HDMI_display_Demon文件,具体实现代码如下:

module HDMI_display_Demon(
    input       clk_100M,
    
    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
);

wire pixclk;
wire[7:0]   R,G,B;
wire HS,VS,DE;
hdmi_data_gen u_hdmi_data_gen
(
    .pix_clk            (pixclk),
    .VGA_R              (R),
    .VGA_G              (G),
    .VGA_B              (B),
    .VGA_HS             (HS),
    .VGA_VS             (VS),
    .VGA_DE             (DE)
);

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

整个工程我已上传到这里工程文件。同时,在此推荐一篇文章HDMI实现

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值