以太网通信--读取物理层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 80ns
    inout              mdio         // MDIO鍙屽悜鏁版嵁绾?
);

reg [2:0] clk_div;
always @ (posedge clk or negedge reset_n) begin
	if (!reset_n) begin
		clk_div <= 3'd0;
	end else if (clk_div == 3'd3) begin
		clk_div <= 3'd0;
	end else begin
		clk_div <= clk_div + 1;
	end
end

always @ (posedge clk or negedge reset_n) begin
	if (!reset_n) begin
		mdc <= 0;
	end else if (clk_div == 3'd2) begin		//120ns鍛ㄦ湡
		mdc <= ~mdc;
	end else begin
		mdc <= mdc;
	end
end

reg 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) begin
	if (!reset_n) begin
		state <= IDLE;
	end else begin
		state <= next_state;
	end
end

initial begin
    next_state = IDLE;
end

always @ (*) begin
	case (state)
		IDLE:		
                    next_state = PREAMBLE;
		PREAMBLE:	if (cnt == 8'd32) begin
						next_state = START;
					end else begin
						next_state = PREAMBLE;
					end
		START:		if (cnt == 8'd34) begin
						next_state = OPCODE;
					end else begin
						next_state = START;
					end
		OPCODE:		if (cnt == 8'd36) begin
						next_state = PHYADDR;
					end else begin
						next_state = OPCODE;
					end
		PHYADDR:	if (cnt == 8'd41) begin
						next_state = REGADDR;
					end else begin
						next_state = PHYADDR;
					end
		REGADDR:	if (cnt == 8'd46) begin
						next_state = TURNDIR;
					end else begin
						next_state = REGADDR;
					end
		TURNDIR:	if (cnt == 8'd48) begin
						next_state = READ;
					end else begin
						next_state = TURNDIR;
					end
		READ:		if (cnt == 8'd65) begin
						next_state = IDLE;
					end else begin
						next_state = READ;
					end
	endcase
end

reg [15:0] data_out; 
always @ (posedge mdc or negedge reset_n) begin
	if (!reset_n) begin
		cnt <= 8'd0;
		mdio_dir <= 1'd0;
		mdio_out <= 1'd0;
		data_out <= 16'd0;
	end else begin
		case(state)
			IDLE:		begin
							cnt <= 8'd0;
							mdio_dir <= 1'd0;
							mdio_out <= 1'd0;
							data_out <= 16'd0;
						end 
			PREAMBLE:	begin
							cnt <= cnt + 1;
							mdio_dir <= 1'd1;	//鍙戦?佸墠瀵肩爜锛屽啓32浣?1
							mdio_out <= 1'd1;
						end
			START:		begin
							cnt <= cnt + 1; 
							mdio_out <= (cnt == 8'd33 ? 0 : 1);		//鍥哄畾01
						end
			OPCODE:		begin
							cnt <= cnt + 1;
							mdio_out <= (cnt == 8'd35 ? 1 : 0);		//璇?10 鍐?01
						end
			PHYADDR:	begin
							cnt <= 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;
							endcase
						end
			REGADDR:	begin
							cnt <= 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;
							endcase
						end
			TURNDIR:	begin		//璇籞0 鍐?10
							cnt <= cnt + 1;
							mdio_out <= (cnt == 8'd47 ? 1'bz : 0);
						end
			READ:		begin
							mdio_dir <= 1'd0;
							cnt <= cnt + 1;
							data_out <= {data_out[14:0],mdio};
						end
		endcase
	end
end

ila_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等通信协议。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker服务发现新纪元:探索Consul的无限魅力

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 •座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元个人主页&#xff1a;团儿.-CSDN博客 目录 前言&…

OpenHarmony-6.IPC/RPC组件

IPC/RPC组件机制 1.基本概念 IPC&#xff1a;设备内的进程间通信&#xff08;Inter-Process Communication&#xff09;。 RPC&#xff1a;设备间的进程间通信&#xff08;Remote Procedure Call&#xff09;。 IPC/RPC用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱…

0.机顶盒晶晨s905l3b芯片--刷入第三方系统+安卓9 root教程+armbian写入EMMC教程

机顶盒s905l3b芯片刷第三方系统安卓9 root教程刷armbian写入EMMC教程 声明&#xff1a; 由于固件、软件、镜像等持续更新&#xff0c;本文仅代表当前所使用版本的流畅安装记录。行文略长&#xff0c;关键代码处会配以截图展示&#xff0c;请自行对比是否存在差异导致安装失败…

视频监控平台:Liveweb视频汇聚融合平台智慧安防视频监控应用方案

Liveweb是一款功能强大、灵活部署的安防视频监控平台&#xff0c;支持多种主流标准协议&#xff0c;包括GB28181、RTSP/Onvif、RTMP等&#xff0c;同时兼容海康Ehome、海大宇等厂家的私有协议和SDK接入。该平台不仅提供传统安防监控功能&#xff0c;还支持接入AI智能分析&#…

汇编语言学习

想要理解栈溢出的最基本原理&#xff0c;汇编和栈是必不可少的&#xff0c;不然想我之前学了也是白学&#xff0c;原理都不知道 一、准备 1.安装gcc sudo apt-get build-dep gcc 这里显示版本不对&#xff0c;我用的是国内镜像源&#xff0c;需要换一下配置 sudo nano /e…

“乡村探索者”:村旅游网站的移动应用开发

3.1 可行性分析 从三个不同的角度来分析&#xff0c;确保开发成功的前提是有可行性分析&#xff0c;只有进行提前分析&#xff0c;符合程序开发流程才不至于开发过程的中断。 3.1.1 技术可行性 在技术实现层次&#xff0c;分析了好几种技术实现方法&#xff0c;并且都有对应的成…

Python + 深度学习从 0 到 1(02 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ Keras 快速入门&#xff1a; 神经网络的基本数据结…

MySQL用户授权

什么是数据库 数据库概述&#xff1a;数据库是按照一定的数据结构将数据存储在存储器的集合常见数据库软件 软件名开源跨平台厂 商Oracle否是甲骨文MySQL是是甲骨文SQL Server否否微软DB2否是IBMMongoDB是是MongoDB Inc.Redis是是开源软件Memcached是是开源软件 DB (DataBas…

2025年我国网络安全发展形势展望

展望2025年&#xff0c;我国网络安全产业有望迎来新的快速增长阶段&#xff0c;零信任安全架构将在各行各业加快应用落地&#xff0c;数据安全技术攻关和应用进程加快&#xff0c;关键基础设施安全能力不断提升。同时&#xff0c;也应关注国家级网络对抗风险加剧、网络安全产业…

GitPuk安装配置指南

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

ArcGIS+MIKE21 洪水淹没分析、溃坝分析,洪水淹没动态效果

洪水淹没分析过程&#xff1a; 一、所需数据&#xff1a; 1.分析区域DEM数据 二、ArcGIS软件 1.提取分析区域DEM&#xff08;水库坝下区域&#xff09; 2.DEM栅格转点 3.计算转换后几何点的x和y坐标值&#xff08;精度20、小数位3&#xff09; 4.导出属性表&#xff0c;形式…

中伟视界:AI识别摄像头+AI预警平台在矿山皮带空载监测中的应用

在矿山开采和矿物处理过程中&#xff0c;皮带运输机扮演着举足轻重的角色。它们负责将矿石、煤炭等物料从一处运送到另一处&#xff0c;是矿山生产流程中不可或缺的一环。然而&#xff0c;皮带运输机在运行过程中也面临着一些挑战&#xff0c;其中之一便是皮带空载问题。皮带空…

探索多模态大语言模型(MLLMs)的推理能力

探索多模态大语言模型&#xff08;MLLMs&#xff09;的推理能力 Multimodal Large Language Models (MLLMs) flyfish 原文&#xff1a;Exploring the Reasoning Abilities of Multimodal Large Language Models (MLLMs): A Comprehensive Survey on Emerging Trends in Mult…

AIGC时代:如何快速搞定Spring Boot+Vue全栈开发

文章目录 一、Spring Boot基础二、Vue.js基础三、Spring Boot与Vue.js集成四、性能优化与最佳实践《快速搞定Spring BootVue全栈开发》内容简介作者简介目录前言/序言本书内容本书特点读者对象 随着人工智能生成内容&#xff08;AIGC&#xff09;技术的迅速发展&#xff0c;内容…

mongodb和Cassandra

mongodb的一致性问题&#xff1a; 15.MongoDB的一致性(读关注与写关注)_mongo w选项-CSDN博客 孤儿节点问题&#xff1a; 技术干货 | MongoDB 偶遇孤儿文档及处理方法-腾讯云开发者社区-腾讯云 分片集群MongoDB迁移前清除孤儿文档 由数据迁移至MongoDB导致的数据不一致问题…

nginx-rtmp服务器搭建

音视频服务器搭建 本文采用 nginx/1.18.0和nginx-rtmp-module模块源代码搭建RTMP流媒体服务器 流程 查看当前服务器的nginx版本下载nginx和nginx-rtmp-module源代码重新编译nginx&#xff0c;并进行相关配置&#xff08;nginx.conf、防火墙等&#xff09;客户端测试连接测试搭…

初始 ShellJS:一个 Node.js 命令行工具集合

一. 前言 Node.js 丰富的生态能赋予我们更强的能力&#xff0c;对于前端工程师来说&#xff0c;使用 Node.js 来编写复杂的 npm script 具有明显的 2 个优势&#xff1a;首先&#xff0c;编写简单的工具脚本对前端工程师来说额外的学习成本很低甚至可以忽略不计&#xff0c;其…

(echarts)数据地图散点类型根据条件设置不同的标记图片

(echarts)数据地图散点类型根据条件设置不同的标记图片 1.用在线工具将本地图片转化base64格式 data(){return { base64Img:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQ...",} }在线转换地址&#xff1a;https://www.jyshare.com/front-end/59/ 2.symbol属…

Linux高级--2.4.5 靠协议头保证传输的 MAC/IP/TCP/UDP---协议帧格式

任何网络协议&#xff0c;都必须要用包头里面设置写特殊字段来标识自己&#xff0c;传输越复杂&#xff0c;越稳定&#xff0c;越高性能的协议&#xff0c;包头越复杂。我们理解这些包头中每个字段的作用要站在它们解决什么问题的角度来理解。因为没人愿意让包头那么复杂。 本…

网络下载ts流媒体

网络下载ts流媒体 查看下载排序合并 很多视频网站&#xff0c;尤其是微信小程序中的长视频无法获取到准确视频地址&#xff0c;只能抓取到.ts片段地址&#xff0c;下载后发现基本都是5~8秒时长。 例如&#xff1a; 我们需要将以上地址片段全部下载后排序后再合成新的长视频。 …