01
視頻圖像經(jīng)過(guò)數(shù)十年的發(fā)展,已形成了一系列的規(guī)范,以VGA和HDMI為主的視頻圖像接口協(xié)議也得到定義與推廣。盡管DP、DVI、Type-C等圖像接口技術(shù)近年來(lái)得到了推廣與應(yīng)用,且VGA傳輸性能發(fā)展逐漸落后于時(shí)代,但作為顯示器和顯卡等設(shè)備的通用顯示接口,VGA和HDMI仍是當(dāng)前主流的視頻圖像接口技術(shù)。
1.1 VGA視頻接口
視頻圖形陣列(VGA,Video Graphics Array),也可稱(chēng)作D-Sub,是IBM于1987年提出的一個(gè)使用模擬信號(hào)的電腦顯示標(biāo)準(zhǔn),因此VGA傳輸信號(hào)為模擬信號(hào),并且只能傳輸視頻信號(hào),不能傳輸音頻信號(hào)。
VGA接口共有15針,分成3排,每排5個(gè)孔,是顯卡上應(yīng)用最為廣泛的接口類(lèi)型,絕大多數(shù)顯卡都帶有此種接口。它傳輸紅、綠、藍(lán)模擬信號(hào)以及同步信號(hào)(水平和垂直信號(hào))。
VGA各針腳定義如下:
VGA支持在640×480的較高分辨率下同時(shí)顯示16種色彩或256種灰度,同時(shí)在320×240分辨率下可以同時(shí)顯示256種顏色。使用VGA連接設(shè)備時(shí),線(xiàn)纜長(zhǎng)度通常不超過(guò)10米,而且要注意接頭是否安裝牢固,否則可能引起圖像中出現(xiàn)虛影。
1.2 HDMI視頻接口
高清晰度多媒體接口(High Definition Multimedia Interface,HDMI)是一種數(shù)字化視頻/音頻接口技術(shù),是適合影像傳輸?shù)膶?zhuān)用型數(shù)字化接口,HDMI可同時(shí)傳送音頻和影音信號(hào),且在信號(hào)傳送前無(wú)需進(jìn)行數(shù)/模或者模/數(shù)轉(zhuǎn)換,是當(dāng)前視音頻主選接口。
HDMI自2002年提出以來(lái),已發(fā)展到HDMI 2.1標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)能夠支持4K 120Hz、8K 60Hz以及高動(dòng)態(tài)范圍成像(HDR),能夠針對(duì)場(chǎng)景或幀數(shù)進(jìn)行優(yōu)化,并向后兼容HDMI 2.0和HDMI 1.4,其中HDMI 1.4最高數(shù)據(jù)傳輸速度為10.2Gbps,HDMI 2.0最高數(shù)據(jù)傳輸速度為18Gbps。
HDMI在物理接口上主要包括以下幾種類(lèi)型:標(biāo)準(zhǔn)HDMI接口、mini HDMI接口和Micro HDMI接口。長(zhǎng)距離傳輸通常線(xiàn)材較硬 ,采用標(biāo)準(zhǔn)HDMI接口以確保穩(wěn)固連接;而小設(shè)備通常采用mini HDMI接口和Micro HDMI接口。
1.3 VGA與HDMI對(duì)比
VGA與HDMI的對(duì)比如下:
- VGA傳輸模擬信號(hào),傳輸過(guò)程需要轉(zhuǎn)換和緩存,存在一定損失;HDMI傳輸數(shù)字信號(hào),數(shù)據(jù)需要無(wú)壓縮,短距離無(wú)轉(zhuǎn)換無(wú)損失;
- VGA僅支持視頻傳輸;HDMI同時(shí)支持音頻傳輸;
- VGA采用PC標(biāo)準(zhǔn),色階從0至255;HDMI采用TV標(biāo)準(zhǔn),色階默認(rèn)從15至255;
- VGA在高分辨率下會(huì)存在失真虛化的問(wèn)題;HDMI支持4K高清分辨率;
- VGA不存在兼容顧慮;HDMI在PC上兼容性一般,通常不支持三屏以上多屏顯示。
隨著數(shù)字圖像的發(fā)展,VGA接口被淘汰已成為趨勢(shì),目前大部分新生產(chǎn)的PC和顯示器設(shè)備都不再支持VGA接口。然而,由于VGA標(biāo)準(zhǔn)早期的影響較大,大量投影儀等設(shè)備仍采用VGA,因此VGA接口目前仍被大量使用。
02
圖像顯示時(shí)序分析
盡管HDMI接口為減少干擾、增強(qiáng)傳輸可靠性采用了TMDS編碼,但其圖像掃描的本質(zhì)方法與VGA相同:通過(guò)行同步與場(chǎng)同步進(jìn)行掃描控制。在設(shè)計(jì)過(guò)程中通常采用專(zhuān)用芯片(例如SIL9134 HDMI編碼芯片與SIL9013 HDMI解碼芯片)完成TMDS編碼操作,因此掌握行同步與場(chǎng)同步的控制時(shí)序,就可以完成視頻圖像的顯示。
2.1 圖像顯示時(shí)序
視頻圖像顯示通常采用逐行掃描的方法:從屏幕左上方開(kāi)始,從左向右逐點(diǎn)掃描。每行掃描完成時(shí),用行同步信號(hào)HSYNC進(jìn)行同步,電子束回到下一行最左側(cè)起始位置,同時(shí)CRT對(duì)電子束進(jìn)行行消隱;每幀所有行掃描完成時(shí),用場(chǎng)同步信號(hào)VSYNC進(jìn)行幀同步,電子束回到屏幕左上方,同時(shí)CRT對(duì)電子束進(jìn)行進(jìn)行場(chǎng)消隱,開(kāi)始下一幀掃描。
HSYNC為行同步信號(hào)(Horizontal Synchronization),低電平時(shí)完成圖像行數(shù)據(jù)掃描,高電平時(shí)進(jìn)行行同步;VSYNC為場(chǎng)同步信號(hào)(Vertical Synchronization),低電平時(shí)進(jìn)行圖像數(shù)據(jù)掃描,高電平時(shí)進(jìn)行幀同步。
行同步信號(hào)HSYNC和場(chǎng)同步信號(hào)VSYNC均由四部分組成:Sync同步脈沖 + Back Porch消隱后肩時(shí)間 + Active Video數(shù)據(jù)有效時(shí)間 + Front Porch消隱前肩時(shí)間。
一幅圖片的顯示包括有效數(shù)據(jù)部分和消隱區(qū)部分,Blanking為圖像的消隱區(qū),Border和Addressable Video部分為圖像的有效數(shù)據(jù)部分,在800×600及以上分辨率中Horizontal Left Border、Horizontal Right Border、Vertical Top Border、Vertical Bottom Border四個(gè)參數(shù)為0,即不存在Border區(qū)域。
行同步時(shí)序以像素為單位,場(chǎng)同步時(shí)序以行為單位。例如1920×1080分辨率的圖像,行時(shí)序以每行1920個(gè)像素進(jìn)行同步和有效傳輸,場(chǎng)時(shí)序以每幀1080行進(jìn)行同步和有效傳輸。
2.2 不同分辨率顯示參數(shù)
通過(guò)行場(chǎng)同步時(shí)序分析可知,對(duì)于圖像分辨率為1920×1080@60Hz的圖像顯示,時(shí)鐘傳輸頻率并非僅考慮有效數(shù)據(jù)像素1920×1080×60=124.416MHz,而應(yīng)當(dāng)同時(shí)考慮有效數(shù)據(jù)和消隱區(qū)數(shù)據(jù)2200×1125×60=148.5MHz。
不同分辨率圖像有效數(shù)據(jù)和消隱區(qū)像素分布如下:
03
圖像顯示代碼實(shí)現(xiàn)
3.1 Verilog代碼
通過(guò)HDMI接口顯示圖像信息,主要包括兩部分:行場(chǎng)同步等信號(hào)生成模塊與IIC配置TMDS編碼芯片模塊。由于IIC協(xié)議配置芯片寄存器實(shí)現(xiàn)方法已在IIC協(xié)議中介紹,所以這里給出不同分辨率下HDMI行場(chǎng)同步信號(hào)的生成代碼:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: Cascatrix
// Engineer: Carson
//
// Create Date: 2023/01/15
// Design Name: Image_Base
// Module Name: cx_image
// Tool Versions: v1.0
// Description: Image read and generate display parameters
//
//////////////////////////////////////////////////////////////////////////////////
`define PIXEL_1920_1080
//`define PIXEL_1680_1050
//`define PIXEL_1280_1024
//`define PIXEL_1280_720
//`define PIXEL_1024_768
//`define PIXEL_800_600
//`define PIXEL_640_480
module cx_image(
inputwireclk,
outputreghs,
outputregvs,
outputwireen,
outputwire [23:0]data
);
//1920x1080 148.5Mhz
`ifdef PIXEL_1920_1080
parameter H_ACTIVE = 1920;// 行數(shù)據(jù)有效時(shí)間
parameter H_FRONT_PORCH = 88; // 行消隱前肩時(shí)間
parameter H_SYNC_TIME = 44; // 行同步信號(hào)時(shí)間
parameter H_BACK_PORCH = 148; // 行消隱后肩時(shí)間
parameter V_ACTIVE = 1080;// 列數(shù)據(jù)有效時(shí)間
parameter V_FRONT_PORCH = 4; // 列消隱前肩時(shí)間
parameter V_SYNC_TIME = 5; // 列同步信號(hào)時(shí)間
parameter V_BACK_PORCH = 36; // 列消隱后肩時(shí)間
`endif
//1680x1050 119Mhz
`ifdef PIXEL_1680_1050
parameter H_ACTIVE = 1680;// 行數(shù)據(jù)有效時(shí)間
parameter H_FRONT_PORCH = 48; // 行消隱前肩時(shí)間
parameter H_SYNC_TIME = 32; // 行同步信號(hào)時(shí)間
parameter H_BACK_PORCH = 80; // 行消隱后肩時(shí)間
parameter V_ACTIVE = 1050;// 列數(shù)據(jù)有效時(shí)間
parameter V_FRONT_PORCH = 3; // 列消隱前肩時(shí)間
parameter V_SYNC_TIME = 6; // 列同步信號(hào)時(shí)間
parameter V_BACK_PORCH = 21; // 列消隱后肩時(shí)間
`endif
//1280x1024 108Mhz
`ifdef PIXEL_1280_1024
parameter H_ACTIVE = 1280;// 行數(shù)據(jù)有效時(shí)間
parameter H_FRONT_PORCH = 48; // 行消隱前肩時(shí)間
parameter H_SYNC_TIME = 112; // 行同步信號(hào)時(shí)間
parameter H_BACK_PORCH = 248; // 行消隱后肩時(shí)間
parameter V_ACTIVE = 1024;// 列數(shù)據(jù)有效時(shí)間
parameter V_FRONT_PORCH = 1; // 列消隱前肩時(shí)間
parameter V_SYNC_TIME = 3; // 列同步信號(hào)時(shí)間
parameter V_BACK_PORCH = 38; // 列消隱后肩時(shí)間
`endif
//1280X720 74.25MHZ
`ifdef PIXEL_1280_720
parameter H_ACTIVE = 1280;// 行數(shù)據(jù)有效時(shí)間
parameter H_FRONT_PORCH = 110; // 行消隱前肩時(shí)間
parameter H_SYNC_TIME = 40; // 行同步信號(hào)時(shí)間
parameter H_BACK_PORCH = 220; // 行消隱后肩時(shí)間
parameter V_ACTIVE = 720; // 列數(shù)據(jù)有效時(shí)間
parameter V_FRONT_PORCH = 5; // 列消隱前肩時(shí)間
parameter V_SYNC_TIME = 5; // 列同步信號(hào)時(shí)間
parameter V_BACK_PORCH = 20; // 列消隱后肩時(shí)間
`endif
//1024x768 65Mhz
`ifdef PIXEL_1024_768
parameter H_ACTIVE = 1024;// 行數(shù)據(jù)有效時(shí)間
parameter H_FRONT_PORCH = 24; // 行消隱前肩時(shí)間
parameter H_SYNC_TIME = 136; // 行同步信號(hào)時(shí)間
parameter H_BACK_PORCH = 160; // 行消隱后肩時(shí)間
parameter V_ACTIVE = 768; // 列數(shù)據(jù)有效時(shí)間
parameter V_FRONT_PORCH = 3; // 列消隱前肩時(shí)間
parameter V_SYNC_TIME = 6; // 列同步信號(hào)時(shí)間
parameter V_BACK_PORCH = 29; // 列消隱后肩時(shí)間
`endif
//800x600 40Mhz
`ifdef PIXEL_800_600
parameter H_ACTIVE = 800;// 行數(shù)據(jù)有效時(shí)間
parameter H_FRONT_PORCH = 40 ;// 行消隱前肩時(shí)間
parameter H_SYNC_TIME = 128;// 行同步信號(hào)時(shí)間
parameter H_BACK_PORCH = 88 ;// 行消隱后肩時(shí)間
parameter V_ACTIVE = 600;// 列數(shù)據(jù)有效時(shí)間
parameter V_FRONT_PORCH = 1 ;// 列消隱前肩時(shí)間
parameter V_SYNC_TIME = 4 ;// 列同步信號(hào)時(shí)間
parameter V_BACK_PORCH = 23 ;// 列消隱后肩時(shí)間
`endif
//640x480 25.175Mhz
`ifdef PIXEL_640_480
parameter H_ACTIVE = 640; // 行數(shù)據(jù)有效時(shí)間
parameter H_FRONT_PORCH = 16 ; // 行消隱前肩時(shí)間
parameter H_SYNC_TIME = 96 ; // 行同步信號(hào)時(shí)間
parameter H_BACK_PORCH = 48 ; // 行消隱后肩時(shí)間
parameter V_ACTIVE = 480; // 列數(shù)據(jù)有效時(shí)間
parameter V_FRONT_PORCH = 10 ; // 列消隱前肩時(shí)間
parameter V_SYNC_TIME = 2 ; // 列同步信號(hào)時(shí)間
parameter V_BACK_PORCH = 33 ; // 列消隱后肩時(shí)間
`endif
parameter H_TOTAL_TIME = H_ACTIVE + H_FRONT_PORCH + H_SYNC_TIME + H_BACK_PORCH;
parameter V_TOTAL_TIME = V_ACTIVE + V_FRONT_PORCH + V_SYNC_TIME + V_BACK_PORCH;
reg h_act;
reg v_act;
reg [12:0] h_syn_cnt;
reg [12:0] v_syn_cnt;
reg [31:0] image_cnt;
// 有效數(shù)據(jù)控制
assign en = h_act & v_act;
// 行掃描計(jì)數(shù)器
always@(posedge clk)
begin
if(h_syn_cnt == H_TOTAL_TIME - 1)
h_syn_cnt <= 13'b0;
else
h_syn_cnt <= h_syn_cnt + 1'b1;
end
// 列掃描計(jì)數(shù)器
always@(posedge clk)
begin
if(h_syn_cnt == H_TOTAL_TIME - 1)
begin
if(v_syn_cnt == V_TOTAL_TIME-1)
v_syn_cnt <= 13'b0;
else
v_syn_cnt <= v_syn_cnt + 1'b1;
end
end
// 行同步控制
always@(posedge clk)
begin
if(h_syn_cnt < H_SYNC_TIME)
hs <= 1'b0;
else
hs <= 1'b1;
end
// 場(chǎng)同步控制
always@(posedge clk)
begin
if(v_syn_cnt < V_SYNC_TIME)
vs <= 1'b0;
else
vs <= 1'b1;
end
// 行有效控制
always@(posedge clk)
begin
if(h_syn_cnt == H_SYNC_TIME + H_BACK_PORCH - 1)
h_act = 1'b1;
else if(h_syn_cnt == H_SYNC_TIME + H_BACK_PORCH + H_ACTIVE - 1)
h_act = 1'b0;
end
// 列有效控制
always@(posedge clk)
begin
if(v_syn_cnt == V_SYNC_TIME + V_BACK_PORCH - 1 && h_syn_cnt == 0)
v_act = 1'b1;
else if(v_syn_cnt == V_SYNC_TIME + V_BACK_PORCH + V_ACTIVE - 1 && h_syn_cnt == 0)
v_act = 1'b0;
end
// 像素?cái)?shù)計(jì)數(shù)器
always@(posedge clk)
begin
if(image_cnt == H_ACTIVE*V_ACTIVE - 1)
image_cnt <= 'd0;
else if(h_act & v_act)
image_cnt <= image_cnt + 1;
end
// 圖像像素值存儲(chǔ)rom
rom_image inst_rom_image
(
.clk (clk),
.en (h_act & v_act),
.addr (image_cnt),
.dout (data)
);
endmodule
rom_image為圖像像素?cái)?shù)據(jù)存儲(chǔ)模塊,根據(jù)不同地址依次存入對(duì)應(yīng)像素的像素值。該模塊可通過(guò)Matlab生成,具體方法將在后續(xù)FPGA數(shù)字圖像仿真中介紹。部分代碼如下:
module rom_image
(
input clk,
input[31:0] addr,
input en,
output[23:0]dout
);
reg [23:0] DATA;
assigndout = DATA;
always@(*)
begin
if(en)
case(addr)
0 : DATA<=24'hB18D81;
1 : DATA<=24'h967266;
2 : DATA<=24'h987468;
...
2073597 : DATA<=24'hAE8070;
2073598 : DATA<=24'hAE8070;
2073599 : DATA<=24'hC79989;
default: DATA<= 0;
endcase
else
DATA <= 0;
end
endmodule
3.2 實(shí)現(xiàn)效果分析
選擇分辨率為1920×1080的圖像:
評(píng)論
查看更多