SMI接口时序图如下:
在读数据的时候,主机端应该给高阻态,但是我把它过了一个触发器,就类似下面这样:
assign mdio_in = mdio;
assign mdio_o = mdio_reg;
always @(posedge clk)
mdio_reg <= 1'bz;
用示波器测得输出得电平变成低电平了,于是当读出来的数据为高电平的时候,就变成了半高的电平,如下图:
后来将代码修改成了这样,才恢复正常:
assign mdio_in = mdio;
assign mdio_o = en ? mdio_reg : 1'bz;
正常的波形如下:
其实以前都是按照第二种方法写inout数据的赋值的,这次也就是想换一种写法,没想到高阻态经过触发器后会变成低电平。
像这种出现半高状态的波形,看到的时候,就应该想到是一端拉高,一端拉低,才导致了电平只有一半。