【转】DE2_TV例程的几点说明
轉(zhuǎn)自:http://www.cnblogs.com/sunev/archive/2012/05/21/2512149.html
一、摘要
對(duì)DE2_TV例程做了分析,并闡明了相關(guān)概念。
二、實(shí)驗(yàn)平臺(tái)
硬件平臺(tái):DIY_DE2
軟件平臺(tái):Quartus II 9.0?
三、一些概念及說(shuō)明
1、PAL和NTSC的區(qū)別
常見(jiàn)的電視信號(hào)制式是PAL和NTSC,另外還有SECAM等。?NTSC即正交平衡調(diào)幅制,PAL為逐行倒像正交平衡調(diào)幅制。?
(1)PAL電視標(biāo)準(zhǔn)?
PAL電視標(biāo)準(zhǔn),每秒25幀,電視掃描線為625線,奇場(chǎng)在前,偶場(chǎng)在后,標(biāo)準(zhǔn)的數(shù)字化PAL電視標(biāo)準(zhǔn)分辨率為720*576, 24比特的色彩位深,畫(huà)面的寬高比為4:3,PAL電視標(biāo)準(zhǔn)用于中國(guó)、歐洲等國(guó)家和地區(qū)。?
(2)NTSC電視標(biāo)準(zhǔn)?
NTSC電視標(biāo)準(zhǔn),每秒29.97幀(簡(jiǎn)化為30幀),電視掃描線為525線,偶場(chǎng)在前,奇場(chǎng)在后,標(biāo)準(zhǔn)的數(shù)字化NTSC電視標(biāo)準(zhǔn)分辨率為720*486,24比特的色彩位深,畫(huà)面的寬高比為4:3。NTSC電視標(biāo)準(zhǔn)用于美、日等國(guó)家和地區(qū)。
下面重點(diǎn)說(shuō)一下PAL制式。PAL一幀的數(shù)據(jù)行格式如圖1所示。
圖1 一幀圖像數(shù)據(jù)行格式
對(duì)于有效數(shù)據(jù)行的格式,如圖2所示
圖2 有效視頻行的數(shù)據(jù)格式
?如上圖所示,EAV和SAV為嵌入式控制字,分別表示有效視頻的終點(diǎn)和起點(diǎn)。EAV和SAV均為4個(gè)字節(jié)構(gòu)成,前3個(gè)字節(jié)FF、00、00為固定頭,“XY”為控制字。“XY”的8個(gè)bit含義如下:
- Bit7(Const),常數(shù),總為1。
- Bit6(F),場(chǎng)同步信號(hào),表示該行數(shù)據(jù)處于奇場(chǎng)還是偶場(chǎng)。
- Bit5(V),垂直同步信號(hào),表示處于場(chǎng)消隱區(qū)間還是正程區(qū)間(有效數(shù)據(jù)行)。
- Bit4(H),水平同步信號(hào),表示是“SAV”還是“EAV”。
- Bit3-0(P3P2P1P0),糾錯(cuò)位。P3=V(XOR)H;P2=F(XOR)H;P1=F(XOR)V;P0=F(XOR)V(XOR)H。
EAV與SAV的詳細(xì)定義如表1所示。
?
表1
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3-0(P3P2P1P0) | Hex | Description |
| 1 | 0 | 0 | 0 | 0000 | 0x80 | Even,Active,SAV |
| 1 | 0 | 0 | 1 | 1101 | 0x9d | Even, Active,EAV |
| 1 | 0 | 1 | 0 | 1011 | 0xab | Even,Blank, SAV |
| 1 | 0 | 1 | 1 | 0110 | 0xb6 | Even, Blank, EAV |
| 1 | 1 | 0 | 0 | 0111 | 0xc7 | Odd, Active, SAV |
| 1 | 1 | 0 | 1 | 1010 | 0xda | Odd, Active, EAV |
| 1 | 1 | 1 | 0 | 1100 | 0xec | Odd, Blank, SAV |
| 1 | 1 | 1 | 1 | 0001 | 0xf1 | Odd, Blank, EAV |
Blanking為水平消隱區(qū),通常由80H/10H來(lái)填充。
對(duì)于圖2中的Valid data(有效數(shù)據(jù))區(qū),其數(shù)據(jù)排列順序如圖3所示。即Y : Cb : Cr=4 : 2 : 2。從圖像的像素點(diǎn)上來(lái)理解,就是每個(gè)像素點(diǎn)有一個(gè)單獨(dú)的Y值,而相鄰的兩個(gè)像素點(diǎn)的Cb和Cr數(shù)據(jù)是一樣的。
?
圖3?數(shù)據(jù)排列順序
2、ITU-R BT.601和ITU-R BT.656的區(qū)別
關(guān)于這兩種信號(hào)的區(qū)別:?
ITU-R BT.601:?16位數(shù)據(jù)傳輸,21芯;Y、U、V信號(hào)并行傳輸,并有場(chǎng)頻和行頻傳輸線。最后更新的文檔代號(hào)為:ITU-R? BT.601-5。
ITU-R BT.656:?8位數(shù)據(jù)傳輸,9芯;串行視頻傳輸,不需要同步信號(hào);傳輸速率是601的2倍。最后更新的文檔代號(hào)為:ITU-R? BT.656-4。
656輸出的是串行數(shù)據(jù),行場(chǎng)同步信號(hào)嵌入在數(shù)據(jù)流中,601是并行數(shù)據(jù),行場(chǎng)同步有單獨(dú)輸出。
656只是數(shù)據(jù)傳輸接口而已,可以說(shuō)是作為601的一個(gè)傳輸方式。簡(jiǎn)單的說(shuō)ITU-R BT.601是"演播室數(shù)字電視編碼參數(shù)"標(biāo)準(zhǔn),而ITU-R BT.656 則是ITU-R BT.601附件A中的數(shù)字接口標(biāo)準(zhǔn),用于主要數(shù)字視頻設(shè)備(包括芯片)之間采用27Mhz/s并口或243Mb/s串行接口的數(shù)字傳輸接口標(biāo)準(zhǔn)。3、關(guān)于DIY_DE2的視頻部分的說(shuō)明
DE2視頻解碼芯片是SAA7181,DIY_DE2采用的視頻解碼芯片是SAA7113,兩種芯片都支持ITU-R BT.656和ITU-R BT.601兩種信號(hào)接口。SAA7113采用的外部晶振為24.576MHz,經(jīng)過(guò)內(nèi)部鎖相環(huán)之后,像素時(shí)鐘為27MHz,亮度信號(hào)時(shí)鐘為13.5MHz,色差信號(hào)時(shí)鐘為6.75MHz。
DE2_TV例程是針對(duì)NTSC制式的攝像頭,而我這里是用的PAL制式的攝像頭,視頻信號(hào)為隔行掃描,奇場(chǎng)在前,偶場(chǎng)在后。使用的視頻接口為ITU-R BT.656,因此對(duì)例程做了些修改。
四、DE2_TV例程分析
1、IIC配置視頻解碼芯片
具體配置方法上篇博文中已經(jīng)說(shuō)明,這里給出配置參數(shù)。
SET_VIDEO+0: LUT_DATA <= 16'h0108;SET_VIDEO+1: LUT_DATA <= 16'h02C3;//default C0SET_VIDEO+2: LUT_DATA <= 16'h0333;//default 33SET_VIDEO+3: LUT_DATA <= 16'h0400;//default 00SET_VIDEO+4: LUT_DATA <= 16'h0500;//default 00SET_VIDEO+5: LUT_DATA <= 16'h06e9;SET_VIDEO+6: LUT_DATA <= 16'h070d;SET_VIDEO+7: LUT_DATA <= 16'h0898;SET_VIDEO+8: LUT_DATA <= 16'h0901;SET_VIDEO+9: LUT_DATA <= 16'h0a80; SET_VIDEO+10: LUT_DATA <= 16'h0b47;SET_VIDEO+11: LUT_DATA <= 16'h0c40;SET_VIDEO+12: LUT_DATA <= 16'h0d00;SET_VIDEO+13: LUT_DATA <= 16'h0e01;SET_VIDEO+14: LUT_DATA <= 16'h0f2a;SET_VIDEO+15: LUT_DATA <= 16'h1000;SET_VIDEO+16: LUT_DATA <= 16'h110c;SET_VIDEO+17: LUT_DATA <= 16'h12b7;SET_VIDEO+18: LUT_DATA <= 16'h1300;SET_VIDEO+19: LUT_DATA <= 16'h1500; SET_VIDEO+20: LUT_DATA <= 16'h1600;SET_VIDEO+21: LUT_DATA <= 16'h1700;SET_VIDEO+22: LUT_DATA <= 16'h4002;SET_VIDEO+23: LUT_DATA <= 16'h41ff;SET_VIDEO+24: LUT_DATA <= 16'h42ff;SET_VIDEO+25: LUT_DATA <= 16'h43ff;SET_VIDEO+26: LUT_DATA <= 16'h44ff;SET_VIDEO+27: LUT_DATA <= 16'h45ff;SET_VIDEO+28: LUT_DATA <= 16'h46ff;SET_VIDEO+29: LUT_DATA <= 16'h47ff; SET_VIDEO+30: LUT_DATA <= 16'h48ff;SET_VIDEO+31: LUT_DATA <= 16'h49ff;SET_VIDEO+32: LUT_DATA <= 16'h4aff;SET_VIDEO+33: LUT_DATA <= 16'h4bff;SET_VIDEO+34: LUT_DATA <= 16'h4cff;SET_VIDEO+35: LUT_DATA <= 16'h4dff;SET_VIDEO+36: LUT_DATA <= 16'h4eff;SET_VIDEO+37: LUT_DATA <= 16'h4fff;SET_VIDEO+38: LUT_DATA <= 16'h50ff;SET_VIDEO+39: LUT_DATA <= 16'h51ff;SET_VIDEO+40: LUT_DATA <= 16'h52ff; SET_VIDEO+41: LUT_DATA <= 16'h53ff;SET_VIDEO+42: LUT_DATA <= 16'h54ff;SET_VIDEO+43: LUT_DATA <= 16'h55ff;SET_VIDEO+44: LUT_DATA <= 16'h56ff;SET_VIDEO+45: LUT_DATA <= 16'h57ff;SET_VIDEO+46: LUT_DATA <= 16'h5800;SET_VIDEO+47: LUT_DATA <= 16'h5954;SET_VIDEO+48: LUT_DATA <= 16'h5a07;SET_VIDEO+49: LUT_DATA <= 16'h5b83;SET_VIDEO+50: LUT_DATA <= 16'h5e00;2、視頻采集、解碼及視頻裁剪部分
由于采用PAL制式的攝像機(jī),其視頻畫(huà)面的有效分辨率為720*576,即總共576行(分奇偶兩場(chǎng),各占288行),每行720個(gè)像素點(diǎn),由于是8位串行輸出,因此每行總共有1440個(gè)字節(jié)。
視頻解碼文件完成的任務(wù)就是:通過(guò)判斷SAV信號(hào),來(lái)判斷接下來(lái)的數(shù)據(jù)是否為有效視頻數(shù)據(jù),如果是,則進(jìn)一步分離出有效數(shù)據(jù)的同步信號(hào)oDVAL和有效數(shù)據(jù)Y、Cb、Cr。
視頻的裁剪是通過(guò)一個(gè)除法器輔助完成的,主要是對(duì)每行視頻數(shù)據(jù)進(jìn)行裁剪,從720個(gè)像素裁剪到640像素。除數(shù)為當(dāng)前視頻行的當(dāng)前字節(jié)數(shù)右移1位,被除數(shù)為9。也就是說(shuō),每9個(gè)像素中,有一個(gè)像素點(diǎn)被裁剪掉,即720-720/9=640。具體代碼如下。
if(iSwap_CbCr)begincase(Cont[1:0]) // Swap0: Cb <= iTD_DATA;1: YCbCr <= {iTD_DATA,Cr};2: Cr <= iTD_DATA;3: YCbCr <= {iTD_DATA,Cb};endcaseendelsebegincase(Cont[1:0]) // Normal0: Cb <= iTD_DATA;1: YCbCr <= {iTD_DATA,Cb};2: Cr <= iTD_DATA;3: YCbCr <= {iTD_DATA,Cr};endcaseend上述代碼中,iSwap_CbCr除數(shù)除以被除數(shù)的商,Cont為當(dāng)前視頻行的當(dāng)前字節(jié)數(shù),下面以例子示之。
?
Cont[1:0] ? ? ? ? 00 ?01 ?10 ?11 ?00 ?01 ?10 ?11 ?00 ?01 ?10 ?11 ?00 ?01 ?10 ?11 ?00 ?01 ?10 ?11??00 ?01 ?10 ?11
iSwap_CbCr ? ? ? 0 ? ?0 ? 0 ? ?0 ? ?0 ? ?0 ? ?0 ? ?0 ? ?0 ? ?0 ? ?0 ? ?0 ? ?0 ? 0 ? ?0 ? ?0 ? ?0 ? ?0 ? ?1 ? ?1?? ?1 ? ?1 ? ?1 ? ?1
iTD_DATA ? ? ? ? Cb1 Y1 Cr1 Y2 Cb2?Y3 Cr2 Y4 Cb3?Y5 Cr3 Y6 ?Cb4?Y7 Cr4 Y8 Cb5?Y9 Cr5 Y10?Cb6?Y11 Cr6 Y12
YCbCr ? ? ? ? ? ? ? ?Y1Cb1 ?Y2Cr1 ?Y3Cb2 ?Y4Cr2 ?Y5Cb3 ?Y6Cr3 ? Y7Cb4 ?Y8Cr4 ?Y9Cb5 ?Y10Cb5 ?Y11Cr5 ?Y12Cb6
?
從上述例子可以看出,每4個(gè)時(shí)鐘周期輸出2個(gè)像素值,即輸出像素值的頻率減小了一半,這與分離出來(lái)的同步信號(hào)oDVAL的時(shí)鐘頻率一樣,同為13.5MHz。
另外,裁剪部分,由于Y9Cb5與Y10Cb5有很大的相似性,這里應(yīng)該是將Y9Cb5剔除,但是具體在什么位置剔除,卻不得而知。莫非是分析錯(cuò)誤?求解。
3、視頻數(shù)據(jù)存取
? 存儲(chǔ)在SDRAM采用的是1入2出的模式,即一個(gè)端口寫(xiě)入,2個(gè)端口讀出。存取數(shù)據(jù)的代碼如下:
?
// SDRAM frame buffer Sdram_Control_4Port u6 ( // HOST Side .REF_CLK(CLOCK_50),//.CLK_18(AUD_CTRL_CLK),.RESET_N(1'b1),// FIFO Write Side 1 .WR1_DATA(YCbCr),.WR1(TV_DVAL),.WR1_FULL(WR1_FULL),.WR1_ADDR(0),.WR1_MAX_ADDR(640*576), // 525-18.WR1_LENGTH(9'h80),.WR1_LOAD(!DLY0),.WR1_CLK(PPI_CLK),// FIFO Read Side 1 .RD1_DATA(m1YCbCr),.RD1(m1VGA_Read),.RD1_ADDR(640*12), // Read odd field and bypess blanking.RD1_MAX_ADDR(640*252),.RD1_LENGTH(9'h80),.RD1_LOAD(!DLY0),.RD1_CLK(PPI_CLK),// FIFO Read Side 2 .RD2_DATA(m2YCbCr),.RD2(m2VGA_Read),.RD2_ADDR(640*300), // Read even field and bypess blanking.RD2_MAX_ADDR(640*540),.RD2_LENGTH(9'h80),.RD2_LOAD(!DLY0),.RD2_CLK(PPI_CLK),// SDRAM Side .SA(DRAM0_A),.BA(DRAM0_BA),.CS_N(DRAM0_CS),.CKE(DRAM0_CKE),.RAS_N(DRAM0_RAS),.CAS_N(DRAM0_CAS),.WE_N(DRAM0_WE),.DQ(DRAM0_D),.DQM(DRAM0_DQM),.SDR_CLK(DRAM0_CLK) );經(jīng)過(guò)裁剪后的視頻分辨率為640*576。
寫(xiě)入SDRAM中時(shí),是將640*576個(gè)像素全部寫(xiě)入進(jìn)去,由于是奇場(chǎng)數(shù)據(jù)在前,偶場(chǎng)數(shù)據(jù)在后,因此前640*288行數(shù)據(jù)為奇場(chǎng)數(shù)據(jù),后?640*288行數(shù)據(jù)為偶場(chǎng)數(shù)據(jù)。
讀取視頻數(shù)據(jù)時(shí),采用乒乓操作,先后讀取奇偶場(chǎng)的數(shù)據(jù),各240行,組成一幅完整的畫(huà)面,讀取方法如下:
1
……
11
讀取12到251行,共240行
252
……
288
以上為奇數(shù)場(chǎng)數(shù)據(jù),以下為偶數(shù)場(chǎng)數(shù)據(jù)
289
……
299
讀取300到539行,共240行
540
……
576
其中,1~288行為奇數(shù)場(chǎng)數(shù)據(jù),289~576為偶數(shù)場(chǎng)數(shù)據(jù)。上述數(shù)據(jù)是從11~251,300~539讀取的,當(dāng)然也可以從1~240,289~529讀取,只要滿足奇偶場(chǎng)的起始行為相鄰行,且保證奇數(shù)場(chǎng)的數(shù)據(jù)行在前即可。
因此,最后得到的視頻分辨率為640*480.
4、色彩空間轉(zhuǎn)換
? 進(jìn)行色彩空間轉(zhuǎn)換之前,對(duì)視頻行數(shù)據(jù)進(jìn)行了簡(jiǎn)單的算法處理,代碼如下:
// Line buffer, delay one line Line_Buffer u10 ( .clken(VGA_Read),.clock(PPI_CLK),.shiftin(mYCbCr_d),.shiftout(m3YCbCr));Line_Buffer u11 ( .clken(VGA_Read),.clock(PPI_CLK),.shiftin(m3YCbCr),.shiftout(m4YCbCr));wire [15:0] m4YCbCr; wire [15:0] m5YCbCr; wire [8:0] Tmp1,Tmp2; wire [7:0] Tmp3,Tmp4;assign Tmp1 = m4YCbCr[7:0]+mYCbCr_d[7:0]; assign Tmp2 = m4YCbCr[15:8]+mYCbCr_d[15:8]; assign Tmp3 = Tmp1[8:2]+m3YCbCr[7:1]; assign Tmp4 = Tmp2[8:2]+m3YCbCr[15:9]; assign m5YCbCr = {Tmp4,Tmp3};對(duì)視頻行進(jìn)行了加和及數(shù)乘運(yùn)算。最后將YUV 4:2:2先轉(zhuǎn)換為YUV4:4:4的形式,之后再通過(guò)公式轉(zhuǎn)換成RGB色彩空間,最后通過(guò)VGA顯示在顯示器上。
?
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的【转】DE2_TV例程的几点说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# DataTable转ListMod
- 下一篇: PostgreSQL的德哥教程