李雁


摘 要:介紹了HDMI2.0的協議及通過FPGA編碼實現HDMI協議的DDC、解擾、解碼、音頻包提取、視頻數據提取的功能。使用IP SMPTE UHD-SDI和UHD SDI Audio實現SDI協議,自編接口適配程序完成SDI音頻嵌入接口實現以及SDI視頻DS流成幀器的實現。
關鍵詞:HDMI;SDI;IEC60958;EDID;I2C;HPD
中圖分類號:TN948.6 文獻標識碼:A 文章編號:1671-2064(2020)09-0062-03
0 引言
高清晰多媒體接口HDMI已經成為任何高清數字電視和多媒體設備之間的標準接口,目前廣泛應用在數字液晶電視、數碼相機、家用投影機、機頂盒、平板電腦等消費類電子中。在專業的數字電影投影機領域,串行數字接口SDI作為專業廣播室視頻設備中的數據傳輸接口,通過同軸電纜傳輸無壓縮的數字視頻信號,保證畫質無損。由于SDI接口的硬件成本比較高昂,且信號傳輸的數據量大,對信號質量要求度比較高,所以只有在一些專業的音視頻設備中才具有SDI接口,但由于一系列消費類電子產品目前已經能支持清晰度質量高的HDMI信號輸出,為了實現HDMI信號能夠輸出到具有SDI接口的設備中進行處理,所以需要進行HDMI轉SDI的信號轉換[1]。
1 FPGA內部實現架構
FPGA采用XILINX公司的XCKU035-FBVA676-2,該芯片的GTH高速串行收發器能支持12G SDI所需的11.88G速率,在接收端,HDP模塊上電后輸出高電平,使得源端檢測到HDMI在線,然后源端通過I2C訪問FPGA內部的EDID,獲取FPGA作為HDMI接收端的接收能力,例如分辨率,刷新率等,從而源端發送最適合接收端的視頻源數據。3路5.94G的HDMI信號CH0/1/2進入FPGA的GTH,GTH主要完成時鐘恢復,串并轉換,得到40bit位寬的并行數據輸出,對原始數據進行解擾后,識別出控制周期,數據島周期,視頻數據周期。從視頻數據周期數據提取出HS,VS,DEN,DATA,從數據島周期提取出AES格式音頻數據。
HDMI接收到的視頻數據一般為RBG格式,轉換成SDI的YCbCr格式后緩存,SDI成幀器根據前級數據的HS,VS,DEN產生行列計數及相應的前導數據,將YCbCr數據取出填充到幀結構的數據中形成DS數據流,使用XILINX的IPCORE SMPTE UHD-SDI完成12G-SDI信號合成,首先是在DS數據流中插入ST352,輸出的DS流進入XILINX的IPCORE UHD SDI Audio,該IP可以將音頻數據通過AXIS接口插入到DS中,插入音頻數據的DS再接回SMPTE UHD-SDI的DS_IN,形成40bit的并行數據后通過GTH發送出12G-SDI。模塊端內部框圖如圖1所示。
2 FPGA內部詳細設計
2.1 HPD
HDP是HDMI的熱插拔功能,當HDMI線纜沒有插入或者FPGA沒有上電的時候,該信號是0V,FPGA上電后固定輸出高電平,經過硬件器件變為5V,插上HDMI線纜后,源端就能檢測到HDMI從機在線。
2.2 EDID
EDID是源端通過I2C讀取從機ROM,獲取從機接收能力,從而發送相應的數據源。I2C的設計遵循I2C的標準協議。使用本地晶振25M作為系統時鐘,該時鐘遠大于400k的I2C速率,方便準確采集I2C的時鐘和數據邊沿以及判斷時鐘高電平的中間時刻。
使用狀態機進行從機設計,劃分9個狀態,分別是Idle(空閑),Start(開始),Saddr(從機地址),JudgeRW(讀寫判斷),Ark(應答),WrRegAddr(寫寄存器地址),WrData(寫數據),RdData(讀數據),WaitArk(等待應答)。狀態跳轉規則要符合I2C標準協議。
在時鐘高電平時檢測到數據出現下降沿,強制進入Start狀態,在時鐘高電平時檢測到數據上升沿,強制進入Idle狀態。每次檢測到時鐘高電平中間時刻,對狀態進行BIT計數,每次轉換狀態,BIT計數歸零。達到狀態預設的BIT值時,狀態跳變。各個狀態對應的BIT計數值如表1所示。
在WrRegAddr狀態,記錄主機要訪問的寄存器,在WaitArk狀態,檢測到主機應答后,寄存器地址自動+1。從而支持連續讀模式。在WaitArk狀態,根據寄存器地址將相應數據寄存到輸出移位寄存器,移位寄存器在時鐘高電平時刻將數據移位輸出,完成I2C的數據傳輸。
2.3 HDMI解擾
HDMI2.0版標準中定義了非加擾控制周期,占用8個時鐘周期,用于三個數據通道的同步對齊及復位加擾因子為初始值。加擾算法的線性反饋移位多項式為G(x)=1+x11+x12+x13+x16。數據通道0的初始值為0xFFFF,數據通道1的初始值為0xFFFE,數據通道2的初始值為0xFFFD。當接收器狀態為視頻數據周期時,將8bit視頻數據與解擾因子的高8bit進行異或運算,得到解擾后的視頻數據。當接收器狀態為數據島周期時,將4bit音頻及輔助數據與解擾因子的高4bit進行異或運算,得到解擾后的音頻及輔助數據。當接收器狀態為加擾控制周期時,將4bit控制矢量與解擾因子的高4bit進行異或運算,得到控制數據[2]。
2.4 信號段檢測
數據解擾后,需要識別出控制周期,數據島周期,視頻數據周期。識別的特征數據在HDMI2.0中,與以前的版本略有不同,不同之處在于:
(1)視頻數據周期保護帶,HDMI2.0采用的是視頻數據編碼,而HDMI1.4采用的是固定值;
(2)數據島周期保護帶,HDMI2.0通道0采用的是可糾錯編碼,通道1和2采用的是視頻數據編碼,而HDMI1.4采用的是固定值;
(3)控制周期,HDMI2.0中非加擾控制周期采用控制周期編碼,加擾控制周期采用查找表,而HDMI1.4只采用控制周期編碼。
根據各個周期的特征數據完成識別后,生成特征標致信號給后級模塊[3]。
2.5 視頻接收
從CH0中提取出HS,VS,在控制周期,HS,VS采用CTL編碼。在數據島周期,采用TERC4編碼。視頻數據使用TMDS編碼。CTL編碼和TERC4編碼分別又4種情況和16種情況,采用查找表完成,TMDS解碼根據協議中的解碼流圖進行設計。最高位為1時,低8位取反,否則保持不變,得到解碼中間數據。次高位為1時,解碼的bit[i]=解碼中間數據的bit[i]異或解碼中間數據的bit[i-1]。次高位為0時,解碼的bit[i]=解碼中間數據的bit[i]異或解碼中間數據的bit[i-1]后取反。上述操作i=7到1。解碼的bit[0]=解碼中間數據的bit[0]。
2.6 音頻接收
音頻數據位于數據島周期中,數據島周期除了傳遞音頻包,還可以傳遞各種控制包,在本次設計中,我們只提取數據島周期包類型值為0x02的音頻采樣包。首先數據先進行TERC4解碼,得到4bit的原始數據。每次數據島周期持續時間為32個時鐘周期的整數倍。連續32個CH0的bit[2]組合得到4個包頭字節,其中前三個字節是內容,最后一個字節是BCH(32,24)編碼后的校驗位。通過BCH解碼能夠實現序列的誤碼探測和誤碼糾錯,最多可糾正4個bit錯誤。我們需要提取第一字節為0x02的音頻采樣包,第二字節的bit[4]為0表示音頻包中有2個音頻通道,為1表示音頻包中有8個音頻通道。當2通道時,子包0/1/2/3分別傳遞音頻采樣channel 0/1的采樣點N,N+1,N+2,N+3。當8通道時,子包0/1/2/3分別傳遞音頻采樣channel 0~7的采樣點N。第二字節的bit[3∶0]表示音頻通道有效。第三字節的bit[3:0]在音頻通道有效的條件下,為1表示該通道此包的音頻采樣點是填充數據,解碼時應當刪除該填充采樣點。第三字節的bit[7∶4]各個bit為1時分別代表每個音頻通道對此時時IEC60958的幀頭第一個音頻采樣點。用于設置PCUV的幀同步計數器歸零。
CH1和CH2的bit位按一定規律結合成4個子包,每個子包有7個有效字節,1個字節的BCH(64,56)校驗位,能夠檢測錯誤并糾正最多4個bit的錯誤。bit組合規則是CH1和CH2的bit[N]交叉組合得到子包N。每個子包的內部結構相同。字節0~2傳遞IEC60958的子幀0的bit[27∶4],也就是左聲道音頻采樣,字節3~5傳遞IEC60958的子幀1的bit[27∶4],也就是右聲道音頻采樣,字節6的bit[3∶0]和[7∶4]傳遞IEC60958子幀0和1的bit[3∶0],即PCUV。P為校驗位,C為狀態位,U為用戶定義位,V為有效指示位。其中192個C組成一個控制幀,指示音頻的采樣速率,有效位等信息。
FPGA內收到前級的數據島周期指示信號后啟動數據計數器,每次計數到32的整數倍產生一個收包完成信號,在計數的同時,對CH1/2的數據bit[3∶0],CH0的bit[2]分別進行移位寄存。得到9組32bit的數據。收包完成信號有效時,按照前面所述的bit排列規則組合得到包頭和子包,同時啟動步驟計數器,分步對數據包進行解析。由于有可能出現連續兩個數據島周期,所以必須在32個步驟內完成解析。在步驟0判斷包頭第一個字節是0x02,產生音頻包指示信號,有效期設定為16個時鐘,則說明設計在16個步驟內完成解析。在步驟1解析出通道有效和通道填充位以及IEC60958的幀起始標致。在步驟2~9中,分別解析出4個子包中的8個音頻采樣點和對應通道號以及相應的PCUV。
2.7 RGB轉YCbCr
HDMI一般默認傳遞的是RGB信號,這是協議中要求必須支持的視頻格式,SDI傳遞的則是YCbCr格式的視頻數據,因此兩者之間需要進行格式轉換。實現公式如下:
Y=0.299R+0.587G+0.114B
Cb=-0.1687R-0.3313G+0.5B
Cr=0.5R-0.4187G-0.0813B
FPGA中的乘法位寬位18位,本次設計實現采用Q16實現,轉換后的公式為:
Y=19595R+38470G+7471B
Cb=-11056R-21712G+32768B
Cr=32768R-27440G-5328B
得到的結果右移16位即可。
轉換的結果需存入8個緩存,以便生成12G-SDI的8個DS流。奇數行的采樣點Y0,1存入DS1,采樣點Y3,4存入DS3,依次逐個存入DS1,3。奇數行的采樣點Cb0,Cr1,存入DS2,采樣點Cb2,Cr3存入DS4。依次逐個存入DS2,4。偶數行的采樣點Y0,1存入DS5,采樣點Y3,4存入DS7,依次逐個存入DS5,7。偶數行的采樣點Cb0,Cr1,存入DS6,采樣點Cb2,Cr3存入DS8,依次逐個存入DS6,8。
2.8 SDI音頻緩存
HDMI解碼的音頻數據格式與SDI是基本一致的,只需將IEC60958的子幀0幀頭指示標志轉譯成0x1,其余子幀0標志轉譯成0x2,所有子幀1標志轉譯成0x3即可和PCUV,音頻數據一起組合成32bit存入音頻緩存,使用AXIS接口的緩存,AXIS入口的ID信號繼續使用前級的TID表示通道號。當后級有效后,寫使能置1,從而才能將前級音頻數據寫入緩存。寫入緩存達到緩存量的一半時,讀使能置1,FPGA內部對主時鐘進行分頻計數得到48kHz的讀時鐘使能,在該使能的作用下,產生通道有效計數器,將輸出給后級AXIS的valid信號拉高,當后級AXIS接口的ready信號有效時,通道計數器加1,當通道計數器的值大于設定的N通道時,valid信號拉低。結束本次采樣使能的AXIS傳輸。當AXIS的valid和ready都有效時,產生AXIS緩存Master接口的ready,更新下一個通道數據。