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代码相关推荐

  1. 本博客Matlab、FPGA代码获取方法

    本博客所有博文所对应的MATLAB代码.FPGA代码包括MATLAB.Quartusii.Vivado.Simulink.System Generator等工具. ------------------ ...

  2. PHY芯片88EE1111 MDIO接口调试

    本次调试88EE1111 PHY芯片之主要目的主要对应为了将其默认的GMII接口通过配置成RGMII接口.因此,可能本文档涉及到的内容并没有涉及到PHY芯片的88EE1111所有内容. PHY芯片管理 ...

  3. FPGA代码设计规范一些探讨

    代码设计规范的重要性 经过一段的工作积累已经慢慢进入了提高和进阶的阶段,在这篇博客里多聊一聊在现实工作中的话题,比如代码规范以及如何尽快接手前人代码,快速定位项目问题. 显然每个FPGA工程师的设计理 ...

  4. 线阵CCD FPGA CCD测量 直径测量 FPGA代码 CCD光学传感器 TCD1501

    线阵CCD FPGA CCD测量 直径测量 FPGA代码 CCD光学传感器 TCD1501,自制USB接口线阵CCD驱动板及核心控制电路板四层单板,包括FPGA线阵CCD驱动程序&STM32单 ...

  5. java字典写实例,基于JAVA的新华字典接口调用代码实例

    基于JAVA的新华字典接口调用代码实例 接口描述:基于JA V A的新华字典接口调用代码实例 接口平台:聚合数据 import java.io.BufferedReader; import java. ...

  6. java final类的写法_重拾JavaSE基础——抽象类、接口、代码块、final和枚举

    今天继续回顾Java基础,有些东西用得不多,大家看看知道语法就好 主要内容 抽象类 抽象方法 抽象方法的写法 抽象方法是否可以私有化 抽象类的特征 抽象类有无构造器,能否实例化对象 抽象类的结构 抽象 ...

  7. MII/MDIO接口详解(转)

    Original Address:http://dpinglee.blog.163.com/blog/static/144097753201041131115262/ 本文主要分析MII/RMII/S ...

  8. 机器学习接口和代码之 线性回归

    线性回归sklearn 接口和代码 官网api:https://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squ ...

  9. python的坐标代码_基于Python的地图坐标服务接口调用代码实例

    代码描述:基于Python的地图坐标服务接口调用代码实例 关联数据:地图坐标服务 接口地址:http://www.juhe.cn/docs/api/id/32 #!/usr/bin/python # ...

  10. vue项目:(全局变量设置与调用)API接口封装 - 代码篇

    vue项目,如何将"API接口" 封装为"全局变量" ? 1. API全局配置文件[global.vue文件] <template><div& ...

最新文章

  1. OKR怎么使用比较好?
  2. Leetcode-探索 | 存在重复
  3. 明日之后服务器什么时候维护结束,明日之后什么时候合区 合区时间详解[多图]...
  4. Volatile可见性、缓存一致性协议、指令重排、内存屏障 - 手写笔记
  5. DataContractJsonSerializer类
  6. idea主题颜色Linux,IntelliJ IDEA更换主题样式分享
  7. cocos2d-x CCArray用法 遍历和删除元素
  8. littlevgl抗锯齿_littlevgl架构浅析
  9. 两个应用程序之间的通信
  10. 线性代数 前五章知识点梳理总结
  11. 大学英语四六级成绩查询
  12. 谷歌浏览器控制台preview乱码问题及原因
  13. 语言学及应用语言学类毕业论文文献有哪些?
  14. 修改el-input叉号的样式
  15. LANDESK8.8版本操作说明书之核心服务器管理
  16. Lect3 最优化Optimization
  17. 影像测量—摄影测量和RTK原理
  18. 脉冲神经网络原理及应用,脉冲神经网络结构特点
  19. android相机分辨率是多少,Android相机套装分辨率
  20. arm-linux-gcc反汇编(分析方法)

热门文章

  1. Mathpix Snip他们都说好用!我也试一试尝试下载-安装-使用
  2. MacOS下好用的截图软件snip
  3. 认知差距决定我们的人生差距?!
  4. ACI注册国际项目考试地点汇总
  5. 软考网络工程师基础知识
  6. 在计算机网络中软件资源共享是指,在计算机网络中,软件资源共享指的是什么...
  7. 115网盘离线下载问题
  8. AAAI 2021论文:利用深度元学习对城市销量进行预测
  9. 工商银行计算机网银不能连接u盾,工商银行网银U盾无法识别怎么办
  10. 工行u盾显示316_工行银行网上交易老是提示插入u盾