FPGA/ASIC技术
随着人们越来越注重安全问题,监控开始向小型化、家庭化发展。为了实现全方位多角度监控,需要采用多路摄像及多个显示器来显示实时信息,同时多路存储的容量需求比较大。为了在容量有限的情况下存储更多数据, 需要对多路视频进行相关处理,将多路视频合成一路视频信号再进行压缩存储和显示。
1 系统组成及工作原理
综合考虑视频图像的实时性以及功耗体积等因素,采取以下方案:由4路并行的视频模数转换芯片TVP5154将4路视频信号转换成数字格式的视频信号,并用FPGA进行合成处理[1],再送给ARM模块进行进一步压缩、存储等处理。图1为系统的FPGA部分的硬件结构图。
采用Xilinx公司Spartan 3E系列中的XC3S500E芯片,该芯片具有功耗低、成本低等优点。采用TVP5154模数芯片主要是考虑到它是4路并行的,可节省板级空间,也方便控制,它可以将输入的4通道NTSC/PAL/SECAM 格式的视频数据转换成4通道的8位ITU-R BT.656[2]格式的数字视频输出供FPGA进行处理。FPGA包含I2C[3]通信模块、视频采集模块、处理模块、存储控制模块以及ARM通信模块。
2 模块设计
2.1 I2C通信模块
FPGA通过I2C总线[4]实现对TVP5154的配置,完成4路视频的AD转换。将I2CA0和I2CA1接地,把从机地址设为B8h。系统上电后,设备处于一个输出未定义的未知状态,直到它接收到RESET 命令。在系统上电或硬件重启后,遵循以下自检过程:
(1)等待1 ms,4个解码通道的寄存器(7Fh)必须写入00h 值。
(2)等待1 ms,读出4个解码通道的寄存器(81h)的版本值。
(3)验证读出来的值是否为54h。
(4)如果读出的值不为54h,则需要重启。
重复此过程,直到4个通道读寄存器(81h)的值均为54h。
自检完成之后,FPGA向TVP5154的 FEh寄存器写入0Fh,让4个解码器同时接收FPGA的写事务,输出设置成标准含嵌入式同步信号的ITU-R BT.656格式的数字视频信号,如图2所示,包括3路同步信号:场、水平、竖直同步信号,并有一路时钟信号,频率为27 MHz。
2.2 视频采集模块
视频采集模块主要是将ITU656格式的视频数据进行缓存和有效数据抽取。首先提取视频有效数据,送入FIFO(深度为2k,可存储一行有效数据)进行缓存。接着通过控制读取FIFO的数据来进行行列1/2抽取。
Modelsim上截取的采集状态转换图如图3所示。先对场同步信号FID进行采样,下降沿启动状态机,从NULL状态进入ST_IDLE状态,然后开始检测同步信号(FF0000 XXh),出现FF状态机跳转到ST_FF,再出现00则跳转到ST_00,如果检测到还为00则跳转到ST_START。此时根据XX的值来确定是否为有效数据,如果是非有效数据,则跳回ST_IDLE,再次跳转;如果是有效数据,则根据XX判断奇偶场,开始采集计数,根据要求选取采集深度,全采为1 440 B。
合成的图像4路按顺序分别位于左上、右上、左下、右下。由于视频为隔行扫描,为实现行1/2抽取,将4路视频信号分为两组,其中前两路采集偶场数据,后两路采集奇场数据。接着分时读取组内两个FIFO实现列1/2抽取,以实现行列1/2抽取。抽取时需要注意的是, ITU656为YUV422格式的,视频数据按照Cb0,Y0,Cr0,Y1,Cb1,Y2,Cr1,…输出,每两个像素点共享红蓝色差信息,加上亮度信息,共4 B,处理时需要将两个像素点作为一个整体。仿真结果如图4所示。
图4为偶场数据处理,奇场相同。偶场有效数据在FF000080h之后,设17个有效数据,前16个数据第1路为00h~0fh,第2路为10h~1fh,第17个数据任意,采集深度为16,最后一个数据被丢弃。当FIFO1数据存入4个(或更大)之后产生FIFO读信号flag_e开始读取两个FIFO的数据(为实现两路视频数据的同步)。flag_e作为有效数据的同步信号,由于读操作延迟一个周期,因此调整一个时钟周期得到flag。dout1是从FIFO1中读取的数据,dout2是从FIFO2中读取的数据。检测到flag_t上升沿count清零开始计数,并用count[2]作为2选1 MUX的控制端,dout1和dout2为输入,dout_e为输出。奇场的数据处理是同样的过程,得到输出dout_o。由于奇偶场是分开的,dout分时输出dout_e和dout_o。
2.3 视频存储控制模块
选取的SRAM容量为2 MB×8,共有21根地址线,地址线分为行地址和列地址[5]。ITU656标准的视频一帧有效数据分辨率为576×720,共576行,选择地址线高10位adr[20..11](0~1 024)为行地址,每行720个像素点,每个像素点为2 B,每行共1440 B,选择地址线低11位adr[10..0](0~2 048)为列地址。
行地址row[9..0]操作通过检测同步信号flag下降沿,数据有效时同步信号为高电平,当一行有效数据存储完成之后flag变低,行地址加1。
有效数据采集模块输出数据为两路信号交替出现,需交替产生存储地址,如下:0、1、2、3、720、721、722、723、4、5、6、7…。如果分辨率有其他要求,可根据所需来确定第2路地址的起始位置。
仿真中以16个数据为例,波形如图5所示。初始赋值adr_ 2为720(第2路的起始地址,根据需要设置,16个数据设为8),其余两个地址adr_v和adr_1赋值为0。Flag出现高时adr_v开始计数,由于两路数据间隔4个周期,所以设置adr_v为3位,检测最高位选择对1、2两个地址中一个进行+1运算,然后以adr _v[2]作为2选1 MUX控制端,列地址column作为输出,得到所需的列地址序列。在flag下降沿之后行地址row加1,得到所需的写地址。
乒乓缓冲的切换逻辑只需检测行地址,当行地址达到576即第576行(对应行地址为575)数据已经存入SRAM,拉高ready信号,然后将row清零。切换两个SRAM的操作方向,将SRAM1总线接至后面的合成模块,而SRAM2则接至地址产生逻辑的输出等待写入。
2.4 视频处理模块
视频处理模块主要实现4路视频的合成处理。根据ITU656格式,调用一个IP生成一个ROM,存入视频帧的第一行数据,EAV和SAV为8 B,EAV后280 B为消隐数据,SAV后1 440 B为消隐数据,共1 728 B。其中EAV为FF0000B6h,SAV为FF0000ABh。
根据存储模块的切换逻辑送出来的READY信号,检测到上升沿之后开始状态跳转,从IDLE状态跳转到EVEN_BLANK1状态,设置一个模为22的计数器,包含一个模为1 728的计数器作为地址来读取ROM中的数据。读完ROM的数据,外计数器+1输出一行数据,共输出22行数据。然后跳转到EVEN_VALID状态,此时先读取ROM中前288 B,并改写EAV和SAV的最后1 B,分别改为9Dh和80h。接着开始读取SRAM中的数据,按照行列地址进行读取,行基地址为0,按列地址递增读取,读至1 440列地址归零,结束一行读取,共重复288次输出有效数据行。由于是隔行扫描,每次行地址加2,最后一次读取的为第574行。接着状态跳转到EVEN_BLANK2,输出两行偶场消隐行,读取ROM的数据即可。再跳转到ODD_BLANK1,输出23行奇场消隐行。读取ROM的数据并改变EAV和SAV的最后1 B为F1h和ECh。然后跳至ODD_VALID输出奇场有效数据,同EVEN _VALID,改写EAV和SAV最后1 B为DAh和C7h,行基地址为1,每次加2,最后一次读取的为第575行。奇场有效行输出完成后,进入ODD_BLANK2,输出两行奇场消隐行。最后跳回EVEN _BLANK1输出下一帧数据。
EVEN_BLANK1输出22行,EVEN_ VALID输出288行,EVEN_BLANK2输出2行,ODD_BLANK1输出23行,ODD_VALI D输出288行,ODD_B LANK2输出2行,一帧共625行标准的ITU656格式的视频数据,并根据格式在特定位改写同步信号。
2.5 ARM通信模块
ARM通信模块主要将合成所得的视频数据送往ARM模块,进行进一步的处理,包括压缩、存储等。接口主要有8 bit数据data[7:0],3 bit同步信号F、H、V,一路时钟信号clk,以及握手信号。
本设计采用自顶向下的分析方法,根据系统的需求划分功能模块,给出一种视频合成方法的FPGA设计,并详细介绍各模块的具体功能和实现。通过给定已知数据进行仿真验证,证明了系统可以较好地实现合成操作。
全部0条评论
快来发表一下你的评论吧 !