以太网通信--读取物理层PHY芯片的状态

PHY芯片通过MDIO接口进行读写,框图如下所示:

原理很简单,就是按照时序将PHY芯片的指定寄存器信息读出或者写入。

MDC时钟需要输出到PHY芯片,一般不低于80MHz。

MDIO是双向接口,FPGA读出状态信息时为输入,FPGA写入控制信息时为输出。

基本时序如下:(来源正点原子)

编码:(使用状态机实现对PHY芯片0x11地址的特殊寄存器的状态读操作)

module mdio_interface (input wire        clk,         // FPGA涓绘椂閽?input wire        reset_n,     // 澶嶄綅淇″彿锛屼綆鏈夋晥output reg        mdc,         // MDC鏃堕挓	涓嶈秴杩?12.5MHz 80nsinout              mdio         // MDIO鍙屽悜鏁版嵁绾?
);reg [2:0] clk_div;
always @ (posedge clk or negedge reset_n) beginif (!reset_n) beginclk_div <= 3'd0;end else if (clk_div == 3'd3) beginclk_div <= 3'd0;end else beginclk_div <= clk_div + 1;end
endalways @ (posedge clk or negedge reset_n) beginif (!reset_n) beginmdc <= 0;end else if (clk_div == 3'd2) begin		//120ns鍛ㄦ湡mdc <= ~mdc;end else beginmdc <= mdc;end
endreg mdio_dir;	//0璇?1鍐?
reg mdio_out;	//
assign mdio = mdio_dir ? mdio_out : 1'bz;parameter IDLE = 8'b00000001;
parameter PREAMBLE = 8'b00000010;	//鍙戦??32浣?1 鍓嶅鐮?
parameter START = 8'b00000100;
parameter OPCODE = 8'b00001000;
parameter PHYADDR = 8'b00010000;
parameter REGADDR = 8'b00100000;
parameter TURNDIR = 8'b01000000;
parameter READ = 8'b10000000;reg [7:0] state,next_state;
reg [7:0] cnt;
always @ (posedge mdc or negedge reset_n) beginif (!reset_n) beginstate <= IDLE;end else beginstate <= next_state;end
endinitial beginnext_state = IDLE;
endalways @ (*) begincase (state)IDLE:		next_state = PREAMBLE;PREAMBLE:	if (cnt == 8'd32) beginnext_state = START;end else beginnext_state = PREAMBLE;endSTART:		if (cnt == 8'd34) beginnext_state = OPCODE;end else beginnext_state = START;endOPCODE:		if (cnt == 8'd36) beginnext_state = PHYADDR;end else beginnext_state = OPCODE;endPHYADDR:	if (cnt == 8'd41) beginnext_state = REGADDR;end else beginnext_state = PHYADDR;endREGADDR:	if (cnt == 8'd46) beginnext_state = TURNDIR;end else beginnext_state = REGADDR;endTURNDIR:	if (cnt == 8'd48) beginnext_state = READ;end else beginnext_state = TURNDIR;endREAD:		if (cnt == 8'd65) beginnext_state = IDLE;end else beginnext_state = READ;endendcase
endreg [15:0] data_out; 
always @ (posedge mdc or negedge reset_n) beginif (!reset_n) begincnt <= 8'd0;mdio_dir <= 1'd0;mdio_out <= 1'd0;data_out <= 16'd0;end else begincase(state)IDLE:		begincnt <= 8'd0;mdio_dir <= 1'd0;mdio_out <= 1'd0;data_out <= 16'd0;end PREAMBLE:	begincnt <= cnt + 1;mdio_dir <= 1'd1;	//鍙戦?佸墠瀵肩爜锛屽啓32浣?1mdio_out <= 1'd1;endSTART:		begincnt <= cnt + 1; mdio_out <= (cnt == 8'd33 ? 0 : 1);		//鍥哄畾01endOPCODE:		begincnt <= cnt + 1;mdio_out <= (cnt == 8'd35 ? 1 : 0);		//璇?10 鍐?01endPHYADDR:	begincnt <= cnt + 1;case (cnt) 8'd37:	mdio_out <= 0;8'd38:	mdio_out <= 0;8'd39:	mdio_out <= 1;8'd40:	mdio_out <= 0;8'd41:	mdio_out <= 0;endcaseendREGADDR:	begincnt <= cnt + 1;case (cnt) 8'd42:	mdio_out <= 1;	//10001瀵勫瓨鍣?8'd43:	mdio_out <= 0;8'd44:	mdio_out <= 0;8'd45:	mdio_out <= 0;8'd46:	mdio_out <= 1;endcaseendTURNDIR:	begin		//璇籞0 鍐?10cnt <= cnt + 1;mdio_out <= (cnt == 8'd47 ? 1'bz : 0);endREAD:		beginmdio_dir <= 1'd0;cnt <= cnt + 1;data_out <= {data_out[14:0],mdio};endendcaseend
endila_1 ila1 (.clk(clk), // input wire clk.probe0(state), // input wire [7:0]  probe0  .probe1(cnt), // input wire [7:0]  probe1 .probe2(next_state), // input wire [7:0]  probe2.probe3(data_out),.probe4(mdio), // input wire [0:0]  probe4 .probe5(mdio_out) // input wire [0:0]  probe5
);endmodule

仿真截图:

可以看出,前32位前导码均为1,在cnt==33时,下两个时钟周期为01即start信号,在cnt==35时,下两个周期即OPCODE信号为10,即读操作,PHY物理地址为00100,这和芯片设计有关,寄存器地址是10001,选取的是特殊寄存器地址,读出的数据是0xbc40。

该寄存器的高四位为1011,高两位对应10即1000Mbps,验证:

链路速率确实为1Gbps,包括

链路实时状态位为1,连接状态。没问题。

代码只实现了读操作,写操作是一样的,有待读者自己完善。

接下来要实现ARP、UDP等通信协议。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Doris Tablet 损坏如何应对?能恢复数据吗?

开门见山&#xff0c;能不能修&#xff1f; Doris 的 Tablet 损坏了&#xff0c;到底能不能修呢&#xff1f;数据会不会丢&#xff1f; 这玩意还真不好说&#xff1f; 哎&#xff0c;怎么又不好说了呢&#xff1f; 这个主要是因为下面的原因&#xff1a; Doris 数据的高可…

【Linux】查询磁盘空间被谁占用了

查询磁盘空间被谁占用了 先说下常见的几种原因&#xff1a; 1、删除的文件未释放空间 2、日志或过期文件未及时清理 3、inode导致 4、隐藏文件夹或者目录 6、磁盘碎片 最后一种单独介绍。 环境&#xff1a;情况是根分区&#xff08;/&#xff09;的总容量为44GB&#xf…

Scala课堂小结

(一)数组&#xff1a; 1.不可变数组 2创建数组

GitPuk安装配置指南

GitPuk是一款开源免费的代码管理工具&#xff0c;上篇文章已经介绍了Gitpuk的功能与优势&#xff0c;这篇文章将为大家讲解如何快速安装和配置GitPuk&#xff0c;助力你快速的启动GitPuk管理代码 1. 安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Windows安装 下载…

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin ​ 根据前面内容&#xff0c;所有的子任务已经基本结束&#xff0c;接下来就是调用转化的bin模型进行最后的逻辑控制了 1 .YOLO的bin使用 ​ 对于yolo其实有个简单的办法&#xff0c;也…

Golang的容器化技术实践总结

Golang的容器化技术实践总结 一、容器化技术概述 什么是容器化技术 容器化技术是一种轻量级、可移植的虚拟化解决方案&#xff0c;它将应用程序、运行环境和依赖项打包到一个被称为容器的独立单元中。容器可以在不同的操作系统中运行&#xff0c;具有更高的资源利用率和更快的部…

修改el-select下拉框高度;更新:支持动态修改

文章目录 效果动态修改&#xff1a;效果代码固定高度版本动态修改高度版本&#xff08;2024-12-25 更新&#xff1a; 支持动态修改下拉框高度&#xff09; 效果 动态修改&#xff1a;效果 代码 固定高度版本 注意点&#xff1a; popper-class 尽量独一无二&#xff0c;防止影…

运动控制卡网络通讯的心跳检测之C#上位机编程

本文导读 今天&#xff0c;正运动小助手给大家分享一下如何使用C#上位机编程实现运动控制卡网络通讯的心跳检测功能。 01 ECI2618B硬件介绍 ECI2618B经济型多轴运动控制卡是一款脉冲型、模块化的网络型运动控制卡。控制卡本身最多支持6轴&#xff0c;可扩展至12轴的运动控制…

自动控制系统综合与LabVIEW实现

自动控制系统综合是为了优化系统性能&#xff0c;确保其可靠性、稳定性和灵活性。常用方法包括动态性能优化、稳态误差分析、鲁棒性设计等。结合LabVIEW&#xff0c;可以通过图形化编程、高效数据采集与处理来实现系统综合。本文将阐述具体方法&#xff0c;并结合硬件选型提供实…

lxml提取某个外层标签里的所有文本

html如下 <div data-v-1cf6f280"" class"analysis-content">选项D错误&#xff1a;<strong>在衡量通货膨胀时&#xff0c;</strong><strong>消费者物价指数使用得最多、最普遍</strong>。 </div> 解析html文本 fro…

学习因子异步化的粒子群优化算法(AsyLnCPSO)——源码

目录 1. 学习因子异步化的概念 2. 算法步骤 2.1 初始化 2.2 迭代过程 3.优势 4. 与传统粒子群算法的区别 5.代码下载&#xff1a; 学习因子异步化的粒子群优化算法&#xff08;AsyLnCPSO&#xff09;是一种改进的粒子群优化&#xff08;PSO&#xff09;算法&#xff0c;…

直流有刷电机多环控制(PID闭环死区和积分分离)

直流有刷电机多环控制 提高部分-第8讲 直流有刷电机多环控制实现(1)_哔哩哔哩_bilibili PID模型 外环的输出作为内环的输入,外环是最主要控制的效果,主要控制电机的位置。改变位置可以改变速度,改变速度是受电流控制。 实验环境 【 !】功能简介: 按下KEY1使能电机,按下…

Verdi -- 打开Consol,创建和执行tcl命令举例

1.Verdi打开Console的步骤&#xff1a; For ref: 2创建tcl脚本. tcl脚本路径&#xff1a; 在Makefile下&#xff0c;与.v文件在同一个目录8_demo这个文件夹下。 font.tcl代码内容&#xff1a; verdiSetFont -monoFont "Courier" -monoFontSize "24" 作用…

GamePlay UE网络同步

基本同步方式: ①未复制:函数仅在本机运行,不对任何人造成影响 ②在服务器上运行:当函数在客户端上调用时才能生效。客户端会通知服务器:“请在服务器上执行这个事件”,事件的具体内容会被在服务器上执行。 ③组播(多播,Multicast):当函数在服务器上调用时才能生效…

RabbitMQ中的Topic模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;支持多种消息传递模式&#xff0c;其中 Topic 模式 是一种灵活且强大的模式&#xff0c;允许生产者…

Scala_【1】概述

第一章 语言特点环境搭建(Windows)idea编写scalaHelloWorld注意事项 Scala是一门以Java虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言 语言特点 Scala是一门多范式的编程语言&#xff0c;Scala支持面向对象和函…

【时间之外】IT人求职和创业应知【74】-运维机器人

目录 OpenAI最强推理模型o3发布&#xff0c;AGI测试能力暴涨 英伟达宣布收购以色列AI初创企业Runai 汤姆猫首款AI机器人产品明日发售 心勿贪&#xff0c;贵知足。 感谢所有打开这个页面的朋友。人生不如意&#xff0c;开越野车去撒野&#xff0c;会害了自己&#xff0c;不如…

移动端网页兼容适配方案小结

文章目录 前言一、使用viewport配置&#xff0c;确保完美视口二、使用rem实现弹性布局三、CSS媒体查询处理不同尺寸四、1px边框问题解决方案五、安全区域适配六、图片适配方案七、横屏适配处理八、软键盘弹出处理总结 前言 移动端适配一直是前端开发中的重点难题&#xff0c;分…

教培行业数字化未来:一站​式开发在线教育系统源码与网校APP详解

时下&#xff0c;如何有效地搭建一个全面、稳定、易于管理的在线教育系统&#xff0c;已成为越来越多教育机构关注的焦点。本篇文章&#xff0c;小编将深入探讨如何一站式开发在线教育系统源码与网校APP&#xff0c;为教培行业的数字化未来提供技术支持。 一、开发在线教育系统…