您的位置:首页 > 其它

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

2017-04-22 09:45 363 查看
1. 概述
本设计采用FPGA技术,将CMOS摄像头(DVP接口)的视频数据采集,并通过以太网传输(UDP方式)给PC机,上位机DEMO通过套接字编程,将视频实时显示在屏幕上。

2. 硬件系统框图
CMOS采用OV7670(30万像素),FPGA采用ALTERA公司的CYCLONE IV,以太网卡采用REALTK公司的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各部分逻辑模块如下图所示:



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)编程方式,软件工程师方便实现网络编程。




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



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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  以太网 FPGA