FPGA设计——HDMI

1. 概述

HDMI英文名为High Definition Multimedia Interface,是一种数字化视频、音频接口。 现已

广泛应用于高清数字电视、PC显示器等产品中。

这里我们使用Silicon Image公司的SiI9134作为HDMI发送芯片,支持HDMI 1.3标准。

2. 设计框图

视频源由FPGA内部产生,sii9134的配置通过I2C模块完成。这里以720P60为例完成设计。

3. Sii9134配置

这里将Sii9134配置成YCbCr422输入,RGB444输出模式。

void sii9134_init()
{
    sccb_senddata(0x72,0x05,0x01);	//reset all sections
    sccb_senddata(0x72,0x05,0x00);	//disable reset

    sccb_senddata(0x72,0x08,0x37);	//VSYNC and HSYNC, 24bit, rising edge, normal operation

    sccb_senddata(0x72,0x0c,0x00);
    sccb_senddata(0x72,0x0d,0x01);

    sccb_senddata(0x72,0x4B,0x00);	//Blue
    sccb_senddata(0x72,0x4C,0x00);	//Green
    sccb_senddata(0x72,0x4D,0xff);	//Red

    sccb_senddata(0x72,0x82,0x25);	//FPLL*IDCK, enable internal source termination
    sccb_senddata(0x72,0x83,0x19);	//HDMI PLL/2, PLL filter feedback/4, PLL filter front/2
    sccb_senddata(0x72,0x84,0x31);	//50uA, PLL filter post/2
    sccb_senddata(0x72,0x85,0x01);	//HDMI transmitter PLL front/2

    sccb_senddata(0x72,0x32,0x04);	//h-blank
    sccb_senddata(0x72,0x33,0x41);	//enable DE, positive polarity, left-blank(370 pixels)
    sccb_senddata(0x72,0x34,0x19);	//v-blank(30 lines)
    sccb_senddata(0x72,0x36,0x00);	//the width of active display
    sccb_senddata(0x72,0x37,0x05);	//the width of active display(1280)
    sccb_senddata(0x72,0x38,0xD0);	//the height of active display
    sccb_senddata(0x72,0x39,0x02);	//the height of active display(720)

	sccb_senddata(0x72,0x3E,0x00);
	sccb_senddata(0x72,0x40,0x6e);
	sccb_senddata(0x72,0x41,0x00);
	sccb_senddata(0x72,0x44,0x29);
	sccb_senddata(0x72,0x45,0x00);
	sccb_senddata(0x72,0x46,0x05);
	sccb_senddata(0x72,0x47,0x06);

	sccb_senddata(0x72,0x48,0x30);
	sccb_senddata(0x72,0x49,0x00);
	sccb_senddata(0x72,0x4a,0x3c);

////////////////////////////////////////////////
	sccb_senddata(0x7a,0x01,0x02);
	sccb_senddata(0x7a,0x02,0x01);
	sccb_senddata(0x7a,0x03,0x00);
	sccb_senddata(0x7a,0x04,0x18);
	sccb_senddata(0x7a,0x05,0x00);

	sccb_senddata(0x7a,0x14,0x11);
	sccb_senddata(0x7a,0x1D,0x40);
	sccb_senddata(0x7a,0x21,0x02);
	sccb_senddata(0x7a,0x22,0x2B);

	sccb_senddata(0x7a,0x2F,0x01);

	sccb_senddata(0x7a,0x40,0x82);
	sccb_senddata(0x7a,0x41,0x02);
	sccb_senddata(0x7a,0x42,0x0d);
	sccb_senddata(0x7a,0x43,0x59);
	sccb_senddata(0x7a,0x44,0x11);
	sccb_senddata(0x7a,0x45,0x28);
	sccb_senddata(0x7a,0x46,0x00);
	sccb_senddata(0x7a,0x47,0x04);
	sccb_senddata(0x7a,0x48,0x00);
	sccb_senddata(0x7a,0x49,0x00);
	sccb_senddata(0x7a,0x4A,0x00);
	sccb_senddata(0x7a,0x4B,0xD1);
	sccb_senddata(0x7a,0x4C,0x02);
	sccb_senddata(0x7a,0x4D,0x00);
	sccb_senddata(0x7a,0x4E,0x00);
	sccb_senddata(0x7a,0x4F,0x01);
	sccb_senddata(0x7a,0x50,0x05);
	sccb_senddata(0x7a,0x51,0x00);
	sccb_senddata(0x7a,0x52,0x00);

	sccb_senddata(0x7a,0x80,0x84);
	sccb_senddata(0x7a,0x81,0x01);
	sccb_senddata(0x7a,0x82,0x0a);
	sccb_senddata(0x7a,0x83,0x70);
	sccb_senddata(0x7a,0x84,0x01);
	sccb_senddata(0x7a,0x85,0x00);
	sccb_senddata(0x7a,0x86,0x00);
	sccb_senddata(0x7a,0x87,0x00);
	sccb_senddata(0x7a,0x88,0x00);
	sccb_senddata(0x7a,0x89,0x00);
	sccb_senddata(0x7a,0x8a,0x00);
	sccb_senddata(0x7a,0x8b,0x00);
	sccb_senddata(0x7a,0x8c,0x00);
	sccb_senddata(0x7a,0x8d,0x00);
	sccb_senddata(0x7a,0x3e,0x33);
}

4. FPGA逻辑设计

FPGA逻辑完成视频源生成、HDMI配置、RGB转YCbCr功能。下面表格给出RGB转YC的公式。


Video Format


Formulas


576p


Y = 0.299R′ + 0.587G′ + 0.114B′
 Cb = –0.172R′ – 0.339G′ + 0.511B′ + 128
 Cr = 0.511R′ – 0.428G′ – 0.083B′ + 128


480p


240p


720p


Y = 0.213R′ + 0.715G′ + 0.072B′
 Cb = –0.117R′ – 0.394G′ + 0.511B′ + 128
 Cr = 0.511R′ – 0.464G′ – 0.047B′ + 128


1080p

//file name:		    hdmi_vid_gen.v
//author:			shugen.yin
//date:				2016.9.21
//function:			hdmi video generation
//log:	

module hdmi_vid_gen(
	input clk,  //74.25MHz                         
	input rst_n,

	output								hdmi_clk,
	output								hdmi_txde,
	output								hdmi_hs,
	output								hdmi_vs,
	output [15:0] 						hdmi_data
);

parameter IMG_HDISP	= 16‘d1280;
parameter IMG_VDISP  = 16‘d720;
parameter H_OFFSET   = 0;

wire pclk;
assign pclk = clk;

assign hdmi_clk  = pclk;
assign hdmi_hs  = hsync;
assign hdmi_txde = data_valid;
assign hdmi_vs  = vsync;
assign hdmi_data = data;

reg [11:0] vcnt;
reg [15:0] hcnt;
reg vsync;
reg hsync;
reg data_valid;
reg [15:0] data;
reg [7:0] red;
reg [7:0] green;
reg [7:0] blue;

always @(posedge pclk)
	if(hcnt>=(IMG_HDISP+259))		//720p
		hcnt <= 0;
	else
		hcnt <= hcnt + 1‘b1;

always @(posedge pclk)
	if(hcnt>=(IMG_HDISP+259))
		if(vcnt>=(IMG_VDISP+24))
			vcnt <= 0;
		else
			vcnt <= vcnt + 1‘b1;
	else
		vcnt <= vcnt;

always @(posedge pclk)
	if((hcnt>=IMG_HDISP+H_OFFSET) & (hcnt<=(IMG_HDISP+H_OFFSET+32)) & (vcnt>=0 | (vcnt<IMG_VDISP)))
		hsync <= 1‘b1;
	else
		hsync <= 1‘b0;

always @(posedge pclk)
	if(vcnt<=(IMG_VDISP+2+6) & vcnt>=(IMG_VDISP+2))
		vsync <= 1‘b1;
	else
		vsync <= 1‘b0;	

reg cbcr_reg;		

always @(posedge pclk)
	if(vsync)
	begin
		data <= 0;
		cbcr_reg <= 0;
		red <= 0;
		green <= 0;
		blue <= 0;
	end
	else if((hcnt>=0) & (hcnt<(IMG_HDISP+0)) & (vcnt>=0) & (vcnt<(0+IMG_VDISP/4)))
	begin
		if(~cbcr_reg)
		begin
			data[7:0] <= y;
			data[15:8] <= cb;
		end
		else
		begin
			data[7:0] <= y;
			data[15:8] <= cr;
		end
		cbcr_reg <= ~cbcr_reg;
		red   <= 8‘hf0;
		green <= 8‘hf0;
		blue  <= 8‘h00;
	end
	else if((hcnt>=0) & (hcnt<(IMG_HDISP+0)) & (vcnt>=(0+IMG_VDISP/4)) & (vcnt<(0+2*IMG_VDISP/4)))
	begin
		if(~cbcr_reg)
		begin
			data[7:0] <= y;
			data[15:8] <= cb;
		end
		else
		begin
			data[7:0] <= y;
			data[15:8] <= cr;
		end
		cbcr_reg <= ~cbcr_reg;
		red   <= 8‘hf0;
		green <= 8‘h00;
		blue  <= 8‘h00;
	end
	else if((hcnt>=0) & (hcnt<(IMG_HDISP+0)) & (vcnt>=(0+2*IMG_VDISP/4)) & (vcnt<(0+3*IMG_VDISP/4)))
	begin
		if(~cbcr_reg)
		begin
			data[7:0] <= y;
			data[15:8] <= cb;
		end
		else
		begin
			data[7:0] <= y;
			data[15:8] <= cr;
		end
		cbcr_reg <= ~cbcr_reg;
		red   <= 8‘h00;
		green <= 8‘hf0;
		blue  <= 8‘h00;
	end
	else if((hcnt>=0) & (hcnt<(IMG_HDISP+0)) & (vcnt>=(0+3*IMG_VDISP/4)) & (vcnt<(0+IMG_VDISP)))
	begin
		if(~cbcr_reg)
		begin
			data[7:0] <= y;
			data[15:8] <= cb;
		end
		else
		begin
			data[7:0] <= y;
			data[15:8] <= cr;
		end
		cbcr_reg <= ~cbcr_reg;
		red   <= 8‘h00;
		green <= 8‘h00;
		blue  <= 8‘hf0;
	end
	else
	begin
		data <= 0;
		cbcr_reg <= 0;
		red <= 0;
		green <= 0;
		blue <= 0;
	end

always @(posedge pclk)
	if(vsync)
		data_valid <= 0;
	else if((hcnt>=0) & (hcnt<(IMG_HDISP+0)) & (vcnt>=0) & (vcnt<(0+IMG_VDISP/4)))
		data_valid <= 1;
	else if((hcnt>=0) & (hcnt<(IMG_HDISP+0)) & (vcnt>=(0+IMG_VDISP/4)) & (vcnt<(0+2*IMG_VDISP/4)))
		data_valid <= 1;
	else if((hcnt>=0) & (hcnt<(IMG_HDISP+0)) & (vcnt>=(0+2*IMG_VDISP/4)) & (vcnt<(0+3*IMG_VDISP/4)))
		data_valid <= 1;
	else if((hcnt>=0) & (hcnt<(IMG_HDISP+0)) & (vcnt>=(0+3*IMG_VDISP/4)) & (vcnt<(0+IMG_VDISP)))
		data_valid <= 1;
	else
		data_valid <= 0;		

wire [7:0] y;
wire [7:0] cb;
wire [7:0] cr;

rgb2ycbcr rgb2ycbcr_inst
(
	.clk(pclk) ,	// input  clk_sig
	.rst_n(rst_n) ,	// input  rst_n_sig
	.red(red) ,	// input [7:0] red_sig
	.green(green) ,	// input [7:0] green_sig
	.blue(blue) ,	// input [7:0] blue_sig
	.y(y) ,	// output [7:0] y_sig
	.cb(cb) ,	// output [7:0] cb_sig
	.cr(cr) 	// output [7:0] cr_sig
);			

endmodule

5. 最终结果

在显示器上显示1280*[email protected]帧的彩条视频。

时间: 2024-11-14 01:40:48

FPGA设计——HDMI的相关文章

FPGA设计——VGA (Altera)

1. VGA概述 VGA(Video Graphics Array)是IBM在1987年推出的一种视频传输,具有分辨率高.显示速率快.颜色丰富等优点,在彩色显示器领域得到了广泛的应用.不支持热插拔,不支持音频传输. 2. VGA时序 下面以640*[email protected]为例说明VGA时序和FPGA设计,其他分辨率和帧率的可参考VESA中查找. 计算像素时钟pclk = 800*525*60 = 25200000,注意这里的HSYNC和VSYNC都是低电平有效,且HSYNC在数据行无效

FPGA设计经验谈

从大学时代第一次接触FPGA至今已有10多年的时间.至今记得当初第一次在EDA实验平台上完成数字秒表,抢答器,密码锁等实验时,那个兴奋劲.当时由于没有接触到HDL硬件描述语言,设计都是在MAX+plus II原理图环境下用74系列逻辑器件搭建起来的.后来读研究生,工作陆陆续续也用过Quartus II,Foundation,ISE,Libero,并且学习了verilogHDL语言,学习的过程中也慢慢体会到verilog的妙用,原来一小段语言就能完成复杂的原理图设计,而且语言的移植性可操作性比原理

FPGA 设计如何进行面积优化(逻辑资源占用量优化)

FPGA面积优化 1 对于速度要求不是很高的情况下,我们可以把流水线设计成迭代的形式,从而重复利用FPGA功能相同的资源. 2 对于控制逻辑小于共享逻辑时,控制逻辑资源可以用来复用,例如FIR滤波器的实现过程中,乘法器是一个共享的资源,我们可以通过控制资源实现状态机,从而复用乘法器,当然这样也牺牲了面积. 3 对于具有类似计数单元的模块,可以采用全局的计数器,以减小面积.例如模块A需要256的循环计数,模块B需要1000的循环计数,那么我们就可以设计一个全局计数器,计数器位数为10,前八位供模块

FPGA设计流程

FPGA设计人体分为设计输入.综合.功能仿真(前仿真).实现.时序仿真(后仿真).配置下载等六个步骤,设计流程如图2所示.下面分别介绍各个设计步骤. 1 设计输入 设计输入包括使用硬件描述语言HDL.状态图与原理图输入三种方式.HDL设计方式是现今设计大规模数字集成电路的良好形式,除IEEE标准中VHDL与Verilog HDL两种形式外,尚有各自FPGA厂家推出的专用语言,如Quartus下的AHDL.HDL语言描述在状态机.控制逻辑.总线功能方面较强,使其描述的电路能特定综合器(如Synop

转载--关于FPGA设计数字信号处理电路的心得

FPGA使用的越来越广泛,除了可用于设计控制电路以为,数字信号处理电路更是FPGA的强项和难点.个人可以说才刚刚入门FPGA设计,也做过一些数字信号处理方面的电路设计,记录下个人心得体会. (一)善用MATLAB来为设计做充分的准备和验证. 在学习EDA课程的时候,我们往往都是按照要求,直接打开QuartusII,噼里啪啦开始疯狂敲代码,然后仿真--不对--再改再仿真--还不对--再改直到仿真结果正确为止.不错,这的确是人们先入为主的一种方法.但这只是我们学习HDL语言,学习使用开发工具时候比较

FPGA 设计中的流量,时滞,时序

FPGA 设计中的流量,时滞,时序 流量:每个时钟周期能够传输的数据位. 时滞:数据从输入到输出需要经历的时钟周期: 时序:两个元件之间的最大延迟,他决定系统的最高时钟速度. 1 采用流水线可以提高 流量: 例如计算X^3,迭代结构 流水线: 此时 流量=8/1 时滞=3 时序=乘法器延迟 2 如果要求低时滞则可以去掉寄存器 3 降低时序,提高时钟频率的方法 FPGA 设计中的流量,时滞,时序

影响FPGA设计中时钟因素的探讨【转】

Crazy Bingo Learn to walk first before you want to run- 影响FPGA设计中时钟因素的探讨 http://www.fpga.com.cn/advance/skill/speed.htm http://www.fpga.com.cn/advance/skill/design_skill3.htm 时钟是整个电路最重要.最特殊的信号,系统内大部分器件的动作都是在时钟的跳变沿上进行, 这就要求时钟信号时延差要非常小, 否则就可能造成时序逻辑状态出错

【转】 FPGA设计的四种常用思想与技巧

本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作种取得事半功倍的效果. FPGA/CPLD的设计思想与技巧是一个非常大的话题,由于篇幅所限,本文仅介绍一些常用的设计思想与技巧,包括乒乓球操作.串并转换.流水线操作和数据接口的同步方法.希望本文能引起工程师们的注意,如果能有意识地利用这些原则指导日后的设计工作,将取得事半功倍的效果! 乒乓操作“乒乓

08-FPGA状态机设计实例——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:1.学习状态机的相关概念 2.理解一段式.两段式以及三段式状态机的区别以及优缺点 实验平台:芯航线FPGA核心板 实验原理: 状态机全称是有限状态机(finite-state machine,缩写:FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 状态机分为摩尔(Moore)型有限状态机与米利(Mealy)型有限状态机.摩尔状态机输出是只由输入确定的有限状态机(不直接依赖于当前状态).米利有限状态机的输出不止与其输入有关还于它的