基于SOPC的視頻編解碼IP核的設計
2011/08/23
引言
SOPC是Altera公司提出的片上可編程系統解決方案,它將CPU、存儲器、I/O接口、DSP模塊以及鎖相環(huán)的系統設計所必需的模塊集成到一塊FPGA上,構成一個(gè)可編程的片上系統,使設計的電路在其規模、可靠性、體積、功耗、功能、上市周期、開(kāi)發(fā)周期、產(chǎn)品維護以及硬件升級等多方面實(shí)現最優(yōu)化。
目前在A(yíng)ltera SOPC">SOPC Builder下集成了包括UART、SPI、Ethernet、SDRAM、Flash、DMA等控制器的IP核。此外,用戶(hù)也可以根據系統的需要自己設計或者購買(mǎi)第三方廠(chǎng)商的IP核,通過(guò)Avalon總線(xiàn)像搭積木一樣方便地將其捆綁在系統上。IP核是經(jīng)過(guò)功能驗證的知識產(chǎn)權核,使用IP 核有以下優(yōu)勢:(1)提高設計性能;(2)降低產(chǎn)品開(kāi)發(fā)成本;(3)縮短設計周期;(4)設計靈活性強;(5)仿真方便;(6)OpenCore Plus支持無(wú)風(fēng)險應用。
當然本論文所說(shuō)的IP核功能沒(méi)有那么豐富,實(shí)際上就是一個(gè)功能驗證正確的用戶(hù)邏輯,和商業(yè)應用的IP核還有一定的差距。本文的主要工作就是通過(guò)硬件描述語(yǔ)言描述了視頻信號的采集,分配,存儲以及色度空間的轉換等邏輯,并且驗證了功能的正確性。
1、視頻編解碼Camera_show原理
嵌入式攝像控制系統除了必要的電源電路以外,還要包括存儲電路、通信電路和下載電路等,所有的設備均與Avalon總線(xiàn)連接,這里主要介紹用戶(hù)邏輯接口Camera_show,它完成了模擬視頻數據轉化成數字視頻數據并在VGA上顯示的功能,主要包括模擬視頻信號的采集、分配(串并轉換電路完成)、存儲(存儲控制邏輯和片上RAM完成)和色度空間轉換。具體的功能框圖如圖1所示。
圖1 用戶(hù)邏輯Camera_show的原理框圖
2、視頻編解碼IP核Camera_Show設計
視頻編解碼IP 核主要完成的功能包含視頻信號的采集、分配、存儲以及色度空間的轉換。模擬視頻信號經(jīng)過(guò)ADV7181B后變成了符合ITU-R656的YUV數字信號,但是要對YUV信號進(jìn)行處理必須將這三路信號分開(kāi)并行處理,所以需要采集分配這三路信號,這是2.1的IP核需要實(shí)現的功能;由于模擬視頻信號是隔行掃描的,但是CRT顯示器是逐行掃描,如果不加處理那么必然會(huì )導致行錯開(kāi),所以需要將數據進(jìn)行存儲,通過(guò)控制實(shí)現隔行變逐行,這是2.2的IP核需要實(shí)現的功能;最后經(jīng)過(guò)處理的YUV三路數字信號,需要完成色度空間的轉換變成RGB信號,這是2.3的IP核需要實(shí)現的功能。
2.1 YUV信號的采集、分配
在嵌入式攝像控制系統中,ADV7181主要承擔著(zhù)模擬攝像頭的視頻數據進(jìn)行解碼的任務(wù),將CVBS的等模擬信號轉化成ITU-R656標準的YUV信號。圖2給出了ADV7181的功能框圖。
圖2 ADV7181功能框圖
由圖可以看到,對于輸入的CVBS等模擬信號經(jīng)過(guò)ADV7181B芯片轉換后輸出YUV信號,行同步信號HS,幀同步信號VS。這些就是需要的數字視頻信號,也就解決了數字視頻源的問(wèn)題。圖2給出了YUV信號的組成排列方式,“FF,00,00”作為AV信號的開(kāi)始,所以需要構造一個(gè)檢測電路。注意到SAV和EAV均是FF,00,00開(kāi)頭但是XY的值不一樣。根據芯片資料,XY表示的是V,即有用信號與空白信號的分界點(diǎn),如果V=0則表示的是SAV,否則是EAV 。XY是場(chǎng)信號的區分標志。0是奇場(chǎng),1是偶場(chǎng)。
模擬信號的一行是1716個(gè)CLOCK,有用信號是1440個(gè)CLOCK,在信號采集和分配的過(guò)程中,僅需對有用信號進(jìn)行采集,所以利用檢測到SAV作為一個(gè)標志,啟動(dòng)信號的分配過(guò)程是非常有必要的。
由于YUV信號在模擬信號中是交織著(zhù)的,所以需要一個(gè)信號選擇電路。YUV一共是三路信號,設計一個(gè)計數器進(jìn)行選擇,計數是O和2時(shí),是UV信號,計數是1和3時(shí)是Y信號,完成的實(shí)際上是串行信號轉并行信號的過(guò)程。以上過(guò)程可以用圖3的原理框圖來(lái)表示。
圖3 YUV信號的采集、分配原理圖
在硬件描述語(yǔ)言中,完成上述過(guò)程還是比較簡(jiǎn)單的。例如檢測電路,只要描述一個(gè)移位寄存器就可以了,具體代碼如下:
其中的wire變量Y_check就是當檢測到FF,00,00的時(shí)候就為1的標志。根據上文所述,區分SAV和EAV是根據XY來(lái)決定,區分奇偶場(chǎng)是根據XY來(lái)區分,所以只有隨后的信號是SAV的時(shí)候,信號分配電路才有效,所以需要描述一段邏輯來(lái)判斷,代碼如下:
START信號就是開(kāi)始信號采集、分配的標志,只有當TD_D=0也就是START= 1時(shí)信號分配電路才會(huì )工作。串轉并電路代碼如下:
以上代碼完成了圖3的功能,輸入的信號名為T(mén)D_D,輸出的三路信號是Cbb,YY,Crr。注意到還有個(gè)YPix_clock,實(shí)際上是27M的2分頻,這個(gè)時(shí)鐘非常有用,在下面將詳細闡述。
2.2 YUV信號的存儲
要將視頻信號隔行變逐行,有2 種解決方法:
第1種:將一幀的數據存儲下來(lái),根據奇偶場(chǎng)的不同(區分可以根據XY),在寫(xiě)周期的時(shí)候,因為奇場(chǎng)的行之間有偶場(chǎng)的信號,所以寫(xiě)數據的時(shí)候需要跳地址寫(xiě),根據行同步信號(或者SAV也可以)來(lái)區分行,換行的時(shí)候地址要加額外的720(用來(lái)存放夾雜在奇場(chǎng)信號中的偶場(chǎng)信號),直到出現偶場(chǎng)信號(也就是XY=1)地址切換為初始基地址加720,其余的同奇行的處理方法,具體的地址分配表參照圖4。
圖4 地址分配表
在讀周期只需要按照順序讀出就可以了,需要注意的是寫(xiě)時(shí)鐘是13.5M,讀時(shí)鐘是27M,而且對于Y、U、V信號要進(jìn)行分別存儲。
第2種:將一行的數據存儲下來(lái),因為1716個(gè)時(shí)鐘周期剛好等于VGA兩行的時(shí)間,所以在這段時(shí)間里可以將7加個(gè)有效視頻信號讀取2遍,以奇行的信號去取代偶行的信號,達到隔行變逐行的目的。在實(shí)現上只要是兩個(gè)RAM塊進(jìn)行乒乓操作就可以了,具體在后文闡述。
比較兩種實(shí)現方法,方法1的優(yōu)點(diǎn)在于圖像沒(méi)有失真,即奇偶行信號依舊相間在一起,方法2卻不能做到這一點(diǎn),而且方法1也可以通過(guò)乒乓方式提高運行的速度,但是由于讀寫(xiě)時(shí)鐘的不同步,每個(gè)存儲空間應當讀2遍。方法2也是讀2遍,但是是每行讀2遍,方法1是一幀數據讀2遍。
方法1的缺點(diǎn)在于存儲的數據量太大。一幀數據僅Y分量就是8bit*720*525=3024000bit=378KB,這個(gè)數據是不適合在SRAM中操作的,需要使用SDRAM,而操作SDRAM是比較復雜的,所以一般考慮使用方法2,因為它需要很小的空間,而且可以利用FPGA的片內資源就可以實(shí)現。當圖像數據傳輸很快的時(shí)候,人眼基本上是分不清奇偶場(chǎng)信號的,所以方法2是可行的。在講方法2之前,需要了解在流水線(xiàn)操作中經(jīng)常使用的乒乓操作,這是可編程邏輯常用的設計思想和技巧。乒乓操作常常應用于數據流控制,典型的乒乓操作如圖5所示。
圖5 乒乓操作示意圖
乒乓操作的處理流程描述如下:輸入數據流通過(guò)“輸入數據流選擇單元”,等時(shí)地將數據流分配到兩個(gè)數據緩沖模塊。數據緩沖模塊可以是任何存儲模塊,比較常用的存儲單元是雙口RAM ( DPRAM ),單口RAM ( SPRAM)和FIFO等。在第一個(gè)緩沖周期,將輸入的數據流緩存到“數據緩沖模塊1”。在第2個(gè)緩沖周期,通過(guò)“輸入數據流選擇單元”的切換,將輸入的數據流緩存到“數據緩沖模塊2”,與此同時(shí),將“數據緩沖模塊1”緩存的第1個(gè)周期的數據通過(guò)“輸出數據流選擇單元”的選擇,送到“數據流運算處理模塊”被運算處理。在第3個(gè)緩沖周期,通過(guò)“輸入數據流選擇單元”的再次切換,將輸入的數據流緩存到“數據緩沖模塊1”,與此同時(shí),將“數據緩沖模塊2”緩存的第2個(gè)周期的數據通過(guò)“輸出數據流選擇單元”的選擇,送到“數據流運算處理模塊”被運算處理。如此循環(huán),周而復始。
乒乓操作的最大特點(diǎn)是,通過(guò)“輸入數據流選擇單元”和“輸出數據流選擇單元”按節拍、相互配合的切換,將經(jīng)過(guò)緩沖的數據流沒(méi)有時(shí)間停頓地送到“數據流運算處理模塊”,被運算和處理。把乒乓看成一個(gè)整體,站在這個(gè)模塊的兩端看數據,輸入數據流和輸出數據流都是連續不斷的,沒(méi)有任何停頓,因此非常適合對數據流進(jìn)行流水線(xiàn)式處理。所以乒乓方式常常應用于流水線(xiàn)式算法,完成數據的無(wú)縫緩沖與處理。
在FPGA里面,使用乒乓操作是面積與速度互換原則的一個(gè)體現。
方法2 可以這樣實(shí)現:在FPGA內部使用Megacore,構造一個(gè)雙口的RAM,雙口RAM的輸入輸出信號的硬件描述語(yǔ)言定義如下:
使用的信號包括:數據信號data_a,dat_b;讀寫(xiě)有效信號wren_a,wren_b;地址信號address_a,address_b;時(shí)鐘信號clock_a,clock_b;輸出數據信號q_a,q_b。可以看到所有的信號都是成對出現的,就是為了進(jìn)行乒乓方式的數據傳輸。分成了兩個(gè)RAM區域,A和B,相當于前面講乒乓方式里的數據緩沖模塊1和2。兩個(gè)RAM塊是交替著(zhù)讀寫(xiě)(由I_a和I_b決定),輸出數據流也是由I決定。剛說(shuō)到寫(xiě)時(shí)鐘是13.5M,讀時(shí)鐘是27M,所以clock_a和clock_b必須是讀寫(xiě)時(shí)鐘切換著(zhù)輸入,而且地址的計數也不一樣,寫(xiě)周期時(shí)候地址增加的時(shí)鐘是13.5M,讀周期地址增加的時(shí)鐘是27M。所以每行的數據讀了兩遍,相當于隔行變逐行。圖6在Qartus II下RAM的乒乓操作功能仿真圖:
圖6 RAM的乒乓操作仿真圖
RAM塊進(jìn)行乒乓方式操作信號的分配表如下:
最后輸出的DATA信號進(jìn)入下一級單元,即YUV到RGB的轉換。
2.3 顏色-空間轉換部分設計
為什么要有這個(gè)轉換呢?因為不論是電視機還是CRT顯示器,都是使用RGB三基色合成的方法來(lái)顯示顏色。用RGB三基色來(lái)表示彩色的確很直觀(guān),但是如果把這種方法用作圖像傳輸則絕不是一個(gè)好方法。主要是因為:
(1)與黑白圖像不兼容;
(2)占用太多帶寬;
(3)抗干擾能力差。
本系統圖像傳感器輸出YCbCr信號,需要進(jìn)行到RGB信號的轉換,用于CRT顯示。YCbCr到RGB按照下面公式進(jìn)行轉換:
R = 1.164 ( Y-16 ) + 1.596 ( Cr-128 );
G = 1.164 ( Y-16 )- 0.813 ( Cr-128 ) - 0.392(Cb-128);
B = 1.164 ( Y-16 ) + 2.017 ( Cb-128 );
觀(guān)察上面公式可以發(fā)現,轉換均需要乘加運算,并且式子中用到了小數,所以必須要對系數進(jìn)行放大。經(jīng)過(guò)合理轉化,公式如下:
R = (1/256) * ( 298*Y + 409*Cr - 57065 );
G = (1/256) * ( 298*Y - 100*Cb - 208*Cr + 34718 );
B = (1/256) * ( 298*Y + 516*Cb - 70861 );
用Verilog HDL編寫(xiě)代碼,實(shí)現YUV到RGB的轉化。其中共包括3個(gè)模塊跟1個(gè)仿真激勵。在模塊const_mult中,主要實(shí)現乘法運算,主要代碼如下:
模塊csc.v中,調用const_mult模塊,通過(guò)參數傳遞改變參數IN_SIZE,OUT_SIZE,CST_MULT的值,然后實(shí)現加法運算。
以R = (1/256) * ( 298*Y + 409*Cr - 57065 )為例,主要代碼如下:
用以實(shí)現G、B的代碼與上面類(lèi)似,在此不再贅述。以下代碼實(shí)現R_full*1/256功能。
主模塊yuv2rgb實(shí)現子模塊的調用,用Modelsim進(jìn)行了仿真。仿真波形如圖7所示:
圖7 YUV到RGB的轉化仿真圖
3、結論
本文設計了基于SOPC">SOPC的視頻編解碼控制器IP核,根據自頂向下的設計思想,將IP核進(jìn)行層次功能劃分,并對IP核的仿真驗證,實(shí)現了視頻信號的采集,分配,存儲以及色度空間的轉換。本IP核具有很好的移植性,可以方便的應用到以Nios II為核心的各種需要視頻編解碼控制器功能的嵌入式中。
與非網(wǎng)
相關(guān)閱讀:
亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩
会泽县|
郁南县|
龙岩市|
普陀区|
苍梧县|
沿河|
珲春市|
澳门|
通化县|
襄樊市|
奉节县|
理塘县|
安义县|
神农架林区|
永宁县|
防城港市|
定南县|
于田县|
吴忠市|
桃源县|
阜城县|
达州市|
福海县|
牡丹江市|
南岸区|
桃园县|
稷山县|
嘉禾县|
溆浦县|
凭祥市|
苍梧县|
儋州市|
鄱阳县|
龙南县|
新巴尔虎左旗|
张家界市|
涞源县|
屏东市|
金川县|
永吉县|
南漳县|
http://444
http://444
http://444
http://444
http://444
http://444