日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDMI显示图片

發布時間:2023/12/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDMI显示图片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1,HDMI簡介

??VGA 接口體積較大,不利于便攜設備的集成;且傳輸的模擬信號易受外界干擾,產生信號畸變。VGA接口之后,推出了DUI接口,DVI 是基于 TMDS(Transition Minimized Differential Signaling, 最小化傳輸差分信號)技術來傳輸數字信號。 TMDS 運用先進的編碼算法把 8bit 數據(R、 G、 B 中的每路基色信號)通過最小轉換編碼為 10bit 數據(包含行場同步信息、時鐘信息、數據 DE、糾錯等),經過直流均衡后,采用差分信號傳輸數據,它和LVDS、 TTL 相比有較好的電磁兼容性能,可以用低成本的專用電纜實現長距離、高質量的數字信號傳輸。數字視頻接口(DVI)是一種國際開放的接口標準,在 PC、 DVD、高清晰電視(HDTV)、高清晰投影儀等設備上有廣泛的應用。

??DVI 接口分為 3 大類: DVI-Analog(DVI-A)接口(12+5)只傳輸模擬信號,實質就是 VGA 模擬傳輸接口規格; DVI-Digital(DVI-D)接口(18+1 和 24+1)是純數字的接口,只能傳輸數字信號,不兼容模擬信號; DVI-Integrated(DVI-I)接口(18+5 和 24+5)是兼容數字和模擬接口的。

??DVI接口的缺點:對平板電視的兼容能力一般,對數字化的色差信號無法支持;由于考慮兼容性,預留不少引腳,造成接口體積較大;只能傳輸圖像信號,對于數字音頻信號的支持完全沒有考慮。

??HDMI 全稱“High Definition Multimedia Interface 高清多媒體接口”。是一種符合高清時代標準的全新數字化視頻/音頻接口技術。HDMI的傳輸原理依然是基于TMDS編碼技術。相比于DVI,HDMI接口體積更小抗干擾能力強;針對大尺寸數字平板電視分辨率進行優化,兼容性好;擁有強大的版權保護機制(HDCP);支持24bit色深處理(RGB,YCbCr);一根線纜實現數字音頻、視頻信號同步傳輸,有效降低使用成本和繁雜程度。

2,HDMI接口及引腳定義

??HDMI 規格書中規定了 HDMI 的 4 種接口類型,但其中 HDMI B Type 接口類型未在市場中出現過,市面上流通最廣的是 HDMI A Type、 HDMI C Type 和 HDMI D Type 接口類型。

??HDMI A Type 接口, 應用于 HDMI1.0 版本,總共有 19pin,為最常見的 HDMI 接頭規格;HDMI C Type 接口, 俗稱 mini-HDMI,應用于 HDMI1.3 版本,總共有 19pin,可以說是縮小版的 HDMI A type,但腳位定義有一定的改變;HDMI D Type 接口, 應用于 HDMI1.4 版本,總共有 19pin,腳位定義有所改變。


??HDMI 接口之間使用 HDMI 信號線連接,不同類型的 HDMI 接口之間也可以使用連接線進行轉接。

HDMI A Type 接口引腳圖

引腳定義引腳定義
1數據 2+ (TMDS Data2+)11時鐘屏蔽 (TMDS Clock Shield)
2數據 2 屏蔽 (TMDS Data2 Shield)12時鐘- (TMDS Clock–)
3數據 2- ( TMDS Data2-)13CEC
4數據 1+ (TMDS Data1+)14保留
5數據 1 屏蔽 (TMDS Data1 Shield)15DDC 時鐘線(SCL)
6數據 1- ( TMDS Data1-)16DDC 數據線(SDA)
7數據 0+ (TMDS Data0+)17DDC/CEC 地 (DDC/CEC GND)
8數據 0 屏蔽 (TMDS Data0 Shield)18+5V 電源 (Power)
9數據 0- ( TMDS Data0-)19熱插拔檢測 (Hot Plug Detect)
10時鐘+ (TMDS Clock+)

??由圖表可知, HDMI 接口共有 19 個引腳,分上下兩排,奇數在上,偶數在下,穿插排布。根據其功能,可以將引腳分為 4 類。

  • TMDS 通道:引腳 1-引腳 12。負責發送音頻、視頻及各種輔助數據; 遵循 DVI1.0 規格的信號編碼方式; 視頻像素帶寬從 25 MHz 到 340 MHz(Type A, HDMI 1.3)或至680MHz (Type B)。帶寬低于 25MHz 的視頻信號如 NTSC480i 將以倍頻方式輸出; 每個像素的容許數據量從 24 位至 48 位。支持每秒 120 張畫面 1080p 分辨率畫面發送以及WQSXGA (3200 x 2048)分辨率;支持 RGB、 YCbCr 4:4:4(8-16 bits per component) 、 YCbCr 4:2:2(12bits per component) 、 YCbCr 4:2:0(HDMI 2.0) 等多種像素編碼方式; 音頻采樣率支持32kHz、 44.1kHz、 48kHz、88.2kHz 96kHz、 176.4kHz、 192kHz、 1536kHz(HDMI2.0) ; 音頻聲道數量最大 8 聲道。 HDMI 2.0 支持 32 聲道。音頻流規格為 IEC61937 兼容流,包括高流量無損信號如 Dolby TrueHD、 DTS-HD Master Audio。

  • DDC 通道:引腳 15、 16、 17。 DDC 全文為 Display Data Channel,譯為“顯示數據通道”; 發送端與接收端可利用 DDC 溝道得知彼此的發送與接收能力,但 HDMI 僅需單向獲知接收端(顯示器)的能力; DDC 通道使用 100kHz 時鐘頻率的 I2C 信號, 發送數據結構為 VESA Enhanced EDID(V1.3)。

  • CEC 通道:引腳 13、 17。 CEC 全文為 Consumer Electronics Control, CEC 通道為必須預留線路,但可以不必實現,作用是用來發送工業規格的 AV Link 協議信號,以便支持單一遙控器操作多臺 AV 機器, 為單芯線雙向串列總線。

  • 其他通道:引腳 14 位保留引腳,無連接;引腳 18 為+5V 電源;引腳 19 位熱插拔檢測引腳。

3,HDMI顯示原理

??HDMI 系統架構由信源端和接收端組成。某個設備可能有一個或多個 HDMI 輸入,一個或多個 HDMI 輸出。這些設備上,每個 HDMI 輸入都應該遵循 HDMI 接收端規則, 每個 HDMI 輸出都應該遵循 HDMI 信源端規則。HDMI數據傳輸框圖如下:

??HDMI 線纜和連接器提供四個差分線對,組成 TMDS 數據和時鐘通道, 這些通道用于傳遞視頻,音頻和輔助數據; 另外, HDMI 提供一個 VESA DDC 通道, DDC 是用于配置和在一個單獨的信源端和一個單獨的接收端交換狀態; 可選擇的 CEC在用戶的各種不同的音視頻產品中, 提供高水平的控制功能; 可選擇的 HDMI 以太網和音頻返回(HEAC),在連接的設備中提供以太網兼容的網絡數據和一個和 TMDS 相對方向的音頻回返通道;此外還有熱插拔檢測信號 HDP, 當顯示器等 HDMI 接口的顯示設備通過 HDMI 接口與 HDMI 信源端相連或斷開連接時, HDMI 信源端能夠通過 HPD 引腳檢測出
這一事件,并做出響應。

4,TMDS簡介

??HDMI 中的 TMDS 傳輸系統分為兩個部分:發送端和接收端。 TMDS 發送端收到HDMI 接口傳來的表示 RGB 信號的 24 位并行數據(TMDS 對每個像素的 RGB 三原色分別按 8bit 編碼,即 R 信號有 8 位, G 信號有 8 位, B 信號有 8 位),然后對這些數據和時鐘信號進行編碼和并/串轉換,再將表示 3 個 RGB 信號的數據和時鐘信號分別分配到獨立的傳輸通道發送出去。接收端接收來自發送端的串行信號,對其進行解碼和串/并轉換,然后發送到顯示器的控制端。與此同時也接收時鐘信號,以實現同步。流程框圖如下

??TMDS 通道包括 3 個 RGB 數據傳輸通道和 1 個時鐘信號傳輸通道。每一通道都通過編碼算法,將 8 位的視頻、音頻數據轉換成最小化傳輸、直流平衡的 10 位數據, 8 位數據經過編碼和直流平衡得到 10 位最小化數據,看似增加了冗余位,對傳輸鏈路的帶寬要求會更高,但事實上,通過這種算法得到的 10 位數據在更長的同軸電纜中傳輸的可靠性增強了。最小化傳輸差分信號是通過異或及異或非等邏輯算法將原始 8 位數據轉換成 10 位數據,前8 位數據由原始信號經邏輯運算后邏輯得到,第 9 位指示運算的方式,第 10 位用來對應直流平衡。

??要實現 TMDS 通道傳輸,首先要將傳入的 8 位的并行數據進行編碼、并/串轉換,添加第 9 位編碼位,將 8 位并行數據發送到 TMDS 接收端;將接收到的 8 位數據并/串轉換;隨后進行最小化傳輸處理,加上第 9 位,即編碼過程。

??添加編碼位的數據需要進行直流均衡處理。 直流平衡(DC-balanced)就是指在編碼過程中保證信道中直流偏移為零,使信道中傳輸數據包含的 1 與 0 的個數相同。方法是在添加編碼位的 9 位數據的后面加上第 10 位數據, 保證 10 位數據中 1 與 0 個數相同。這樣,傳輸的數據趨于直流平衡,使信號對傳輸線的電磁干擾減少,提高信號傳輸的可靠性。

??直流均衡處理后的 10 位數據需要進行單端轉差分處理。 TMDS 差分傳動技術是一種利用 2 個引腳間電壓差來傳送信號的技術。傳輸數據的數值(“0”或者“1”)由兩腳間電壓正負極性和大小決定。即采用 2 根線來傳輸信號,一根線上傳輸原來的信號,另一根線上傳輸與原來信號相反的信號。這樣接收端就可以通過讓一根線上的信號減去另一根線上的信號的方式來屏蔽電磁干擾,從而得到正確的信號。

5,HDMI顯示圖片的實現

設計的整體框圖如下

5.1 clk_gen 時鐘產生模塊

??通過PLL IP核產生兩路輸出時鐘,分別為25MHz,125MHz為其他模塊提供時鐘。

5.2 vga_pic,vga_ctrl 顯示數據的產生與控制

??vga_ctrl模塊輸出坐標數據,圖像有效信號,行場同步信號以及像素數據。代碼如下

module vga_ctrl (input wire vga_clk , //輸入工作時鐘,頻率25MHzinput wire sys_rst_n , //輸入復位信號,低電平有效input wire [15:0] pix_data , //輸入像素點色彩信息output wire [11:0] pix_x , //輸出VGA有效顯示區域像素點X軸坐標output wire [11:0] pix_y , //輸出VGA有效顯示區域像素點Y軸坐標output wire hsync , //輸出行同步信號output wire vsync , //輸出場同步信號output wire rgb_valid ,output wire [15:0] rgb //輸出像素點色彩信息 );//********************************************************************// //****************** Parameter and Internal Signal *******************// //********************************************************************// //parameter define parameter H_SYNC = 10'd96 , //行同步H_BACK = 10'd40 , //行時序后沿H_LEFT = 10'd8 , //行時序左邊框H_VALID = 10'd640 , //行有效數據H_RIGHT = 10'd8 , //行時序右邊框H_FRONT = 10'd8 , //行時序前沿H_TOTAL = 10'd800 ; //行掃描周期 parameter V_SYNC = 10'd2 , //場同步V_BACK = 10'd25 , //場時序后沿V_TOP = 10'd8 , //場時序上邊框V_VALID = 10'd480 , //場有效數據V_BOTTOM = 10'd8 , //場時序下邊框V_FRONT = 10'd2 , //場時序前沿V_TOTAL = 10'd525 ; //場掃描周期//wire define wire pix_data_req ; //像素點色彩信息請求信號//reg define reg [11:0] cnt_h ; //行同步信號計數器 reg [11:0] cnt_v ; //場同步信號計數器//********************************************************************// //***************************** Main Code ****************************// //********************************************************************////cnt_h:行同步信號計數器 always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_h <= 12'd0 ;else if(cnt_h == H_TOTAL - 1'd1)cnt_h <= 12'd0 ;elsecnt_h <= cnt_h + 1'd1 ;//hsync:行同步信號 assign hsync = (cnt_h <= H_SYNC - 1'd1) ? 1'b1 : 1'b0 ;//cnt_v:場同步信號計數器 always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_v <= 12'd0 ;else if((cnt_v == V_TOTAL - 1'd1) && (cnt_h == H_TOTAL-1'd1))cnt_v <= 12'd0 ;else if(cnt_h == H_TOTAL - 1'd1)cnt_v <= cnt_v + 1'd1 ;elsecnt_v <= cnt_v ;//vsync:場同步信號 assign vsync = (cnt_v <= V_SYNC - 1'd1) ? 1'b1 : 1'b0 ;//rgb_valid:VGA有效顯示區域 assign rgb_valid = (((cnt_h >= H_SYNC + H_BACK + H_LEFT)&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID))&&((cnt_v >= V_SYNC + V_BACK + V_TOP)&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))? 1'b1 : 1'b0;//pix_data_req:像素點色彩信息請求信號,超前rgb_valid信號一個時鐘周期 assign pix_data_req = (((cnt_h >= H_SYNC + H_BACK + H_LEFT - 1'b1)&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID - 1'b1))&&((cnt_v >= V_SYNC + V_BACK + V_TOP)&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))? 1'b1 : 1'b0;//pix_x,pix_y:VGA有效顯示區域像素點坐標 assign pix_x = (pix_data_req == 1'b1)? (cnt_h - (H_SYNC + H_BACK + H_LEFT - 1'b1)) : 12'hfff; assign pix_y = (pix_data_req == 1'b1)? (cnt_v - (V_SYNC + V_BACK + V_TOP)) : 12'hfff;//rgb:輸出像素點色彩信息 assign rgb = (rgb_valid == 1'b1) ? pix_data : 16'b0 ;endmodule

vga_pic模塊,pix_x,pix_y坐標值處于圖像顯示有效區域時,從ROM中讀取像素數據,然后輸出,代碼如下

module vga_pic (input wire vga_clk , //輸入工作時鐘,頻率25MHzinput wire sys_rst_n , //輸入復位信號,低電平有效input wire [11:0] pix_x , //輸入VGA有效顯示區域像素點X軸坐標input wire [11:0] pix_y , //輸入VGA有效顯示區域像素點Y軸坐標output [15:0] pix_data //輸出像素點色彩信息 );//********************************************************************// //****************** Parameter and Internal Signal *******************// //********************************************************************// //parameter define parameter CHAR_B_H = 10'd192 , CHAR_B_V = 10'd208 ; parameter CHAR_W = 10'd100 ,CHAR_H = 10'd100 ;parameter BLACK = 12'h000 ,WHITE = 12'hfff ,BLUE = 12'h00F ; //藍色wire rom_req;reg [13:0] rom_addr; wire [15:0] rom_data;//何時從rom中讀取數據 assign rom_req = (((pix_x >= CHAR_B_H - 1'b1) && (pix_x < (CHAR_B_H + CHAR_W - 1'b1)))&&((pix_y >= CHAR_B_V) && (pix_y < (CHAR_B_V + CHAR_H)))) ? 1'b1:1'b0;//產生rom地址 always @(posedge vga_clk,negedge sys_rst_n) beginif(!sys_rst_n)rom_addr <= 14'd0;else if(rom_req == 1'b1) beginif(rom_addr == 14'd9999)rom_addr <= 14'd0;elserom_addr <= rom_addr + 1;endelserom_addr <= rom_addr; end//輸出數據 rom_pic rom_pic_inst(.clock (vga_clk) ,.address (rom_addr) ,.q (rom_data) );assign pix_data = (rom_req == 1'b1) ? rom_data:WHITE;endmodule

5.3 hdmi_ctrl模塊

??該模塊實現對輸入的顏色分量及時鐘進行編碼,并串轉換,差分輸出的功能,模塊框圖如下

??按照上面的模塊框圖,首先對編碼模塊進行編寫,編碼模塊按照官方手冊進行編寫。編碼模塊參考流程圖中個參數說明。

符號說明
D, C0, C1, DE編碼器輸入數據。 D 是八位像素數據, C1 和 C0 是通道的控制數據,DE 是數據使能。
cnt寄存器,用來跟蹤數據流的不一致,正值表示發送的 1 的個數超過的數目,負數表示發送的 0 的個數超過的數目。表達式 cnt{t-1}表示相對于輸入數據前一個集的前一個不一致值。表達式 cnt{t}表示相對于輸入數據當前集的新的不一致設置。
q_out完成編碼后的 10bit 數據。
N1{x}返回參數 x 中“1”的個數。
N0{x}返回參數 x 中“1”的個數。

編碼模塊參考流程圖


代碼如下

module encode (input wire sys_clk , //時鐘信號input wire sys_rst_n , //復位信號,低有效input wire [7:0] data_in , //輸入8bit待編碼數據input wire c0 , //控制信號c0input wire c1 , //控制信號c1input wire de , //使能信號output reg [9:0] data_out //輸出編碼后的10bit數據 );//********************************************************************// //****************** Parameter and Internal Signal *******************// //********************************************************************// //parameter define parameter DATA_OUT0 = 10'b1101010100,DATA_OUT1 = 10'b0010101011,DATA_OUT2 = 10'b0101010100,DATA_OUT3 = 10'b1010101011;//wire define wire condition_1 ; //條件1 wire condition_2 ; //條件2 wire condition_3 ; //條件3 wire [8:0] q_m ; //第一階段轉換后的9bit數據//reg define reg [3:0] data_in_n1 ; //待編碼數據中1的個數 reg [7:0] data_in_reg ; //待編碼數據打一拍 reg [3:0] q_m_n1 ; //轉換后9bit數據中1的個數 reg [3:0] q_m_n0 ; //轉換后9bit數據中0的個數 reg [4:0] cnt ; //視差計數器,0-1個數差別,最高位為符號位 reg de_reg1 ; //使能信號打一拍 reg de_reg2 ; //使能信號打兩拍 reg c0_reg1 ; //控制信號c0打一拍 reg c0_reg2 ; //控制信號c0打兩拍 reg c1_reg1 ; //控制信號c1打一拍 reg c1_reg2 ; //控制信號c1打兩拍 reg [8:0] q_m_reg ; //q_m信號打一拍//********************************************************************// //***************************** Main Code ****************************// //********************************************************************// //data_in_n1:待編碼數據中1的個數 always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)data_in_n1 <= 4'd0;elsedata_in_n1 <= data_in[0] + data_in[1] + data_in[2]+ data_in[3] + data_in[4] + data_in[5]+ data_in[6] + data_in[7];//data_in_reg:待編碼數據打一拍 always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)data_in_reg <= 8'b0;elsedata_in_reg <= data_in;//condition_1:條件1 assign condition_1 = ((data_in_n1 > 4'd4) || ((data_in_n1 == 4'd4)&& (data_in_reg[0] == 1'b0)));//q_m:第一階段轉換后的9bit數據 assign q_m[0] = data_in_reg[0]; assign q_m[1] = (condition_1) ? (q_m[0] ^~ data_in_reg[1]) : (q_m[0] ^ data_in_reg[1]); assign q_m[2] = (condition_1) ? (q_m[1] ^~ data_in_reg[2]) : (q_m[1] ^ data_in_reg[2]); assign q_m[3] = (condition_1) ? (q_m[2] ^~ data_in_reg[3]) : (q_m[2] ^ data_in_reg[3]); assign q_m[4] = (condition_1) ? (q_m[3] ^~ data_in_reg[4]) : (q_m[3] ^ data_in_reg[4]); assign q_m[5] = (condition_1) ? (q_m[4] ^~ data_in_reg[5]) : (q_m[4] ^ data_in_reg[5]); assign q_m[6] = (condition_1) ? (q_m[5] ^~ data_in_reg[6]) : (q_m[5] ^ data_in_reg[6]); assign q_m[7] = (condition_1) ? (q_m[6] ^~ data_in_reg[7]) : (q_m[6] ^ data_in_reg[7]); assign q_m[8] = (condition_1) ? 1'b0 : 1'b1;//q_m_n1:轉換后9bit數據中1的個數 //q_m_n0:轉換后9bit數據中0的個數 always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)beginq_m_n1 <= 4'd0;q_m_n0 <= 4'd0;endelsebeginq_m_n1 <= q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7];q_m_n0 <= 4'd8 - (q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7]);end//condition_2:條件2 assign condition_2 = ((cnt == 5'd0) || (q_m_n1 == q_m_n0));//condition_3:條件3 assign condition_3 = (((~cnt[4] == 1'b1) && (q_m_n1 > q_m_n0))|| ((cnt[4] == 1'b1) && (q_m_n0 > q_m_n1)));//數據打拍,為了各數據同步 always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)beginde_reg1 <= 1'b0;de_reg2 <= 1'b0;c0_reg1 <= 1'b0;c0_reg2 <= 1'b0;c1_reg1 <= 1'b0;c1_reg2 <= 1'b0;q_m_reg <= 9'b0;endelsebeginde_reg1 <= de;de_reg2 <= de_reg1;c0_reg1 <= c0;c0_reg2 <= c0_reg1;c1_reg1 <= c1;c1_reg2 <= c1_reg1;q_m_reg <= q_m;end//data_out:輸出編碼后的10bit數據 //cnt:視差計數器,0-1個數差別,最高位為符號位 always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)begindata_out <= 10'b0;cnt <= 5'b0;endelsebeginif(de_reg2 == 1'b1)beginif(condition_2 == 1'b1)begindata_out[9] <= ~q_m_reg[8]; data_out[8] <= q_m_reg[8]; data_out[7:0] <= (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];cnt <= (~q_m_reg[8]) ? (cnt + q_m_n0 - q_m_n1) : (cnt + q_m_n1 - q_m_n0);endelsebeginif(condition_3 == 1'b1)begindata_out[9] <= 1'b1;data_out[8] <= q_m_reg[8];data_out[7:0] <= ~q_m_reg[7:0];cnt <= cnt + {q_m_reg[8], 1'b0} + (q_m_n0 - q_m_n1);endelsebegindata_out[9] <= 1'b0;data_out[8] <= q_m_reg[8];data_out[7:0] <= q_m_reg[7:0];cnt <= cnt - {~q_m_reg[8], 1'b0} + (q_m_n1 - q_m_n0);endendendelsebegincase ({c1_reg2, c0_reg2})2'b00: data_out <= DATA_OUT0;2'b01: data_out <= DATA_OUT1;2'b10: data_out <= DATA_OUT2;default:data_out <= DATA_OUT3;endcasecnt <= 5'b0;endendendmodule

并串轉換模塊代碼

module par_to_ser (input wire clk_5x , //輸入系統時鐘input wire [9:0] par_data , //輸入并行數據output wire ser_data_p , //輸出串行差分數據output wire ser_data_n //輸出串行差分數據 );//********************************************************************// //****************** Parameter and Internal Signal *******************// //********************************************************************// //wire define wire [4:0] data_rise = {par_data[8],par_data[6],par_data[4],par_data[2],par_data[0]}; wire [4:0] data_fall = {par_data[9],par_data[7],par_data[5],par_data[3],par_data[1]};//reg define reg [4:0] data_rise_s = 0; reg [4:0] data_fall_s = 0; reg [2:0] cnt = 0;always @ (posedge clk_5x)begincnt <= (cnt[2]) ? 3'd0 : cnt + 3'd1;data_rise_s <= cnt[2] ? data_rise : data_rise_s[4:1];data_fall_s <= cnt[2] ? data_fall : data_fall_s[4:1];end//********************************************************************// //**************************** Instantiate ***************************// //********************************************************************// //------------- ddio_out_inst0 ------------- altddio ddio_out_inst0 (.datain_h (data_rise_s[0] ),.datain_l (data_fall_s[0] ),.outclock (~clk_5x ),.dataout (ser_data_p ) );//------------- ddio_out_inst1 ------------- altddio ddio_out_inst1 (.datain_h (~data_rise_s[0]),.datain_l (~data_fall_s[0]),.outclock (~clk_5x ),.dataout (ser_data_n ) );endmodule

hdmi_ctrl頂層模塊代碼

module hdmi_ctrl (input wire clk_1x , //輸入系統時鐘input wire clk_5x , //輸入5倍系統時鐘input wire sys_rst_n , //復位信號,低有效input wire [7:0] rgb_blue , //藍色分量input wire [7:0] rgb_green , //綠色分量input wire [7:0] rgb_red , //紅色分量input wire hsync , //行同步信號input wire vsync , //場同步信號input wire de , //使能信號output wire hdmi_clk_p ,output wire hdmi_clk_n , //時鐘差分信號output wire hdmi_r_p ,output wire hdmi_r_n , //紅色分量差分信號output wire hdmi_g_p ,output wire hdmi_g_n , //綠色分量差分信號output wire hdmi_b_p ,output wire hdmi_b_n //藍色分量差分信號 );//********************************************************************// //****************** Parameter and Internal Signal *******************// //********************************************************************// wire [9:0] red ; //8b轉10b后的紅色分量 wire [9:0] green ; //8b轉10b后的綠色分量 wire [9:0] blue ; //8b轉10b后的藍色分量//********************************************************************// //**************************** Instantiate ***************************// //********************************************************************// //------------- encode_inst0 ------------- encode encode_inst0 (.sys_clk (clk_1x ),.sys_rst_n (sys_rst_n ),.data_in (rgb_blue ),.c0 (hsync ),.c1 (vsync ),.de (de ),.data_out (blue ) );//------------- encode_inst1 ------------- encode encode_inst1 (.sys_clk (clk_1x ),.sys_rst_n (sys_rst_n ),.data_in (rgb_green ),.c0 (hsync ),.c1 (vsync ),.de (de ),.data_out (green ) );//------------- encode_inst2 ------------- encode encode_inst2 (.sys_clk (clk_1x ),.sys_rst_n (sys_rst_n ),.data_in (rgb_red ),.c0 (hsync ),.c1 (vsync ),.de (de ),.data_out (red ) );//------------- par_to_ser_inst0 ------------- par_to_ser par_to_ser_inst0 (.clk_5x (clk_5x ),.par_data (blue ),.ser_data_p (hdmi_b_p ),.ser_data_n (hdmi_b_n ) );//------------- par_to_ser_inst1 ------------- par_to_ser par_to_ser_inst1 (.clk_5x (clk_5x ),.par_data (green ),.ser_data_p (hdmi_g_p ),.ser_data_n (hdmi_g_n ) );//------------- par_to_ser_inst2 ------------- par_to_ser par_to_ser_inst2 (.clk_5x (clk_5x ),.par_data (red ),.ser_data_p (hdmi_r_p ),.ser_data_n (hdmi_r_n ) );//------------- par_to_ser_inst3 ------------- par_to_ser par_to_ser_inst3 (.clk_5x (clk_5x ),.par_data (10'b1111100000),.ser_data_p (hdmi_clk_p ),.ser_data_n (hdmi_clk_n ) );endmodule

整個工程的頂層模塊代碼

module hdmi_bar (input wire sys_clk , //輸入工作時鐘,頻率50MHzinput wire sys_rst_n , //輸入復位信號,低電平有效output wire ddc_scl ,output wire ddc_sda ,output wire tmds_clk_p ,output wire tmds_clk_n , //HDMI時鐘差分信號output wire [2:0] tmds_data_p ,output wire [2:0] tmds_data_n //HDMI圖像差分信號 );//********************************************************************// //****************** Parameter and Internal Signal *******************// //********************************************************************// //wire define wire vga_clk ; //VGA工作時鐘,頻率25MHz wire clk_5x ; wire locked ; //PLL locked信號 wire rst_n ; //VGA模塊復位信號 wire [11:0] pix_x ; //VGA有效顯示區域X軸坐標 wire [11:0] pix_y ; //VGA有效顯示區域Y軸坐標 wire [15:0] pix_data; //VGA像素點色彩信息 wire hsync ; //輸出行同步信號 wire vsync ; //輸出場同步信號 wire [15:0] rgb ; //輸出像素信息 wire rgb_valid;//rst_n:VGA模塊復位信號 assign rst_n = (sys_rst_n & locked); assign ddc_scl = 1'b1; assign ddc_sda = 1'b1;//********************************************************************// //*************************** Instantiation **************************// //********************************************************************////------------- clk_gen_inst ------------- clk_gen clk_gen_inst (.areset (~sys_rst_n ), //輸入復位信號,高電平有效,1bit.inclk0 (sys_clk ), //輸入50MHz晶振時鐘,1bit.c0 (vga_clk ), //輸出VGA工作時鐘,頻率25Mhz,1bit.c1 (clk_5x ),.locked (locked ) //輸出pll locked信號,1bit );//------------- vga_ctrl_inst ------------- vga_ctrl vga_ctrl_inst (.vga_clk (vga_clk ), //輸入工作時鐘,頻率25MHz,1bit.sys_rst_n (rst_n ), //輸入復位信號,低電平有效,1bit.pix_data (pix_data ), //輸入像素點色彩信息,16bit.pix_x (pix_x ), //輸出VGA有效顯示區域像素點X軸坐標,10bit.pix_y (pix_y ), //輸出VGA有效顯示區域像素點Y軸坐標,10bit.hsync (hsync ), //輸出行同步信號,1bit.vsync (vsync ), //輸出場同步信號,1bit.rgb_valid (rgb_valid ),.rgb (rgb ) //輸出像素點色彩信息,16bit );//------------- vga_pic_inst ------------- vga_pic vga_pic_inst (.vga_clk (vga_clk ), //輸入工作時鐘,頻率25MHz,1bit.sys_rst_n (rst_n ), //輸入復位信號,低電平有效,1bit.pix_x (pix_x ), //輸入VGA有效顯示區域像素點X軸坐標,10bit.pix_y (pix_y ), //輸入VGA有效顯示區域像素點Y軸坐標,10bit.pix_data (pix_data ) //輸出像素點色彩信息,16bit);//------------- hdmi_ctrl_inst ------------- hdmi_ctrl hdmi_ctrl_inst (.clk_1x (vga_clk ), //輸入系統時鐘.clk_5x (clk_5x ), //輸入5倍系統時鐘.sys_rst_n (rst_n ), //復位信號,低有效.rgb_blue ({rgb[4:0],3'b0} ), //藍色分量.rgb_green ({rgb[10:5],2'b0} ), //綠色分量.rgb_red ({rgb[15:11],3'b0} ), //紅色分量.hsync (hsync ), //行同步信號.vsync (vsync ), //場同步信號.de (rgb_valid ), //使能信號.hdmi_clk_p (tmds_clk_p ),.hdmi_clk_n (tmds_clk_n ), //時鐘差分信號.hdmi_r_p (tmds_data_p[2] ),.hdmi_r_n (tmds_data_n[2] ), //紅色分量差分信號.hdmi_g_p (tmds_data_p[1] ),.hdmi_g_n (tmds_data_n[1] ), //綠色分量差分信號.hdmi_b_p (tmds_data_p[0] ),.hdmi_b_n (tmds_data_n[0] ) //藍色分量差分信號 );endmodule

6,顯示結果

彩條顯示

圖片顯示

總結

以上是生活随笔為你收集整理的HDMI显示图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。