FPGA实现千兆/百兆自适应以太网UDP传输

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

0、前言

笔者最近在项目中需要使用到ZYNQ中PL端做以太网UDP传输并且需要支持100M/1000M自适应切换。使用的PHY型号为RTL8211。以下分享的主要为利用已有的1000M协议栈修改为100M并且实现二者自适应切换,IP核主要实现以下功能

1、实现100M/1000M自适应

2、回环测试

PS:完整的IP核文件下载地址:https://download.csdn.net/download/qq_24025329/87019436

1、软硬件环境和前置条件

笔者采用的接口是RGMII接口,即100M模式下单边沿采样,时钟频率为25M。在1000M模式下使用双边沿采样,时钟频率为125M。所以在千兆模式下需要使用原语对数据采样,这里就不过多赘述了,这里默认已经拥有了可以实现1000M通讯的协议栈了。

2、实现步骤

第一步:千兆-百兆接收数据转换模块

这里笔者偷了个懒,既然已经有了千兆模式下读取的数据,那么我们只需要根据千兆与百兆之间的采样模式进行转换就可以读出来正确的数据了。具体思想如下

1、千兆为双边沿采样,百兆为单边沿采样。所以在千兆模式RGMII转换为GMII接口下跑百兆的速度读出来的8bit数据中高四位=低四位的。所以我们将读出来的数据只保留四位即可。下图为千兆模式下的采样

fpga千兆网怎么变成百兆网,FPGA,笔记,fpga开发,udp,网络,zynq,verilog

 2、时钟采用PHY提供的时钟,即百兆模式下25M千兆模式下为125M即可。具体实现代码如下

`timescale 1ns / 1ps
module eth_speed(
	input 			  Rst_n,		//系统复位
    //以太网GMII接口
    input             gmii_rx_clk , //GMII接收时钟
    input             gmii_rx_dv  , //GMII接收数据有效信号
    input      [7:0]  gmii_rxd    , //GMII接收数据
    
    //速度转换后以太网GMII接口
    output             gmii_rx_clk_s , //GMII接收时钟
    output             gmii_rx_dv_s  , //GMII接收数据有效信号
    output    reg[7:0] gmii_rxd_s      //GMII接收数据
    
);
//==========参数定义=============//
parameter SPEED = 1000;//1000Mbps

//==========寄存器定义===========//
reg 	out_clk;		//输出时钟
reg 	count_s;		//二分数据计数
reg 	data0_en;
reg 	data1_en;		//数据有效位


//==========组合逻辑运算=============//
assign gmii_rx_clk_s = out_clk;//输出时钟二分频
assign gmii_rx_dv_s = data0_en && data1_en;//接收数据有效

//==========时序逻辑============//
//输入时钟二分频
always @(posedge gmii_rx_clk or negedge Rst_n)
if(!Rst_n)
	out_clk <= 1'd0;
else
	out_clk <= ~out_clk;

//二分数据计数
//第一个数据来临后的第一个下降沿=1
//
always @(negedge gmii_rx_clk or negedge Rst_n)
if(!Rst_n)
	count_s <= 1'd0;
else if(!gmii_rx_dv)//数据无效 清零
	count_s <= 1'd0;
else
	count_s = ~count_s;//反转

//采集数据1 下降沿采集数据
always @(negedge gmii_rx_clk or negedge Rst_n)
if(!Rst_n)
	gmii_rxd_s[3:0] <= 4'd0;
else if(gmii_rx_dv && (!count_s))//接收数据有效并且二分频时钟位低电平
	gmii_rxd_s[3:0] <= gmii_rxd[3:0];
	
//采集数据2 下降沿采集数据
always @(negedge gmii_rx_clk or negedge Rst_n)
if(!Rst_n)
	gmii_rxd_s[7:4] <= 4'd0;
else if(gmii_rx_dv && (count_s))//接收数据有效并且二分频时钟位低电平
	gmii_rxd_s[7:4] <= gmii_rxd[3:0];


//采集数据1有效位
always @(posedge gmii_rx_clk or negedge Rst_n)
if(!Rst_n)
	data0_en <= 1'd0;
else if(!count_s)	//第一个数据采样的周期
	if(gmii_rx_dv)	//有效
		data0_en <= 1'd1;
	else
		data0_en <= 1'd0;
else
	data0_en <= data0_en;
	
//采集数据2有效位
always @(posedge gmii_rx_clk or negedge Rst_n)
if(!Rst_n)
	data1_en <= 1'd0;
else if(count_s)	//第二个数据采样的周期
	if(gmii_rx_dv)	//有效
		data1_en <= 1'd1;
	else
		data1_en <= 1'd0;
else
	data1_en <= data1_en;
	
    
endmodule

第二步:千兆-百兆接收数据转换模块

发送方面就不能偷懒了,只能自己写了一个百兆模式下的发送,代码如下

`timescale 1ns / 1ps

module eth_speed_tx(
	input 			Rst_n,
	input 			gmii_rx_clk,	//来自PHY的时钟
	//获得数据接口
	input 	[7:0]	data_in,		//GMII数据
	input 			data_en,		//GMII使能
	output 			data_clk,		//GMII时钟,用于获取发送数据,是RGMII的1/2
	
	//RGMII接口
	output 			rgmii_txc,		//RGMII的时钟
	output 	reg[3:0]rgmii_txd,		//RGMII发送的数据
	output 			rgmii_tx_ctl	//RGMII发送控制
);

//========寄存器定义===========//
reg 	rgmii_txc_2_s;//发送时钟的二分频 并滞后90°
reg 	en_delay;//输入使能延迟

//==========逻辑==============//
assign data_clk = rgmii_txc_2_s;
assign rgmii_tx_ctl = data_en|en_delay;
assign rgmii_txc = gmii_rx_clk;

//==========时序逻辑==========//
//时钟二分频 用于获得数据  并滞后90°
always@(negedge rgmii_txc or negedge Rst_n)
if(!Rst_n)
	rgmii_txc_2_s <= 1'd0;
else
	rgmii_txc_2_s <= ~rgmii_txc_2_s;

//发送数据赋值
always @(negedge gmii_rx_clk or negedge Rst_n)
if(!Rst_n)
	rgmii_txd <= 4'd0;
else if(data_en && rgmii_txc_2_s)//要发送第一个4bit数据 低位
	rgmii_txd <= data_in[3:0];
else if(data_en && (!rgmii_txc_2_s))//要发送第二个4bit数据 高位
	rgmii_txd <= data_in[7:4];
else
	rgmii_txd <= rgmii_txd;

//使能延迟
always @(negedge gmii_rx_clk or negedge Rst_n)	
if(!Rst_n)
	en_delay <= 1'd0;
else if(data_en && (!rgmii_txc_2_s))
	en_delay <= 1'd1;
else
	en_delay <= 1'd0;

endmodule

第三步:百兆千兆切换逻辑

百兆和千兆模式下切换本质上就是切换RGMII的接口信号源,具体的逻辑较为简单如图所示

fpga千兆网怎么变成百兆网,FPGA,笔记,fpga开发,udp,网络,zynq,verilog

 其中SPEED为选择开关,该值可以是定义的参数,也可以当作接口有外部提供。

最后

该IP核是笔者在项目中解决自己的问题所编写,水平有限如有疏漏敬请指正。文章来源地址https://www.toymoban.com/news/detail-810074.html

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

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

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

相关文章

  • 千兆/百兆车载以太网转换器 罗森伯格H-MTD 泰科MATEnet接口

    重庆汇迪能电子设备有限公司 www.hdn-vdo.com #车载以太网转换器 车载以太网转换器是将车载以太网转换为标准以太网的一种协议转换器。将方便的支持用户将两线的车载以太网转换为RJ45接口的网线接入到电脑。 为千兆和百兆可切换双速车载以太网转换器。采用车载以太网普遍

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

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

    2024年01月22日
    浏览(60)
  • 基于FPGA的百兆以太网通信(一)——MDIO配置PHY芯片

     一、以太网简介   之前提了个引子,接下来我会分享一下基于FPGA的百兆以太网通信学习过程。第一部分是对于以太网PHY芯片的配置和状态读取。   一般来说,FPGA以太网通信是需要外接的PHY芯片的,目前的很多FPGA出厂的底板上已经焊好了PHY芯片,所以这一点是比较方便的。

    2024年04月10日
    浏览(57)
  • FPGA - 以太网UDP通信(一)

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

    2024年04月18日
    浏览(57)
  • FPGA——三速自适应以太网设计(1)基本模块

    每层都嵌套在上层的数据字段 以太网帧长: 64B~1518B IP层 ARP层 UDP层 ICMP层 要双端口ram读写缓存帧的数据和FIFO配合存储帧长度和类型 类型是0800就是IP 0806就是ARP,进行分流操作 两个数据流都加个FIFO,以帧为单位,先输出A,A输出完成后再输出B。还要进行流控:要切换通道输出

    2024年03月14日
    浏览(74)
  • FPGA优质开源项目 – UDP万兆光纤以太网通信

    本文开源一个FPGA项目:UDP万兆光通信。该项目实现了万兆光纤以太网数据回环传输功能。Vivado工程代码结构和之前开源的《UDP RGMII千兆以太网》类似,只不过万兆以太网是调用了Xilinx的10G Ethernet Subsystem IP核实现。 下面围绕该IP核的使用、用户接口,以及数据传输方案展开介

    2024年02月10日
    浏览(60)
  • FPGA实现以太网(一)——以太网简介

    以太网(Ethernet)是当今现有局域网采用的最通用的通信协议标准, 该标准定义了在局域网中采用的电缆类型和信号处理方法。 以太网凭借其成本低、通信速率高、抗干扰性强等优点被广泛应用在网络远程监控、 交换机、工业自动化等对通信速率要求较高的场合。 以太网是一

    2024年02月03日
    浏览(53)
  • 千兆以太网(二)——MDIO接口协议

      MAC和PHY芯片有一个配置接口,即MDIO接口。可以配置PHY芯片的工作模式以及获取PHY芯片的状态信息。PHY芯片内部有一系列寄存器。用户通过配置寄存器来配置PHY芯片的工作模式。   FPGA通过MDIO接口对PHY芯片的内部寄存器进行配置。通常情况下芯片在默认情况下也可以工作

    2024年01月20日
    浏览(55)
  • 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日
    浏览(49)
  • 基于FPGA的数据采集、编码、通讯和存储系统设计(即FPGA+RTL8211千兆以太网+SD卡存储+RTC+Uart+AD7606数模转换+电流放大采集等硬件设计与程序验证)

    介绍一个小项目,加强对FPGA相关接口的整体把握。 硬件及软件代码梳理: 硬件系统的主要功能框图,其中FPGA作为处理单元,实现了包括电流和电压的采集、千兆以太网通讯、SD卡本地数据存储和串口通讯等。已经过板级测试,测试包含:千兆网通讯收发测试、AD采集的数据

    2024年04月13日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包