一.ARP协议
1.1ARP简介
ARP ( Address Resolution Protocol ),即地址解析协议,是根据 IP 地址(逻辑地址)获取 MAC 地址的一种 TCP/IP 协议。在以太网中,一个主机和另一个主机进行通信,必须要知道目的主机的 MAC 地址(物理地址),而目的 MAC 地址的获取由 ARP 协议完成。
1.2ARP协议格式
前导码(Preamble):为了实现底层数据的正确阐述,物理层使用 7 个字节同步码(0 和 1 交替(55-55-55-55-55-55-55))实现数据的同步。
帧起始界定符(SFD,Start Frame Delimiter):使用 1 个字节的 SFD(固定值为 0xd5)来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。
目的 MAC 地址:即接收端物理 MAC 地址,占用 6 个字节。MAC地址共48位,一个字节8Bit,因此是48/8=6位。
源 MAC 地址:即发送端物理 MAC 地址,占用 6 个字节。
长度/类型:上图中的长度/类型具有两个意义,当这两个字节的值小于 1536(十六进制为 0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于 1536,则表示该以太网中的数据属于哪个上层协议,例如 0x0800 代表 IP 协议(网际协议)、0x0806 代表 ARP 协议(地址解析协议)等。
数据:以太网中的数据段长度最小 46 个字节,最大 1500 个字节。最大值 1500 称为以太网的最大传输单元(MTU,Maximum Transmission Unit)。
帧检验序列(FCS,Frame Check Sequence):为了确保数据的正确传输,在数据的尾部加入了 4 个字节的循环冗余校验码(CRC 校验)来检测数据是否传输错误。
硬件类型(Hardware type):硬件地址的类型,1 表示以太网地址。
协议类型(Protocol type):要映射的协议地址类型,ARP 协议的上层协议为 IP 协议,因此该协议类型为 IP 协议,其值为 0x0800。
硬件地址长度(Hardware size):硬件地址(MAC 地址,长度为6)的长度,以字节为单位。
协议地址长度(Protocol size):IP 地址的长度,IP地址是32位,32/8=4,以字节为单位。
OP(Opcode):操作码,用于表示该数据包为 ARP 请求或者 ARP 应答。1 表示 ARP 请求,2 表示 ARP应答。
源 MAC 地址:发送端的硬件地址。
源 IP 地址:发送端的协议(IP)地址。
目的 MAC 地址:接收端的硬件地址,在 ARP 请求时由于不知道接收端 MAC 地址,因此该字段为广播地址,即 48’hff_ff_ff_ff_ff_ff。
目的 IP 地址:接收端的协议(IP)地址。
1.3硬件设计
1.3.1数据流走向
进行ARP测试时,首先上位机向开发板发送arp请求包,数据由网线传入到RJ45水晶接口,
接着数据由RJ45传到PHY侧,PHY将数据进行数模转换后传给FPGA,FPGA根据协议格式进行分析整合以太网数据包,反传给上位机。
1.3.2数据流传输介质介绍
以太网接口电路主要由 MAC(Media Access Control)控制器和物理层接口 PHY Physical Layer,PHY)两大部分构成。MAC层这里是FPGA,主要作用是访问控制子层协议,对接收的数据根据协议格式进行解析,按照协议格式进行发送数据。PHY层接收 MAC 发过来的数据(对 PHY 来说,没有帧的概念,都是数据而不管什么地址,数据还是 CRC),把并行数据转化为串行流数据,按照物理层的编码规则把数据编码转换为模拟信号发送出去,接收数据时的流程反之。故PHY作用之一就是进行数模转换。
但是MAC收发的数据要传给PHY就需要有接口连接,即RGMII(Reduced GMII简化千兆比特媒体独立接口):RGMII 是 GMII 的简化版,数据位宽为 4 位,在 1000Mbps 传输速率下,时钟频率为 125Mhz,在时钟的上下沿同时采样数据。在 100Mbps 和 10Mbps 通信速率下,为单个时钟沿采样。
1.3.3硬件设计
![](https://i-blog.csdnimg.cn/direct/70c613f4573d4ad1a59396e1feb31fb2.png)
下图是用到的RGMII接口对应的引脚。
由上面开发板原理图可得出引脚分配表如下。
1.4模块设计
1.4.1整体模块设计
PLL:该模块对系统时钟进行倍频,输出 200Mhz 的时钟,用于 IDELAYCTRL 原语的参考时钟 。
gmii_to_rgmii:因为FPGA不能处理双沿信号,因此需要进行双沿(DDR)数据和单沿(SDR)数据之间的转换。接收数据时,将rgmii_rxd双沿信号转换为gmii_rx单沿信号送入到arp模块中进行数据解析。发送数据时,将arp整合号的数据由gmii_tx单沿信号转换为rgmii_tx双沿信号发送出去。
arp_ctrl:当arp模块解析数据包完成后发出arp_rx_done完成信号以及arp_rx_type信号。arp_ctrl根据发来的这两个信号决定arp模块什么时候开始发送arp数据包以及arp数据包的类型。
arp:接收数据时,根据arp协议依次解析数据;发送数据时,完成crc校验功能以及根据arp协议整合为arp数据包发送出去。
1.4.2gmii_to_rgmii模块
1.4.2.1rgmii_rx 模块
这里之所以要加延时组件是因为上下沿采样时,数据也在更新,因此采集的数据容易有误,采用接收时钟延迟部分,使得在数据更新的中间进行采样,从而保证采样数据的准确性。
其中 IDELAY2 原语必须搭配 IDELAYCTRL 原语进行使用。以上组件IDELAY2、BUFIO、BUFG的作用是将输入数据以及输入时钟进行延时。
IDDR 将双沿1位数据转换成单沿两位数据。因为接收到有rgmii_rx_ctrl和rgmii_rxd[3:0],总共5位信号,而IDDR一次只能转换一位双沿数据,因此需要例化5次。
其中IDDR的模式选择如下。
1.4.2.2rgmii_tx 模块
这里没有延时,只需要例化5次ODDR即可。采用的模式如下。
1.4.3arp模块
整体数据流程:首先arp_rx模块在gmii_rx_clk=125MHZ的时钟下接收8位gmii_rxd数据信号,按照arp协议格式解析数据,总共得出四路数据。
第一:得出源IP和源MAC(上位机的),这两个信号发送到arp_tx 模块,同时arp_tx模块接收来自arp_ctrl模块发来的发送数据使能信号和arp类型信号,结合arp协议格式整合成数据包进行发送数据。
第二:得出接收完成信号arp_rx_done和arp类型arp_rx_type,将这两个信号发送给arp_ctrl模块,若arp接收完成并且接收的是arp请求信号,则arp_ctrl模块输出信号arp_tx_en拉高,arp_tx_type拉低,代表控制arp_tx模块可以开始发送arp应答包了。
1.4.3.1arp_rx模块
st_idle:检测接收使能信号。
st_preamble:检测前导码+SFD是否错误。
st_eth_head:检测目的MAC是否为开发板MAC,检测以太网协议类型是否为ARP协议。
st_arp_data:检测目的IP地址是否为开发板IP地址,同时接收ARP类型是应答还是请求。0为请求,1为应答。接收src_mac、src_ip。给出arp_rx_done信号和arp_rx_type信号。
1.4.3.2arp_tx模块
ARP 发送模块根据以太网帧格式和 ARP 协议发送 ARP 请求或者 ARP 应答数据。
当发送MAC帧时到arp数据结束(包括填充码),拉高crc_en信号,并将整合号的arp数据送到crc32_d8模块中进行校验,接着crc32_d8将校验结果传送到arp_tx模块,该模块将校验数据整合到arp数据包中形成完整的一包以太网数据包进行发送。
CRC32 校验在 FPGA 实现的原理是线性反馈移位寄存器,其思想是各个寄存器储存着上一次 CRC32 运算的结果,寄存器的输出即为 CRC32 的值。
1.5板级验证
上位机向开发板发出arp请求。图一是因为没有icmp协议来检测数据包收发信息,故显示丢失。
二.ICMP协议
2.1ICMP/IP简介
ICMP(Internet Control Message Protocol)Internet 控制报文协议。它是 TCP/IP 协议簇的一个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。ICMP 报文包含在 IP 数据报中,属于 IP 的一个用户。
IP 协议是 TCP/IP 协议簇中的核心协议,也是 TCP/IP 协议的载体,IP 协议规定了数据传输时的基本单元和格式。如下图所示,之所以先介绍IP协议,因为IP协议中包含ICMP协议。即ICMP协议位于IP层的数据段。所有的 TCP、UDP 及 ICMP 数据都以 IP 数据报格式传输。
2.2ICMP/IP协议格式
版本:4 位 IP 版本号(Version),这个值设置为二进制的 0100 时表示 IPv4,设置为 0110 时表示 IPv6, 目前使用比较多的 IP 协议版本号是 4。
首部长度:4 位首部长度(IHL,Internet Header Length),表示 IP 首部一共有多少个 32 位(4 个字节)。 在没有可选字段时,IP 首部长度为 20 个字节,因此首部长度的值为 5。
服务类型:8 位服务类型(TOS,Type of service),该字段被划分成两个子字段:3 位优先级字段(现在已经基本忽略掉了)和 4 位 TOS 字段,最后一位固定为 0。服务类型为 0 时表示一般服务。
总长度:16 位 IP 数据报总长度(Total Length),包括 IP 首部和 IP 数据部分,以字节为单位。我们利用 IP 首部长度和 IP 数据报总长度,就可以知道 IP 数据报中数据内容的起始位置和长度。由于该字段长16bit,所以 IP 数据报最长可达 65535 字节。尽管理论上可以传输长达 65535 字节的 IP 数据报,但实际上还要考虑网络的最大承载能力等因素。
标识字段:16 位标识(Identification)字段,用来标识主机发送的每一份数据报。通常每发送一份报文它的值就会加 1。
标志字段:3 位标志(Flags)字段,第 1 位为保留位;第 2 位表示禁止分片(1 表示不分片 0:允许分片);第 3 位标识更多分片(除了数据报的最后一个分片外,其它分片都为 1)。
片偏移:13 位片偏移(Fragment Offset),在接收方进行数据报重组时用来标识分片的顺序。
生存时间:8 位生存时间字段,TTL(Time To Live)域防止丢失的数据包在无休止的传播,一般被设置为 64 或者 128。
协议:8 位协议(Protocol)类型,表示此数据报所携带上层数据使用的协议类型,ICMP 为 1,TCP 为6,UDP 为 17。
首部校验和:16 位首部校验和(Header Checksum),该字段只校验数据报的首部,不包含数据部分;校验 IP 数据报头部是否被破坏、篡改和丢失等。
源 IP 地址:32 位源 IP 地址(Source Address),即发送端的 IP 地址,如 192.168.1.123。
目的 IP 地址:32 位目的 IP 地址(Destination Address),即接收端的 IP 地址,如 192.168.1.102。
可选字段:是数据报中的一个可变长度的可选信息,选项字段以 32bit 为界,不足时插入值为 0 的填充字节,保证 IP 首部始终是 32bit 的整数倍。
类型(type):占用了 8 bit 位,前面我们说,是 ICMP 报文类型,用于标识错误类型的差错报文或者查询类型的报告报文。常用类型有:类型 0,代码 0:表示回显应答(ping 应答),类型 8,代码 0:表示回显请求(ping 请求)。 类型 11,代码 0:超时;类型 3,代码 0:网络不可达;类型 3,代码 1:主机不可达;类型 5,代码 0:重定向。
代码(code):占用了 8 bit 位,根据 ICMP 差错报文的类型,进一步分析错误的原因,代码值不同对应的错误也不同,例如:类型为 11 且代码为 0,表示数据传输过程中超时了,超时的具体原因是 TTL 值为 0,数据报被丢弃。
校验和(checksum):占用了 16 bit 位,校验的方法同上述 IP 首部校验和的方法一致。数据发送到目的地后需要对 ICMP 数据报文做一个校验,用于检查数据报文是否有错误。
标识符(Identifier):占用了 16 bit 位,对于每一个发送的数据报进行标识。
序列号(Sequence number):占用了 16 bit 位,对于发送的每一个数据报文进行编号,比如:发送的第一个数据报序列号为 1,第二个序列号为 2。
数据(Data):要发送的 ICMP 数据。
2.3模块设计
2.3.1整体模块设计
PLL模块:因为gmii_to_rgmii模块中的输入延时控制IDELAYCTRL中需要用到PLL倍频输出的200MHZ时钟。
FIFO模块:以太网单次会接收到大量数据,即ICMP数据格式图中的橙色部分,因此本次实验需要一个 FIFO 模块用来缓存数据,由于本次实验所使用的 GMII 接收时钟和 GMII 发送时钟实际上为同一个时钟,都为125Mhz,因此这里使用的是同步 FIFO。
arp模块:因为ICMP协议发送时需要发送上位机MAC和IP,故要用到ARP模块进行解析,将解析到的des_mac和des_ip信号传送给icmp模块使用。
icmp模块:发送和解析icmp协议包,和arp模块功能类似,只不过协议时序数据不一样而已。
eth_ctrl模块:主要是实现以太网协议的的一个切换。当使用ARP协议获取上位机MAC和IP时,gmii_tx_en和gmii_txd发送的就为ARP的发送使能和发送数据。当使用ICMP协议获取网络是否通畅信息时,gmii_tx_en和gmii_txd发送的就为ICMP的发送使能和发送数据。
整体数据流程:首先gmii_to_rgmii模块将接收到的以太网包数据进行双沿转单沿转换,转换好的数据gmii_rxd和gmii_rx_dv数据同时发送到ICMP模块和ARP模块,若数据包中是ICMP协议数据,则ICMP模块根据ICMP数据格式进行解析并发送对应的ICMP换回数据报文。ARP模块检测到发来的ICMP协议数据进行判断,然后丢弃。同理,若数据包中是ARP协议数据,则ICMP模块进行丢弃,ARP模块进行解析并应答。然后ARP模块和ICMP模块输出的发送数据和发送数据使能由eth_ctrl模块管控分时输入到gmii_to_rgmii模块进行单沿转双沿的转换,发送出去。
2.3.2icmp模块
整体数据流程:首先icmp_rx将接收到的以太网报文进行解析,解析完成后将icmp_id、icmp_seq、reply_checksum信号传给icmp_tx,方便icmp_tx模块进行报文整合。
同时icmp_rx接收到的rc_data信号放入FIFO中进行缓存,当icmp_tx需要发送时再取出。
icmp_rx接收完成,将icmp_pkt_done信号传给icmp_tx中的tx_start_en信号,则icmp_tx开始发送icmp环回报文数据。
2.3.2.1icmp_rx模块
st_idle:检测接收使能信号。
st_preamble:检测前导码+SFD是否错误。
st_eth_head:检测目的MAC是否为开发板MAC,检测以太网协议类型是否为IP协议。
st_ip_head:有效数据字节长度icmp_data_length;当前接收的数据是不是ICMP协议;检测目的IP地址是否为开发板IP地址。
st_icmp_head:判断ICMP报文类型是否是回显请求;解析出ICMP标识符icmp_id;解析出ICMP序列号icmp_seq;
st_rx_data:将icmp的8位数据部分进行两两拼接,拼接为16位数值;解析出以太网单包数据接收完成信号rec_pkt_done;解析出以太网接收的数据段使能信号rec_en;解析出以太网接收的数据rec_data;解析出以太网接收的有效字数( 单位:byte)rec_byte_num;
st_rx_end:给出接收数据校验reply_checksum,方面发送模块进行16位相加消除进位计算。
2.3.2.2icmp_tx模块
ICMP 发送模块根据以太网帧格式和 ICMP协议发送 ICMP 环回数据报文。
发送之前依次对IP首部,ICMP首部+数据段进行校验。以上校验完毕再进行发送报文操作。
当发送MAC帧时到icmp数据结束(包括填充码),拉高crc_en信号,并将整合号的icmp数据送到crc32_d8模块中进行校验,接着crc32_d8将校验结果传送到icmp_tx模块,该模块将校验数据整合到icmp数据包中形成完整的一包以太网数据包进行发送。
CRC32 校验在 FPGA 实现的原理是线性反馈移位寄存器,其思想是各个寄存器储存着上一次 CRC32 运算的结果,寄存器的输出即为 CRC32 的值。
2.4板级验证
三.UDP协议
3.1UDP协议简介
UDP (User Datagram Protocol)用户数据协议是一种面向无连接的传输层协议,属于 TCP/IP 协议簇的一种。UDP 具有消耗资源少、通信效率高等优点,通常用来传输音频、视频等对实时性要求高的场合。
3.2UDP协议格式
源端口号:16 位发送端端口号,用于区分不同服务的端口,端口号的范围从 0 到 65535。
目的端口号:16 位接收端端口号。
UDP 长度:16 位 UDP 长度,包含 UDP 首部长度+数据长度,单位是字节(byte)。
UDP 校验和:16 位 UDP 校验和。UDP 计算校验和的方法和计算 IP 数据报首部校验和的方法相似,但不同的是 IP 数据报的校验和只检验 IP 数据报的首部,而 UDP 校验和包含三个部分:UDP 伪首部,UDP 首部和 UDP 的数据部分。伪首部的数据是从 IP 数据报头和 UDP 数据报头获取的,包括源 IP 地址,目的 IP地址,协议类型和 UDP 长度,其目的是让 UDP 两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。
3.3模块设计
3.3.1整体模块设计
PLL模块:因为gmii_to_rgmii模块中的输入延时控制IDELAYCTRL中需要用到PLL倍频输出的200MHZ时钟。
FIFO模块:以太网单次会接收到大量数据,即ICMP协议中的数据段和UDP协议中的数据段,因此本次实验需要一个 FIFO 模块用来缓存数据,本次实验所使用的 GMII 接收时钟和 GMII 发送时钟实际上为同一个时钟,都为125Mhz,但是为了方便后面实验因此这里使用的是异步 FIFO。
arp模块:因为ICMP协议发送时需要发送上位机MAC和IP,故要用到ARP模块进行解析,将解析到的des_mac和des_ip信号传送给icmp模块使用。
icmp模块:发送和解析icmp协议包,和arp模块功能类似,只不过协议时序数据不一样而已。
udp模块:发送和解析udp协议包,和arp模块功能类似,只不过协议时序数据不一样而已。
eth_ctrl模块:主要是实现以太网协议的的一个切换。当使用ARP协议获取上位机MAC和IP时,gmii_tx_en和gmii_txd发送的就为ARP的发送使能和发送数据。当使用ICMP协议获取网络是否通畅信息时,gmii_tx_en和gmii_txd发送的就为ICMP的发送使能和发送数据。当使用UDP协议传输用户自定义数据时,gmii_tx_en和gmii_txd发送的就为UDP的发送使能和发送数据
整体数据流程:首先gmii_to_rgmii模块将接收到的以太网包数据进行双沿转单沿转换,转换好的数据gmii_rxd和gmii_rx_dv数据同时发送到ICMP模块和ARP模块和UDP模块,若数据包中是ICMP协议数据,则ICMP模块根据ICMP数据格式进行解析并发送对应的ICMP环回数据报文。ARP和UDP模块检测到发来的ICMP协议数据进行判断,然后丢弃。同理,若数据包中是ARP协议数据,则ICMP和UDP模块进行丢弃,ARP模块进行解析并应答。然后ARP模块和ICMP模块和UDP模块输出的发送数据和发送数据使能由eth_ctrl模块管控分时输入到gmii_to_rgmii模块进行单沿转双沿的转换,发送出去。同时将解析出的用户自定义数据段rec_data缓存至FIFO中。
3.3.2UDP模块
整体数据流程:首先udp_rx将接收到的以太网报文进行解析,解析完成后将rec_data、rec_byte_num信号经过FIFO缓存后传给udp_tx,方便udp_tx模块进行报文整合。
icmp_rx接收完成,将rec_pkt_done信号传给udp_tx中的tx_start_en信号,则udp_tx开始发送udp环回报文数据。
3.3.2.1udp_rx模块
st_idle:检测接收使能信号。
st_preamble:检测前导码+SFD是否错误。
st_eth_head:检测目的MAC是否为开发板MAC,检测以太网协议类型是否为IP协议。
st_ip_head:检测当前接收的数据是不是UDP协议;检测目的IP地址是否为开发板IP地址。
st_rx_data:发出以太网单包数据接收完成信号rec_pkt_done;给出以太网接收的数据使能信号rec_en;解析自定义数据段rec_data;解析以太网接收的有效字数rec_byte_num。
3.3.2.2udp_tx模块
UDP 发送模块根据以太网帧格式和 UDP协议发送 UDP 环回数据报文。
发送之前对IP首部进行校验。以上校验完毕再进行发送报文操作。
当发送MAC帧时到icmp数据结束(包括填充码),拉高crc_en信号,并将整合号的icmp数据送到crc32_d8模块中进行校验,接着crc32_d8将校验结果传送到icmp_tx模块,该模块将校验数据整合到icmp数据包中形成完整的一包以太网数据包进行发送。
CRC32 校验在 FPGA 实现的原理是线性反馈移位寄存器,其思想是各个寄存器储存着上一次 CRC32 运算的结果,寄存器的输出即为 CRC32 的值。
3.4板级验证
上位机向开发板发送UDP报文,UDP数据段字节少于18,自动补零,多于18则不做补充。
上位机对开发板执行ping操作,发送ICMP报文。以下是开发板环回ICMP信息。
三.基于OV5640的PL以太网视频传输实验
3.1OV5640简介
OV5640 是 OmniVision(豪威科技)公司生产的一颗 CMOS 图像传感器,该传感器功耗低、可靠性高以及采集速率快,主要应用在玩具、安防监控、电脑多媒体等领域。OV5640 是一款 1/4 英寸单芯片图像传感器,其感光阵列达到 2592*1944(即 500W 像素),能实现最快15fps QSXVGA(2592*1944)或者 90fps VGA(640*480)分辨率的图像采集。
3.2SCCB协议
3.2.1SCCB写传输协议
![](https://i-blog.csdnimg.cn/direct/49b77e6252ce46c683d25ead70cfe74b.png)
ID Address(W):OV5640 的器件地址为 7’h3c,一位读写控制位0为写,1为读。故ID Address+X=8’h78;
Sub-address(H):高 8 位寄存器地址。
Sub-address(L):低 8 位寄存器地址.
3.2.2SCCB读传输协议
首先进行需写,使地址指针指向虚写操作中寄存器地址的位置,需写时ID Address为8’h78;
然后是读器件地址和读数据,此时读取到的数据才是寄存器地址对应的数据,此时ID Address为8’h79.
3.3模块设计
3.3.1总体模块设计
PLL模块 :产生eth_top模块中子模块gmii_to_rgmii中idelay所需要的时钟200MHZ,同时产生50MHZ的时钟提供给i2c_dri模块使用。
i2c_dri模块:按照 I2C 协议对OV5640的存储芯片执行数据读写操作。因为OV5640 是采用 SCCB 接口总线来配置寄存器,OV5640 是用 16 位(两个字节)表示寄存器地址。在OV5640 正常工作之前,必须先对传感器进行初始化,即通过配置寄存器使其工作在预期的工作模式,以及得到较好画质的图像。因为 SCCB 的写传输协议和 IIC 几乎相同,因此我们可以直接使用 IIC 的驱动程序来配置摄像头。
i2c_cfg模块:给i2c_dri模块提供驱动信号,以及字地址子数据等信息,驱动i2c_dri模块进行写数据操作。同时暂存从i2c_dri模块读出的数据。该实验没有用到i2c_dri读数据功能,只用了写数据功能对OV5640的寄存器进行初始化操作。
start_transfer_ctrl模块:该模块解析以太网顶层模块接收到的数据,如果收到 1 个字节的 ASCII 码“1”,则表示以太网开始传输图像数据,img_data_pkt开始进行一帧中的一行数据进行打包;如果收到 1 个字节的 ASCII 码“0”,则表示以太网停止传输图像数据。
img_data_pkt模块:图像数据封装模块负责传输输入的 8 位图像数据,以及添加图像数据的帧头和行场分辨率。该模块控制着以太网发送模块发送的字节数,单次发送一行图像数据的字节数,模块内部例化了一个异步 FIFO 模块,用于缓存待发送的图像数据。
eth_top模块:负责将img_data_pkt模块打包好的数据以udp报文的形式发送到上位机上进行显示。
整体数据流程:
因为OV5640 是采用 SCCB 接口总线来配置寄存器,OV5640 是用 16 位(两个字节)表示寄存器地址。在OV5640 正常工作之前,必须先对传感器进行初始化,即通过配置寄存器使其工作在预期的工作模式,以及得到较好画质的图像,因为 SCCB 的写传输协议和 IIC 几乎相同,因此我们可以直接使用 IIC 的驱动程序来配置摄像头。所以该功能由i2c_dri模块和i2c_cfg模块来完成。依次对OV5640中的250个寄存器进行初始化配置。
然后上位机向开发板发送报文,eth_top模块接收到以太网报文后开始进行解析,若类型是arp则可以解析出上位机的MAC地址和IP地址;若类型是udp,则可以解析出收到的字节是1还是0,是1就代表开发板可以向上位机发送要显示的图像数据了。
当eth_top模块解析出上位机发送的数据时,如果收到 1 个字节的 ASCII 码“1”,则表示以太网开始传输图像数据,如果收到 1 个字节的 ASCII 码“0”,则表示以太网停止传输图像数据.
然后将以太网传输图像信号传递给img_data_pkt模块,该模块将OV5640采集到的8位图像信号进行打包,每一帧的第一行数据+帧头和行场分辨率进行打包,其余不加。
打包好的数据传给eth_top模块,该模块将打包好的图像数据按照udp协议进行整合,也就是将其放入udp协议的数据段部分,然后以以太网报文的形式发送给上位机进行显示。
综合下来是上位机——>eth_top——>start_transfer_ctrl——>img_data_pkt——>eth_top——>上位机。
3.3.2i2c_dri模块
st_data_rd :读出OV5640寄存器中数据i2c_data_r,该实验没有进行这一步骤;
st_stop:给出I2C一次操作完成i2c_done,因为该实验需要配置250个寄存器的数值信息,因此每当i2c_done拉高依次,代表一个寄存器的数值写入完毕;
该模块还需要进行时钟分频,将50MHZ的时钟分频成1Mhz给i2c_cfg模块和自身使用。这里注意scl是dri_clk的四分之一,即25Khz。
3.3.3ic_cfg模块
由于对OV5640进行寄存器初始化有250个寄存器,因此该模块就是根据i2c_dri模块发来的i2c_done信号调整i2c_data信号,每当i2c_done信号拉高依次,就更新i2c_data信号赋值给不同的寄存器。
3.3.4eth_top模块
接收数据时:首先上位机向开发板发送数据,通过gmii_to_rgmii模块进行双沿数据到单沿数据的转换,转换成gmii数据后同时发送给udp模块和arp模块。若发送的是arp形式的报文,则udp模块将该报文丢弃,arp进行报文解析,获取上位机的MAC地址和IP地址。若发送的是UDP形式的报文,则arp模块将报文丢弃,udp模块进行报文解析,将解析后的数据rec_data等传送出去。
发送数据时:当输入信号udp_tx_start_en信号拉高后,该信号传入到udp模块中,udp模块开始以UDP协议数据格式将发来的数据进行整合,整合为udp报文形式,然后再通过gmii_to_rgmii模块进行转换,转换为rgmii【7:0】格式数据再发送出去。
3.3.5start_transfer_ctrl模块
当eth_top模块处于 接收上位机数据时,并将接收到的数据进行解析完毕后,就将解析完毕的数据udp_rec_pkt_done等信号传入到该模块中,然后该模块进行数据判断,如果收到 1 个字节的 ASCII 码“1”,则表示以太网开始传输图像数据,如果收到 1 个字节的 ASCII 码“0”,则表示以太网停止传输图像数据。
3.3.6img_data_pkt模块
![](https://i-blog.csdnimg.cn/direct/b4bd496679164594867ac35073602ce4.png)
FIFO写数据:当帧起始信号来临时,捕捉到下降沿就开始向fifo中写入数据(写数据的时钟是像素时钟),因为分辨率是640X480,因此一行包含640个像素点,该实验采用RGB565模式,因此一个像素点包含两个字节,每一帧的第一行还需要加上8字节的帧头和行场分辨率,因此就是640X2+8。每一包udp报文发送一行像素信息,故当传输完第一行数据时,eth_top发送一个udp_done信号,则此时fifo写入的数据字节数就是640X2。以此类推。
FIFO读数据:当FIFO中的字节数fifo_rdusedw大于eth_top要发送的数据长度,则开始进行读数据(读数据的时钟是udp_tc_clk,因为eth_top将读到的数据进行整合发送出去),将udp_tx_start_en信号拉高控制eth_top模块读取FIFO中的数据。
3.4板级验证