FPGA——基于verilog编写HDMI接口屏幕显示

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

目录

一、HDMI介绍

二、显示原理

2.1 DVI介绍    

2.2 TMDS连接

2.2.1 TMDS编码算法

2.2.2 DVI编码

2.2.2 HDMI编码

2.3 HDMI引脚定义 

三、逻辑原理图

3.1 系统框图

 3.2 top原理图

 3.3 核心HDMI_CTRL控制模块

 3.3.1 编码功能模块

3.3.2 par_to_ser功能模块

3.3.3 顶层控制代码

四、总结


一、HDMI介绍

        HDMI(High-Definition Multimedia Interface)是一种高清晰度多媒体接口,用于在各种电子设备之间传输高质量的音频和视频信号。HDMI接口常用于连接电视、显示器、投影仪、音频设备、电脑等各种消费电子设备。

        HDMI接口的主要优点是可以提供高质量的数字音频和视频传输,支持高清晰度的影像输出。它可以传输全高清(1080p)甚至4K超高清分辨率的视频,以及有损和无损的多声道音频。

        HDMI接口还具有多种功能和特性,例如支持3D影像传输、支持高动态范围(HDR)显示、支持音频回传(Audio Return Channel,ARC)等。它还可以传输网络数据和控制信号,以便按需连接互联网和进行设备之间的互动。

        HDMI接口采用小型、方便连接的接头,相较于传统的模拟接口(如VGA、AV接口等),具有更高的传输质量和更简单的连接方式。通过使用HDMI线缆,用户可以方便地将各种电子设备连接在一起,享受高质量的音视频体验。

        需要注意的是,HDMI接口有几个不同的版本(如HDMI 1.4、HDMI 2.0、HDMI 2.1等),每个版本支持不同的特性和功能。因此,在选择HDMI接口时,需要根据设备的需求和兼容性来选择适当的版本。

二、显示原理

fpga中hdmi1.4/2.0 ip的工程,fpga开发

值得注意的是HDMI是向下兼容DVI的,因此下面我们来简单的介绍一下DVI。 

2.1 DVI介绍    

        DVI(Digital Visual Interface)是一种数字化视频接口,用于在电子设备之间传输数字视频信号。DVI接口最初是为了替代模拟接口(如VGA)而设计的,以提供更好的图像质量和更高的分辨率支持。

        DVI接口支持多种视频信号格式,包括单链接(Single Link)和双链接(Dual Link)。单链接DVI可以传输较低的分辨率(如1920x1200),而双链接DVI可以支持更高的分辨率(如2560x1600)。双链接DVI还可以提供更高的带宽,支持更高的刷新率和更丰富的颜色深度。

        DVI接口还可以通过适配器或转换器与其他类型的视频接口兼容,如HDMI、VGA和DisplayPort。这意味着您可以使用适当的适配器来连接DVI设备与其他类型的显示设备。

        与HDMI接口相比,DVI接口没有传输音频信号的能力。因此,在连接DVI设备时,您可能需要另外使用音频线缆来传输音频信号。

        总的来说,DVI接口是一种常见的数字视频接口,可用于连接计算机显示器、显卡、投影仪等设备。它提供了较高的图像质量和分辨率支持,是一个可靠且广泛使用的接口标准。然而,由于它不支持音频传输并且逐渐被HDMI和DisplayPort等接口所替代,因此在选择设备时需要考虑其兼容性和功能需求。

2.2 TMDS连接

        TMDS(Transition Minimized Differential Signaling)是一种用于传输数字信号的技术,常用于接口标准如DVI和HDMI中。

        TMDS连接通过使用差分信号传输来减少信号干扰和损失。它使用一对相互翻转的信号线(正负两条)传输数据。通过将数据分成多个位(bit)并使用时钟信号进行同步,TMDS可以高效地传输大量的数字数据。

        在TMDS连接中,发送方将数字信号转换为差分信号,即将每个位的高低电平分别对应为正负两个电平。接收方通过比较两个差分信号的电平差异来恢复原始的数字信号。这种差分传输方式能够减少电磁干扰和传输距离上的信号损失,从而提供更可靠的数据传输。

        TMDS连接常用于视频接口标准,如DVI和HDMI。在DVI接口中,TMDS连接用于传输图像数据。在HDMI接口中,TMDS连接不仅可以传输视频数据,还可以传输音频和其他控制信号。

        总的来说,TMDS连接是一种通过差分信号传输数字数据的技术。它在数字接口标准中起到了重要的作用,提供了可靠和高质量的数据传输。

fpga中hdmi1.4/2.0 ip的工程,fpga开发

 其中包括T.M.D.S.transmitter编码过程,具体TMDS编码算法如下:

2.2.1 TMDS编码算法

fpga中hdmi1.4/2.0 ip的工程,fpga开发

TMDS编码算法主要是将8bit的数据扩展为10bit的数据,以方便进行解码。

TMDS编码算法在官网也有提供,地址为:amd - Sign In

2.2.2 DVI编码

fpga中hdmi1.4/2.0 ip的工程,fpga开发

        在传软视频图像的过程中,数据通道上传输的是编码后电有效像素字符。
        而在每一帧图像的行与行之间,以及视频中不同帧之间的时间间隔(消隐期)内,数据通道上传输的则是控制字符。

        每个通道上有两位控制信号的输入接口,共对应四种不同的控制字符。
        这些控制字符提供了视频的行同步(HZYNC)以及帧同步(VSYNC)信息,在蓝色通道传输。

2.2.2 HDMI编码

fpga中hdmi1.4/2.0 ip的工程,fpga开发

         HDMI传输的消隐期除了控制字符之外,还可以用于传输音频或者其他附加数据,比如字幕信息等。

        4-bit音频和附加数据将通过TERC4编码机制转换成10-bit TERC4字符,然后在绿色和红色通道上传输。

这里为了简单流程,因此采用DVI编码与TMDS编码算法。

2.3 HDMI引脚定义 

fpga中hdmi1.4/2.0 ip的工程,fpga开发

三、逻辑原理图

3.1 系统框图

fpga中hdmi1.4/2.0 ip的工程,fpga开发

 3.2 top原理图

fpga中hdmi1.4/2.0 ip的工程,fpga开发

 3.3 核心HDMI_CTRL控制模块

fpga中hdmi1.4/2.0 ip的工程,fpga开发

 3.3.1 编码功能模块

 其中encode采用官方提供的代码。

3.3.2 par_to_ser功能模块

其中主要包括并转串、单脉冲信号转换为差分信号。

        1、并转串模块

注:主要使用OSERDESE2原语,具体参考手册。

`timescale 1ns / 1ps

module par_to_ser(
	input	[9:0]	paralell_data,
	input			clk_5x,
	input			reset,
	input			paralell_clk,
	
	output			serial_data_out
    );
	
	wire		cascade1;
	wire		cascade2;
	
	//例化OSERDESE2原语,实现并串转换,Master模式
	OSERDESE2 #(
		.DATA_RATE_OQ   ("DDR"),       // 设置双倍数据速率
		.DATA_RATE_TQ   ("SDR"),       // DDR, BUF, SDR
		.DATA_WIDTH     (10),           // 输入的并行数据宽度为10bit
		.SERDES_MODE    ("MASTER"),    // 设置为Master,用于10bit宽度扩展
		.TBYTE_CTL      ("FALSE"),     // Enable tristate byte operation (FALSE, TRUE)
		.TBYTE_SRC      ("FALSE"),     // Tristate byte source (FALSE, TRUE)
		.TRISTATE_WIDTH (1)             // 3-state converter width (1,4)
	)
	OSERDESE2_Master (
		.CLK        (clk_5x),    // 串行数据时钟,5倍时钟频率
		.CLKDIV     (paralell_clk),     // 并行数据时钟
		.RST        (reset),            // 1-bit input: Reset
		.OCE        (1'b1),             // 1-bit input: Output data clock enable
		
		.OQ         (serial_data_out),  // 串行输出数据
		
		.D1         (paralell_data[0]), // D1 - D8: 并行数据输入
		.D2         (paralell_data[1]),
		.D3         (paralell_data[2]),
		.D4         (paralell_data[3]),
		.D5         (paralell_data[4]),
		.D6         (paralell_data[5]),
		.D7         (paralell_data[6]),
		.D8         (paralell_data[7]),
	   
		.SHIFTIN1   (cascade1),         // SHIFTIN1 用于位宽扩展
		.SHIFTIN2   (cascade2),         // SHIFTIN2
		.SHIFTOUT1  (),                 // SHIFTOUT1: 用于位宽扩展
		.SHIFTOUT2  (),                 // SHIFTOUT2
			
		.OFB        (),                 // 以下是未使用信号
		.T1         (1'b0),             
		.T2         (1'b0),
		.T3         (1'b0),
		.T4         (1'b0),
		.TBYTEIN    (1'b0),             
		.TCE        (1'b0),             
		.TBYTEOUT   (),                 
		.TFB        (),                 
		.TQ         ()                  
	);
	   
	//例化OSERDESE2原语,实现并串转换,Slave模式
	OSERDESE2 #(
		.DATA_RATE_OQ   ("DDR"),       // 设置双倍数据速率
		.DATA_RATE_TQ   ("SDR"),       // DDR, BUF, SDR
		.DATA_WIDTH     (10),           // 输入的并行数据宽度为10bit
		.SERDES_MODE    ("SLAVE"),     // 设置为Slave,用于10bit宽度扩展
		.TBYTE_CTL      ("FALSE"),     // Enable tristate byte operation (FALSE, TRUE)
		.TBYTE_SRC      ("FALSE"),     // Tristate byte source (FALSE, TRUE)
		.TRISTATE_WIDTH (1)             // 3-state converter width (1,4)
	)
	OSERDESE2_Slave (
		.CLK        (clk_5x),    // 串行数据时钟,5倍时钟频率
		.CLKDIV     (paralell_clk),     // 并行数据时钟
		.RST        (reset),            // 1-bit input: Reset
		.OCE        (1'b1),             // 1-bit input: Output data clock enable
		
		.OQ         (),                 // 串行输出数据
		
		.D1         (1'b0),             // D1 - D8: 并行数据输入
		.D2         (1'b0),
		.D3         (paralell_data[8]),
		.D4         (paralell_data[9]),
		.D5         (1'b0),
		.D6         (1'b0),
		.D7         (1'b0),
		.D8         (1'b0),
	   
		.SHIFTIN1   (),                 // SHIFTIN1 用于位宽扩展
		.SHIFTIN2   (),                 // SHIFTIN2
		.SHIFTOUT1  (cascade1),         // SHIFTOUT1: 用于位宽扩展
		.SHIFTOUT2  (cascade2),         // SHIFTOUT2
			
		.OFB        (),                 // 以下是未使用信号
		.T1         (1'b0),             
		.T2         (1'b0),
		.T3         (1'b0),
		.T4         (1'b0),
		.TBYTEIN    (1'b0),             
		.TCE        (1'b0),             
		.TBYTEOUT   (),                 
		.TFB        (),                 
		.TQ         ()                  
	); 
	
endmodule

3.3.3 顶层控制代码

里面例化编码模块、并转串、以及OBUFDS原语(单脉冲信号转换为差分信号)。还要一个复位信号的转化。

注:转换复位信号

module asyn_rst_syn(
    input clk,          //目的时钟域
    input reset_n,      //异步复位,低有效
    
    output syn_reset    //高有效
    );
    
//reg define
reg reset_1;
reg reset_2;
    
assign syn_reset  = reset_2;
    
//对异步复位信号进行同步释放,并转换成高有效
always @ (posedge clk or negedge reset_n) begin
    if(!reset_n) begin
        reset_1 <= 1'b1;
        reset_2 <= 1'b1;
    end
    else begin
        reset_1 <= 1'b0;
        reset_2 <= reset_1;
    end
end
    
endmodule

module dvi_transmitter_top(
    input        pclk,           // pixel clock
    input        pclk_x5,        // pixel clock x5
    input        reset_n,        // reset
    
    input [23:0] video_din,      // RGB888 video in
    input        video_hsync,    // hsync data
    input        video_vsync,    // vsync data
    input        video_de,       // data enable
    
    output       tmds_clk_p,    // TMDS 时钟通道
    output       tmds_clk_n,
    output [2:0] tmds_data_p,   // TMDS 数据通道
    output [2:0] tmds_data_n,
    output       tmds_oen       // TMDS 输出使能
    );
    
//wire define    
wire        reset;
    
//并行数据
wire [9:0]  red_10bit;
wire [9:0]  green_10bit;
wire [9:0]  blue_10bit;
wire [9:0]  clk_10bit;  
  
//串行数据
wire [2:0]  tmds_data_serial;
wire        tmds_clk_serial;

//*****************************************************
//**                    main code
//***************************************************** 
assign tmds_oen = 1'b1;  
assign clk_10bit = 10'b1111100000;

//异步复位,同步释放
asyn_rst_syn reset_syn(
    .reset_n    (reset_n),
    .clk        (pclk),
    
    .syn_reset  (reset)    //高有效
    );
  
//对三个颜色通道进行编码
dvi_encoder encoder_b (
    .clkin      (pclk),
    .rstin	    (reset),
    
    .din        (video_din[7:0]),
    .c0			(video_hsync),
    .c1			(video_vsync),
    .de			(video_de),
    .dout		(blue_10bit)
    ) ;

dvi_encoder encoder_g (
    .clkin      (pclk),
    .rstin	    (reset),
    
    .din		(video_din[15:8]),
    .c0			(1'b0),
    .c1			(1'b0),
    .de			(video_de),
    .dout		(green_10bit)
    ) ;
    
dvi_encoder encoder_r (
    .clkin      (pclk),
    .rstin	    (reset),
    
    .din		(video_din[23:16]),
    .c0			(1'b0),
    .c1			(1'b0),
    .de			(video_de),
    .dout		(red_10bit)
    ) ;
    
//对编码后的数据进行并串转换
serializer_10_to_1 serializer_b(
    .reset              (reset),                // 复位,高有效
    .paralell_clk       (pclk),                 // 输入并行数据时钟
    .serial_clk_5x      (pclk_x5),              // 输入串行数据时钟
    .paralell_data      (blue_10bit),           // 输入并行数据

    .serial_data_out    (tmds_data_serial[0])   // 输出串行数据
    );    
    
serializer_10_to_1 serializer_g(
    .reset              (reset),
    .paralell_clk       (pclk),
    .serial_clk_5x      (pclk_x5),
    .paralell_data      (green_10bit),

    .serial_data_out    (tmds_data_serial[1])
    );
    
serializer_10_to_1 serializer_r(
    .reset              (reset),
    .paralell_clk       (pclk),
    .serial_clk_5x      (pclk_x5),
    .paralell_data      (red_10bit),

    .serial_data_out    (tmds_data_serial[2])
    );
            
serializer_10_to_1 serializer_clk(
    .reset              (reset),
    .paralell_clk       (pclk),
    .serial_clk_5x      (pclk_x5),
    .paralell_data      (clk_10bit),

    .serial_data_out    (tmds_clk_serial)
    );
    
//转换差分信号  
OBUFDS #(
    .IOSTANDARD         ("TMDS_33")    // I/O电平标准为TMDS
) TMDS0 (
    .I                  (tmds_data_serial[0]),
    .O                  (tmds_data_p[0]),
    .OB                 (tmds_data_n[0]) 
);

OBUFDS #(
    .IOSTANDARD         ("TMDS_33")    // I/O电平标准为TMDS
) TMDS1 (
    .I                  (tmds_data_serial[1]),
    .O                  (tmds_data_p[1]),
    .OB                 (tmds_data_n[1]) 
);

OBUFDS #(
    .IOSTANDARD         ("TMDS_33")    // I/O电平标准为TMDS
) TMDS2 (
    .I                  (tmds_data_serial[2]), 
    .O                  (tmds_data_p[2]), 
    .OB                 (tmds_data_n[2])  
);

OBUFDS #(
    .IOSTANDARD         ("TMDS_33")    // I/O电平标准为TMDS
) TMDS3 (
    .I                  (tmds_clk_serial), 
    .O                  (tmds_clk_p),
    .OB                 (tmds_clk_n) 
);
  
endmodule

四、总结

        HMDI的控制模块整体代码并不复杂,但是需要整体理解逻辑思路。同时需要熟练的使用原语的使用。文章来源地址https://www.toymoban.com/news/detail-770022.html

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

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

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

相关文章

  • 基于FPGA的以太网传输图片通过HDMI显示(含源码)

      在此之前,已经讲解过HDMI、UDP、DDR3等模块的使用,前文在使用HDMI显示图片时,由于没有讲解DDR3,使用FPGA内部的RAM存储图像数据,因为FPGA片上RAM的资源有限,导致最终显示放大的图片失真严重。   本文通过DDR3存储整张图片的数据,然后通过HDMI在显示器上进行显示,

    2024年03月27日
    浏览(64)
  • FPGA实现HDMI接口

    HDMI( High-Definition Multimedia Interface),即高清多媒体接口。它能够 同时传输视频和音频 ,简化了设备的接口和连线;同时提供了更高的数据传输带宽, 可以传输无压缩的数字音频及高分辨率视频信号。 HDMI 接口在物理层使用 TMDS 标准传输音视频数据。 点亮液晶显示屏需要按

    2024年02月04日
    浏览(43)
  • 基于FPGA:运动目标检测(LCD显示+串口输出,纯Verilog工程)

          最早做了基于FPGA:运动目标检测(VGA显示,原理图+源码+硬件选择),有网友反应,VGA一个大大的屏幕,做起来很不方便,并且功能过于单一。      因此,在上个工程的基础上,修改成了TFT-LCD屏幕检测,并且将检测结果通过串口输出到电脑上位机上,以便大家做

    2024年02月07日
    浏览(41)
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注:大部分参考内容来自“征途Pro《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10(上)”  贴个下载地址: 野火FPGA-Altera-EP4CE10征途开发板_核心板 — 野火产品资料下载中心 文档 hdmi显示器驱动设计与验证 — [野火]FPGA Verilog开发实战指南——基于Altera EP4CE10 征途Pro开

    2024年02月09日
    浏览(47)
  • 基于FPGA的高速数据采集ATA接口Verilog开发与Matlab

    基于FPGA的高速数据采集ATA接口Verilog开发与Matlab 摘要: 本文介绍了基于FPGA的高速数据采集ATA接口的Verilog开发与Matlab的应用。通过使用Verilog语言进行FPGA的硬件设计,实现了ATA接口的数据采集功能。同时,结合Matlab进行数据处理和分析,实现了对采集的数据进行实时处理和显

    2024年02月07日
    浏览(55)
  • FPGA实现jpeg图片解码RGB 纯verilog代码编写 提供基于zynq得工程源码和技术支持

    jpg是一种压缩的图片格式,之所以压缩是为了减小图片所占空间,jpg压缩原理这里不罗嗦,可以自行百度或者b站,大佬讲的比我好,jpg解压缩就是逆向过程,用opencv啥的解压缩就是一句话的事儿,但对于fpga硬件来说就是大型工程了。 本设计使用zynq7100位平台,将jpg图片的c语

    2024年02月07日
    浏览(56)
  • 基于FPGA的四位数码管显示按键计数器设计(verilog编程)

    软件:Vivado 2022.2 硬件:BASYS 3 设计描述:通过开发板上的四个按键,按下一次记数加一,分别由四个数码管从左到右分别显示四个按键记数情况。 例: 1.初始值为0000,意为无记数 2.当按下第一个按键,记数加一,数码管显示1000 3.再次按下一第一个按键,记数加一,数码管显

    2024年02月08日
    浏览(49)
  • 基于FPGA的16QAM调制器verilog实现,包括testbench,并通过MATLAB显示FPGA输出信号的星座图

    目录 1.算法仿真效果 2.verilog核心程序 3.算法涉及理论知识概要 4.完整verilog matlab2022a/vivado2019.2仿真结果如下:  将FPGA仿真的数据导出,然后在matlab中将数据通过噪声之后,可以得到如下的星座图效果。 fpga工程版本信息:       16QAM全称正交幅度调制是英文Quadrature Amplitude

    2024年02月07日
    浏览(44)
  • FPGA—HDMI 显示器驱动设计与验证(附代码)

    目录 1.理论 2.实操 2.1 顶层模块 2.2 时钟生成模块 2.3 HDMI 驱动控制模块 2.3.1 编码模块 2.3.2 并行转串行模块 2.4 顶层仿真验证 3.总结 HDMI简介       VGA 接口体积较大;且传输的模拟信号易受外界干扰。因此在VGA 接口之后,首先推出的是 DVI 接口, DVI 是基于 TMDS(Transition Minim

    2024年02月10日
    浏览(46)
  • (七)零基础FPGA图像处理——HDMI彩条显示实验

    此篇为专栏 《FPGA学习笔记》 的第七篇,记录我的学习FPGA的一些开发过程和心得感悟,刚接触FPGA的朋友们可以先去此专栏置顶 《FPGA零基础入门学习路线》来做最基础的扫盲。 本篇内容基于笔者实际开发过程和正点原子资料撰写,将会详细讲解此FPGA实验的全流程, 诚挚 地

    2024年02月03日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包