1 引言
通过对CMOS 图像传感器输出的黑白电视信号进行视频采集, 获得数字图像信号, 实现数字图像的处理。该系统采用PC 机和基于DSP 的数字信号处理板(数字板) 构成主从式成像系统。采用计算机作为主机, DSP 作为辅助机的主从式结构。文章主要介绍系统的视频图像采集部分采用FPGA (现场可编程门阵列) 进行逻辑控制实现视频图像采集的原理及实现。
2 系统组成及基本原理
一个完整的成像系统不但要具备图像信号的采集功能, 能对图像进行实时显示, 且要求完成图像信号的分析, 处理算法(如图像压缩、图像识别等) 以及图像处理结果的反馈控制。通常这些算法的运算量大, 同时又要满足实时显示的要求, 因此采用高速DSP 芯片作为数据核心处理单元。
另外, 要求系统满足通用性的同时, 针对不同的应用和不断出现的新处理方法, 还要使系统便于功能的改进和扩展。为此, 我们以PC 机为主机, 以TI 公司的DSP ( TMS320C6201) 作为数字信号处理板的核心, 用FPGA 作为系统数据采集的控制部分, 设计出实时图像处理系统。图1 是基于DSP 的实时图像系统的原理图。文章将详细阐述该系统数据采集部分的实现方法。
图1 基于DSP 的实时图像系统的原理图
3 视频信号采集部分的实现原理
3.1 信号说明
黑白复合视频图像信号通常由图像信号、消隐信号以及同步信号共同组成。我们采用黑白电视信号作为模拟输入, 以FPGA 作为采集系统的控制单元进行逻辑控制实现采样。图2 是复合视频图像信号波形,
图2 复合视频图像信号波形示意图
黑白电视信号说明如下:
(1) 扫描方式为隔行扫描;
(2) 每秒50 场, 场周期为20 ms , 每场312.5行, 行周期为64μs ;
(3) 黑白电视信号由图象信号, 复合消隐脉冲,复合同步脉冲组成, 场消隐期宽度为25 个行同期,场同步脉冲宽度为215 个行周期, 行消隐期宽度为12μs , 行同步脉冲宽度为4.7μs。
由于系统采用逐场逐行采集电视信号, 并且要求控制所采集的图像大小为128 ×128 像素, 因此必须对视频信号的同步信号进行分离, 提取视频信号的同步信号, 以便采集部分的实现。
3.2 视频信号复合同步信号提取电路
我们采用视频同步分离器LM1881 芯片来完成这一功能, LM1881 可以从0.5 ~ 2 V 标准负极性NTSC 制、PAL 制或SECAM 制视频信号中提取组合同步、场同步、奇偶场识别等信号, 这些信号都是进行图像数字采集所需要的同步信号, 有了它们, 才能确定在哪一场、哪一行。因此我们选用LM1881 来获取复合同步信号。采用LM1881 同步提取电路, 能够十分方便地提取采集同步信号, 且电路十分简单, 该部分的电路图和信号波形如图3 所示。其中Vin 是标准视频信号, Hs 为行同步信号, Vs 为场同步信号,ODEV 为奇偶场信号。
图3 LM1881 复合同步信号提取电路及信号波形
图4 是实际提取的视频同步信号波形, 可以看出, 我们采用LM1881 可以获得很好的视频同步信号, 为视频信号采集提供了好的控制信号。
图4 视频同步信号波形图
3.3 FPGA 与DSP 数据交换部分的工作原理及工作过程
由图1 可以看出, DSP 与FPGA 中是采用一个双口RAM 来实现数据交换的, 双口RAM 的容量为4 K ×32 bit 。双口RAM 作为图像数据的中间存储区, 图像采集部分由DSP 负责启动控制及采集数据的读取。为了实现图像的实时采集与处理, 应当使对图像信号的采集与外部对图像的读取能够同时进行,因而将4 K的双口RAM 划分成两块图像数据缓存区域, 假设前2 K为RAM-1 , 后2 K为RAM-2 。在系统工作的任一时刻, 一块缓存用于图像的采集, 采集部分向该存储区写图像数据; 另一块用于外部对图像数据的读取, DSP 可以读取该存储区中的图像数据。
双缓存结构的一个重要特点在于DSP 对存储区的数据操作是随着双口RAM 存储地址来回切换的。当AD 转换数据写满RAM-1 时, FPGA 会向DSP 发出一个中断信号, 此时, DSP 读取RAM-1 中的数据,同时, AD 转换数据写入RAM-2 , 当RAM-2 中的数据写满时, FPGA 会向DSP 发出一个中断信号,此时, DSP 读取RAM-2 中的数据, 同时, AD 转换数据写入RAM-1 , 如此交替, 实现数据的写入与读取同时进行。由于DSP 读取双口RAM 中数据的速度远远大于AD 转换写入数据的速度, 就允许采集与外部访问的同时进行, 采用两块存储区操作的乒乓式切换, 满足数据实时交换的要求。
系统的工作过程为:
(1) DSP 通过ENAD 信号控制采集系统的运行, 当ENAD = 1 , 数据采集系统开始工作, 数据通过AD 不断地送入双口RAM , 且双口RAM 每隔2 K发出一个中断, 通知DSP 读取前一段已完成转换的数据;
(2) 当ENAD = 0 , 即系统停止工作, 采集时钟为低电平, 存储器片选均为低电平(片选为高电平有效) , 整个系统处于低能耗的待命状态。
3.4 FPGA 采集控制部分的逻辑结构
实际上一场视频图像的奇行场和偶行场分别为312.5 行, 场消隐期宽度为25 个行周期, 由于我们采集的行数一定, 因而只需对奇行场进行采集即可,为使图像的采集行范围不落入场消隐期中, 我们确定一场的采集从场同步滞后32 个Hs 脉冲开始, 采集128 行后停止, 这样可以保证不会采到消隐电平。图像每行时间为64μs , 其中行消隐期宽度为12μs , 行消隐期中有4.7 μs 的行同步头, 行同步头在消隐期中的位置一般靠前。我们确定从采集行行同步滞后7μs 后开始采集(滞后时间可视具体信号稍加调整) ,采集时钟为6.66 MHz , 采128 个点需要19.2μs。可以用一个6 分频的计数器, 将40M 的输入时钟CLOCK变换为6.66 M 的采集时钟AD_CLK。根据3.3 中说明的系统工作过程, FPGA 的控制逻辑过程为:
当ENAD = 0 时, 采集系统停止工作, 这时LINE = 0 , ENCA = 0 , 因而没有AD 转换信号, 同时地址发生器不计数。
当ENAD = 1 时, 系统处于采集状态, 采集一场图像的过程为:
首先ENAD 与Hs 通过AD 启动控制部分合成,使AD 启动, 只有Vs 上升沿到来后, 才让Hs 通过,从而保证采集的图像为完整的一帧图像。当Vs 上升沿到来后, 对所有计数器及触发器清零。Vs 上升沿后, 场消隐延时用来对Hs 计数, 以保证计数32 周期后, 场消隐期已过, 可以采集图像。行同步计数器对Hs 进行计数。在计数的每一行中, 当Hs 上升沿到来时, 行消隐延时对AD_CLK 计数, 计数到32时, 此时行消隐已过, 点同步计数器开始对AD_CLK计数。当行同步计数达到128 后停止计数, 此时一帧图像采集完毕。等待下一个Vs 到来。
图5 为FPGA 采集控制部分逻辑原理图。设计采用原理图输入法, 对设计文件进行了仿真和时序分析, 其时序特性符合所需的时序要求, 该系统选用的FPGA 器件是Xilinx 公司的Spartan XL 系列XSC2000 , 在Foundation 3.1i 上完成设计, 且下载到芯片验证。同时, 根据不同的输入控制信号和控制要求, 只要对FPGA 内部的逻辑结构稍作修改,便可实现新的控制。
图5 FPGA 采集控制部分逻辑原理框图
图6 是FPGA 输出的AD 控制信号。其中, AD_INT是中断响应信号, ENCA 是AD 转换控制信号。
图6 FPGA 输出的AD 控制信号图
3.5 DSP 实现中断控制取数
FPGA 每采集2 K 数据所发出的中断信号AD_INT 与DSP 的外部INT7 相连, 用于实现DSP 的中断取数, 由于FPGA 每隔2 K发出一个中断, 且双口RAM 的大小为4 K, 因而必须采用中断实现取数。具体实现为在DSP 内设置中断, 当外部中断信号来到时, 则响应中断服务程序, 执行中断响应。如此反复, 直到完成一帧图像采集。
该系统DSP 的中断控制部分采用ANSI C 语言编写, DSP 中断主程序及中断响应服务程序如下(读取一帧图像) :
A_flag = 0 ;
count = 8 ;
void main()
{
……
ICR| = 0x80 ;
IER| = 0x0083 ;// enable int 7 (start_int)
CSR| = 1 ;
* (unsigned volatile int *)ADADDR = 0x1F ;// ad start
while (1) // waiting for intrupt
{ if (count == 0) break ; }
*(unsigned volatile int *) ADADDR = 0x0 ; // ad stop
CSR = 0x100 ; // disable all interrupts
IER = 1 ; // disable all interrupts except NMI
ICR = 0xffff ; // clear all pending interrupts
……
}
interrupt void start_int ( ) // interrupt service program
{ if (A_flag == 0)
{ while (b0 < 0x2000)
{ *(unsigned volatile int *) (0x400000 + b1) = *(unsigned volatile int *) (0x1400000 + b0) & 0xFFF ;
b0 = b0 + 4 ;
b1 = b1 + 4 ; }
A_flag = 1 ; }
else if (A_flag == 1)
{ while (b0 < 0x4000)
{ *(unsigned volatile int *) (0x400000 + b1) =*(unsigned volatile int *) (0x1400000 + b0) & 0xFFF ;
b0 = b0 + 4 ;
b1 = b1 + 4 ; }
b0 = 0 ;
A_flag = 0 ; }
count-- ;
}
在中断矢量表中要设置硬件中断7 的响应函数,以便有外部中断时执行相应的中断服务程序, 设置语句为:
INT7 : b-start_int
程序中ICR 为中断设置寄存器, IER 为中断使能寄存器, CSR 为控制状态寄存器。ADADDR 为AD 启动/ 关闭控制字, 其地址值为0x3380000 。A_flag 标记用于识别读取的数据是4 K 双口RAM 的前或后2 K的标记。count 用于一帧图像中断次数的记数(2 K*8 = 16 K) , 双口RAM 在DSP 的存储器中对应的存储器位置为0x1400000 , 因而转移数据时, 对0x1400000 进行操作。
4 实验结果
采集到的数据通过PCI 口与PC 机实现数据交换, 由于PCI 口实现交换数据快(可高达120Mbyte/s) , 且可方便地读取板卡上内存处的数据实现数据交换, 便于系统的实现。图7 是用系统进行视频图像采集, 通过PCI 口实现读数和显示获得的128 ×128 面阵, 按256 级灰度显示所得的图像。通过系统成像实验表明, 该系统可以采集获得很清晰的图像, 实验结果较为满意。
图7 采集得到的128 ×128 面阵256 级灰度图像图
5 结束语
在系统中采用FPGA 作为采集控制部分, 可以提高系统处理的速度, 大大提高系统的灵活性和适应性。具体表现为:
(1) 系统性能得到大大提高: 由于在FPGA 与DSP 之间采用双口RAM 作为数据交换区, FPGA 专门负责采集控制部分的实现, 通过中断的方法与DSP实现数据和控制指令交换, 因而大大提高系统的性能。如果采用DSP 进行AD 采集控制, 在高频数据采集控制中将耗去DSP 的大部分时钟, 而降低系统的整体速度。
(2) 系统的适应性与灵活性强: 由于采用FPGA可编程逻辑器件作为系统采集控制单元, 对于不同的视频图像信号, 只要在FPGA 内对控制逻辑稍作修改, 便可实现信号采集。同时, 也可根据系统的需要, 控制所采图像的位置和所采图像的大小, 以适合不同场合的需要。
(3) 设计结构简单, 调试方便: FPGA 的外围硬件电路简单, 因而在硬件设计中, 可以大大地减小硬件设计的复杂程度。而FPGA 的时序逻辑调试可在软件上仿真实现, 因而大大降低硬件调试难度。
文章评论(0条评论)
登录后参与讨论