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数据中高四位=低四位的。所以我们将读出来的数据只保留四位即可。下图为千兆模式下的采样
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;
elseout_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;
elsecount_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;elsedata0_en <= 1'd0;
elsedata0_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;elsedata1_en <= 1'd0;
elsedata1_en <= data1_en;endmodule
第二步:千兆-百兆接收数据转换模块
发送方面就不能偷懒了,只能自己写了一个百兆模式下的发送,代码如下
`timescale 1ns / 1psmodule 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;
elsergmii_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];
elsergmii_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;
elseen_delay <= 1'd0;endmodule
第三步:百兆千兆切换逻辑
百兆和千兆模式下切换本质上就是切换RGMII的接口信号源,具体的逻辑较为简单如图所示
其中SPEED为选择开关,该值可以是定义的参数,也可以当作接口有外部提供。
最后
该IP核是笔者在项目中解决自己的问题所编写,水平有限如有疏漏敬请指正。
FPGA实现千兆/百兆自适应以太网UDP传输相关推荐
- 8端口千兆百兆车载以太网交换机
8端口千兆百兆车载以太网交换机 重庆汇迪能电子设备有限公司 www.hdn-vdo-com SW1100交换机, 为8端口千兆和百兆混合车载以太网交换机,其中包含2个通道的1000BASE-T1接口, ...
- 简谈基于FPGA的千兆以太网设计
简谈基于FPGA的千兆以太网设计 今天给大侠带来简谈基于FPGA的千兆以太网设计,话不多说,上货. 今天我们来简单的聊一聊以太网,以太网在FPGA学习中属于比较高级的内容了,有些大侠肯定会感觉以太网学 ...
- 基于FPGA的千兆以太网设计
今天给大侠带来基于FPGA的千兆以太网设计,话不多说,上货. 一.设计概述 由于设计比较复杂,本篇带来设计流程以及设计思路,仅供各位大侠参考. 本篇通过管理数据输入输出MDIO配置PHY寄存器,使其工 ...
- 4光12电千兆网管型工业以太网交换机 16口二层导轨式可管理工业以太网交换机
HY5700-75412G-X千兆网管型工业以太网交换机专为严苛关键应用环境设计,如工厂自动化.智能交通及过程控制等领域.4个千兆光纤端口有大的灵活性,可轻松建立千兆冗余环及进行千兆上传.HY5700 ...
- 飞畅科技-千兆/百兆/核心/PoE/光纤交换机选型指南
交换机是监控网络传输的核心设备.交换机的选型,有很多的重要技术参数需要考虑,硬件上包括百兆/千兆/万兆速率的端口.电口/光口/PoE口.端口数量.MAC地址表深度.转发延迟.缓存大小.VLAN.隔离等 ...
- 交换机千兆和百兆对网速影响_交换机千兆和百兆对网速影响_千兆/百兆/核心/PoE/光纤交换机选型指南...
交换机是监控网络传输的核心设备.交换机的选型,有很多的重要技术参数需要考虑,硬件上包括百兆/千兆/万兆速率的端口.电口/光口/PoE口.端口数量.MAC地址表深度.转发延迟.缓存大小.VLAN.隔离等 ...
- FPGA驱动千兆以太网PHY但电脑只显示百兆
前两天公司做了个新板子,ZYNQ7035 + RTL8211E,拿给我测,于是写逻辑代码测试一下数据回环,没想到电脑端网络适配器一直显示是百兆网.查了多方原因,差点想手动配置寄存器了,但是想想又觉得不 ...
- 【转】简谈基于FPGA的千兆以太网
原文地址: http://blog.chinaaet.com/luhui/p/5100052903 大家好,又到了学习时间了,学习使人快乐.今天我们来简单的聊一聊以太网,以太网在FPGA学习中属于比较 ...
- 简谈基于FPGA的千兆以太网
当今,随着互联网技术的迅速发展,采用以太网实现数据采集和控制方面的应用,成为了电子系统设计的热点.以太网具有价格低廉.稳定可靠.传输速度快.传输距离远等特点,以太网技术发展成熟,具有很高的性价比.采用 ...
最新文章
- c#自动登录网页,浏览页面
- 计算机二级第十九套题电子表格,2012年计算机二级Access第十九套上机试题及答案详解...
- 阿里云MVP北京闭门会圆满落幕 多把“利剑”助力开发者破阵蜕变
- Jquery常用操作:checkbox、select取值,radio、checkbox、select选中及其相关
- [Web 前端] inline-block元素设置overflow:hidden属性导致相邻行内元素向下偏移
- 25个国外优秀电子商务网站设计案例
- html正则表达式search,正则表达式解析关键字和标签的搜索字段([])
- 我所理解的离散傅里叶变换_DFT
- (自己测试没有问题)解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing
- linux 音频文件播放文件管理,linux dsp 播放音频文件
- JavaOne 2016后续活动
- php程序设计案例教程 程序题,PHP程序设计案例教程
- opencv4 图像特征匹配_概述 | 全景图像拼接技术全解析
- 容器编排技术 -- Kubernetes 在 Namespace 中配置默认的CPU请求与限额
- 内卷化的信贷行业,如何做好信贷风控规则的挖掘
- 希望博客园可以开个邮件列表
- python pdf转word
- 关于英文系统中的中文乱码的更改
- 2019: 属于BERT预训练语言模型之年
- mysql5.7.22的配置说明_mysql 5.7.22 免安裝版Windows配置