MDIO接口FPGA代码
MDIO 接口Verilog 代码
支持 clause 22 标准
其中start 标志至少需要保持两个mdc时钟,可以参考后面的仿真文件
module MDIO
(input rst,input clk,output reg mdc,inout mdio,input start , //开始传输标志 高电平有效,结束传输后拉低input [1:0] opcode ,input [4:0] phy_addr , //phy addressinput [4:0] reg_addr , //phy register addressinput [15:0] write_data , //write smi dataoutput reg [15:0] phy_reg , //read smi dataoutput reg transfer_end //write or read finished);reg mdio_oe,mdio_out;
wire mdio_in;assign mdio = mdio_oe ? mdio_out : 1'bz ;// MDIO数据输出或高阻, 0-READ,1-WRITE
assign mdio_in = mdio;//产生MDC 时钟
parameter NUM=49; //50M/100=500k
reg [5:0] cnt;
always @(posedge clk or negedge rst)
beginif(!rst)begincnt<=0;mdc<=0;endelse if (cnt==NUM)begincnt<=0;mdc<=mdc+1;endelsebegincnt<=cnt+1;end
end//数据流,上升沿有效
parameter preamble=8'b00000001;
parameter st= 8'b00000010;
parameter op= 8'b00000100;
parameter phyad= 8'b00001000;
parameter regad= 8'b00010000;
parameter ta= 8'b00100000;
parameter data= 8'b01000000;
parameter idle= 8'b10000000;//检测上升沿,产生开始传输脉冲
reg start_next;
wire start_edge;
always @(posedge mdc or negedge rst)
beginif(!rst)beginstart_next<=0;endelse start_next<=start;
endassign start_edge=!start_next & start;//状态转移
reg [7:0] state,state_next;always @(posedge mdc or negedge rst )
beginif(!rst)beginstate<=idle;end else if(start_edge)beginstate<=preamble;endelsestate<=state_next;
end//接口数据缓存
reg [1:0] st_code; //mdio start code
reg [1:0] ta_code ; //mdio write code
reg [1:0] op_code;
reg [4:0] regaddr;
reg [4:0] phyaddr;
reg [15:0] writedata;reg [7:0] counter;
always @(posedge mdc or negedge rst)
beginif(!rst)begin counter<=0;endelse if(counter==64)begincounter<=0;transfer_end<=1;endelse if(state!=idle)begintransfer_end<=0;counter<=counter+1;endendalways @(negedge mdc)
beginstate_next<=state;case(state)preamble: beginst_code<= 2'b01 ; ta_code<= 2'b10 ;op_code<=opcode;//缓存regaddr<=reg_addr;phyaddr<=phy_addr;writedata<=write_data;mdio_oe<=1;mdio_out<=1;if(counter==31)beginstate_next<=st;endendst:beginmdio_oe<=1;mdio_out<=st_code[1];st_code<=st_code<<1;if(counter==33)beginstate_next<=op;endendop:beginmdio_oe<=1;mdio_out<=op_code[1];op_code<=op_code<<1;if(counter==35)beginstate_next<=phyad;endendphyad:beginmdio_oe<=1;mdio_out<=phyaddr[4];phyaddr<=phyaddr<<1;if(counter==40)beginstate_next<=regad;endendregad:beginmdio_oe<=1;mdio_out<=regaddr[4];regaddr<=regaddr<<1;if(counter==45)beginstate_next<=ta;endendta:beginif(opcode==2'b10)beginmdio_oe<=0;if(counter==47)beginstate_next<=data;endendif(opcode==2'b01)beginmdio_oe<=1;mdio_out<=ta_code[1];ta_code<=ta_code<<1;if(counter==47)beginstate_next<=data;endendenddata:beginif(opcode==2'b10)//读取beginmdio_oe<=0;//读取放到外面;if(counter==63)beginstate_next<=idle;endendif(opcode==2'b01)//写入beginmdio_oe<=1;mdio_out<=writedata[15];writedata<=writedata<<1;if(counter==63)beginstate_next<=idle;endendendidle:beginmdio_oe<=0;if(counter==64)beginstate_next<=idle;endenddefault:beginstate_next<=idle;endendcase
end
//读取数据
always @(posedge mdc or negedge rst )
beginif(!rst)beginphy_reg<=0;endelse if(state_next==data )beginphy_reg<={phy_reg[14:0],mdio_in};endelse phy_reg<=phy_reg;
endendmodule
仿真文件
`timescale 1 ns / 1 psmodule tb;reg clk;
reg rst;wire mdc;
wire mdio;
reg start ; //开始传输标志 高电平有效,结束传输后拉低
reg [1:0] opcode ;
reg [4:0] phy_addr ; //phy address
reg [4:0] reg_addr ; //phy register address
reg [15:0] write_data ; //write smi datawire [15:0] phy_reg ; //read smi data
wire transfer_end ; //write or read finished initial
beginrst=0;start=0;phy_addr=5'b10101;reg_addr=5'b01010;opcode=2'b01; //10 读取 01 写入write_data=16'h5a5a;
// mdio_data=16'ha5a5;#10 rst=1;clk=1;#80 start=1; #150000 start=0;#4000 start=1; #150000 start=0; #4000 start=1; #150000 start=0; endalways #10 clk<=~clk;//读取逻辑验证
//reg [15:0] mdio_data;
//reg mdio_out;
//reg mdio_en;
//
//assign mdio=mdio_en ? mdio_out : 1'bz;
//reg [7:0] counter;
//always @(posedge mdc or negedge rst)
//begin
// if(!rst)
// begin
// counter<=0;
// end
// else if(start)
// if(counter==64)
// counter<=0;
// else
// counter <=counter+1;
// else
// counter<=0;
//
//end//always @(negedge mdc)
//begin
// case(counter)
// 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64:
// begin
// mdio_en<=1;
// mdio_out<=mdio_data[15];
// mdio_data<={mdio_data[14:0],1'b0};
// end
// endcase
//endMDIO MDIO_INST
(.rst(rst),.clk(clk),.mdc(mdc),.mdio(mdio),.start (start) , //开始传输标志 高电平有效,结束传输后拉低.opcode (opcode) ,.phy_addr (phy_addr) , //phy address.reg_addr (reg_addr) , //phy register address.write_data (write_data), //write smi data.phy_reg (phy_reg) , //read smi data.transfer_end (transfer_end) //write or read finished);endmodule
MDIO接口FPGA代码相关推荐
- 本博客Matlab、FPGA代码获取方法
本博客所有博文所对应的MATLAB代码.FPGA代码包括MATLAB.Quartusii.Vivado.Simulink.System Generator等工具. ------------------ ...
- PHY芯片88EE1111 MDIO接口调试
本次调试88EE1111 PHY芯片之主要目的主要对应为了将其默认的GMII接口通过配置成RGMII接口.因此,可能本文档涉及到的内容并没有涉及到PHY芯片的88EE1111所有内容. PHY芯片管理 ...
- FPGA代码设计规范一些探讨
代码设计规范的重要性 经过一段的工作积累已经慢慢进入了提高和进阶的阶段,在这篇博客里多聊一聊在现实工作中的话题,比如代码规范以及如何尽快接手前人代码,快速定位项目问题. 显然每个FPGA工程师的设计理 ...
- 线阵CCD FPGA CCD测量 直径测量 FPGA代码 CCD光学传感器 TCD1501
线阵CCD FPGA CCD测量 直径测量 FPGA代码 CCD光学传感器 TCD1501,自制USB接口线阵CCD驱动板及核心控制电路板四层单板,包括FPGA线阵CCD驱动程序&STM32单 ...
- java字典写实例,基于JAVA的新华字典接口调用代码实例
基于JAVA的新华字典接口调用代码实例 接口描述:基于JA V A的新华字典接口调用代码实例 接口平台:聚合数据 import java.io.BufferedReader; import java. ...
- java final类的写法_重拾JavaSE基础——抽象类、接口、代码块、final和枚举
今天继续回顾Java基础,有些东西用得不多,大家看看知道语法就好 主要内容 抽象类 抽象方法 抽象方法的写法 抽象方法是否可以私有化 抽象类的特征 抽象类有无构造器,能否实例化对象 抽象类的结构 抽象 ...
- MII/MDIO接口详解(转)
Original Address:http://dpinglee.blog.163.com/blog/static/144097753201041131115262/ 本文主要分析MII/RMII/S ...
- 机器学习接口和代码之 线性回归
线性回归sklearn 接口和代码 官网api:https://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squ ...
- python的坐标代码_基于Python的地图坐标服务接口调用代码实例
代码描述:基于Python的地图坐标服务接口调用代码实例 关联数据:地图坐标服务 接口地址:http://www.juhe.cn/docs/api/id/32 #!/usr/bin/python # ...
- vue项目:(全局变量设置与调用)API接口封装 - 代码篇
vue项目,如何将"API接口" 封装为"全局变量" ? 1. API全局配置文件[global.vue文件] <template><div& ...
最新文章
- OKR怎么使用比较好?
- Leetcode-探索 | 存在重复
- 明日之后服务器什么时候维护结束,明日之后什么时候合区 合区时间详解[多图]...
- Volatile可见性、缓存一致性协议、指令重排、内存屏障 - 手写笔记
- DataContractJsonSerializer类
- idea主题颜色Linux,IntelliJ IDEA更换主题样式分享
- cocos2d-x CCArray用法 遍历和删除元素
- littlevgl抗锯齿_littlevgl架构浅析
- 两个应用程序之间的通信
- 线性代数 前五章知识点梳理总结
- 大学英语四六级成绩查询
- 谷歌浏览器控制台preview乱码问题及原因
- 语言学及应用语言学类毕业论文文献有哪些?
- 修改el-input叉号的样式
- LANDESK8.8版本操作说明书之核心服务器管理
- Lect3 最优化Optimization
- 影像测量—摄影测量和RTK原理
- 脉冲神经网络原理及应用,脉冲神经网络结构特点
- android相机分辨率是多少,Android相机套装分辨率
- arm-linux-gcc反汇编(分析方法)