采用图像传感器的CPLD视觉系统设计方法

采用图像传感器的cpld视觉系统设计方法
搭建一种低成本的嵌入式视觉系统,系统由cmos图像传感器、cpld、arm7微处理器以及sram构成。其中,cpld识别时序,解决了图像采集系统存在的严格时序同步和双cpu共享一片sram的总线竞争问题;用verilog语言编写mealy状态机控制图像数据写入sram,多路数据选择器实现总线切换,避免了总线冲突。图像处理算法注重效率,基于arm实现,系统最终工作速率为25帧/s。
关键词 ov6620 视觉系统 cmos epm7128 slpc2214
目前,关于视觉系统的研究已经成为热点,也有开发出的系统可供参考。但这些系统大多是基于pc机的,由于算法和硬件结构的复杂性而使其在小型嵌入式系统中的应用受到了限制。上述系统将图像数据采集后,视觉处理算法是在pc机上实现的。随着嵌入式微处理器技术的进步,32位arm处理器系统拥有很高的运算速度和很强的信号处理能力,可以作为视觉系统的处理器,代替pc机来实现简单的视觉处理算法。下面介绍一种基于arm和cpld的嵌入式视觉系统,希望能分享嵌入式视觉开发过程中的一些经验。
1 系统方案与原理
在嵌入式视觉的设计中,目前主流的有以下2种方案:
方案1图像传感器+微处理器(arm或dsp)+sram
方案2图像传感器+cpld/fpga+微处理器+sram
方案1系统结构紧凑,功耗低。在图像采集时,图像传感器输出的同步时序信号的识别需要借助arm的中断,而中断处理时,微处理器需要完成程序跳转、保存上下文等工作[1],降低了图像采集的速度,适合对采集速度要求不高、功耗低的场合。
方案2借助cpld来识别图像传感器的同步时序信号,不必经过微处理器的中断,因而系统的采集速度提高,但cpld的介入会使系统的功耗提高。
为了综合以上2种方案的优势,在硬件上采用“arm+cpld+图像传感器+sram”。该方案充分利用了cpld的可编程性,通过软件编程来兼有方案1的优势,具体体现在以下方面:
① 功耗的高低可以控制。对于功耗有严格要求的场合,通过cpld的可编程性将时序部分的接口与arm的中断端口相连,仅仅是组合逻辑的总线相连,可以降低cpld的功耗从而达到方案1的效果;对于采集速度要求高而功耗要求不高的情况,可以充分发挥cpld的优势,利用组合与时序逻辑来实现图像传感器输出同步信号的识别,并将图像数据写入sram中。
② 器件的选择可以多样。在硬件设计上,所有总线均与cpld相连;在软件设计上,不同的模块单独按功能封装。这样以cpld为中心,系统的其他器件均可更换而无需对cpld部分程序进行改动,有利于系统的功能升级。
作为本系统的一种应用,开发了视觉跟踪的程序,可以在目标和背景颜色对比强烈的情况下对物体进行跟踪。通过对cmos摄像头采集来的数据进行实时处理,根据物体的颜色计算出被追踪物体的质心坐标。下面分别描述系统各部分的功能。
2 系统硬件
2.1 硬件组成及连接
系统的硬件主要有4部分:cmos图像传感器ov6620、可编程器件cpld、512 kb的sram和32位微处理器lpc2214。
ov6620是美国omnivision公司生产的cmos图像传感器,以其高性能、低功耗适合应用在嵌入式图像采集系统中,本系统图像数据的输入都是通过ov6620采集进来的;可编程器件cpld采用altera公司的epm7128s,用verilog硬件编程语言在quartusii下编写程序;作为系统的数据缓冲,sram选用的是is61lv5128,其随机访问的特性为图像处理程序提供了便利;而lpc2214在pll(锁相环)的支持下最高可以运行在60 mhz的频率下,为图像的快速处理提供了硬件支持。
ov6620集成在一个板卡上,有独立的17 mhz晶振。输出3个图像同步的时序信号:像素时钟pclk、帧同步vsync和行同步href。同时,还可以通过8位或16位的数据总线输出rgb或ycrcb格式的图像数据。
在硬件设计上,有2个问题需要解决:
① 图像采集的严格时序同步;
② 双cpu共享sram的总线仲裁。
解决第一个问题的关键在于如何实时、准确地读取ov6620的时序输出信号,据此将图像数据写入sram中。这里采用的解决方案是用cpld来实现时序信号的识别以及图像数据的写入。cpld在硬件上可以识别信号的边沿,速度更快,通过verilog语言编写mealy状态机来实现图像数据的sram写入,更加稳定。
对于双cpu共享sram,可以通过合理的连接方式来解决。考虑到cpld的可编程性,将ov6620的数据总线,lpc2214的地址、数据总线以及sram的总线都连接到cpld上。通过编程来控制总线之间的连接,只要在软件上保证总线的互斥性,即在同一时刻有且仅有一个控制器(cpld或者lpc2214)来操作sram的总线,就可以有效地避免总线冲突。这样,硬件上的仲裁就可以通过软件来保证,该过程可以通过在cpld中编写多路数据选择器来实现。
各器件之间的连接关系如图1所示。
图1 系统结构框图
由图1可见,微处理器的总线接在cpld上,在对功耗有严格要求的场合中,只需要在cpld中,将ov6620的同步时序信号所对应的引脚与lpc2214连接在cpld上的中断引脚相连,系统就可以转换成方案1的形式。对cpld而言,引脚相连的仅仅是组合逻辑,降低了功耗。方案1的具体工作过程可见参考文献[1]。而对于采集速度要求较高的场合,cpld部分的程序源代码见本刊网站www.mesnet.com.cn——编者注。下面重点介绍这种情况下的应用。
2.2 工作过程
系统上电后,首先由lpc2214通过i2c总线配置摄像头的工作状态,需要配置的主要有输出图像的数据格式、速率、是否白平衡,以及自动增益是否打开。配置完成后,lpc2214发出图像采集的信号给cpld,此时cpld操作sram的总线,并通过对ov6620输出时序的检测将图像数据写入sram。当然,写入sram需要严格符合sram的操作时序。一帧图像采集完成后,cpld置位标志位来通知lpc2214,如果lpc2214处于空闲状态,则通知cpld将总线使用权切换至lpc2214,由lpc2214读取sram中的数据并进行图像处理。同时,发送信号给cpld进行数据采集,图像的采集和处理将并行执行,提高了系统的工作效率。当再次采集完一帧数据后,重复上述过程。
2.3 硬件方案的特点
lpc2214负责图像处理,cpld负责图像数据的采集,很好地实现了功能上的封装。可以看到,cpld将与硬件时序相关的程序封装,与外界的接口仅为标志状态线以及数据采集总线,极大地方便了系统的升级而无需改动图像采集部分的硬件和软件。甚至更换为其他型号功能更为强大的微处理器,只要按照上述标志状态线的约定来操作,系统仍然可以正常工作,增强了系统的兼容性和可移植性。
3 系统软件
系统软件主要由arm微处理器和cpld两部分程序构成。arm部分的代码使用c语言在ads1.2环境下开发,而cpld部分则使用verilog硬件语言在quartusii下开发。
3.1 cpld部分程序设计
cpld的程序主要分为2部分:组合逻辑和时序逻辑。组合逻辑主要完成总线仲裁,程序并不依赖cpld的全局时钟;时序逻辑完成对信号的检测,根据sram的操作时序将图像数据写入。
在总线仲裁部分,需要注意的是: 对cpld而言,不同的时刻同一总线的数据流入方向是不同的。因而在verilog中,需要声明总线为双向端口。具体的总线仲裁程序如下:
assign sram_data = (arm_ctrl == 2′b10) ? 8′hzz: cam_data;
assign arm_data= (arm_ctrl == 2′b10) ? sram_data : 8′hzz;
assign sram_add= (arm_ctrl == 2′b10) ? arm_add : sram_add_map;
assign sram_oe= (arm_ctrl == 2′b10) ? arm_oe: sram_oe_map;
assign sram_ce= (arm_ctrl == 2′b10) ? arm_ce: sram_ce_map;
assign sram_we= (arm_ctrl == 2′b10) ? arm_we: sram_we_map;
对双向端口的总线操作总结如下:
① 需要控制信号指明端口在某一时刻的方向;
② 输出高阻即代表该双向端口是输入状态,此时可以作为普通的输入端口来使用。
时序逻辑部分主要完成对图像传感器时序信号的识别。如图2所示,cpld需要首先检测vsync的下降沿,接着检测href信号的上升沿,然后在pclk信号的上升沿将图像数据读入。
图2 ov6620输出时序图
在verilog语言中,对上升沿的检测是通过always语句来实现的。例如检测时钟信号cam_pclk的上升沿: always@(posedge cam_pclk)。但从上面的分析中可以看出,需要检测的信号沿有3个,可以都用always来检测,但在verilog的语法中always语句是不可以嵌套的。为了解决这个问题,本系统中采用了如下方式:整个模块只有一个时序逻辑的always块,其他的信号沿检测用与always等价的方式实现。例如对于cam_vsyn信号,设置2个临时信号vsyn_0和vsyn_1,在每个时钟信号的上升沿,进行如下赋值:
vsyn_1 <= cam_vsyn;//临时信号赋值
vsyn_0 4时,通过压栈方式传递(需要额外的指令和慢速的存储器操作)。通常限制参数的个数,使它为4或更少。如果不可避免,则把常用的前4个参数放在r0~r3中。
③ 在for(), while() do…while()的循环中,用“减到0”代替“加到某个值”。比如:
for (loop = 1; loop = 60)
count = 0;
⑤ 避免使用大的局部结构体或数组,可以考虑用malloc/free代替。
⑥ 避免使用递归。
结语
本文介绍了一种基于arm和cpld的嵌入式视觉系统,可以实现颜色跟踪。在硬件设计上,图像采集和图像处理分离,更利于系统功能的升级。而视觉处理算法更注重处理的效率和实时性,同时根据不同的需要有两种模式可供选择。最后给出了提高程序效率的一些建议和方法。与基于pc机的视觉系统相比,该系统功耗低、体积小,适合应用于移动机器人等领域。

李佳琦直播间秒光的讯飞智能录音笔A1有多强
垃圾软件删除工具是Windows的免费程序
苹果APP Store将下架不符合隐私标准的应用
TI针对电动汽车(EV)无线电池管理系统开发的全新解决方案
欧盟人工智能安全报告
采用图像传感器的CPLD视觉系统设计方法
浅谈Molex 的 BNC 射频连接器与组件改善查看体验
比特币和区块链有什么关系
USB Type-C和USB 3.1如何区分与选择?
NVP6321,Nextchip单通道RX;NVP6324,Nextchip四通道RX,级别为车规级别
配线架与交换机如何连接
F007运放组成精密的绝对值放大电路图
微机电源
智能型SSD vs 智能网络卡:角色与特性的异同
电子电路与电磁兼容设计
MEMS热式质量燃气表的工作原理及设计
亚马逊将推新工具,低成本监控工人和机器
中国电科与哈工大签署战略合作协议
EUV极紫外光时代步伐渐近 或将迎来250瓦EUV光源
夏季电气防火需重视,智慧用电系统来帮你