基于NiosII的IP Camera传输系统实现
扫描二维码
随时随地手机看文章
1 引言
随着网络技术的发展,人们对监控功能要求越来越高,网络摄像头以其特有的优势改变了传统监控手段,为远程实时监控提供了出色的解决方案。人们只需打开网页或视频浏览器就可实时查看需要监控场所的安全情况。
2 系统的硬件设计
IP Camera的硬件架构如图1所示,这是笔者参与开发的一种基于Altera公司NiosII嵌入式软核CPU的网络视频传输设计方案,实现了以太网内视频数据传输。FPGA采用的是Altera公司的Cy-cloneII系列的EP2C35F672C6器件。IP camera主要是由视频采集、Cyclone FPGA及系统存储和网络传输等3部分组成。由于Cyclone FPGA及系统存储的电路设计具有一定的通用性,所以这里仅介绍视频采集和网络传输的电路设计。
2.1视频采集模块设计
本系统设计的视频采集器件采用ADV7181B。ADV7181B是一款集成的视频解码器,通过配置可以接收CVBS复合视频、S-Video及YPrPb分量多种模拟信号,ADV7181B的数字输出是16位或8位、并与CCIR656标准兼容的YCrCb4:2:2视频数据,还包括垂直同步VS、水平同步HS及场同步信号。
本系统设计选用ADV7181B的AIN6作为CVBS复合视频信号的输入,ADV7181B的输出数据采用8位的数据宽度。ADV7181B的27 MHz时钟由FPGA提供,FPGA通过I2C总线读/写ADV7181B的寄存器控制ADV7181B,ADV7181B的I2C总线读地址为0x40,写地址为0x41。ADV7181B的8位YCrCb4:2:2视频输出数据及其他输出信号直接连接至FPGA。视频采集电路模块电路图如图2所示。
2.2网络传输模块设计
本系统设计的网络器件采用DM9000A。DM9000A是Davicom公司推出的一款低功耗高速网络控制器,该器件具有通用处理器接口、10 M/100 M PHY和4 KB的SRAM。
本系统设计的以太网接口部分电路原理图如图3所示在DM9000A的48个引脚中,TX+、TX-、RX+、RX-分别连接到RJ45INTLED的TD+、TD-、RD+、RD-。而LED1和LED2则分别连接至RJ45INTLFD的黄色LED与绿色LED接口,除悬空引脚和电源相关引脚外,其余引脚均连接至FPGA。
3 系统软件设计
系统软件设计主要包括:建立底层软件平台一NiosII IDE提供的底层软件开发平台,建立应用软件,创建用户传输任务等功能,从而实现TCP/IP连接和视频数据传输。
3.1 建立底层软件平台-μC/OS-II和LWIP
考虑到嵌入式系统的有限资源及NiosII IDE开发环境对μC/OS-II的支持,系统选择μC/OS-II作为操作系统。在NiosII IDE集成开发环境中,μC/OS-II的加载非常方便,只需在建立工程时选取μC/OS-II库选项即可。更重要的是,它根据用户在SOPC中搭建的硬件平台而动态加载。开发系统时,需不断修改和调整硬件平台,从而获取最佳配置。NiosIIIDE开发环境会自动根据开发者修改后的硬件平台加载μC/OS-II。这样,开发者无需考虑硬件平台就可解决与操作系统μC/OS-II不匹配问题。
LWIP是瑞士计算机科学院的开发的TCP/IP协议栈,其开发的初衷是用于嵌入式系统,一般它只需要几十KB的RAM和约40 KB的ROM就可运行。NiosII IDE开发环境内部集成了LWIP协议栈,用户在加载操作系统μC/OS-II后,只需选取相应的LWIP选项,即可加入协议栈。工程中,LWIP以系统库的形式存在,应用软件只需加上相应的头文件,就可调用API函数实现网络连接、数据收发等功能,迅速实现系统的网络接入。
3.2建立应用软件
本系统设计的嵌入式应用软件流程图如图4所示。
首先对堆栈和驱动程序初始化。初始化堆栈,应在调用OSStart启动μC/OS-II调度程序之前调用IDE的库函数lwip_stack_int(),该函数用于设置协议栈。堆栈初始化后,再调用库函数init_done_func(),但该函数必须调用库函数lwip_devices_init(),这个函数将对在system.h中定义的所有已安装的以太网设备驱动程序进行注册。函数lwip_devices_init()还会调用函数get_mac_addr()和函数get_ip_address()从而获取系统的mac地址和IP地址。当lwip_devices_init()返回一个非0值则表示注册成功。注册成功后,LWIP栈可用,从而便可在程序中创建任务。
初始化完成后,使用函数sys_thread_new()创建使用套接字API与LWIP栈对话的新任务。系统中,由函数sys_thread_new(link_task,NULL,link_PRIO)创建的用户任务是link_task()。该任务中,系统调用函数listen(fd_listen,1)监听上位机连接是否成功,一旦连接成功,调用NiosII IDE所提供的IO操作函数IOWR(OUT_PIO_BASE,0,0x01)控制接收模块,将视频数据保存到SRAM,当存满一帧后,接收模块产生一个中断,这时系统可通过指针读取SRAM中的值a[i]=*(p+i+N/2*(TIMES-times),每读取1 450 Byte就调用套接字API函数send(clisock,send_buf,N,0)发送至上位机。由于保存图像的分辨率仅是320×240,所以数据量并不大。发送时,通过函数IOWR(OUT_PIO_BASE,0,0x00)控制接收模块何时停止接收,一帧图像发送完毕,再通过函数IOWR(OUT_PI-O_BASE,0,0x01)控制接收模块开始接收下一帧图像,如此反复循环,直到连接断开为止。
4 上位机软件设计
本系统设计的客户端视频显示应用程序是利用LabWindows/CVI软件开发,此应用程序利用套接字编程,可以作为客户机与服务器NiosII系统之间通信。
本系统设计的上位机的应用程序除了显示视频功能外,还添加了保存和回放功能。上位机通过创建一个标准的Socket接口完成连接以及接收数据;当接收完一帧数据后,对其进行数据处理,再调用函数CreateDIBitmap()创建一幅位图,最后再调用函数CanvasDrawBitmap()完整显示。
5 结束语
本系统设计是基于NiosII IP摄像头的系统,介绍了从SOPC Builder创建NiosII软核处理器、IDE建立底层软件平台,到设计NioslI应用软件的整个架构。同时,对上位机的应用程序做了说明。经过硬件测试,整个系统运行良好,实时性能良好。