我们几种常见的视频接口有VGA,DVI,HDMI,SDI,DP等等。 我们最熟悉的应该就是VGA,很多FPGA的爱好者都用FPGA驱动过VGA的显示器,行场时序是不是还历历在目。 很多FPGA开发板仅仅只有VGA的接口,但是但是,DECA开发板可是有HDMI接口的哦! 如果有兴趣,可以百度查查这些接口原理,支持的分辨率等等。 一:DECA的HDMI接口:
ArrowDECA MAX 10 评估套件的HDMI芯片采用的是ADI的ADV7513。
- 集成包括3D视频支持在内的HDMI v.1.4特性
- 165 MHz频率,支持最高达1080p和UXGA的所有视频格式
- 支持全音域元数据包传输
- 3D视频就绪
- 可编程双向色彩空间转换器
- 支持标准S/PDIF,适用于最高192 kHz的立体声线性脉冲码调制(LPCM)或压缩音频
- 高比特率(HBR)音频
- I2C 和Hot Plug™(热插拔)检测(HPD) I/O具有5 V容差,无需额外器件
- 无需支持S/PDIF和I2S的音频主时钟
其实主要包括,音频、视频、i2c配置,TMDS通路,DDC显示通道。 1.视频,音频为数据; 2.i2c主要完成的是HDMI芯片的配置,确定芯片的工作模式; 3.TMDS通路可以理解为HDMI传输协议里的; 4.DDC这部分是DDC即显示器数据通道,是主机(比如说主机,也可以是我们开发板)用于访问显示器存储器以获取显示器中EEPROM中的EDID格式数据,确定显示器的显示属性(如分辨率、纵横比等)信息的数据通道。 接下来,我们先研究视频数据的时序,VGA和HDMI的一起看看。音频的暂时放一下,因为显示器没有自带音箱。 二:回顾一下VGA的时序: VGA时序:
VGA时序原理可以看看: http://www.cnblogs.com/spartan/archive/2011/08/16/2140546.html 我们在VESA标准中可以查到,以我的显示器为例,1920*1080的分辨率,60HZ下:
所以按照VESA标准,驱动我的显示器的HSYNC和VSYNC如下: 对应HSYNC的a、b、c、d 44 148 1920 88 total2200 对应VSYNC的a、b、c、d 5 36 1080 4 total 1125 数据有效区域为: 192< HSYNC < 2113 && 41< VSYNC < 1122 计算系统时钟为:2200*1125*60=148.5MHZ,呵呵,其实上面已经算好了….
- module vga_drive(clk_vga,rst_n,test_pattern,vsync,hsync,red,green,blue);
- input clk_vga,rst_n;
- input [2:0]test_pattern; //测试模式,颜色:
- //VGA interface
- output hsync,vsync;
- output [4:0]red;
- output [5:0]green;
- output [4:0]blue;
- //1920*1080 60HZ
- parameter H_SYNC = 12'd44;
- parameter H_BACK = 12'd148;
- parameter H_DISP = 12'd1920;
- parameter H_FRONT = 12'd88;
- parameter H_TOTAL = 12'd2200;
- parameter V_SYNC = 12'd5;
- parameter V_BACK = 12'd36;
- parameter V_DISP = 12'd1080;
- parameter V_FRONT = 12'd4;
- parameter V_TOTAL = 12'd1125;
- /*----------------------------------------
- SYNC-BACK-DISP-FRONT
- _____---------------
- ----------------------------------------*/
- //**********hsync generate**************
- reg [11:0]h_cnt;
- always @(posedge clk_vga)
- begin
- if(!rst_n)
- h_cnt<=12'd0;
- else if(h_cnt<H_TOTAL-1'b1)
- h_cnt<=h_cnt+1'b1;
- else h_cnt<=12'd0;
- end
- assign hsync = (h_cnt < H_SYNC) ? 1'b0 : 1'b1;
- //**********vsync generate**************
- reg [11:0]v_cnt;
- always @(posedge clk_vga)
- begin
- if(!rst_n)
- v_cnt<=12'd0;
- else if(h_cnt == H_TOTAL-1'b1)
- begin
- if(v_cnt < V_TOTAL-1'b1)
- v_cnt<=v_cnt+1'b1;
- else v_cnt<=1'b0;
- end
- else v_cnt<=v_cnt;
- end
- assign vsync = (v_cnt<V_SYNC) ? 1'b0 : 1'b1;
- wire data_valid ;
- assign data_valid = (h_cnt > H_SYNC+H_BACK-1'b1) && (h_cnt < H_SYNC+H_BACK+H_DISP)
- &&(v_cnt > V_SYNC+V_BACK-1'b1) && (v_cnt < V_SYNC+V_BACK+V_DISP);
- reg [15:0]vga_rgb;
- always @(posedge clk_vga)
- begin
- if(!rst_n)
- vga_rgb<=16'd0;
- else
- begin
- case (test_pattern)
- 3'd0: vga_rgb <= 16'b11111_000000_00000; //red
- 3'd1: vga_rgb <= 16'b00000_111111_00000; //green
- 3'd2: vga_rgb <= 16'b00000_000000_11111; //blue
- 3'd3: vga_rgb <= 16'b11111_111111_00000; //
- 3'd4: vga_rgb <= 16'b11111_000000_11111; //
- 3'd5: vga_rgb <= 16'b00000_111111_11111; //
- 3'd6: vga_rgb <= 16'b11111_111111_11111; //white
- 3'd7: vga_rgb <= 16'b00000_000000_00000; //black
- default:vga_rgb <= 16'd0;
- endcase
- end
- end
- assign red = data_valid ? vga_rgb[15:11] : 5'd0;
- assign green = data_valid ? vga_rgb[10:5] : 6'd0;
- assign blue = data_valid ? vga_rgb[4:0] : 5'd0;
- endmodule
复制代码由于DECA没有VGA接口,这里用我其他的Altera的cycloneIV开发板来试试;
三:HDMI接口时序及原理
这里没有用VGA显示什么图像啊,什么的,原理也没有分析,就是因为相对简单,资料较多,所以VGA仿真都没做,直接就上板成功了,这里主要是看看VGA的时序,以及和HDMI接口的时序有什么区别;
HDMI相关的内容也看的差不错了,后面的话就可以重点分析一下HDMI部分的内容。
|