加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于FPGA的TMDS編碼

2024/03/26
2667
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

在我們之前的學(xué)習(xí)中,了解到HDMI是一種全數(shù)字化視頻和聲音發(fā)送接口,可以發(fā)送音頻以及視頻信號。HDMI向下兼容DVI,DVI只能傳輸視頻信號。HDMI和DVI接口協(xié)議在物理層均使用TMDS標(biāo)準(zhǔn)來傳輸音頻或視頻信號,接下來就著重了解一下TMDS編碼。

TMDS(最小化傳輸差分信號)中,有四個通道,其中包含了三個數(shù)據(jù)通道和一個時鐘通道。其中數(shù)據(jù)通道用來傳輸顏色、音頻、控制等信號。HDMI默認(rèn)使用RGB(RGB888)三個數(shù)據(jù)通道,當(dāng)然也可以是亮度和色度信息(YCrCb,4:4:4或者4:2:2)。

上圖為HDMI的鏈接框架;

通道0傳輸?shù)臄?shù)據(jù)為:B分量的視頻數(shù)據(jù)、行場同步信號、音頻信號。

通道0傳輸?shù)臄?shù)據(jù)為:G分量的視頻數(shù)據(jù)、控制信號、音頻信號。通道0傳輸?shù)臄?shù)據(jù)為:R分量的視頻數(shù)據(jù)、控制信號、音頻信號。不同的數(shù)據(jù)在TMDS數(shù)據(jù)通道中在三種不同的周期中發(fā)送。

在TMDS傳輸標(biāo)準(zhǔn)中,不論是視頻信號、控制信號還是輔助信號,都是以10bit的數(shù)據(jù)傳輸,所以需要對這三個信號進(jìn)行編碼,分別采用不同的編碼方式。

在此,我們著重說一下視頻編碼,在Xilinx官方給出的一個編碼示意圖中,我們可以清楚整個的編碼流程:

圖中也體現(xiàn)出了控制信號的編碼方式:

會對應(yīng)特定的四個值中的一個。

編碼如下:

1    `timescale 1 ps / 1ps2  3    module dvi_encoder (4      input            clkin,    // pixel clock input5      input            rstin,    // async. reset input (active high)6      input      [7:0] din,      // data inputs: expect registered7      input            c0,       // c0 input8      input            c1,       // c1 input9      input            de,       // de input10     output reg [9:0] dout      // data outputs11   );12 13     ////////////////////////////////////////////////////////////14     // Counting number of 1s and 0s for each incoming pixel15     // component. Pipe line the result.16     // Register Data Input so it matches the pipe lined adder17     // output18     ////////////////////////////////////////////////////////////19     reg [3:0] n1d; //number of 1s in din20     reg [7:0] din_q;21 22   //計算像素數(shù)據(jù)中“1”的個數(shù)23     always @ (posedge clkin) begin24     n1d <=#1 din[0] + din[1] + din[2] + din[3] + din[4] + din[5] + din[6] + din[7];25 26     din_q <=#1 din;27     end28 29     ///////////////////////////////////////////////////////30     // Stage 1: 8 bit -> 9 bit31     // Refer to DVI 1.0 Specification, page 29, Figure 3-532     ///////////////////////////////////////////////////////33     wire decision1;34 35     assign decision1 = (n1d > 4'h4) | ((n1d == 4'h4) & (din_q[0] == 1'b0));36 37     wire [8:0] q_m;38     assign q_m[0] = din_q[0];39     assign q_m[1] = (decision1) ? (q_m[0] ^~ din_q[1]) : (q_m[0] ^ din_q[1]);40     assign q_m[2] = (decision1) ? (q_m[1] ^~ din_q[2]) : (q_m[1] ^ din_q[2]);41     assign q_m[3] = (decision1) ? (q_m[2] ^~ din_q[3]) : (q_m[2] ^ din_q[3]);42     assign q_m[4] = (decision1) ? (q_m[3] ^~ din_q[4]) : (q_m[3] ^ din_q[4]);43     assign q_m[5] = (decision1) ? (q_m[4] ^~ din_q[5]) : (q_m[4] ^ din_q[5]);44     assign q_m[6] = (decision1) ? (q_m[5] ^~ din_q[6]) : (q_m[5] ^ din_q[6]);45     assign q_m[7] = (decision1) ? (q_m[6] ^~ din_q[7]) : (q_m[6] ^ din_q[7]);46     assign q_m[8] = (decision1) ? 1'b0 : 1'b1;47 48     /////////////////////////////////////////////////////////49     // Stage 2: 9 bit -> 10 bit50     // Refer to DVI 1.0 Specification, page 29, Figure 3-551     /////////////////////////////////////////////////////////52     reg [3:0] n1q_m, n0q_m; // number of 1s and 0s for q_m53     always @ (posedge clkin) begin54     n1q_m  <=#1 q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7];55     n0q_m  <=#1 4'h8 - (q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7]);56     end57 58     parameter CTRLTOKEN0 = 10'b1101010100;59     parameter CTRLTOKEN1 = 10'b0010101011;60     parameter CTRLTOKEN2 = 10'b0101010100;61     parameter CTRLTOKEN3 = 10'b1010101011;62 63     reg [4:0] cnt; //disparity counter, MSB is the sign bit64     wire decision2, decision3;65 66     assign decision2 = (cnt == 5'h0) | (n1q_m == n0q_m);67     /////////////////////////////////////////////////////////////////////////68     // [(cnt > 0) and (N1q_m > N0q_m)] or [(cnt < 0) and (N0q_m > N1q_m)]69     /////////////////////////////////////////////////////////////////////////70     assign decision3 = (~cnt[4] & (n1q_m > n0q_m)) | (cnt[4] & (n0q_m > n1q_m));71 72     ////////////////////////////////////73     // pipe line alignment74     ////////////////////////////////////75     reg       de_q, de_reg;76     reg       c0_q, c1_q;77     reg       c0_reg, c1_reg;78     reg [8:0] q_m_reg;79 80     always @ (posedge clkin) begin81     de_q    <=#1 de;82     de_reg  <=#1 de_q;83     84     c0_q    <=#1 c0;85     c0_reg  <=#1 c0_q;86     c1_q    <=#1 c1;87     c1_reg  <=#1 c1_q;88 89     q_m_reg <=#1 q_m;90     end91 92     ///////////////////////////////93     // 10-bit out94     // disparity counter95     ///////////////////////////////96     always @ (posedge clkin or posedge rstin) begin97     if(rstin) begin98       dout <= 10'h0;99       cnt <= 5'h0;100    end else begin101      if (de_reg) begin102      if(decision2) begin103        dout[9]   <=#1 ~q_m_reg[8]; 104        dout[8]   <=#1 q_m_reg[8]; 105        dout[7:0] <=#1 (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];106107        cnt <=#1 (~q_m_reg[8]) ? (cnt + n0q_m - n1q_m) : (cnt + n1q_m - n0q_m);108      end else begin109        if(decision3) begin110        dout[9]   <=#1 1'b1;111        dout[8]   <=#1 q_m_reg[8];112        dout[7:0] <=#1 ~q_m_reg[7:0];113114        cnt <=#1 cnt + {q_m_reg[8], 1'b0} + (n0q_m - n1q_m);115        end else begin116        dout[9]   <=#1 1'b0;117        dout[8]   <=#1 q_m_reg[8];118        dout[7:0] <=#1 q_m_reg[7:0];119120        cnt <=#1 cnt - {~q_m_reg[8], 1'b0} + (n1q_m - n0q_m);121        end122      end123      end else begin124      case ({c1_reg, c0_reg})125        2'b00:   dout <=#1 CTRLTOKEN0;126        2'b01:   dout <=#1 CTRLTOKEN1;127        2'b10:   dout <=#1 CTRLTOKEN2;128        default: dout <=#1 CTRLTOKEN3;129      endcase130131      cnt <=#1 5'h0;132      end133    end134    end135    136  endmodule

編碼完成后,對數(shù)據(jù)我們需要進(jìn)行并串轉(zhuǎn)換,此操作我們可以使用原語OSERDES2實現(xiàn)10-to-1的過程。最后用OBUFDS將串行數(shù)據(jù)轉(zhuǎn)換為差分信號輸出即可。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
XC6SLX25T-2CSG324C 1 AMD Xilinx Field Programmable Gate Array, 1879 CLBs, 667MHz, 24051-Cell, CMOS, PBGA324, 15 X 15 MM, 0.80 MM PITCH, LEAD FREE, BGA-324
$129.32 查看
EPM3128ATI100-10N 1 Altera Corporation EE PLD, 10ns, 128-Cell, CMOS, PQFP100, TQFP-100
$17.54 查看
EP3C16F484I7N 1 Intel Corporation Field Programmable Gate Array, 15408 CLBs, 472.5MHz, 15408-Cell, CMOS, PBGA484, 23 X 23 MM, 2.60 MM HEIGHT, 1 MM PITCH, LEAD FREE, FBGA-484

ECAD模型

下載ECAD模型
暫無數(shù)據(jù) 查看

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

任何技術(shù)的學(xué)習(xí)就好比一個江湖,對于每一位俠客都需要不斷的歷練,從初入江湖的小白到歸隱山林的隱世高人,需要不斷的自我感悟自己修煉,讓我們一起仗劍闖FPGA乃至更大的江湖。