1 简介
1.1 基于DVB-T无线视频传输系统
无线视频传输系统的硬件实现框图如图1所示。本系统硬件分为4个组成部分:信源编码部分、信道编码调制部分、射频部分和接收机部分。
摄像头采集视频信号,并输出PAL制的模拟电视信号。视频解码器将AV视频信号数字化和解码,转化为YUV(4:2:2)格式输出。TMS320DM 642将原始视频以MPEG-2格式进行编码,并且将编码数据封装为TS数据流。TS数据流以SPI并行数据格式传递给信道解码部分。
信道编码部分通过FPGA(EP3C55F484)对数据进行DVB-T编码和中频调制,调制信号经过模拟上变频完成射频调制。
接收机部分通过接收射频信号并对其进行模拟下变频,提取出感兴趣的中频信号,利用信道解调器对其进行信道解码。解码后的信源数据流以TS流格式传送给TMS320DM642处理器。处理器先进行TS解包,再对MPEG-2数据流解压缩。根据系统不同设置,可以通过PCI接口发送至PC端进行后端数据处理,或通过视频编码器将视频信号还原为模拟电视信号。
1.2 传送流(TS流)
TS流是由打包的视频、音频基本码流再经过打包形成的复合码流,每包长度为188字节,或由PS流分段截取,适用于误码较大的应用环境。传送流的系统层可分作两个子层:一个是相应于特定数据流操作(PES分组层,可变长度),该层是为编解码的控制而定义的逻辑结构,
PES头包括流的性质、版权说明(该节目是原始节目还是复制节目)、加入时间标签PTS和DTS、说明DSM的特殊模式等;另一个是相应于多路复用操作(TS分组层,188字节固定长度结构),该层是针对交换和互操作而定义的,在TS头中加入同步、说明有无差错、有无加扰,加入连续计数和不连续性指示(因为节目流的包相互交叉),加入节目参考时钟PCR以及包识别PID等。两个子层间的复用关系是将PES结构切割成一个个小包,作为TS包的净荷嵌入到TS流结构中而建立起来的,这种结构可以很方便地实现直接从传送流中解出原始音视频数据,也可从一个或多个传送流中抽取想要的基本流来进行解码,或构造新的传送流再次传输,还可以依据通信信道的质量在TS流与PS流间作切换。
1.3 数据在DM642接口的传输
I2C总线传输为140kb/s,速度慢,接口简单,适合于各种芯片参数的配置或EEPROM访问等数据量小的通信。视频口传输为27M×20b/ s,数据较快,接口复杂,功能单一,一般只用于DSP与视频编/解码器之间的视频数据传输。网口传输为10M/100M,通信协议复杂,若用FPGA实现,则接口也复杂,适合于DSP与PC机间的数据传输。McBSP传输为40 Mb/s,如果用FPGA实现接口较为简单,适合于DSP与FPGA低速数据传输。GPIO传输为10M×n,n是GPIO的引脚数目,接口极其简单,传输速度较快。如DM6437共有111个GPIO引脚,若用3个32位的GPIO则可达到960 Mb/s。即使用1个32位的GPIO bank也可以达到320 Mb/s,能够满足一般的数据传输需求。DM642有16个GPIO口,速度也可达到160 Mb/s,满足设计要求。图2即是GPIO方式传输TS流需要的时序。
如果利用任务或中断的方式传输数据,因为数据量大,势必增加CPU的负担,这种负担很有可能是CPU无法承受的。例如使用任务来传输,若数据为8 MB/s,则这个任务占用CPU 80%的时间,这是本应该占据大部分时问的图像压缩算法无法忍受的,并且时常可能被突如其来的中断打断而丢失数据。若利用中断来同步传输,而使CPU大部分时间在中断中,亦是不现实的。这里采用DSP中的增强型的DMA模块(EDMA),在CPU不参与的情况下完成数据传输,只有传输完成才进入中断,如此则解放出CPU,以使算法占用它。2 TS流传输实现
2.1 McBSP实现
McBSP由数据通道和控制通道组成,可以与外部设备连接,进行数据通信。数据的接收与发送分别工作于不同的引脚上,因此数据通信是全双工的。其他的4个引脚用于传输控制信号(时钟和同步信号)。
这里采用EDMA进行McBSP与存储器缓冲区之间的数据搬运。EDMA控制器读取从外部设备接收到并保存在DRR(数据接收寄存器)的数据,或者将需要向外部设备发送的数据写入DXR(数据发送寄存器)。被写入DXR的数据经过XSR被移出到DX脚上。同理,接收的数据先被移入RSR,然后被拷贝到RBR,最后再被拷贝到DRR,这时就允许被EDMA访问了。McBSP中内部数据的移出和外部数据的移入可以同时发生,即可以进行全双工的数据通信。
以EDMA接收数据的配置为例,配置参数RAM。EDMA通道接收数据源地址为McBSP0的DRR寄存器,地址计数模式为不变模式。设置EDMA通道接收数据目的地址为DSP片内存储区PingBuffer首地址,确保第一次传输数据是到PingBuffer,地址计数模式同样为递增模式。配置源地址计数索引值,由于源地址为McBSP0的DRR寄存器,固定不变;配置目的地址计数索引值,由于接收数据为32位,所以srcBidx=srcCidx=4,这是因为DSP内的最小计数单元为1个字节,8bits;配置剩余的参数RAM传输参数,包括设置ACNT=4,BCNT=2 048,CCNT=1,采用一维传输A-SYN C。
接下来是ping-pong传输的程序实现。替ping-pong各自分配1个通道,于是一共有3个通道,对应3个参数RAM。ping通道的参数RAM与主通道的参数RAM完全一致,pong通道的参数RAM与主通道相比,只需将pong通道接收数据目的地址改为PongBuffer首地址。随后调用EDMA_link三次,分别将主通道和ping通道连接,ping通道和pong通道相互连接。EDMA中断设置与GPIO输出任务一样。
2.2 GPIO实现
TS流输出任务采用1D到1D的传输模式。SUM=01,DUM=00,即源地址是188字节的Buffer,目的地址是GPIO[8:15]对应的寄存器,GP4的外部触发EDMA传输,传输188字节产生1次EDMA中断。队列优先级设置为紧急,来保证时序。以EXTINT5为EDMA触发事件:
pong的参数RAM设置类似,只要将源地址改为pong,并将重载的参数RAM地址改为edmacfg_pong即可。
DM642中,EDMA的64个通道只产生一种中断。当一个通道传输完成后,IPR(Interrupt Pending Register)寄存器里的相应位会被置1,EDMA中断处理器通过查询IPR寄存器,确定是哪个通道完成了传输,并调用相应的中断服务程序,即tccCb(回调函数,即通道传输完成后所调用的中断服务程序)。tccCb=edma_isr,该函数的作用是当一个接收Buffer被填满时,在通道传输完成后发送一个旗语信号给信号处理程序,通知其对收到的数据进行处理。参数RAMOPT中TCINTEN位置1,以使能EDMA中断。随后,利用DSP/BIOS将EDMA中断源和DSP的可屏蔽中断5连接起来。编写相应通道的EDMA中断程序,传输完一个TS包后,检查是否1帧图像的TS流传完,用以生成数据有效信号(Dvalid),通知接收方哪些是有用数据。由于选用了DM642的可屏蔽中断5,还需使能IER寄存器里的对应位。
TS流输入则只需要将SUM=00,DUM=01,目的地址和源地址交换,再将EDMA中断程序中目的地址变更到188字节后的地址。采用GP4作EDMA同步事件(即SPI时钟),GPIO[8:15]作数据输入,GP7作同步,采用GP6作外部中断,用作数据有效线。在外部中断中重载,在传输完成中断中改变目的地址。如此则可顺利接收到TS流。
采用Link的ping-pong方式,利用两个参数RAM反复转载得到TS流的数据:在此采用的双缓冲结构,即在DSP缓冲区内开辟两块缓冲用于并行处理FPGA通过McBSP传过来的数据。当EDMA往PingBuffer里传输数据时,CPU即可处理PongBuffer里的数据。当工作完成后,彼此交换缓冲区,EDMA往PongBuffer里写数据,CPU处理PingBuffer里的数据。为了实现双缓冲结构,采用了EDMA提供的Link功能,如图3所示,即将不同的EDMA传输参数RAM连接起来,组成一个传输链。在传输链中,一个传输的结束会导致自动从参数RAM中装载下一个传输需要的事件参数。在具体程序中,只需将ping通道的参数RAM连接到pong通道,同时将pong通道的参数RAM连接到ping通道即可。2.3 ping-pong操作的改进
由于原来程序McBSP通过EDMA传输到ping或pong中,在EDMA传输完成中断的过程中还需要复制数据(memcpy)到公共缓冲区。复制数据是一个很费时的过程,但程序不宜停留在中断的时间过长,故而希望EDMA能直接传到公共缓冲区中。
如图4所示,在建立McBSP和EDMA通信时,将ping目的地址改变成公共缓冲池的首地址,将pong目的地址变为缓冲池下一个缓冲区的首地址。再在EDMA传输完成中断的过程中改变上一次用的PaRAM的目的地址,即ping完成,则中断改变ping的目的地址。这样对原程序改变较小,并且占用的参数RAM也较少。但要求ping,pong通道必须处在同一优先级队列中。当重新转载其中一个时,才不会影响另一个通道。
3 测试结果
图5是用连续自增的数在32 Mb/s的速度下以McBSP方式在FPGA的SignalTap II中看到的时序。
图6是时钟为9 MHz时TS输出任务在FPGA的SignalTap II中看到的TS流时序。实测中,输入任务在接收板DSP接收到TS流数据,数据率为9 MB/s,数据有效(Dvalid)上升沿来时,得同步头0x47。
TS流在SDRAM存放的基地址为0x804DBC88,前4个字节(即0x47 0x40 0x45 0x10)是TS包的包头,从包头的定义规范可以看到,第1个字节0x47为TS包的同步字节;第2个字节0x40说明这个TS包包含1个PES包的包头,它传输的优先级为0级,在这个包中不存在传输错误;第2个字节和第3个字节表明这个TS包的PID是0x45,是这个设计中的视频包的PID;第4个字节说明在这个TS包中仅有有效载荷,没有自适应区。188字节后再次出现同步字节0x47,0x00表示不是第1个TS包,PID也是0x45。再过188个字节还是同步字节0x47。可见,TS流的输入输出任务都较好地实现了它们的功能。
结语
本文介绍了一种基于DM642和EP3C55F484的无线视频传输系统的实现方式,并就TS流传输进行了讨论。测试结果证明,项目中提出的McBSP和GPIO结合EDMA方式都成功实现了TS流的输入和输出传输,GPIO方式速度较快,信道中直接采用GPIO的方式要比模拟McBSP接口简单得多,并用改进的乒乓方式提高程序运行效率。