FPGA设计――CMOS图像采集与以太网传输显示(OV7670)

时间:2022-06-06 16:50:01

1. 概述

本设计采用FPGA技术,将CMOS摄像头(DVP接口)的视频数据采集,并通过以太网传输(UDP方式)给PC机,上位机DEMO通过套接字编程,将视频实时显示在屏幕上。


2. 硬件系统框图

CMOS采用OV7670(30万像素),FPGA采用ALTERA公司的CYCLONE IV,以太网卡采用REALTK公司的100M网卡芯片。

FPGA设计――CMOS图像采集与以太网传输显示(OV7670)

硬件平台采用ETree的FPGA开发板(某宝提供),如下图所示:

FPGA设计――CMOS图像采集与以太网传输显示(OV7670)


3. UDP/IP协议

UDP(User Datagram Protocol)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。UDP协议经常用于图像传输、网络监控数据交换等数据传输速度要求比较高的场合。

UDP报文格式

0                     15

16             31

源端口号

目的端口号

报文长度

校验和

数据

IP(Internet Protoco)包位于网络层,功能是把分组发往目标网络或主机。所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输。

FPGA设计――CMOS图像采集与以太网传输显示(OV7670)

以太网的数据帧的传输过程中,包长一般在46~1500字节,这里将UDP包长设计为:(8+20+640*2)=1308字节,以提高传输效率。


4. FPGA逻辑设计

FPGA各部分逻辑模块如下图所示:

FPGA设计――CMOS图像采集与以太网传输显示(OV7670)

  • CMOS Capture,采集CMOS的DVP视频流;

  • I2C Config,配置CMOS芯片;

  • FIFO,实现CMOS时钟域到以太网时钟域之间的转换;

  • UDP Pack,实现UDP/IP协议的实现。

下面为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 <=  'h1280;
'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 <=  'h1101;
'd9:lut_data <=  'h3a04;
'd10:lut_data <=  'h1201;
//windows setting
'd11:lut_data <=  'h1712;//Hstart high 8bit
'd12:lut_data <=  'h1800;//Hstop high 8bit
'd13:lut_data <=  'h1902;//Vstart high 8bit
'd14:lut_data <=  'h1a7a;//Vstop high 8bit
'd15:lut_data <=  'h32b6;//HREF
'd16:lut_data <=  'h0300;//VREF
'd17:lut_data <=  'h0c00;
'd18:lut_data <=  'h3e00;
'd19:lut_data <=  'h703a;
'd20:lut_data <=  'h7135;
'd21:lut_data <=  'h7211;
'd22:lut_data <=  'h73f0;
'd23:lut_data <=  'ha202;
'd24:lut_data <=  'h13e0;
'd25:lut_data <=  'h0000;
'd26:lut_data <=  'h0d40;
'd27:lut_data <=  'h1438;
'd28:lut_data <=  'ha507;
'd29:lut_data <=  'hab08;
'd30:lut_data <=  'h2495;
'd31:lut_data <=  'h2533;
'd32:lut_data <=  'h26e3;
'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 <=  'h13e5;
'd42:lut_data <=  'h0e61;
'd43:lut_data <=  'h0f4b;
'd44:lut_data <=  'h1602;
'd45:lut_data <=  'h2102;
'd46:lut_data <=  'h2291;
'd47:lut_data <=  'h2907;
'd48:lut_data <=  'h3303;
'd49:lut_data <=  'h350b;
'd50:lut_data <=  'h371c;
'd51:lut_data <=  'h3871;
'd52:lut_data <=  'h3c78;
'd53:lut_data <=  'h3d08;
'd54:lut_data <=  'h413a;
'd55:lut_data <=  'h4d40;
'd56:lut_data <=  'h4e20;
'd57:lut_data <=  'h6955;
'd58:lut_data <=  'h6b4a;
'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 <=  'h4314;
'd74:lut_data <=  'h44f0;
'd75:lut_data <=  'h4534;
'd76:lut_data <=  'h4658;
'd77:lut_data <=  'h4728;
'd78:lut_data <=  'h483a;
'd79:lut_data <=  'h5988;
'd80:lut_data <=  'h5a88;
'd81:lut_data <=  'h5b44;
'd82:lut_data <=  'h5c67;
'd83:lut_data <=  'h5d49;
'd84:lut_data <=  'h5e0e;
'd85:lut_data <=  'h6c0a;
'd86:lut_data <=  'h6d55;
'd87:lut_data <=  'h6e11;
'd88:lut_data <=  'h6f9f;
'd89:lut_data <=  'h6a40;
'd90:lut_data <=  'h0140;
'd91:lut_data <=  'h0240;
'd92:lut_data <=  'h13e7;
'd93:lut_data <=  'h3411;
'd94:lut_data <=  'h9266;
'd95:lut_data <=  'h3b0a;
'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)编程方式,软件工程师方便实现网络编程。

FPGA设计――CMOS图像采集与以太网传输显示(OV7670)


6. 视频显示结果

给FPGA板卡上电,打开UDP demo软件,视频正常显示。

FPGA设计――CMOS图像采集与以太网传输显示(OV7670)


7. 任务管理器

在任务管理器中,可以查看网卡的状态,包括使用率和丢包的大概曲线图。UDP demo软件运行几分钟后,图像稳定显示,从任务管理器中可以看到本地网卡2的使用率为65.99%,曲线平整,没有异常丢包情况。

FPGA设计――CMOS图像采集与以太网传输显示(OV7670)


本文出自 “shugenyin的博客” 博客,请务必保留此出处http://shugenyin.blog.51cto.com/4259554/1918406