dsp图像数据流设计

DSP图像数据流设计

DSP应用程序主要分为三个部分:采集、处理和显示。

第一,采集是指应用层调用DSP底层驱动函数user_read_upp_data()将一帧RGB565视频格式数据储存到指定位置,该函数通过UPP接口接收FPGA的YCBCR图像数据,并按照特定公式转换成RGB565图像放置在用户指定的数组里;

第二,处理是指将应用层按照实际需求将采集得到的图像进行处理,并在原图像上叠加字符、十字线、波门等信息;

第三,显示是指应用层调用DSP底层驱动函数user_write_video_buff()将处理后的图像送入显示缓冲区,DSP利用中断机制自动将缓存区的一个完整数据帧送给LCD屏(DSP6748平台)或通过UPP接口发给FPGA(DSP6655平台)。

具体流程图如下所示,需要说明的有以下几点:

  1. 数据采集和显示均由底层中断实现,不能或者占用很少主程序工作时间;
  2. 主程序只能和采集缓冲区、显示缓冲区进行交互,每次交互的图像数据量都是一帧;
  3. 采集缓冲区和显示缓冲区都采用3片buffer的结构形式,拿显示缓冲区举例,底层函数和主程序通过不同的接口指针去访问它,写入指针和读取指针不允许访问同一片buffer,防止数据帧出现半新半旧的情况,写入指针和读取指针都遵循buffer1         buffer2         buffer3         buffer1的访问流程;
  4. 当写入速度比读取速度快时,写入指针只有等读取指针访问完一块区域后,才能进行该区域的覆盖写入,如果有新数据来而读取指针又没访问完,则写入指针会停留在原区域重新写入,重新覆盖上一帧数据;
  5. 每次从采集缓冲区读取的数据帧都是上一次的,但如果主程序长时间未调用user_read_upp_data()函数,接下来读取的2个数据帧会和实时数据有长时间的时间差,后期要想办法优化;
  6. 如果主程序调用user_read_[A1] upp_data()函数太频繁,而采集函数又来不及更新缓冲区,则应用层会一直获得上一次已经取过的数据帧,直到下一帧数据接收完成;
  7. 每次更新显示缓冲区的数据,LCD都应在下一帧显示,但如果主程序调用user_write_video_buff()函数太频繁,LCD来不及刷新,那可能会造成部分数据帧丢失;

dsp图像数据流设计_第1张图片

图1.1 DSP主程序流程图

 

1 数据采集:

1.1 数据传输方式

FPGA发送数据的方式:一帧图像数据大小为1440*576字节的大小,但是,FPGA端发送过程是分奇偶场分开发送数据的,奇场图像数据大小为1440*288,偶场图像数据大小为1440*288,先传偶场再传奇场,因此每次需要连续传输1440*288字节大小的数据。

DSP接收数据的方式:DSP通过UPP接口接收数据,实际上是通过内部UPP_DMA将UPP通道缓存中的接收到的数据以一个二维数组的形式搬移到DSP内部指定地址中(DDR3或DDR2),通过配置目标地址,传输行数,传输列数,传输偏移量来实现。

综上所述,一帧图像数据需要两次UPP来接收或发送。

1.2 数据同步

为了保证每次DSP数据的更新得到的都是最近的数据,那么得做好UPP传输的同步性,以及确保在时钟不稳时UPP发生错误时能够及时复位。交互中每次UPP数据发送完后FPGA会发送给DSP的一个GPIO(V中断)[A2] 中断来通知其上一场数据已经发送完毕,需要重新配置下一场数据的储存地址[A3] ,即使没有接收到1440*288个数据,也需要重置UPP接口,准备下次接收

具体交互是这样做的:FPGA在每次发送完UPP的数据后通过一个I/O口给DSP的GPIO BANK0PIN1发送一个上升沿脉冲,DSP将此引脚配置为上升沿触发中断模式。同时,通过GPIO BANK0PIN5做一个I/O口的Filed信号来区分数据是奇场数据还是偶场数据,如信号流程如图1.2所示。

dsp图像数据流设计_第2张图片

图1.2 数据同步信号流程

V中断需要处理任务:

1,读取GPIO的Filed信号,并保存到gpio_f_flag中。

2,判别UPP DMA接收中断是否产生(判别UPP接收中断全局标识是否置1),若产生了接收中断,则清零接收中断标识位,并根据gpio_f_flag的值是1(高电平)或0(地电平)来区分是奇场数据还是偶场数据,以此来存放UPP数据到对应内存中;若没有产出接收中断,则说明此次UPP传输失败,则复位UPP外设,并重新配置UPP DMA参数。

3,配置好下一次UPP接收首地址并开启UPP接收通道。[A4] 

UPP中断需要处理任务:

根据UPP中断状态寄存器值判别是否发生了UPP接收窗口中断或发送窗口中断,若发生了,则将UPP接收中断全局标识置1,将UPP发送中断全局标识置1。

1.3 采集数据的转换和内存访问的切换

FPGA通过UPP发送给DSP的数据格式是YCRCB格式的,而且一帧分为了奇场和偶场,所以在处理数据之前得将接收到的数据分成Y场数据(720*576大小)和CRCB场数据(720*576大小)。各场的格式和数据转换如图1.3所示。先取一行偶场数据,将其中的Y0-Y719存入Y场的第一行,其中的CB0-CB359,CR0-CR359存入CBCR场的第一行;再取一行偶场数据,将其中的Y0-Y719存入Y场的第二行,其中的CB0-CB359,CR0-CR359存入CBCR场的第二行,以此类推,转换完一帧数据。

dsp图像数据流设计_第3张图片

图1.3 各场数据格式

FPGA分两次给一帧图像,所以DSP一帧数据的BUFF设置为两个1440*288的缓存(UPP_BUFF_EVEN和UPP_BUFF_ODD),分别存储偶场数据和奇场数据。由于图像数据帧BUFF的写入和读出速度是不一样的因此需要设置6个BUFF数据帧来做写入和读取的切换,分别为UPP_BUFF1_EVEN,UPP_BUFF1_ODD,UPP_BUFF2_EVEN,UPP_BUFF2_ODD,UPP_BUFF3_EVEN,UPP_BUFF3_ODD。读取与写入的访问操作按以下顺序流程来操作(BUFF1->BUFF2->BUFF3->BUFF1->…)。

 

你可能感兴趣的:(TI_DSP学习,6655)