您的位置 首页 电源

根据片上可编程体系解决方案完成视频编解码IP核的规划

基于片上可编程系统解决方案实现视频编解码IP核的设计-SOPC是Altera公司提出的片上可编程系统解决方案,它将CPU、存储器、I/O接口、DSP模块以及锁相环的系统设计所必需的模块集成到一块FPGA上,构成一个可编程的片上系统,使设计的电路在其规模、可靠性、体积、功耗、功能、上市周期、开发周期、产品维护以及硬件升级等多方面实现最优化。

导言

SOPC是Altera公司提出的片上可编程体系处理方案,它将CPU存储器I/O接口DSP模块以及相环的体系规划所必需的模块集成到一块FPGA上,构成一个可编程的片上体系,使规划的电路在其规划、可靠性、体积、功耗、功用、上市周期、开发周期、产品保护以及硬件晋级等多方面完结最优化。

现在在Altera SOPC“》SOPC Builder下集成了包含UART、SPIEthernet、SDRAM、Flash、DMA 等操控器的IP核。此外,用户也能够依据体系的需求自己规划或许购买第三方厂商的IP核,经过Avalon总线像搭积木相同便利地将其捆绑在体系上。IP 核是经过功用验证的知识产权核,运用IP 核有以下优势:(1)进步规划功用;(2)下降产品开发本钱;(3)缩短规划周期;(4)规划灵活性强;(5)仿真便利;(6) OpenCore Plus 支撑无风险运用。

当然本论文所说的IP 核功用没有那么丰厚,实际上便是一个功用验证正确的用户逻辑,和商业运用的IP 核还有必定的距离。本文的首要作业便是经过硬件描绘言语描绘了视频信号的收集,分配,存储以及色度空间的转化等逻辑,而且验证了功用的正确性。

1.视频编解码Camera_show原理

嵌入式摄像操控体系除了必要的电源电路以外,还要包含存储电路、通讯电路和下载电路等,一切的设备均与Avalon总线衔接,这儿首要介绍用户逻辑接口Camera_show,它完结了模仿视频数据转化成数字视频数据并在VGA上显现的功用,首要包含模仿视频信号的收集、分配(串并转化电路完结)、存储(存储操控逻辑和片上RAM完结)和色度空间转化。详细的功用框图如图1所示。

依据片上可编程体系处理方案完结视频编解码IP核的规划

图1 用户逻辑Camera_show的原理框图

2.视频编解码IP核Camera_Show规划

视频编解码IP核首要完结的功用包含视频信号的收集、分配、存储以及色度空间的转化。模仿视频信号经过ADV7181B 后变成了契合ITU-R656 的YUV 数字信号,可是要对YUV 信号进行处理有必要将这三路信号分隔并行处理,所以需求收集分配这三路信号,这是2.1 的IP核需求完结的功用;由于模仿视频信号是隔行扫描的,可是CRT 显现器是逐行扫描,假如不加处理那么必然会导致行错开,所以需求将数据进行存储,经过操控完结隔行变逐行,这是2.2 的IP 核需求完结的功用;最终经过处理的YUV 三路数字信号,需求完结色度空间的转化变成RGB 信号,这是2.3 的IP 核需求完结的功用。

2.1 YUV 信号的收集、分配

在嵌入式摄像操控体系中,ADV7181首要承担着模仿摄像头的视频数据进行解码的使命,将CVBS的等模仿信号转化成ITU-R656规范的YUV信号。图2给出了ADV7181的功用框图。

图2 ADV7181功用框图

由图能够看到,关于输入的CVBS 等模仿信号经过ADV7181B芯片转化后输出YUV 信号,行同步信号HS, 帧同步信号VS。这些便是需求的数字视频信号,也就处理了数字视频源的问题。图2 给出了YUV 信号的组成摆放办法,“FF,00,00”作为AV 信号的开端,所以需求结构一个检测电路。留意到SAV 和EAV 均是FF , 00 , 00 最初可是XY 的值不相同。依据芯片材料,XY[4]表明的是V ,即有用信号与空白信号的分界点,假如V=0则表明的是SAV,否则是EAV 。XY[6]是场信号的区别标志。0 是奇场,1 是偶场。

模仿信号的一行是1716 个CLOCK ,有用信号是1440 个CLOCK ,在信号收集和分配的进程中,仅需对有用信号进行收集,所以运用检测到SAV 作为一个标志,发动信号的分配进程对错常有必要的。

由于YUV 信号在模仿信号中是交织着的,所以需求一个信号挑选电路。YUV 一共是三路信号,规划一个计数器进行挑选,计数是O和2时,是UV信号,计数是1 和3 时是Y 信号,完结的实际上是串行信号转并行信号的进程。以上进程能够用图3的原理框图来表明。

图3 YUV信号的收集、分配原理图

在硬件描绘言语中,完结上述进程仍是比较简单的。例如检测电路,只需描绘一个移位寄存器就能够了,详细代码如下:

wire Y_check=((R3==8‘hff)&&(R2==8’h00)&&(R1==8‘h00))?1:0;

always@(posedge CLOCK)

begin

RR1=TD_D; RR2=Rl; RR3=R2;

end

always@(negedge CLOCK)

begin

Rl=RR1; R2=RR2; R3=RR3;

end

其间的wire 变量Y_check 便是当检测到FF,00,00的时分就为1的标志。依据上文所述,区别SAV 和EAV 是依据XY[4]来决议,区别奇偶场是依据XY[7]来区别,所以只要随后的信号是SAV 的时分,信号分配电路才有用,所以需求描绘一段逻辑来判别,代码如下:

reg START,Field;

always@(posedge CLOCK)begin

if(Y_check==1)

begin

START=~TD_D[4];

Field=TD_D[6];

end

end

START信号便是开端信号收集、分配的标志,只要当TD_D=0 也便是START= 1时信号分配电路才会作业。串转并电路代码如下:

reg [1:0] COUNTER;

always@(posedge CLOCK)begin

if (!START)

COUNTER=0;

else COUNTER = COUNTER + 1;

end

reg YPix_clock;

always@(posedge CLOCK) begin

case(COUNTER)

0 : begin Cbb=TD_D;YPix_clock=0;end

1 : begin YY =TD_D;CCr =Crr;CCb=Cbb;YPix_clock=1;end

2 : begin Crr=TD_D;YPix_clock=0;end

3 : begin YY=TD_D;CCr=Crr;CCb=Cbb;YPix_clock=1;end

endcase

end

以上代码完结了图3的功用,输入的信号名为TD_D,输出的三路信号是Cbb , YY , Crr。留意到还有个YPix_clock,实际上是27M 的2 分频,这个时钟十分有用,在下面将详细论述。 {{分页}}

2.2 YUV 信号的存储

要将视频信号隔行变逐行,有2 种处理办法:

第1种:将一帧的数据存储下来,依据奇偶场的不同(区别能够依据XY[7]),在写周期的时分,由于奇场的行之间有偶场的信号,所以写数据的时分需求跳地址写,依据行同步信号(或许SAV也能够)来区别行,换行的时分地址要加额定的720(用来寄存夹杂在奇场信号中的偶场信号),直到呈现偶场信号(也便是XY[6]=1)地址切换为初始基地址加720,其他的同奇行的处理办法,详细的地址分配表参照图4。

图 4 地址分配表

在读周期只需求依照次序读出就能够了,需求留意的是写时钟是13.5M,读时钟是27M,而且关于Y、U、V信号要进行别离存储。

第2种:将一行的数据存储下来,由于1716 个时钟周期刚好等于VGA 两行的时刻,所以在这段时刻里能够将7加个有用视频信号读取2遍,以奇行的信号去替代偶行的信号,到达隔行变逐行的意图。在完结上只需是两个RAM块进行乒乓操作就能够了,详细在后文论述。

比较两种完结办法,办法1的长处在于图画没有失真,即奇偶行信号仍旧相间在一起,办法2 却不能做到这一点,而且办法1 也能够经过乒乓办法进步运转的速度,可是由于读写时钟的不同步,每个存储空间应当读2遍。办法2也是读2遍,可是是每行读2遍,办法1是一帧数据读2遍。

办法1的缺陷在于存储的数据量太大。一帧数据仅Y重量便是8bit*720*525 =3024000bit = 378KB,这个数据是不合适在SRAM中操作的,需求运用SDRAM,而操作SDRAM 是比较复杂的,所以一般考虑运用办法2,由于它需求很小的空间,而且能够运用FPGA的片内资源就能够完结。当图画数据传输很快的时分,人眼基本上是分不清奇偶场信号的,所以办法2是可行的。在讲办法2之前,需求了解在流水线操作中常常运用的乒乓操作,这是可编程逻辑常用的规划思维和技巧。乒乓操作常常运用于数据流操控,典型的乒乓操作如图5所示。

图5 乒乓操作示意图

乒乓操作的处理流程描绘如下:输入数据流经过“输入数据流挑选单元”,等时地将数据流分配到两个数据缓冲模块。数据缓冲模块能够是任何存储模块,比较常用的存储单元是双口RAM ( DPRAM ),单口RAM ( SPRAM)和FIFO等。在第一个缓冲周期,将输入的数据流缓存到“数据缓冲模块1”。在第2个缓冲周期,经过“输入数据流挑选单元”的切换,将输入的数据流缓存到“数据缓冲模块2”,与此同时,将“数据缓冲模块1”缓存的第1个周期的数据经过“输出数据流挑选单元”的挑选,送到“数据流运算处理模块”被运算处理。在第3 个缓冲周期,经过“输入数据流挑选单元”的再次切换,将输入的数据流缓存到“数据缓冲模块1”,与此同时,将“数据缓冲模块2”缓存的第2个周期的数据经过“输出数据流挑选单元”的挑选,送到“数据流运算处理模块”被运算处理。如此循环,循环往复。

乒乓操作的最大特点是,经过“输入数据流挑选单元”和“输出数据流挑选单元”按节拍、相互配合的切换,将经过缓冲的数据流没有时刻中止地送到“数据流运算处理模块”,被运算和处理。把乒乓当作一个全体,站在这个模块的两头看数据,输入数据流和输出数据流都是接二连三的,没有任何中止,因而十分合适对数据流进行流水线式处理。所以乒乓办法常常运用于流水线式算法,完结数据的无缝缓冲与处理。

在FPGA里边,运用乒乓操作是面积与速度交换准则的一个表现。

办法2 能够这样完结:在FPGA内部运用Megacore,结构一个双口的RAM, 双口RAM 的输入输出信号的硬件描绘言语界说如下:

RAM2 u (.data_a (iDATA [7:0]) ,

.wren_a (I_a ) ,

.address_a(COUNTER_a [9 : 0] ) ,

.clock_a ( CLOCK_ a) ,

.q_a(DATA_a [ 7 : 0 ] ) ,

.data_b(iDATA[7:0]),

.wren_b (I_b),

.address_b(COUNTER_b[9:0]) ,

.clock_b(CLOCK_b) ,

.q_b(DATA_b[7:0]) ) ;

运用的信号包含:数据信号data_a, dat_b;读写有用信号wren_a, wren_b;地址信号address_a, address_b;时钟信号clock_a,clock_b;输出数据信号q_a,q_b。能够看到一切的信号都是成对呈现的,便是为了进行乒乓办法的数据传输。分成了两个RAM区域,A 和B,相当于前面讲乒乓办法里的数据缓冲模块1 和2。两个RAM 块是替换着读写(由I_a和I_b决议),输出数据流也是由I 决议。刚提到写时钟是13.5M,读时钟是27M,所以clock_a 和clock_b有必要是读写时钟切换着输入,而且地址的计数也不相同,写周期时分地址添加的时钟是13.5M,读周期地址添加的时钟是27M。所以每行的数据读了两遍,相当于隔行变逐行。图6是在Quartus II下RAM的乒乓操作功用仿真图:

图6 RAM的乒乓操作仿真图 {{分页}}

RAM块进行乒乓办法操作信号的分配表如下:

最终输出的DATA信号进入下一级单元,即YUV到RGB的转化。

2.3 色彩-空间转化部分规划

为什么要有这个转化呢?由于不论是电视机仍是CRT显现器,都是运用RGB三基色组成的办法来显现色彩。用RGB三基色来表明五颜六色确实很直观,可是假如把这种办法用作图画传输则绝不是一个好办法。首要是由于:

(1) 与是非图画不兼容;

(2) 占用太多带宽;

(3) 抗干扰能力差。

本体系图画传感器输出YCbCr信号,需求进行到RGB信号的转化,用于CRT显现。YCbCr 到RGB依照下面公式进行转化:

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 );

调查上面公式能够发现,转化均需求乘加运算,而且式子顶用到了小数,所以有必要要对系数进行扩大。经过合理转化,公式如下:

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编写代码,完结YUV到RGB的转化。其间共包含3个模块跟1个仿真鼓励。在模块const_mult中,首要完结乘法运算,首要代码如下:

module const_mult (Clock, ClockEnable, Reset, Color, Color_Out);

parameter IN_SIZE = 8;

parameter OUT_SIZE = 16; // output size width (integer)

parameter CST_MULT = 66; // constant multiplicand (integer)

........

always @(posedge Clock or posedge Reset)

begin : COLOR_KCM

if (Reset)

Color_Out 《= 0;

else if (ClockEnable)

Color_Out 《= CST_MULT * Color;

end

endmodule

模块csc.v中,调用const_mult模块,经过参数传递改动参数IN_SIZE, OUT_SIZE, CST_MULT的值,然后完结加法运算。

以R = (1/256) * ( 298*Y + 409*Cr – 57065 )为例,首要代码如下:

const_mult #(8, 18, 298) R_KCM_Y(.Clock(Clock), .ClockEnable(ClockEnable), .Reset(Reset), .Color(Y),.Color_Out(R_Y_KCM));

const_mult #(8, 18, 0 ) R_KCM_Cb(.Clock(Clock), .ClockEnable(ClockEnable), .Reset(Reset), .Color(Cb),.Color_Out(R_Cb_KCM));

const_mult #(8, 18, 409) R_KCM_Cr(.Clock(Clock), .ClockEnable(ClockEnable), .Reset(Reset), .Color(Cr),.Color_Out(R_Cr_KCM));

// Adder for (Cr + constant)

always @(posedge Clock or posedge Reset)

begin : R_Cr_C_Adder

if (Reset)

R_Cr_C 《= 0;

else if (ClockEnable)

R_Cr_C 《= R_Cr_KCM – 57065;

end

// Adder for (Y + Cb)

always @(posedge Clock or posedge Reset)

begin : R_Y_Cb_Adder

if (Reset)

R_Y_Cb 《= 0;

else if (ClockEnable)

R_Y_Cb 《= R_Y_KCM + R_Cb_KCM;

end

// Adder for R =》 Y + Cb + constant

always @(posedge Clock or posedge Reset)

begin : R_Adder

if (Reset)

R_full 《= 0;

else if (ClockEnable)

R_full 《= R_Y_Cb + R_Cr_C;

End

用以完结G、B的代码与上面相似,在此不再赘述。以下代码完结R_full*1/256功用。

always @(R_full or G_full or B_full)

begin

if(R_full[17]) R = 0;

else if(R_full[16]) R = 255;

else R = R_full [15:8];

……

end

主模块yuv2rgb完结子模块的调用,用Modelsim进行了仿真。仿真波形如图7所示:

图7 YUV到RGB的转化仿真图

3.定论

本文规划了依据SOPC”》SOPC的视频编解码操控器IP核,依据自顶向下的规划思维,将IP核进行层次功用区分,并对IP核的仿真验证,完结了视频信号的收集,分配,存储以及色度空间的转化。本IP核具有很好的移植性,能够便利的运用到以Nios II为中心的各种需求视频编解码操控器功用的嵌入式中。

责任编辑:gt

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/97806.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部