您的位置:首页 > 理论基础 > 计算机网络

基于UDP协议的网络摄像头的设计与实现

2012-06-19 17:24 253 查看

[b]一、摘要[/b]

该博文主要将视频采集、压缩技术、总线切换技术和UDP数据传输结合在一起,完成了基于UDP的网络摄像头的开发。以下阐述了具体开发过程,一些关键问题的调试过程见下篇博文。

[b]二、实验平台[/b]

硬件平台:DIY_DE2

软件平台:Quartus II 9.0 + Nios II 9.0 + Visual Studio 2008

三、实验原理

[b]1、系统整体框图[/b]



图1 系统整体框图

[b]2、系统的工作流程[/b]

  首先,视频采集部分一直工作并进行VGA显示,当NIOS II端给出写视频数据命令后,切换总线为写视频方式,同时视频压缩部分开始工作,将视频数据压缩并写入到SRAM中,当写满一帧图像后,通知NIOS II读取视频数据,NIOS II通过中断形式,进入中断服务函数,将总线切换为读视频方式,之后读取SRAM中的视频,读完一帧图像之后,再次切换总线为写视频方式,同时传输视频数据,PC端接收并显示。

[b]3、各个模块的说明[/b]

(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协议,并将收到的视频数据显示在控件上。

[b]四、实验步骤[/b]

[b]1、硬件平台部分[/b]

顶层文件采用原理图的形式,如图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工具。

[b]2、NIOS II部分[/b]

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,并使其在同一网段中。

[b]3、PC端[/b]

PC端实现UDP传输协议和视频显示是采用C#语言,其设计界面如下所示。



图3 C#界面

[b]五、实验结果[/b]

VGA显示结果和PC端显示结果分别如图所示。

图4 VGA显示效果



图5 C#端显示效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: