MDIO实现还是比较简单的,应用xilinx FPGA内的VIO核就可以直接读写查看,如果板子有串口,做个简单的处理就可以直接通过电脑读写。

时序如下图所示,将下面时序实现就可以实现读写,在实际应用时基本不需要配置,有特殊需求可以做一些应用,比如要监控网络是否掉线等

python mmap 寄存器 phy寄存器读写协议_串口


对外接口:

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拉到高阻,然后读引脚电平就可以。

实验结果:

python mmap 寄存器 phy寄存器读写协议_引脚_02


验证写的话,找到寄存器里面控制PHY复位那bit写一下就行,读的话可以读读连接状态,看看是不是1000BASE-T