关键字:千兆网接口" title="千兆网接口">千兆网接口摄像机" title="摄像机">摄像机
2 硬件总体设计
硬件总体框架如上图,主控制器FPGA选用altera公司高性价比芯片EP2C20F256C6N。系统工作频率为100M。图像传感器的数据首先在FIFO里缓冲后暂存于SDRAM,在网络空闲时将暂存的图像数据经FIFO2缓冲后送MAC芯片,再发送到网络上。
CMOS芯片选用Micron Technology的MT9P031,在500万像素的满分辨率下最高可输出14帧的图像数据。 SDRAM选用W982516BH-75,容量为32Mbytes,g与FPGA内部FIFO结合可设计为32Mbytes的大容量循环缓存,在图像分辨率为300万像素时可缓存10帧以上图像数据。千兆网接口MAC芯片选用AX88180,物理层芯片选用88E1111,再通过网络变压器及RJ45用六类网线与计算机千兆网卡相连。
3 千兆网接口设计
AX88180是亚信公司推出的一款高性能低成本的Non-PCI千兆以太网控制器,适用于多种需要高速接入网络的嵌入式系统,如消费电子和家庭网络等。AX88180内置10/100/1000 Mb/s以太网媒体存取控制器(MAC),符合IEEE 802.3/IEEE 802.3u/IEEE 802.3ab协议,可与一般16/32位微控制器连接,其操作与SRAM相同。AX88180内置10/100/1000 Mb/s以太网媒体存取控制器(MAC),与PHY之间采用RGMII接口;内置主机接口控制器,可以与16/32位主机方便连接寻址方式与SRAM相同;内置40 KB SRAM网络封包缓存器,其中32 KB用于从PHY接收数据包,KB用于主机发送数据包到PHY,可以用高效方式进行封包的存储、检索与修改;内置256字节的配置寄存器,用于主机控制和参数设置;内置EEP-ROM接口;内置IP/TCP/UDP 校验和大大减小微控制器的运算负载,改善传输反应时间。图2为AX88180及PHY芯片88E1111的连接图。
3.1 千兆网接口初始化
对千兆网接口的初始非常重要,如果初始化不正确,系统将无法正常工作。对接口的初始化主要包括对AX88180和88E1111的初始化。
代码用verilog语言完成。具体代码可参考亚信公司的驱动程序代码,应注意初始化时需要加入一些固定的延时以确定芯片正常工作。
3.2 图像数据的封包
当图像的分辨率为2048×1536时,一个UDP数据包包含1024字节的图像数据和两个bytes图像行编号。当计算机收到数据包时,根据图像行编号信息放入对应的内存中,可以很方便的组合成一副完整的图像。并且,采用行编号的形式,还可防止某一两个数据包丢失后导致整副图像都无法显示的问题。以下这FPGA写入AX88180的UDP包头代码。
case(param_num) ‘d0: w_dd <= ‘hFFFF;//目的MAC地址(广播地址),写三次 ‘d3: w_dd <= ‘h1111;//源MAC地址,均为0x1111,写三次 ‘d6: w_dd <= ‘h0008;//协议号 ‘d7: w_dd <= ‘h0045;//固定数据VIP4, ‘d8: w_dd <= ‘h1E04;//IP包总长度1026+28,并且高低8位交换 ‘d9: w_dd <= ‘h0;//ID号,始终为0 ‘d10:w_dd <= ‘h0;//fragment offset始终为0; ‘d11:w_dd <= ‘h1140;//生存期和协议号,固定 ‘d12:w_dd <= ‘h0;//IP校验和,由MAC芯片自动生成 ‘d13:w_dd <= ‘hA8C0;//源IP,固定为192.168.1.204 ‘d14:w_dd <= ‘hCC01; ‘d15:w_dd <= ‘hFFFF;//目的IP,任意 ‘d16:w_dd <= ‘hFFFF; ‘d17:w_dd <= ‘h7017;//源端口,固定为6000 ‘d18:w_dd <= ‘h7017;/⁄目的端口,固定为6000 ‘d19:w_dd <= ‘h0A04;//UDP数据长度 ‘d20:w_dd <= ‘h0;////校验和由AX88180自动生成 ‘d21:w_dd <= row_num;//图像行信息从0开开始 default:w_dd <= w_dd; endcase 3.3 应用程序设计 由于大量数据在网络上传输,用SOCKET的方式来获图像数据包已经比较困难,丢包率会比较高。采用Winpcap来捕获网络上的数据包,可有效的减少丢包率。用Winpcap编写程序需要安装开发包及驱动程序。
第一步,指定要通信的网卡设备并打开。
BOOL InitWpcap(){ pcap_if_t* alldevs; pcap_if_t* d; char errbuf[PCAP_ERRBUF_SIZE]; if(pcap_findalldevs(&alldevs, errbuf) == -1){ AfxMessageBox(“Error in pcap_findalldevs”); return FALSE; } /⁄枚举网卡然后添加到用户选择的ComboBox中,代码省略 char *filter = "port 6000";//只接收端口6000的数据 bpf_u_int32 NetMask = 0xFFFFFF; struct bpf_program fcode; if(pcap_compile(m_pcap, &fcode, filter, 1, NetMask) < 0){ AfxMessageBox("nError compiling filter: wrong syntax"); pcap_close(m_pcap); return FALSE; } if(pcap_setfilter(m_pcap, &fcode)<0){ AfxMessageBox("nError setting the filtern"); pcap_close(m_pcap); return FALSE; } pcap_freealldevs(alldevs); /⁄释放alldev资源 return TRUE;} 第二步:开启一个线程接收数据。
UINT RecvProc(LPVOID lpParammeter) { pcap_loop(m_pcap, 0, packet_handler, NULL); return 0;} packet_handler是处理收到数据包的回调函数, 当从port6000收到数据后它会被调用,直到线程终止。
第三步:处理收到的数据
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data){ const u_char *real_data = pkt_data+42; int row=real_data[0]+(real_data[1]<<8); }//这里就没有处理包头,直接处理数据。
4 总结
兆网接口摄像机,网络传输有效数据带宽达400Mb/s以上,较好的解决了百兆网传输带宽不足、数据传输速度慢的问题。传输300万像素不进行压缩的原始图像,帧率可达18帧/秒,视频流畅清晰。计算机采用Winpcap捕获图像数据,丢包率小于0.02%。