MDIO实现还是比较简单的,应用xilinx FPGA内的VIO核就可以直接读写查看,如果板子有串口,做个简单的处理就可以直接通过电脑读写。
时序如下图所示,将下面时序实现就可以实现读写,在实际应用时基本不需要配置,有特殊需求可以做一些应用,比如要监控网络是否掉线等
对外接口:
input clk_i,
input rst_n,
output MDC_o,
input MDIO_i,
output reg MDIO_o,
input [ 4:0] Phy_addr, //00111
input [ 4:0] Reg_addr, //00000
input [15:0] Reg_data_i,
output reg [15:0] Reg_data_o,
input Op_sw, // 0 rd 1 wr
input Op_enable, // 1 enable
output reg Op_sw_r
op_sw 通过VIO提前输入读或写
op_enable 外部触发,也是通过VIO active-high button 但是这个电平会持续一段时间,最好是内部做判断上升沿处理,用串口读写拉高一个电平就可以。
op_sw_r 使用在TA状态后如果是读就控制inout接口为in状态,也就是拉成高阻,读引脚电平
其他的接口就是变量名的意思
状态机跳转:
always @(*) begin
case (cstate)
idle: nstate<= (Op_enable) ? leading : idle;
leading:nstate<= (State_turn)? WR_Addr : leading;
WR_Addr:nstate<= (State_turn)? TA_wait : WR_Addr;
TA_wait:nstate<= (Op_sw) ? WR_data : Rd_data;
WR_data:nstate<= (State_turn)? delay : WR_data;
Rd_data:nstate<= (State_turn)? delay : Rd_data;
delay: nstate<= (State_turn)? idle : delay;
default: nstate <= idle;
endcase
end
MDIO只需要照着时序撸就可以,只需区分一下读和写,写比较简单,一直按时序写就行,读只需在TA状态将mido拉到高阻,然后读引脚电平就可以。
实验结果:
验证写的话,找到寄存器里面控制PHY复位那bit写一下就行,读的话可以读读连接状态,看看是不是1000BASE-T