HDMI是(High Definition Multimedia Interface)的縮寫,意思是高清晰度多媒體接口,是一種數字化視頻/音頻接口技術,適合影像傳輸的專用型數字化接口,可同時傳送音頻和影像信號,最高數據傳輸速度爲48Gbps(2.1版),HDMI相較於VGA接口,它傳輸的信息量大,色彩度高,傳輸速度快等顯著優勢。html
通常來講驅動HDMI有兩種方法,有些開發板是用一顆專用的HDMI芯片ADV7511作HDMI的輸出使用,ADV7511 是一款高速高清晰度多媒體接口(High Definition Multimedia Interface HDMI)發送器。 可以處理的數據速率高達165MHz(1080p @60H, UXGA @60Hz), 輸出數據速率高達 225MHz。git
Digilent官方出品的ZYBO開發板,上面一個雙向的HDMI端口,直接鏈接在PL的引腳上,因此此次博主分享的工程是用ZYBO PL端的IO口模擬HDMI接口,首先先來說一下HDMI的顯示原理主要是TMDS,該部分摘自博客:http://blog.sina.com.cn/s/blog_679686370100vgg1.html算法
HDMI 採用和 DVI 相同癿傳輸原理——TMDS(Transition Minimized Differential signal),最小化傳輸差分信號。微信
TMDS 傳輸系統分爲兩個部分:發送端和接收端。 TMDS 發送端收到HDMI 接口傳來的表示 RGB 信號的24 位並行數據(TMDS 對每一個像素的 RGB 三原色分別按 8bit 編碼,即 R信號有 8 位,G 信號有 8 位,B 信號有 8 位),而後對這些數據進行編碼和並/串轉換,再將表示 3 個 RGB 信號的數據分別分配到獨立的傳輸通道發送出去。接收端接收來自發送端的串行信號,對其進行解碼和串/並轉換,而後發送到顯示器的控制端。與此同時也接收時鐘信號,以實現同步。學習
TMDS的原理測試
每個 TMDS 鏈路都包括 3 個傳輸 RGB 信號的數據通道和 1 個傳輸時鐘信號的通道。每個數據通道都經過編碼算法,將 8 位的視、音頻數據轉換成最小化傳輸、直流平衡的 10 位數據。這使得數據的傳輸和恢復更加可靠。最小化傳輸差分信號是經過異或及異或非等逡、邏輯算法將原始 8 位信號數據轉換成 10 位,前 8 爲數據由原始信號經運算後得到,第 9 位指示運算的方式,第 10 位用來對應直流平衡。編碼
通常來講,HDMI 傳輸癿編碼格式中要包含視頻數據、控制數據和數據包(數據包中包噸音頻數據和附加信息數據,例如糾錯碼等)。 TMDS 每一個通道在傳輸時要包含一個 2bit 的控制數據、 8bit 的視頻數據或者 4bit 的數據包便可。在 HDMI 信息傳輸過程當中,能夠分爲三個階段:視頻數據傳輸週期、控制數據傳輸週期和數據島傳輸週期,分別對應上述的三種數據類型。設計
下面介紹 TMDS 中採用的技術:視頻
8 位數據通過編碼和直流平衡獲得 10 位最小化數據,這彷彿增長了冗餘位,對傳輸鏈路的帶寬要求更高,但事實上,經過這種算法獲得的 10 位數據在更長的同軸電纜中傳輸的可靠性加強了。下圖是一個例子,說明對一個 8 位的並行 RED 數據編碼、並/串轉換。htm
第一步:將 8 位並行 RED 數據發送到 TMDS 収送端。
第二步:並/串轉換.
第三步:進行最小化傳輸處理,加上第 9 位,即編碼過程。第 9 位數據稱爲編碼位。
2. 直流平衡
直流平衡(DC-balanced)就是指在編碼過程當中保證信道中直流偏移爲零。方法是在原來的 9 位數據癿後面加上第 10 位數據,返樣,傳輸的數據趨於直流平衡,使信號對傳輸線的電磁干擾減小,提升信號傳輸的可靠性。
3. 差分信號
TMDS差分傳動技術是一種利用2個引腳間電壓差來傳送信號的技術。傳輸數據的數值(「0」或者「1」)由兩腳間電壓正負極性和大小決定。即,採用 2 根線來傳輸信號,一根線上傳輸原來的信號,另外一根線上傳輸與原來信號相反的信號。這樣接收端就能夠經過讓一根線上的信號減去另外一根線上的信號的方式來屏蔽電磁干擾,從而獲得正確的信號。
另外,還有一個顯示數據通道(DDC),是用於讀取表示接收端顯示器的清晰度等顯示能力的擴展顯示標識數據(EDID)的信號線。搭載 HDCP(High-bandwidth Digital Content Protection,高帶寬數字內容保護技術)的發送、接收設備之間也利用 DDC 線進行密碼鍵的認證。
接下來是電路設計部分,HDMI驅動部分追尋原始出處應該是迪芝倫官方,該部分代碼用VHDL語言描述,爲了方便移植,我將該部分代碼封裝成自定義IP Core,由上文可知,咱們須要產生RGB888三路數據,輸入給該模塊,而後通過解碼、串/並轉換,差分輸出。還須要兩個時鐘輸入,一個是當前顯示分辨率的像素時鐘,一個是當前顯示分辨率的像素時鐘的五倍。還有一個行同步信號和場同步信號,這兩個信號的產生方法和VGA是同樣的,簡單來講就是先產生VGA的信號,行同步信號、場同步信號RGB888的數據輸入給HDMI驅動模塊就能夠顯示了,咱們要修改顯示的數據,仍是隻須要修改VGA時序便可。
該工程通過測試,能夠實現720p(1280x720)的分辨率顯示,1080p(1920×1080)的分辨率沒有測試出來,緣由我以爲多是官方的zybo的晶振是125Mhz的,這個時鐘很尷尬,直接用Clocking wizard鎖不出來HDMI所須要的精確時鐘,以下圖。我試過先分頻出100Mhz,而後在調用一個IP Core分頻和倍頻,可是綜合總會報錯。因此直接這樣進行PLL雖然有偏差可是仍是能夠顯示出720p的。
並且根據迪芝倫的官方手冊上描述,有這樣一段,Resolution up to 720p(1280x720) have been teste。個人英文不是很好,那既然這樣說了,沒準它還真達不到1080p,好吧無論了,就暫且認爲它最高只能達到720p吧。逃~
打開工程後,須要從新添加HDMI自定義IP的路徑,就在工程中,rgb2dvi_v1_2文件夾中。
而後在IP Catalog中搜索hdmi_disp就能夠獲得對應的IP Core了。
雙擊打開這四個須要定義的參數,已經定義好在IP中了,直接點擊OK——Generate生成
直接能夠在以下圖所示中找到例化文件,直接實例化便可。
關於引腳約束,須要說的是,引腳約束必須爲TMDS_33電平標準
最後附上一張720p彩條測試圖。
最後歡迎關注一億人都想要關注的微信訂閱號【開源FPGA】,總結記錄本身的學習過程,一個FPGA工程師的養成之路。歡迎加入開源FPGA-交流羣-I進行討論,羣號碼:677163633。若是您須要本工程的源碼,歡迎關注博主微信訂閱號【開源FPGA】,在後臺回覆,開源FPGA,便可得到工程源碼哦!
轉載請註明出處:NingHeChuan(寧河川)
我的微信訂閱號:開源FPGA
若是你想及時收到我的撰寫的博文推送,能夠掃描左邊二維碼(或者長按識別二維碼)關注我的微信訂閱號
知乎ID:NingHeChuan
微博ID:NingHeChuan