FPGA实现HDMI接口

这篇具有很好参考价值的文章主要介绍了FPGA实现HDMI接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.HDMI简介

HDMI( High-Definition Multimedia Interface),即高清多媒体接口。它能够同时传输视频和音频,简化了设备的接口和连线;同时提供了更高的数据传输带宽, 可以传输无压缩的数字音频及高分辨率视频信号。 HDMI 接口在物理层使用 TMDS 标准传输音视频数据。FPGA实现HDMI接口,找工作用的FPGA,fpga开发

2.LCD驱动

点亮液晶显示屏需要按照一定的时序,示意图如下。使用FPGA驱动LCD屏幕时,是按照一行一行的形式点亮屏幕的,一个像素时钟点亮一个像素。其中,黑色部分传输控制数据或者其他数据,白色部分传输有效的像素数据。以下图为例,传输一幅图像的过程为:1.VSYNC拉高表示开始传输;;2. 等待VBP行的扫描时间;3.进入有效显示区域,HSYNC拉高开始一行数据的扫描,这一行的时间包括三个部分的:HBP+DE+HFP;4.扫完600行,即完成有效区域的显示,然后等待VFP行的扫描时间结束一帧的扫描。
FPGA实现HDMI接口,找工作用的FPGA,fpga开发
LCD 行显示时序
在有效数据区域,LCD行显示时序如下图,其中参数有:
.HSYNC:行同步信号,当此信号有效的时候就表示开始显示新的一行数据,图示为低电平有效。
HSPW:行同步间隔,也就是 HSYNC 信号持续时间。行与行之间不是连续的,中间有间隔。单位是像素时钟。
HBP::行显示后沿(或后肩),单位是 像素时钟。
HOZVAL:行有效显示区域,即显示一行数据所需的时间,假如屏幕分辨率为 1024*600,那么 HOZVAL就是 1024,单位为像素时钟。

FPGA实现HDMI接口,找工作用的FPGA,fpga开发
LCD 帧显示时序
传输一整幅图像的时序如下图,其中参数有:
VSYNC:帧(场)同步信号,当此信号有效的时候就表示开始显示新的一帧数据。图示为低电平有效。
VSPW:帧同步信号宽度,也就是 VSYNC 信号持续时间,单位为 1 行的时间。
VBP:帧显示后沿(或后肩),单位为 1 行的时间。
LINE:帧有效显示区域,即显示一帧数据所需的时间,假如屏幕分辨率为 1024*600,那么 LINE 就是600 行的时间。
VFP:帧显示前沿(或前肩),单位为 1 行的时间。
因此,显示一帧的总时间就可以计算为:VSPW+VBP+LINE+VFP 个行时间,总的时间T:T = (VSPW+VBP+LINE+VFP) * (HSPW + HBP + HOZVAL + HFP)(含义就是行乘列个像素时钟)
FPGA实现HDMI接口,找工作用的FPGA,fpga开发

3.FPGA实现HDMI接口

首先我们需要明确一定,使用HDMI接口传输数据时,数据以TMDS的电平标准传输,实际上它是一种串行的数据格式。但是在FPGA中处理的数据是以RGB888的形式的并行数据,所以需要进行并串转换。在转换之前,需要将RGB888数据进8b/10b编码,这么做的目的主要是为了避免连续出现0或者1,来保证DC平衡。同时,每个编码后的 10-bit字符中状态跳转(“由 1 到 0”或者“由 0 到 1” ) 的次数将被限制在五次以内。
8b/10b编码
对于8b/10b编码,XILINX官方提供了编码模块流程以及代码,不过多解释了:
FPGA实现HDMI接口,找工作用的FPGA,fpga开发
并串转换
并串转换使用XILINX FPGA提供的并转串的IO逻辑资源OSERDES,调用方式是使用原语OSERDESE2。一个OSERDES只能实现8:1的并串转换,若要实现10:1的并串转换则需要使用两个OSERDES级联实现。需要注意的是,两个OSERDES级联时,第二个OSERDES输入数据端口只能从D3开始,D1、D2不可用。
FPGA实现HDMI接口,找工作用的FPGA,fpga开发
差分输出
经过并转串的数据并不能直接输出,还需要转为差分形式的信号。这时候需要使用到FPGA的IO资源中的IOB,两个IOB可以配置成差分信号输出,调用方法是使用原语OBUFDS。
FPGA实现HDMI接口,找工作用的FPGA,fpga开发

4.实验——HDMI传图驱动LCD显示

工程的整体框图如下,主要由四个模块组成,分别是分频模块、视频显示模块、视频驱动模块、数据传输模块。分频模块产生像素时钟和五倍的像素时钟用于其他模块;视频显示模块主要完成ROM中图片数据的读取,由视频驱动模块驱动并输出RGB888数据给视频驱动模块;视频驱动模块完成LCD扫描的过程以及将读取的像素数据输出给数据传输模块;数据传输模块完成8b/10b编码、并转串输出和差分信号的形成。
FPGA实现HDMI接口,找工作用的FPGA,fpga开发
视频显示模块
视频显示模块主要完成要显示图片的像素数据输出。图片数据存于例化的单端ROM中,单个数据位宽为24bit,图片大小200*200一共40000像素。LCD使用的是1280×720的分辨率,因此除了显示图片的地方外,其他位置显示白色。该模块代码如下:

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 白色

//*****************************************************
//**                    main code
//*****************************************************
wire ena;
wire [23:0]rom_out;
reg [15:0]cnt;

assign ena = 1;

always @(posedge pixel_clk or negedge sys_rst_n ) begin
    if (!sys_rst_n)
        cnt <= 'b0;
	else if(pixel_ypos == 460)	
		cnt <= 'b0;
    else if((pixel_xpos >= 537) && (pixel_xpos < 737) && (pixel_ypos >= 260) && (pixel_ypos < 460))  //让图片显示在屏幕中央
		cnt <= cnt + 16'b1;	
end

always @(posedge pixel_clk ) begin
    if (!sys_rst_n)
		pixel_data <= 'b0;
	else if((pixel_xpos >= 539) && (pixel_xpos < 740) && (pixel_ypos >= 260) && (pixel_ypos < 460))
		pixel_data <= rom_out;
	else
		pixel_data <= WHITE;
end





blk_mem_gen_0 your_instance_name (
  .clka(pixel_clk),    // input wire clka
  .ena(ena),      // input wire ena
  .addra(cnt),  // input wire [15 : 0] addra
  .douta(rom_out)  // output wire [23 : 0] douta
);
endmodule

视频驱动模块
视频驱动模块一方面产生像素点的坐标用于读取视频显示模块中的像素数据,一方面输出像素数据和行场同步信号给编码模块。此外,显示屏分辨率参数是1280*720。模块代码如下:

module video_driver(
    input           	pixel_clk	,
    input           	sys_rst_n	,
		
    //RGB接口	
    output          	video_hs	,     //行同步信号
    output          	video_vs	,     //场同步信号
    output          	video_de	,     //数据使能
    output  	[23:0]  video_rgb	,    //RGB888颜色数据
    output	reg			data_req 	,
	
    input   	[23:0]  pixel_data	,   //像素点数据
    output  reg	[10:0]  pixel_xpos	,   //像素点横坐标
    output  reg	[10:0]  pixel_ypos    //像素点纵坐标
);

//parameter define

//1280*720 分辨率时序参数
parameter  H_SYNC   =  11'd40;   //行同步
parameter  H_BACK   =  11'd220;  //行显示后沿
parameter  H_DISP   =  11'd1280; //行有效数据
parameter  H_FRONT  =  11'd110;  //行显示前沿
parameter  H_TOTAL  =  11'd1650; //行扫描周期

parameter  V_SYNC   =  11'd5;    //场同步
parameter  V_BACK   =  11'd20;   //场显示后沿
parameter  V_DISP   =  11'd720;  //场有效数据
parameter  V_FRONT  =  11'd5;    //场显示前沿
parameter  V_TOTAL  =  11'd750;  //场扫描周期

//reg define
reg  [11:0] cnt_h;
reg  [11:0] cnt_v;
reg       	video_en;

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

assign video_de  = video_en;
assign video_hs  = ( cnt_h < H_SYNC ) ? 1'b0 : 1'b1;  //行同步信号赋值
assign video_vs  = ( cnt_v < V_SYNC ) ? 1'b0 : 1'b1;  //场同步信号赋值

//使能RGB数据输出
always @(posedge pixel_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		video_en <= 1'b0;
	else
		video_en <= data_req;
end

//RGB888数据输出
assign video_rgb = video_de ? pixel_data : 24'd0;

//请求像素点颜色数据输入
always @(posedge pixel_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)
		data_req <= 1'b0;
	else if(((cnt_h >= H_SYNC + H_BACK - 2'd2) && (cnt_h < H_SYNC + H_BACK + H_DISP - 2'd2))
                  && ((cnt_v >= V_SYNC + V_BACK) && (cnt_v < V_SYNC + V_BACK+V_DISP)))
		data_req <= 1'b1;
	else
		data_req <= 1'b0;
end

//像素点x坐标
always@ (posedge pixel_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        pixel_xpos <= 11'd0;
    else if(data_req)
        pixel_xpos <= cnt_h + 2'd2 - H_SYNC - H_BACK ;
    else 
        pixel_xpos <= 11'd0;
end
    
//像素点y坐标	
always@ (posedge pixel_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        pixel_ypos <= 11'd0;
    else if((cnt_v >= (V_SYNC + V_BACK)) && (cnt_v < (V_SYNC + V_BACK + V_DISP)))
        pixel_ypos <= cnt_v + 1'b1 - (V_SYNC + V_BACK) ;
    else 
        pixel_ypos <= 11'd0;
end

//行计数器对像素时钟计数
always @(posedge pixel_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        cnt_h <= 11'd0;
    else begin
        if(cnt_h < H_TOTAL - 1'b1)
            cnt_h <= cnt_h + 1'b1;
        else 
            cnt_h <= 11'd0;
    end
end

//场计数器对行计数
always @(posedge pixel_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        cnt_v <= 11'd0;
    else if(cnt_h == H_TOTAL - 1'b1) begin
        if(cnt_v < V_TOTAL - 1'b1)
            cnt_v <= cnt_v + 1'b1;
        else 
            cnt_v <= 11'd0;
    end
end

endmodule

数据传输模块
编码模块将输入的并行数据编码、并转串数据和差分输出。
编码框图如下所示,主要完成RGB888的8b/10b编码,同时行场同步信号HSYNC、VSYNC由蓝色通道进行编码,表示控制信号,接在蓝色通道的C0、C1端口,在传输数据的消隐期传送。其余通道的控制信号未使用到,均赋值为0。
FPGA实现HDMI接口,找工作用的FPGA,fpga开发
并转串使用OSERDESE2原语实现。HDMI接口中传输四路数据,分别是R、G、B和时钟,因此需要四路并转串。OSERDESE2使用DDR模式,也就是每个时钟可以转换2个数据,因此OSERDESE2转换10bit数据只需要五个时钟,这就是要用PLL产生5倍像素时钟的原因。时钟的并转串采用硬编码的形式,直接输入10‘b11111_00000的数据。最后由OBUFDS产生四差分信号输出。该部分的整体框图如下:
做了一个低电平复位转高电平复位的逻辑,原因是这些原语都是使用的高电平复位,但是其他模块都是低电平复位。
FPGA实现HDMI接口,找工作用的FPGA,fpga开发
结果展示
FPGA实现HDMI接口,找工作用的FPGA,fpga开发文章来源地址https://www.toymoban.com/news/detail-767523.html

到了这里,关于FPGA实现HDMI接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA小白找工作必备建议

    如果您是一名刚入门的JAVA小白,正在寻求工作机会,那么恭喜您来对地方!本文将为您提供一些建议,帮助您在求职过程中更好地展现自己的优势和准备迎接新的挑战。 1.基础知识打牢 在找工作前,务必确保您对JAVA编程语言的基础知识有很好的掌握。熟悉面向对象编程(

    2024年02月16日
    浏览(50)
  • 计算机专业,考研还是找工作?

    目前研一在读,只能说当时在大三的时候和你一样迷茫,也找过工作,但是就是找不到!没有技术,技术面一问就炸,还被各种嘲讽... 如果你的本科和我一样没有学什么技术,那读一个研究生也算是给自己一个过渡的机会,多学技术提升自己! 技术过硬以后找工作还是有很

    2024年04月17日
    浏览(38)
  • ChatGPT帮你写简历找工作

            随着随着毕业时间的到来,应届生将要面临求职问题,根据官方的统计,2023届高校毕业生预计达1158万人,就业市场竞争激烈,无论是校园招聘,招聘会,线上招聘除了自身的准备和个人能力,都会用到简历,如何让你的简历脱引而出引起注意至关重要,让当今最

    2024年02月06日
    浏览(55)
  • 学习Unity到什么程度可以找工作?

    游戏开发是一个充满无限可能的行业,Unity作为最流行的游戏开发引擎,吸引着无数游戏开发者的目光。在这个行业发展迅速、竞争激烈的背景下,许多同学都梦想着通过系统学习获得游戏开发技能,从而在游戏行业找到属于自己的一席之地。 然而从学习Unity到进入游戏行业

    2024年02月19日
    浏览(53)
  • 自学unity什么程度能去找工作?

    了解了你的相关经历。首先你的基础一定是打的非常好了,但是找工作要面试的话,面试官会比较看重你是否有成功的项目经验,或者游戏demo,并且通过这两项考察你的技能掌握程度。因此目前的情况还需要再努力一下哦。 因为我之前属于原画转的unity,当时也是整理了非常

    2024年02月13日
    浏览(42)
  • 大学生找工作防坑指南,收藏10000+

    2023年就业季即将抵达,你害怕了吗? 据数据统计,今年的应届生人数再创新高,将达到1158万人,相信同学们看到这串数字已经感到毛骨悚然。然而大学生要面临的挑战不仅这些,最残酷的考验还在最后。 作为初出茅庐的社会新人,大学生一度被戏谑为“眼神既清澈又愚蠢”

    2024年02月04日
    浏览(63)
  • 全网最全靠谱找工作招聘网站大全

    智联招聘:www.zhaopin.com 前程无忧:www.51job.com 中华英才:www.chinahr.com 猎聘网:www.liepin.com 58同城:www.58.com 赶集网:www.ganji.com 百姓网:www.baixing.com 看准网:www.kanzhun.com 百度招聘:zhaopin.baidu.com 中国人才热线:www.cjo1.com 英才网联:www.800hr.com 拉钩网:www.lagou.com Boss直聘:www

    2024年02月16日
    浏览(61)
  • 自学软件测试,学到什么程度可以出去找工作?

    其实初级测试学的东西并不多,如果脱产学习的话2~3个月差不多就能简单入门。 另外不要担心,初级测试对于Python/Java编程,自动化测试,性能测试这些都是初步的了解和学习。如果说要深度掌握,那确实是还需要很多时间。 好了,现在开始正题。 自学软件测试,学到什么

    2024年02月07日
    浏览(58)
  • AI如何帮助Salesforce从业者找工作?

    在当今竞争激烈的就业市场中,找到满意的工作是一项艰巨的任务。成千上万的候选人竞争一个岗位,你需要利用一切优势从求职大军中脱颖而出。 这就是AI的用武之地,特别是像ChatGPT这样的人工智能工具,可以成为你的秘密武器。本篇文章将探讨AI如何帮助你加快Salesforc

    2024年02月08日
    浏览(67)
  • Java自学到什么程度就可以去找工作了?

    Java作为一门广泛应用于软件开发领域的编程语言,对于初学者来说,了解到什么程度才能开始寻找实习和入职机会是一个常见的问题。 本文将从实习和入职这两个方面,分点详细介绍Java学习到什么程度才能够开始进入职场。 并在文章末尾给大家安排上送书福利! 在开始寻

    2024年02月12日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包