千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)

这篇具有很好参考价值的文章主要介绍了千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相关文章:
(1)千兆以太网网络层 ARP 协议的原理与 FPGA 实现
(2)千兆以太网硬件设计及链路层 MAC 协议格式
(3)CRC校验原理及实现
(4)RGMII 与 GMII 转换电路设计
(5)千兆以太网网络层 IP 协议介绍与 IP 校 验和算法实现
(6)千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP发送)
(7)千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)
(8)千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP回环)
(9)以太网初始化设计(MDIO 控制器)
(10)添加基于 OV2640 的以太网 RGMII 图像传输系统设计


前言

在前面我们对以太网 UDP 帧格式做了讲解,UDP 帧格式包括前导码+帧界定符、以太网头部数据、IP 头部数据、UDP 头部数据、UDP 数据、FCS 数据,以太网接收模块同样是按照该格式接收数据。

提示:任何文章不要过度深思!万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」 ;不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人 。怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」

心得体会

(1)UDP接收数据,无论是MAC地址,还是IP地址,或者UDP端口,其源端口都为计算机;
(2)在接收数据时不关心源端口(计算机)的MAC地址,还是IP地址,或者UDP端口,只关心目的地址,也就是说接收数据时可以将源端口MAC地址,IP地址,UDP端口全部置 0;
(3)验证时一定要弄清目的地址(开发板)的MAC和IP地址,这里与UDP发送中目的MAC、IP(计算机)是相反的,此处需要注意;
(4)本实验针对千兆网,注意查看电脑是否支持。

一、 UDP 协议简单回顾

以太网 UDP 帧的用户数据是打包在 UDP 协议中,而 UDP 协议又是基于 IP 协议之上的,IP 协议又是走 MAC 层发送的,即从包含关系来说:MAC 帧中的数据段为 IP 数据报文,IP 报文中的数据段为 UDP 报文,UDP 报文中的数据段为用户希望传输的数据内容下图为使用 UDP 协议发送数据的层层打包示意图。
fpga 以太网 接收,FPGA代码分享,udp,fpga开发,单片机,fpga,网络,缓存,网络协议
其中,和以太网帧、IP 报文具有帧头一样,UDP 数据报也包含了一个 UDP 报头部分,与 UDP 协议相关的一些信息如端口号,数据包长度等会被打包进 UDP 报头中,然后再与需要传输的 UDP 报文数据一起,作为 IP 报文的数据段送往 IP 层发送。

二、UDP接收实现

GMII 接口信号连接关系及各信号的介绍如下。
fpga 以太网 接收,FPGA代码分享,udp,fpga开发,单片机,fpga,网络,缓存,网络协议
(注:表格中的方向是站在 MAC 侧角度看的)

fpga 以太网 接收,FPGA代码分享,udp,fpga开发,单片机,fpga,网络,缓存,网络协议
此处给出GMII 接口信号连接关系及各信号的介绍,是为了明确UDP发送与接收需要什么输入与输出。

下面将对各个状态的实现及功能进行简要介绍。

  1. IDLE
    空闲状态,当产生接收数据有效信号时,进入PREAMBLE_CODE状态,否则处于 IDLE 状态,代码如下所示:
 IDLE:     begin
							    GMII_RX_DONE <= 0;
							    crc_en <= 0;
								if(GMII_DV_reg1 && !GMII_DV_reg2)
									begin
										  curr_state <= PREAMBLE_CODE;
										  
									end
								else
								  curr_state <= curr_state;
							end

上述代码中的GMII_DV_reg1 信号是将接收数据有效信号GMII_DV寄存之后打一拍得到的,GMII_DV_reg2 信号是将GMII_DV_reg1信号打一拍得到的,将GMII_DV_reg2 信号取反与
GMII_DV_reg1 相与得到接收数据有效脉冲,得到该信号之后,进入到PREAMBLE_CODE 状态,
fpga 以太网 接收,FPGA代码分享,udp,fpga开发,单片机,fpga,网络,缓存,网络协议

GMII_DV_reg1 信号和GMII_DV_reg2 信号的实现代码如下所示,代码中对GMII_TXD 信号也进行了寄存和打拍操作,

//输入数据寄存
	always @ (posedge clk125m_o  or  negedge reset_n)
		if(!reset_n)
			begin
				GMII_ER_reg <= 0;
				GMII_DV_reg <= 0;
				GMII_TXD_reg<= 0;
			end
		else begin
		        GMII_ER_reg <= GMII_ER;
				GMII_DV_reg <= GMII_DV;
				GMII_TXD_reg<= GMII_TXD;
		     end
			
	
	
	
	//数据打两拍判断接收起始
	always @ (posedge clk125m_o  or negedge reset_n)
	    if(!reset_n)
			begin
			
				GMII_DV_reg1 <= 0;
				GMII_DV_reg2 <= 0;
				
				GMII_TXD_reg1<= 0;
				GMII_TXD_reg2<= 0;
				crc_data        <= 0;
			
			end
		else
			begin
					GMII_DV_reg1 <= GMII_DV_reg;
					GMII_DV_reg2 <= GMII_DV_reg1;
					
					GMII_TXD_reg1<= GMII_TXD_reg;
					GMII_TXD_reg2<= GMII_TXD_reg1;
					crc_data     <= GMII_TXD_reg2;  
					
			end
	
  1. PREAMBLE_CODE 状态
    处于 PREAMBLE_CODE状态的时候,当以太网接收到帧界定符(D5)和 7 个的前导码(55)
    时,进入到ETH_HEADER 状态,代码如下所示:
PREAMBLE_CODE:
								begin
									crc_init <= 0;
									if(cnt_preamble == 4'd7)
									  begin
										  curr_state <= ETH_HEADER;
										  cnt_preamble <= 0;
									  end
									  
									
									else
										begin
											cnt_preamble <= cnt_preamble + 1'b1;
											curr_state <= curr_state;
										end
                                end
  1. ETH_HEADER
    处于 ETH_HEADER 状态时,接收以太网头部数据,当接收完 14 个以太网头部数据之后,进入到 IP_HEADER 状态,如果接收不是7个55和一个D5,则表明此时数据接收错误,进入 IDLE 状态,然后当处于该状态的时候,根据 cnt_eth_header 的值,依次得到 14 个字节的以太网头部数据,分别是 MAC 目的地址(6 个字节)、MAC 源地址(6 个字节)和以太网类型(2 个字节),代码如下所示:
 ETH_HEADER:begin
								crc_en <= 1;
								if(cnt_eth_header == 4'd13)
									begin
										curr_state <= IP_HEADER;
										cnt_eth_header <= 0;
									end
								else if((cnt_eth_header == 4'd0) && (preamble_code_check_ok == 1'b0))
									begin
										curr_state <= IDLE;
										cnt_eth_header <= 0;
									end	
								else
									begin
										cnt_eth_header <= cnt_eth_header + 1'b1;
										curr_state <= curr_state;
									end
								
								case(cnt_eth_header)
									 
									  4'd0 :dst_mac_reg[47:40] <= GMII_TXD_reg2;   
									  4'd1 :dst_mac_reg[39:32] <= GMII_TXD_reg2;
									  4'd2 :dst_mac_reg[31:24] <= GMII_TXD_reg2;
									  4'd3 :dst_mac_reg[23:16] <= GMII_TXD_reg2;
									  4'd4 :dst_mac_reg[15:8]  <= GMII_TXD_reg2;
									  4'd5 :dst_mac_reg[7:0]   <= GMII_TXD_reg2;

									  4'd6 :src_mac_reg[47:40] <= GMII_TXD_reg2;
									  4'd7 :src_mac_reg[39:32] <= GMII_TXD_reg2;
									  4'd8 :src_mac_reg[31:24] <= GMII_TXD_reg2;
									  4'd9 :src_mac_reg[23:16] <= GMII_TXD_reg2;
									  4'd10:src_mac_reg[15:8]  <= GMII_TXD_reg2;
									  4'd11:src_mac_reg[7:0]   <= GMII_TXD_reg2;

									  4'd12:eth_type[15:8] <= GMII_TXD_reg2;
									  4'd13:eth_type[7:0]  <= GMII_TXD_reg2;
									  default: ;	
									
								endcase
						    end

其中preamble_code_check_ok为:文章来源地址https://www.toymoban.com/news/detail-765863.html

always @ (posedge clk125m_o  or negedge reset_n)
		if(!reset_n)
			preamble_code_check_ok <= 1'b0;
		else if((GMII_TXD_reg2 == 8'hd5) && (cnt_preamble == 4'd7))
			preamble_code_check_ok <= 1'b1;
		else
			preamble_code_check_ok <= 1'b0;
  1. IP_HEADER
    (1)接收以太网 IP 头部数据状态IP_HEADER,首先得对接收的以太网 IP 头部数据进行计数,定义一个计数器 cnt_ip_header,当处于该状态的时候进行计数,否则清零,
    (2)然后当处于 IP_HEADER 状态时,获取以太网 IP 头部数据,根据 cnt_ip_header 的值,一共需要获取 20 个字节的数据,分别为 IP 版本(ip_ver)、首部长度(ip_hdr_len)、服务类型(ip_tos)、数据报总长度(total_len)、标识主机发送的每一份数据报(ip_id)、标志位(ip_rsv、ip_df、ip_mf)、段偏移量(ip_frag_offset)、生存期(ip_ttl)、IP 的协议封装类型(ip_protocol)、头部校验和(ip_check_sum)、源 IP 地址(src_ip)和目的 IP 地址(dst_ip),代码如下所示:
IP_HEADER:begin
									if(cnt_ip_header == 5'd19)
									    begin
										    curr_state <= UDP_HEADER;
											udp_data_length_reg <= ip_total_len - 16'd20 - 16'd8;
											cnt_ip_header <= 5'd0;
											ip_cal_en     <= 1;
											
										end
									else if(cnt_ip_header >= 5'd1 && eth_header_check_ok == 1'b0)
									    begin
											curr_state <= IDLE;
											cnt_ip_header <= 0;
											
										end
									else
										begin
											cnt_ip_header <= cnt_ip_header + 1'b1;
											curr_state <= curr_state;
										end
									case (cnt_ip_header)
										          5'd0:   {
   ip_ver,ip_hdr_len}                       <= GMII_TXD_reg2;
												  5'd1:   ip_tos                                    <= GMII_TXD_reg2;
												  5'd2:   ip_total_len[15:8]                        <= GMII_TXD_reg2;
												  5'd3:   ip_total_len[7:0]                         <= GMII_TXD_reg2;
												  5'd4:   ip_id[15:8]                               <= GMII_TXD_reg2;
												  5'd5:   ip_id[7:0]                                <= GMII_TXD_reg2;
												  5'd6:   {
   ip_rsv,ip_df,ip_mf,ip_frag_offset[12:8]} <= GMII_TXD_reg2;
												  5'd7:   ip_frag_offset[7:0]                       <= GMII_TXD_reg2;
												  5'd8:   ip_ttl                                    <= GMII_TXD_reg2;
												  5'd9:   ip_protocol                               <= GMII_TXD_reg2;
												  5'd10:  ip_check_sum[15:8]                        <= GMII_TXD_reg2;
												  5'd11:  ip_check_sum[7:0]                         <= GMII_TXD_reg2;
												  5'd12:  src_ip_reg[31:24]                         <= GMII_TXD_reg2;
												  5'd13:  src_ip_reg[23:16]                         <= GMII_TXD_reg2;
												  5'd14:  src_ip_reg[15:8]                          <= GMII_TXD_reg2;
												  5'd15:  src_ip_reg[7:0]                           <= GMII_TXD_reg2;
												  5'd16:  dst_ip_reg[31:24]                         <= GMII_TXD_reg2;
												  5'd17:  dst_ip_reg[23:16]                         <= GMII_TXD_reg2;
												  5'd18:  dst_ip_reg[15:8]                          <= GMII_TXD_reg2;
												  5'd19:  dst_ip_reg[7:0]                           <= GMII_TXD_reg2;      
												  defaul

到了这里,关于千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA-以太网基础知识-MII接口-RMII接口-GMII接口-RGMII接口-MAC协议-UDP协议

    记录学习FPGA以太网基础知识、包括MII接口-RMII接口-GMII接口-RGMII接口-MAC协议、UDP协议 由上图可得,以太网传输流程 : 1、一块fpga的pcb板子以太网部分,包括FPGA芯片、PHY以太网芯片、网口接口。 2、FPGA芯片包括UDP层、IP层、MAC层,即FPGA封装好了这些硬件模块也叫IP核(这里的

    2024年02月08日
    浏览(15)
  • FPGA驱动千兆以太网PHY但电脑只显示百兆

    前两天公司做了个新板子,ZYNQ7035 + RTL8211E,拿给我测,于是写逻辑代码测试一下数据回环,没想到电脑端网络适配器一直显示是百兆网。查了多方原因,差点想手动配置寄存器了,但是想想又觉得不对,FPGA逻辑驱动以太网PHY芯片是不用配置寄存器的,只要PHY芯片外部引脚上

    2024年02月16日
    浏览(12)
  • FPGA高端项目:图像采集+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

    FPGA高端项目:图像采集+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持 没玩过图像处理、GT高速接口、UDP网络通信,都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。GT资源是Xilinx系列FPGA的重要卖点,也是做

    2024年02月05日
    浏览(22)
  • FPGA高端项目:图像采集+GTX+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

    FPGA高端项目:图像采集+GTX+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持 没玩过图像处理、GT高速接口、UDP网络通信,都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。GT资源是Xilinx系列FPGA的重要卖点,也是做

    2024年02月05日
    浏览(21)
  • FPGA高端项目:图像缩放+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

    FPGA高端项目:图像缩放+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持 没玩过图像处理、GT高速接口、UDP网络通信,都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。GT资源是Xilinx系列FPGA的重要卖点,也是做

    2024年02月05日
    浏览(20)
  • FPGA高端项目:图像缩放+GTX+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

    FPGA高端项目:图像缩放+GTX+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持 没玩过图像处理、GT高速接口、UDP网络通信,都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。GT资源是Xilinx系列FPGA的重要卖点,也是做

    2024年03月14日
    浏览(41)
  • 千兆以太网芯片88E1111 RGMII模式的FPGA驱动实现

    千兆以太网芯片88E1111 RGMII模式的FPGA驱动实现 在网络应用领域,千兆以太网已经成为主流,而88E1111作为一款先进的千兆以太网芯片,其驱动实现对于网络设备的性能和稳定性有着至关重要的影响。本文将介绍在RGMII模式下,如何实现88E1111芯片在FPGA上的驱动。 一、准备工作

    2024年01月22日
    浏览(15)
  • FPGA - 以太网UDP通信(一)

    ​以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。 ​ 以太网是现实世界中最普遍的一种计算机网络。以太网有两类:第一类是经典以太网,第二类是交换式以太网,使用了一

    2024年04月18日
    浏览(22)
  • FPGA 以太网传输ov5640视频

    使用 DFZU4EV MPSoC 开发板及双目 OV5640 摄像头其中一个摄像头实现图像采集,并通过开发板上的以太网接口发送给上位机实时显示。 时钟模块用于为 I2C 驱动模块、以太网顶层模块和开始传输控制模块提供驱动时钟;I2C 驱动模块和 I2C 配置模块用于初始化 OV5640 图像传感器;摄像

    2024年04月10日
    浏览(21)
  • ZYNQ AXI_DMA_UDP以太网传输(二)问题记录

    上一篇文章只是简单的记录一下调试成功的代码 但调试成功这个过程很痛苦,踩了很多坑,特此记录,留眼以后查看 参考博客 xilinx dma调试笔记 ZYNQ AXI DMA调试细节 在调试过程中出现这类问题基本上都是这一句代码出了问题: 再往里面跳可以看见这样一个函数,在正点原子提

    2024年03月14日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包