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

news2025/7/18 8:20:09

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数据中高四位=低四位的。所以我们将读出来的数据只保留四位即可。下图为千兆模式下的采样

 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的接口信号源,具体的逻辑较为简单如图所示

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

最后

该IP核是笔者在项目中解决自己的问题所编写,水平有限如有疏漏敬请指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于微信小程序的青少年素质教育培训系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mav…

高性能计算和并行计算的关系

高性能计算 百度百科的定义为&#xff1a; 高性能计算(High performance computing&#xff0c; 缩写HPC) 指通常使用很多处理器&#xff08;作为单个机器的一部分&#xff09;或者某一集群中组织的几台计算机&#xff08;作为单个计 算资源操作&#xff09;的计算系统和环境…

windows环境CLion调试SRS流媒体服务器源码

环境介绍&#xff1a; SRS支持JetBrains的CLion&#xff0c;它是基于cmake编译的&#xff0c;在windows环境使用CLion&#xff0c;通过SSH远程调试SRS&#xff0c;调试环境安装在CentOS 7虚拟机上。 资源下载&#xff1a; CLion官网下载地址&#xff1a;https://www.jetbrains.…

构造函数与原型对象

一、构造函数与原型对象 1、构造函数 作用&#xff1a;主要用于创建对象&#xff0c;初始化对象的属性 1、ES5中创建构造函数然后创建对象 function Student(id,name){this.id id,this.name name }let s1 new Student(001,小王) 2、ES6中创建类&#xff0c;给类单独定义…

Java反应式编程(3)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 在前面的文章中已经把vert.x框架给跑起来了&#xff0c;但是实际开发中服务端是需要响应客户端的请求的&#xff0c;所以肯定需要增加接口&#xff0c;但是该怎么…

【华为OD机试真题 python】 绘图机器【2022 Q4 | 100分】

■ 题目描述 绘图机器的绘图笔初始位置在原点(0,0)机器启动后按照以下规则来进行绘制直线。 1. 尝试沿着横线坐标正向绘制直线直到给定的终点E 2. 期间可以通过指令在纵坐标轴方向进行偏移&#xff0c;offsetY为正数表示正向偏移,为负数表示负向偏移 给定的横坐标终点值E 以…

Timesnet: Temporal 2d-variation modeling for general time series analysis

Timesnet: Temporal 2d-variation modeling for general time series analysis (ICLR 2022) 时间序列分析在天气预报、异常检测、行为识别等领域有着广泛的应用。针对时序变化建模这一广泛分析任务的共同关键问题进行了研究。之前的方法试图直接从一维时间序列中实现这一点,由…

Java线程池如何实现线程复用

线程池把线程和任务进行解耦&#xff0c;线程归线程&#xff0c;任务归任务&#xff0c;摆脱了通过 Thread 创建线程时“一个线程必须对应一个任务”的限制。在线程池中&#xff0c;同一个线程可以从 BlockingQueue 中不断提取新任务来执行&#xff0c;其核心原理在于线程池对 …

学生动漫网页设计模板下载你的名字 大学生HTML网页制作作品 简单漫画网页设计成品 dreamweaver学生网站模板

Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业&#xff0c;茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#xff1a;样式 在操作…

图像增强之灰度变换和直方图均衡化(附代码python+opencv)

一、图像增强的概念和分类 概念&#xff1a;图像增强是采用一系列技术去改善图像的视觉效果&#xff0c;或将图像转换成一种更适合于人或机器进行分析和处理的形式。例如采用一系列技术有选择地突出某些感兴趣的信息&#xff0c;同时抑制一些不需要的信息&#xff0c;提高图像的…

(JVM)双亲委派机制

Java 虚拟机对 class 文件采用的是按需加载的方式&#xff0c;也就是说当需要使用该类时才会将它的 class 文件加载到内存生成 class 对象。而且加载某个类的 class 文件时&#xff0c;Java 虚拟机采用的是双亲委派模式&#xff0c;即把请求交由父类处理&#xff0c;它是一种任…

文档基础模型引领文档智能走向多模态大一统

编者按&#xff1a;自2019年以来&#xff0c;微软亚洲研究院在文档智能领域进行了诸多探索&#xff0c;开发出一系列多模态任务的文档基础模型 (Document Foundation Model)&#xff0c;包括 LayoutLM (v1、v2、v3) 、LayoutXLM、MarkupLM 等。这些模型在诸如表单、收据、发票、…

MySQL中find_in_set函数的使用

1.语法 FIND_IN_SET(str,strlist) &#xff08;1&#xff09;str 要查询的字符串 &#xff08;2&#xff09;strlist 字段名&#xff1b; 参数以”,”分隔 如 (1,2,6,8) 查询字段(strlist)中包含(str)的结果&#xff0c;返回结果为null或记录 假如字符串str在由N个子链组成的…

5G无线技术基础自学系列 | 物理上行控制信道

素材来源&#xff1a;《5G无线网络优化实践》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 PUCCH用于传输上行控制信息&#xff08;U…

岭回归、Lasso回归和弹性网络

减少过拟合的一个好方法是对模型进行正则化&#xff08;即约束模型&#xff09;&#xff1a;它拥有的自由度越少&#xff0c;则过拟合数据的难度就越大。正则化多项式模型的一种简单方法是减少多项式的次数。 对于线性模型&#xff0c;正则化通常是通过约束模型的权重来实现的。…

记一次生产中使用CompletableFuture遇到的坑

为什么使用CompletableFuture 业务功能描述&#xff1a;有一个功能是需要调用基础平台接口组装我们需要的数据&#xff0c;在这个功能里面我们要调用多次基础平台的接口&#xff0c;我们的入参是一个id&#xff0c;但是这个id是一个集合。我们都是使用RPC调用&#xff0c;一般…

【22年11月12日更新】搭建宝塔面板、青龙面板“京东代挂”

本文章仅供学习 一、青龙面板是什么&#xff1f; 青龙面板可以运行某东脚本&#xff0c;你在某宝、某度等各个渠道搜索“京东代挂”&#xff0c;都是用青龙面板。 二、搭建宝塔面板 1.更新 yum 包 首先下载finalshell通过账号密码连接服务器&#xff0c;然后输入 yum up…

零基础程序员想要学好.Net,跟着这7个步骤学习就可以了

作为一个初学者程序员&#xff0c;很喜欢问的一个问题就是&#xff1a;零基础如何自学编程&#xff1f;在后台也有很多读者私信我&#xff0c;问我这个问题&#xff0c;其实这个问题比较大&#xff0c;不是一两句就可以说清楚的。 所以&#xff0c;今天结合我个人的经历&#x…

注意力机制详解(Attention详解)

注意力机制与人眼类似&#xff0c;例如我们在火车站看车次信息&#xff0c;我们只关注大屏的车次信息&#xff0c;而忽略大屏外其他内容&#xff0c;从而导致钱包被偷。。。 注意力机制只关注重点信息&#xff0c;忽略不重要的信息&#xff0c;关注最核心的内容。 主要就是这…

推荐系统实战2——EasyRec 推荐框架环境配置

推荐系统实战2——EasyRec 推荐框架环境配置学习前言先验条件EasyRec仓库地址EasyRec环境配置一、EasyRec的下载二、EasyRec的初始化三、EasyRec的安装四、一些额外的情况学习前言 EasyRec是阿里巴巴开源的推荐系统框架。生命苦短&#xff0c;从建好的推荐系统框架开始学&…