SOPC在视频编解码IP核中的应用-设计应用_第1页
SOPC在视频编解码IP核中的应用-设计应用_第2页
SOPC在视频编解码IP核中的应用-设计应用_第3页
SOPC在视频编解码IP核中的应用-设计应用_第4页
SOPC在视频编解码IP核中的应用-设计应用_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档-下载后可编辑SOPC在视频编解码IP核中的应用-设计应用

System-on-a-Programmable-Chip,即可编程片上系统。用可编程逻辑技术把整个系统放到一块硅片上,称作SOPC.可编程片上系统(SOPC)是一种特殊的嵌入式系统:首先它是片上系统(SOC),即由单个芯片完成整个系统的主要逻辑功能;其次,它是可编程系统,具有灵活的设计方式,可裁减、可扩充、可升级,并具备软硬件在系统可编程的功能。SOPC它是用可编程逻辑技术把整个系统放到一块硅片上,来用于嵌入式系统的研究和电子信息处理。SOPC是一种特殊的嵌入式系统,它是片上系统(SOC),即由单个芯片完成整个系统的主要逻辑功能但它不是简单的SOC,它也是可编程系统,具有灵活的设计方式,可裁减、可扩充、可升级,并具备软硬件在系统可编程的功能。

SOPC设计技术涵盖了嵌入式系统设计技术的全部内容,除了以处理器和实时多任务操作系统(RTOS)为中心的软件设计技术、以PCB和信号完整性分析为基础的高速电路设计技术以外,SOPC还涉及目前以引起普遍关注的软硬件协同设计技术。由于SOPC的主要逻辑设计是在可编程逻辑器件内部进行,而BGA封装已被广泛应用在微封装领域中,传统的调试设备,如:逻辑分析仪和数字示波器,已很难进行直接测试分析,因此,必将对以仿真技术为基础的软硬件协同设计技术提出更高的要求。同时,新的调试技术也已不断涌现出来,如Xilinx公司的片内逻辑分析仪ChipScopeILA就是一种价廉物美的片内实时调试工具。

当然本论文所说的IP核功能没有那么丰富,实际上就是一个功能验证正确的用户逻辑,和商业应用的IP核还有一定的差距。本文的主要工作就是通过硬件描述语言描述了视频信号的采集,分配,存储以及色度空间的转换等逻辑,并且验证了功能的正确性。

1.视频编解码Camera_show原理

嵌入式摄像控制系统除了必要的电源电路以外,还要包括存储电路、通信电路和电路等,所有的设备均与Avalon总线连接,这里主要介绍用户逻辑接口Camera_show,它完成了模拟视频数据转化成数字视频数据并在VGA上显示的功能,主要包括模拟视频信号的采集、分配(串并转换电路完成)、存储(存储控制逻辑和片上RAM完成)和色度空间转换。具体的功能框图如图1所示。

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

2.视频编解码IP核Camera_Show设计

IP核(IntellectualPropertycore)是一段具有特定电路功能的硬件描述语言程序,该程序与集成电路工艺无关,可以移植到不同的半导体工艺中去生产集成电路芯片。利用IP核设计电子系统,引用方便,修改基本元件的功能容易。具有复杂功能和商业价值的IP核一般具有知识产权,尽管IP核的市场活动还不规范,但是仍有许多集成电路设计公司从事IP核的设计、开发和营销工作。IP核有两种,与工艺无关的VHDL程序称为软核;具有特定电路功能的集成电路版图称为硬核。硬核一般不允许更改,利用硬核进行集成电路设计难度大,但是容易成功流片。

视频编解码IP核主要完成的功能包含视频信号的采集、分配、存储以及色度空间的转换。模拟视频信号经过ADV7181B后变成了符合ITU-R656的YUV数字信号,但是要对YUV信号进行处理必须将这三路信号分开并行处理,所以需要采集分配这三路信号,这是2.1的IP核需要实现的功能;由于模拟视频信号是隔行扫描的,但是CRT显示器是逐行扫描,如果不加处理那么必然会导致行错开,所以需要将数据进行存储,通过控制实现隔行变逐行,这是2.2的IP核需要实现的功能;经过处理的YUV三路数字信号,需要完成色度空间的转换变成RGB信号,这是2.3的IP核需要实现的功能。

2.1YUV信号的采集、分配

YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间。在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

在嵌入式摄像控制系统中,ADV7181主要承担着模拟摄像头的视频数据进行解码的任务,将CVBS的等模拟信号转化成ITU-R656标准的YUV信号。图2给出了ADV7181的功能框图。

图2ADV7181功能框图

由图可以看到,对于输入的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的原理框图来表示。

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

在硬件描述语言中,完成上述过程还是比较简单的。例如检测电路,只要描述一个移位寄存器就可以了,具体代码如下:

wireY_check=((R3==8'hff)(R2==8'h00)(R1==8'h00))?1:0;

always@(posedgeCLOCK)

begin

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

end

always@(negedgeCLOCK)

begin

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

end

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

regSTART,Field;

always@(posedgeCLOCK)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@(posedgeCLOCK)begin

if(!START)

COUNTER=0;

elseCOUNTER=COUNTER+1;

end

regYPix_clock;

always@(posedgeCLOCK)begin

case(COUNTER)

0:beginCbb=TD_D;YPix_clock=0;end

1:beginYY=TD_D;CCr=Crr;CCb=Cbb;YPix_clock=1;end

2:beginCrr=TD_D;YPix_clock=0;end

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

endcase

end

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

2.2YUV信号的存储

要将视频信号隔行变逐行,有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的输入输出信号的硬件描述语言定义如下:

RAM2u(。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是在QuartusII下RAM的乒乓操作功能仿真图:

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

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

用VerilogHDL编写代码,实现YUV到RGB的转化。其中共包括3个模块跟1个仿真激励。在模块const_mult中,主要实现乘法运算,主要代码如下:

moduleconst_mult(Clock,ClockEnable,Reset,Color,Color_Out);

parameterIN_SIZE=8;

parameterOUT_SIZE=16;//outputsizewidth(integer)

parameterCST_MULT=66;//constantmultiplicand(integer)

……

always@(posedgeClockorposedgeReset)

begin:COLOR_KCM

if(Reset)

Color_Out=0;

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

//Adderfor(Cr+constant)

always@(posedgeClockorposedgeReset)

begin:R_Cr_C_Adder

if(Reset)

R_Cr_C=0;

elseif(ClockEnable)

R_Cr_C=R_Cr_KCM-57065;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论