基于UDP协议的网络摄像头的设计与实现
一、摘要
该博文主要将视频采集、压缩技术、总线切换技术和UDP数据传输结合在一起,完成了基于UDP的网络摄像头的开发。以下阐述了具体开发过程,一些关键问题的调试过程见下篇博文。
二、实验平台
硬件平台:DIY_DE2
软件平台:Quartus II 9.0 + Nios II 9.0 + Visual Studio 2008
三、实验原理
1、系统整体框图
图1 系统整体框图
2、系统的工作流程
首先,视频采集部分一直工作并进行VGA显示,当NIOS II端给出写视频数据命令后,切换总线为写视频方式,同时视频压缩部分开始工作,将视频数据压缩并写入到SRAM中,当写满一帧图像后,通知NIOS II读取视频数据,NIOS II通过中断形式,进入中断服务函数,将总线切换为读视频方式,之后读取SRAM中的视频,读完一帧图像之后,再次切换总线为写视频方式,同时传输视频数据,PC端接收并显示。
3、各个模块的说明
(1)视频采集
采用博文“DE2_TV例程的几点说明”中分析的例程。
(2)视频压缩
该部分为了尽快验证网络摄像头的可行性,采用了有损压缩的方式,即隔一行采集一行,隔一列采集一列,并使用RGB555格式,最终的分辨率降低到320*240。
(3)总线切换
由于视频采集是用的verilog实现的,而网络传输部分是采用NIOS II软核实现的,为了将二者联系起来,采用了SRAM作为视频缓存的存储器;需要存储数据时,将总线切换到视频写那一端,即Quartus II那一端;需要传输视频数据时,将总线切换到视频读一端,即NIOS II那一端。
(4)网络传输
采用的是UDP协议,在博文“DIY_DE2之DM9000A网卡调试系列例程(二)——DM9000A测试、自收发、实现UDP”中有提及,在NIOS II端完成,运行内存为SDRAM。
(5)PC显示
这一部分,采用Visual Studio 2008作为上位机软件平台,完成UDP协议,并将收到的视频数据显示在控件上。
四、实验步骤
1、硬件平台部分
顶层文件采用原理图的形式,如图2所示。
图2 顶层文件
FPGA端的底层文件主要有视频采集及VGA显示、视频压缩、总线切换和NIOS II网络传输4个部分组成,其中除NIOS II网络传输的原理图是通过SOPC生成的外,其他的均需要手动生成。
对于DIY_DE2开发板,视频采集及VGA显示部分采用SDRAM1作为缓存,NIOS II部分仅采用SDRAM0作为运行内存,SRAM0做为总线切换器件。
另外,下面是几个需要注意的问题:
(1)锁相环
整个系统总共采用了一个锁相环,时钟输入为50MHz,输出为clk0:100MHz,偏移2ns,SDRAM的物理时钟;clk1:100MHz,视频采集端SDRAM1的控制器时钟;clk2:100MHz,NIOS II控制器时钟;另外,PLL部分采用in zero delay buffer mode(多一个警告)、with no compensation(优先)两种模式均可。
(2)NIOS II处理器
采用NIOS II/f最高性能的处理器,并关掉二级缓存功能,初始化向量设为CFI,异常向量设为SDRAM0。
(3)NIOS II端的两个PIO
一个输入,一个输出。输入的设置为中断,上升沿检测;输出的初始值设置为0。输入的为给NIOS II的读视频信号,输出的为NIOS II给外面的写视频信号。
(4)时序约束是采用的timequest工具。
2、NIOS II部分
NIOS II部分主要实现两个功能:读取缓存在SRAM中的图像数据和通过UDP协议传输。而这两个功能的实现均是在中断服务函数中实现。一些关键代码如下:
//读缓存中的数据
for(j = 0;j < 76800;j++) { a[j] = IORD(SRAM_16BIT_512K_0_BASE,j); b[j] = IORD(SRAM_16BIT_512K_0_BASE,j) >> 8; } //再次将其置高,往SRAM里面写数据 IOWR(PIO_1_BASE,0,1); //第一包数据全为0,作为一帧图像开始信号 for(i = 0;i < 1;i++) { for(k = 42;k < 1506;k++) { SND[k] = 0; } TransmitPacket(SND,1510); // Send repetitively 1468 bytes of data. } //接下来的105包数据为有效的图像数据 for(i = 1;i < 106;i++) { for(k = 42;k < 1506;k++) { if((k%2) == 0) SND[k] = a[k/2 - 21 + i*732]; else SND[k] = b[k/2 - 21 + i*732]; // IOWR_ALTERA_AVALON_PIO_DATA(LED_GREEN_BASE,SND[k]); // msleep(500); } TransmitPacket(SND,1510); // Send repetitively 1468 bytes of data. }
注:网络传输部分无论发送还是接收,都是先传输低位,再传输高位。
注意:系统初始化的IP部分,应正确填写DE2和PC的IP,并使其在同一网段中。
3、PC端
PC端实现UDP传输协议和视频显示是采用C#语言,其设计界面如下所示。
图3 C#界面
五、实验结果
VGA显示结果和PC端显示结果分别如图所示。
图4 VGA显示效果
图5 C#端显示效果