0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA數(shù)字圖像顯示原理與實(shí)現(xiàn)(Verilog)

HJ18656750788 ? 來源:Cascatrix ? 2023-01-29 14:12 ? 次閱讀

01視頻圖像接口概述

視頻圖像經(jīng)過數(shù)十年的發(fā)展,已形成了一系列的規(guī)范,以VGA和HDMI為主的視頻圖像接口協(xié)議也得到定義與推廣。盡管DP、DVI、Type-C等圖像接口技術(shù)近年來得到了推廣與應(yīng)用,且VGA傳輸性能發(fā)展逐漸落后于時代,但作為顯示器和顯卡等設(shè)備的通用顯示接口,VGA和HDMI仍是當(dāng)前主流的視頻圖像接口技術(shù)。

2d83fd1c-974f-11ed-bfe3-dac502259ad0.jpg ? ?

1.1 VGA視頻接口

視頻圖形陣列(VGA,Video Graphics Array),也可稱作D-Sub,是IBM于1987年提出的一個使用模擬信號電腦顯示標(biāo)準(zhǔn),因此VGA傳輸信號為模擬信號,并且只能傳輸視頻信號,不能傳輸音頻信號。

2d8b4b26-974f-11ed-bfe3-dac502259ad0.png

VGA接口共有15針,分成3排,每排5個孔,是顯卡上應(yīng)用最為廣泛的接口類型,絕大多數(shù)顯卡都帶有此種接口。它傳輸紅、綠、藍(lán)模擬信號以及同步信號(水平和垂直信號)。

VGA各針腳定義如下:

2d9478cc-974f-11ed-bfe3-dac502259ad0.jpg

VGA支持在640×480的較高分辨率下同時顯示16種色彩或256種灰度,同時在320×240分辨率下可以同時顯示256種顏色。使用VGA連接設(shè)備時,線纜長度通常不超過10米,而且要注意接頭是否安裝牢固,否則可能引起圖像中出現(xiàn)虛影。

1.2 HDMI視頻接口

高清晰度多媒體接口(High Definition Multimedia Interface,HDMI)是一種數(shù)字化視頻/音頻接口技術(shù),是適合影像傳輸?shù)膶S眯蛿?shù)字化接口,HDMI可同時傳送音頻和影音信號,且在信號傳送前無需進(jìn)行數(shù)/模或者模/數(shù)轉(zhuǎn)換,是當(dāng)前視音頻主選接口。

2d9ac682-974f-11ed-bfe3-dac502259ad0.png

HDMI自2002年提出以來,已發(fā)展到HDMI 2.1標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)能夠支持4K 120Hz、8K 60Hz以及高動態(tài)范圍成像(HDR),能夠針對場景或幀數(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在物理接口上主要包括以下幾種類型:標(biāo)準(zhǔn)HDMI接口、mini HDMI接口和Micro HDMI接口。長距離傳輸通常線材較硬 ,采用標(biāo)準(zhǔn)HDMI接口以確保穩(wěn)固連接;而小設(shè)備通常采用mini HDMI接口和Micro HDMI接口。

2db457dc-974f-11ed-bfe3-dac502259ad0.jpg

1.3 VGA與HDMI對比

VGA與HDMI的對比如下:

1. VGA傳輸模擬信號,傳輸過程需要轉(zhuǎn)換和緩存,存在一定損失;HDMI傳輸數(shù)字信號,數(shù)據(jù)需要無壓縮,短距離無轉(zhuǎn)換無損失;

2. VGA僅支持視頻傳輸;HDMI同時支持音頻傳輸;

3. VGA采用PC標(biāo)準(zhǔn),色階從0至255;HDMI采用TV標(biāo)準(zhǔn),色階默認(rèn)從15至255;

4. VGA在高分辨率下會存在失真虛化的問題;HDMI支持4K高清分辨率;

5. VGA不存在兼容顧慮;HDMI在PC上兼容性一般,通常不支持三屏以上多屏顯示。

隨著數(shù)字圖像的發(fā)展,VGA接口被淘汰已成為趨勢,目前大部分新生產(chǎn)的PC和顯示器設(shè)備都不再支持VGA接口。然而,由于VGA標(biāo)準(zhǔn)早期的影響較大,大量投影儀等設(shè)備仍采用VGA,因此VGA接口目前仍被大量使用。

02圖像顯示時序分析

盡管HDMI接口為減少干擾、增強(qiáng)傳輸可靠性采用了TMDS編碼,但其圖像掃描的本質(zhì)方法與VGA相同:通過行同步與場同步進(jìn)行掃描控制。在設(shè)計過程中通常采用專用芯片(例如SIL9134 HDMI編碼芯片與SIL9013 HDMI解碼芯片)完成TMDS編碼操作,因此掌握行同步與場同步的控制時序,就可以完成視頻圖像的顯示。

2.1 圖像顯示時序

視頻圖像顯示通常采用逐行掃描的方法:從屏幕左上方開始,從左向右逐點(diǎn)掃描。每行掃描完成時,用行同步信號HSYNC進(jìn)行同步,電子束回到下一行最左側(cè)起始位置,同時CRT對電子束進(jìn)行行消隱;每幀所有行掃描完成時,用場同步信號VSYNC進(jìn)行幀同步,電子束回到屏幕左上方,同時CRT對電子束進(jìn)行進(jìn)行場消隱,開始下一幀掃描。

HSYNC為行同步信號(Horizontal Synchronization),低電平時完成圖像行數(shù)據(jù)掃描,高電平時進(jìn)行行同步;VSYNC為場同步信號(Vertical Synchronization),低電平時進(jìn)行圖像數(shù)據(jù)掃描,高電平時進(jìn)行幀同步。

2dbc4906-974f-11ed-bfe3-dac502259ad0.jpg

行同步信號HSYNC和場同步信號VSYNC均由四部分組成:Sync同步脈沖 + Back Porch消隱后肩時間 + Active Video數(shù)據(jù)有效時間 + Front Porch消隱前肩時間。

2dd39048-974f-11ed-bfe3-dac502259ad0.jpg

一幅圖片的顯示包括有效數(shù)據(jù)部分和消隱區(qū)部分,Blanking為圖像的消隱區(qū),Border和Addressable Video部分為圖像的有效數(shù)據(jù)部分,在800×600及以上分辨率中Horizontal Left Border、Horizontal Right Border、Vertical Top Border、Vertical Bottom Border四個參數(shù)為0,即不存在Border區(qū)域。

2defb962-974f-11ed-bfe3-dac502259ad0.png

行同步時序以像素為單位,場同步時序以行為單位。例如1920×1080分辨率的圖像,行時序以每行1920個像素進(jìn)行同步和有效傳輸,場時序以每幀1080行進(jìn)行同步和有效傳輸。

2.2 不同分辨率顯示參數(shù)

通過行場同步時序分析可知,對于圖像分辨率為1920×1080@60Hz的圖像顯示,時鐘傳輸頻率并非僅考慮有效數(shù)據(jù)像素1920×1080×60=124.416MHz,而應(yīng)當(dāng)同時考慮有效數(shù)據(jù)和消隱區(qū)數(shù)據(jù)2200×1125×60=148.5MHz。

不同分辨率圖像有效數(shù)據(jù)和消隱區(qū)像素分布如下:

2e14cc52-974f-11ed-bfe3-dac502259ad0.png

03圖像顯示代碼實(shí)現(xiàn)

3.1 Verilog代碼

通過HDMI接口顯示圖像信息,主要包括兩部分:行場同步等信號生成模塊與IIC配置TMDS編碼芯片模塊。由于IIC協(xié)議配置芯片寄存器實(shí)現(xiàn)方法已在IIC協(xié)議中介紹,所以這里給出不同分辨率下HDMI行場同步信號的生成代碼:

`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ù)有效時間

parameter H_FRONT_PORCH = 88; // 行消隱前肩時間

parameter H_SYNC_TIME = 44; // 行同步信號時間

parameter H_BACK_PORCH = 148; // 行消隱后肩時間

parameter V_ACTIVE = 1080;// 列數(shù)據(jù)有效時間

parameter V_FRONT_PORCH = 4; // 列消隱前肩時間

parameter V_SYNC_TIME = 5; // 列同步信號時間

parameter V_BACK_PORCH = 36; // 列消隱后肩時間

`endif

//1680x1050 119Mhz

`ifdef PIXEL_1680_1050

parameter H_ACTIVE = 1680;// 行數(shù)據(jù)有效時間

parameter H_FRONT_PORCH = 48; // 行消隱前肩時間

parameter H_SYNC_TIME = 32; // 行同步信號時間

parameter H_BACK_PORCH = 80; // 行消隱后肩時間

parameter V_ACTIVE = 1050;// 列數(shù)據(jù)有效時間

parameter V_FRONT_PORCH = 3; // 列消隱前肩時間

parameter V_SYNC_TIME = 6; // 列同步信號時間

parameter V_BACK_PORCH = 21; // 列消隱后肩時間

`endif

//1280x1024 108Mhz

`ifdef PIXEL_1280_1024

parameter H_ACTIVE = 1280;// 行數(shù)據(jù)有效時間

parameter H_FRONT_PORCH = 48; // 行消隱前肩時間

parameter H_SYNC_TIME = 112; // 行同步信號時間

parameter H_BACK_PORCH = 248; // 行消隱后肩時間

parameter V_ACTIVE = 1024;// 列數(shù)據(jù)有效時間

parameter V_FRONT_PORCH = 1; // 列消隱前肩時間

parameter V_SYNC_TIME = 3; // 列同步信號時間

parameter V_BACK_PORCH = 38; // 列消隱后肩時間

`endif

//1280X720 74.25MHZ

`ifdef PIXEL_1280_720

parameter H_ACTIVE = 1280;// 行數(shù)據(jù)有效時間

parameter H_FRONT_PORCH = 110; // 行消隱前肩時間

parameter H_SYNC_TIME = 40; // 行同步信號時間

parameter H_BACK_PORCH = 220; // 行消隱后肩時間

parameter V_ACTIVE = 720; // 列數(shù)據(jù)有效時間

parameter V_FRONT_PORCH = 5; // 列消隱前肩時間

parameter V_SYNC_TIME = 5; // 列同步信號時間

parameter V_BACK_PORCH = 20; // 列消隱后肩時間

`endif

//1024x768 65Mhz

`ifdef PIXEL_1024_768

parameter H_ACTIVE = 1024;// 行數(shù)據(jù)有效時間

parameter H_FRONT_PORCH = 24; // 行消隱前肩時間

parameter H_SYNC_TIME = 136; // 行同步信號時間

parameter H_BACK_PORCH = 160; // 行消隱后肩時間

parameter V_ACTIVE = 768; // 列數(shù)據(jù)有效時間

parameter V_FRONT_PORCH = 3; // 列消隱前肩時間

parameter V_SYNC_TIME = 6; // 列同步信號時間

parameter V_BACK_PORCH = 29; // 列消隱后肩時間

`endif

//800x600 40Mhz

`ifdef PIXEL_800_600

parameter H_ACTIVE = 800;// 行數(shù)據(jù)有效時間

parameter H_FRONT_PORCH = 40 ;// 行消隱前肩時間

parameter H_SYNC_TIME = 128;// 行同步信號時間

parameter H_BACK_PORCH = 88 ;// 行消隱后肩時間

parameter V_ACTIVE = 600;// 列數(shù)據(jù)有效時間

parameter V_FRONT_PORCH = 1 ;// 列消隱前肩時間

parameter V_SYNC_TIME = 4 ;// 列同步信號時間

parameter V_BACK_PORCH = 23 ;// 列消隱后肩時間

`endif

//640x480 25.175Mhz

`ifdef PIXEL_640_480

parameter H_ACTIVE = 640; // 行數(shù)據(jù)有效時間

parameter H_FRONT_PORCH = 16 ; // 行消隱前肩時間

parameter H_SYNC_TIME = 96 ; // 行同步信號時間

parameter H_BACK_PORCH = 48 ; // 行消隱后肩時間

parameter V_ACTIVE = 480; // 列數(shù)據(jù)有效時間

parameter V_FRONT_PORCH = 10 ; // 列消隱前肩時間

parameter V_SYNC_TIME = 2 ; // 列同步信號時間

parameter V_BACK_PORCH = 33 ; // 列消隱后肩時間

`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;

// 行掃描計數(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

// 列掃描計數(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

// 場同步控制

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

// 像素數(shù)計數(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

// 圖像像素值存儲rom

rom_image inst_rom_image

(

.clk (clk),

.en (h_act & v_act),

.addr (image_cnt),

.dout (data)

);

endmodule

rom_image為圖像像素數(shù)據(jù)存儲模塊,根據(jù)不同地址依次存入對應(yīng)像素的像素值。該模塊可通過Matlab生成,具體方法將在后續(xù)FPGA數(shù)字圖像仿真中介紹。部分代碼如下:

module rom_image

(

input clk,

input[31:0] addr,

inputen,

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的圖像:

2e383156-974f-11ed-bfe3-dac502259ad0.png

FPGA通過HDMI輸入到顯示器,顯示效果如下:

2e46ecaa-974f-11ed-bfe3-dac502259ad0.jpg

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21736

    瀏覽量

    603419
  • HDMI
    +關(guān)注

    關(guān)注

    32

    文章

    1704

    瀏覽量

    151931
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8598

    瀏覽量

    151163
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110101
  • 數(shù)字圖像
    +關(guān)注

    關(guān)注

    2

    文章

    119

    瀏覽量

    18762

原文標(biāo)題:FPGA數(shù)字圖像顯示原理與實(shí)現(xiàn)(Verilog)

文章出處:【微信號:Carlinx FPGA,微信公眾號:Carlinx FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    RGB數(shù)字圖像顯示中錯誤圖像分析

    RGB數(shù)字圖像顯示中錯誤圖像分析Incorrect colours in the RGB display of the "digital" colour bars Products:CCVS +[hide][/hide]
    發(fā)表于 06-13 00:05

    數(shù)字圖像空域?yàn)V波算法的FPGA設(shè)計

    方法卻都是類似的,都是通過模板卷積的方法來實(shí)現(xiàn)的?! LSI技術(shù)的迅猛發(fā)展為數(shù)字圖像實(shí)時處理技術(shù)提供了硬件基礎(chǔ),其中FPGA(現(xiàn)場可編程門陣列)的特點(diǎn)使其非常適用于數(shù)字圖像處理。本文
    發(fā)表于 02-24 14:20

    DCT實(shí)現(xiàn)Verilog HDL的數(shù)字圖像處理源代碼

    DCT實(shí)現(xiàn)Verilog HDL的數(shù)字圖像處理源代碼
    發(fā)表于 08-11 09:30

    基于FPGA的B超數(shù)字圖像實(shí)時采集系統(tǒng)

    基于FPGA的B超數(shù)字圖像實(shí)時采集系統(tǒng)
    發(fā)表于 08-17 11:55

    FreeDev FPGA數(shù)字圖像處理板

    FreeDev FPGA數(shù)字圖像處理板
    發(fā)表于 08-17 22:34

    基于FPGA數(shù)字圖像處理中的邊緣檢測系統(tǒng)

    `基于FPGA數(shù)字圖像處理領(lǐng)域的邊緣檢測系統(tǒng)。該系統(tǒng)實(shí)現(xiàn)了從24位真彩色圖片的存儲到VGA顯示邊緣信息。`
    發(fā)表于 06-26 13:36

    有誰用FPGA做過數(shù)字圖像直方圖統(tǒng)計

    剛開始用FPGA數(shù)字圖像處理,看了一些有關(guān)直方圖方面的資料但是感覺還是不太清晰,請問有誰做過求帶順便求推薦FPGA數(shù)字圖像處理方面入門級的書
    發(fā)表于 08-21 09:48

    有誰用FPGA做過數(shù)字圖像直方圖統(tǒng)計

    剛開始用FPGA數(shù)字圖像處理,看了一些有關(guān)直方圖方面的資料但是感覺還是不太清晰,請問有誰做過求帶順便求推薦FPGA數(shù)字圖像處理方面入門級的書
    發(fā)表于 08-23 11:01

    基于FPGA數(shù)字圖像處理

    分享一本用fpga數(shù)字圖像處理的書。
    發(fā)表于 03-05 21:40

    【電子書】基于FPGA數(shù)字圖像處理

    `一個FPGA工程師的數(shù)字圖像處理筆記。`
    發(fā)表于 03-29 15:01

    怎么利用FPGA實(shí)現(xiàn)數(shù)字圖像的空域?yàn)V波算法?

    本文研究的就是在FPGA設(shè)計平臺上設(shè)計硬件電路,實(shí)現(xiàn)數(shù)字圖像的空域?yàn)V波算法。
    發(fā)表于 04-30 06:29

    基于FPGA數(shù)字圖像顯示系統(tǒng)

    主要討論如何利用FPGA 實(shí)現(xiàn)數(shù)字圖像在VGA 顯示器和電視上進(jìn)行顯示, 并介紹所使用的Atmel AT40K 系列
    發(fā)表于 04-16 14:16 ?25次下載

    基于FPGA數(shù)字圖像顯示系統(tǒng)

    主要討論如何利用FPGA 實(shí)現(xiàn)數(shù)字圖像在VGA 顯示器和電視上進(jìn)行顯示, 并介紹所使用的Atmel AT40K 系列
    發(fā)表于 05-14 14:44 ?17次下載

    數(shù)字圖像邊緣檢測的FPGA實(shí)現(xiàn)

    數(shù)字圖像邊緣檢測的FPGA實(shí)現(xiàn)......
    發(fā)表于 01-04 15:31 ?18次下載

    FPGA設(shè)計中 Verilog HDL實(shí)現(xiàn)基本的圖像濾波處理仿真

    參考。 《岡薩雷斯數(shù)字圖像處理MATLAB版》中文版(第二版) 電子版 薦讀:FPGA設(shè)計經(jīng)驗(yàn)之圖像處理 基于FPGA的實(shí)時圖像邊緣檢測系統(tǒng)
    的頭像 發(fā)表于 07-13 09:30 ?2827次閱讀