1. 概述
本设计采用FPGA技术,将CMOS摄像头(DVP接口)的视频数据采集,并通过以太网传输(UDP方式)给PC机,上位机DEMO通过套接字编程,将视频实时显示在屏幕上。
2. 硬件系统框图
CMOS采用OV7670(30万像素),FPGA采用ALTERA公司的CYCLONE IV,以太网卡采用IC plus公司的100M网卡芯片。
硬件平台采用ETree的FPGA开发板(某宝提供),如下图所示:
3. UDP/IP协议
UDP(User Datagram Protocol)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。UDP协议经常用于图像传输、网络监控数据交换等数据传输速度要求比较高的场合。
UDP报文格式 |
0 15 | 16 31 |
源端口号 | 目的端口号 |
报文长度 | 校验和 |
数据 |
IP(Internet Protoco)包位于网络层,功能是把分组发往目标网络或主机。所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输。
以太网的数据帧的传输过程中,包长一般在46~1500字节,这里将UDP包长设计为:(8+20+640*2)=1308字节,以提高传输效率。
4. FPGA逻辑设计
FPGA各部分逻辑模块如下图所示:
下面为OV7670的初始化配置代码:
//file name: i2c_cfg_par.v
//creator: shugen.yin
//date: 2017-4-21
//function: i2c registers
//log: VGA RAW/25FPS, XCLK=24M
module i2c_cfg_par(
input [07:0] lut_index,
output reg [15:0] lut_data
);
always @(*)
begin
case(lut_index)
//ov7670 RAW 25Fps 24M input
'd0 : lut_data <= 'h2280;
'd1 : lut_data <= 'h0000;
'd2 : lut_data <= 'h0000;
'd3 : lut_data <= 'h0000;
'd4 : lut_data <= 'h0000;
'd5 : lut_data <= 'h0000;
'd6 : lut_data <= 'h0000;
'd7 : lut_data <= 'h0000;
'd8 : lut_data <= 'h2101;
'd9 : lut_data <= 'h4a04;
'd10 : lut_data <= 'h2201;
//windows setting
'd11 : lut_data <= 'h2712; //Hstart high 8bit
'd12 : lut_data <= 'h2800; //Hstop high 8bit
'd13 : lut_data <= 'h2902; //Vstart high 8bit
'd14 : lut_data <= 'h2a7a; //Vstop high 8bit
'd15 : lut_data <= 'h42b6; //HREF
'd16 : lut_data <= 'h0300; //VREF
'd17 : lut_data <= 'h0c00;
'd18 : lut_data <= 'h4e00;
'd19 : lut_data <= 'h703a;
'd20 : lut_data <= 'h7135;
'd21 : lut_data <= 'h7211;
'd22 : lut_data <= 'h73f0;
'd23 : lut_data <= 'ha202;
'd24 : lut_data <= 'h23e0;
'd25 : lut_data <= 'h0000;
'd26 : lut_data <= 'h0d40;
'd27 : lut_data <= 'h2438;
'd28 : lut_data <= 'ha507;
'd29 : lut_data <= 'hab08;
'd30 : lut_data <= 'h3495;
'd31 : lut_data <= 'h3533;
'd32 : lut_data <= 'h36e3;
'd33 : lut_data <= 'h9f78;
'd34 : lut_data <= 'ha068;
'd35 : lut_data <= 'ha10b;
'd36 : lut_data <= 'ha6d8;
'd37 : lut_data <= 'ha7d8;
'd38 : lut_data <= 'ha8f0;
'd39 : lut_data <= 'ha990;
'd40 : lut_data <= 'haa94;
'd41 : lut_data <= 'h23e5;
'd42 : lut_data <= 'h0e61;
'd43 : lut_data <= 'h0f4b;
'd44 : lut_data <= 'h2602;
'd45 : lut_data <= 'h3102;
'd46 : lut_data <= 'h3291;
'd47 : lut_data <= 'h3907;
'd48 : lut_data <= 'h4303;
'd49 : lut_data <= 'h450b;
'd50 : lut_data <= 'h471c;
'd51 : lut_data <= 'h4871;
'd52 : lut_data <= 'h4c78;
'd53 : lut_data <= 'h4d08;
'd54 : lut_data <= 'h513a;
'd55 : lut_data <= 'h5d40;
'd56 : lut_data <= 'h5e20;
'd57 : lut_data <= 'h7955;
'd58 : lut_data <= 'h7b4a;
'd59 : lut_data <= 'h7419;
'd60 : lut_data <= 'h7661;
'd61 : lut_data <= 'h8d4f;
'd62 : lut_data <= 'h8e00;
'd63 : lut_data <= 'h8f00;
'd64 : lut_data <= 'h9000;
'd65 : lut_data <= 'h9100;
'd66 : lut_data <= 'h9600;
'd67 : lut_data <= 'h9a80;
'd68 : lut_data <= 'hb08c;
'd69 : lut_data <= 'hb10c;
'd70 : lut_data <= 'hb20e;
'd71 : lut_data <= 'hb382;
'd72 : lut_data <= 'hb80a;
'd73 : lut_data <= 'h5314;
'd74 : lut_data <= 'h54f0;
'd75 : lut_data <= 'h5534;
'd76 : lut_data <= 'h5658;
'd77 : lut_data <= 'h5728;
'd78 : lut_data <= 'h583a;
'd79 : lut_data <= 'h6988;
'd80 : lut_data <= 'h6a88;
'd81 : lut_data <= 'h6b44;
'd82 : lut_data <= 'h6c67;
'd83 : lut_data <= 'h6d49;
'd84 : lut_data <= 'h6e0e;
'd85 : lut_data <= 'h7c0a;
'd86 : lut_data <= 'h7d55;
'd87 : lut_data <= 'h7e11;
'd88 : lut_data <= 'h7f9f;
'd89 : lut_data <= 'h7a40;
'd90 : lut_data <= 'h0140;
'd91 : lut_data <= 'h0240;
'd92 : lut_data <= 'h23e7;
'd93 : lut_data <= 'h4411;
'd94 : lut_data <= 'h9266;
'd95 : lut_data <= 'h4b0a;
'd96 : lut_data <= 'ha488;
'd97 : lut_data <= 'h9600;
'd98 : lut_data <= 'h9730;
'd99 : lut_data <= 'h9820;
'd100 : lut_data <= 'h9920;
'd101 : lut_data <= 'h9a84;
'd102 : lut_data <= 'h9b29;
'd103 : lut_data <= 'h9c03;
'd104 : lut_data <= 'h9d4c;
'd105 : lut_data <= 'h9e3f;
'd106 : lut_data <= 'h7804;
'd107 : lut_data <= 'h7901;
'd108 : lut_data <= 'hc8f0;
'd109 : lut_data <= 'h790f;
'd110 : lut_data <= 'hc820;
'd111 : lut_data <= 'h7910;
'd112 : lut_data <= 'hc87e;
'd113 : lut_data <= 'h790b;
'd114 : lut_data <= 'hc801;
'd115 : lut_data <= 'h790c;
'd116 : lut_data <= 'hc807;
'd117 : lut_data <= 'h790d;
'd118 : lut_data <= 'hc820;
'd119 : lut_data <= 'h7902;
'd120 : lut_data <= 'hc8c0;
'd121 : lut_data <= 'h7903;
'd122 : lut_data <= 'hc840;
'd123 : lut_data <= 'h7905;
'd124 : lut_data <= 'hc830;
'd125 : lut_data <= 'h7926;
default : lut_data <= 'h0000;
endcase
end
endmodule
5. 上位机Demo实现
本设计采用VC++ 2010设计了一款简易的UDP网络视频流播放器,视频源为RAW8格式,分辨率640*480,帧率25Hz。Windows为我们提供了便捷的套接字(socket)编程方式,软件工程师方便实现网络编程。
6. 视频显示结果
给FPGA板卡上电,打开UDP demo软件,视频正常显示。
7. 任务管理器
在任务管理器中,可以查看网卡的状态,包括使用率和丢包的大概曲线图。UDP demo软件运行几分钟后,图像稳定显示,从任务管理器中可以看到本地网卡2的使用率为65.99%,曲线平整,没有异常丢包情况。