FPGA运行不稳定
我先说说我自己怀疑的地方
1,1.2V bank2的供电不知道有没有什么特别需要注意的地方,因为MDIO是1.2V的电平。 我选的LVCMOS1.2。
2,测得地噪声比较大,任何时候只要FPGA端口有I2C信号或者MDIO信号,就会出现相应频率的噪声,幅度能达到50mV。
3,上电时序上来说1.2V因为经过电平转换芯片,所以Vint上电要慢一些。
4,程序(程序我做了很多尝试,没有什么进展)
希望大家多多给建议,女工程师已经在崩溃边缘了。
正在做个IIC2MDIO,看下有没有时序问题吧。接口,因为有的chip输入输出延迟是不一样的。还有板子。抓下波形,看看。
userclk是什么,同步还是异步啊,其实我也不懂mdio。为了点信元
我也在做这个,目前看来I2C的通信很好,3.3V。 MDIO会乱跳,就是读的话该读成0010的东西会突然读成0001. 有时候一大串100多个全能读对,有时候就到第四个就出错了。输入都是一样的。
就是系统时钟,晶振是100M的,同步。
不知道我理解的对不对,MDIO是以太网那个把,应该有MDIO,MCK,mck和mdio你都用系统时钟打两拍同步了吗,一般会把MCK同步个上升沿脉冲来
然后用那个上沿脉冲做使能信号读入MDIO的数据。也许我想错了,毕竟没做过MDIO。我按照同步的i2c做法来的,异步就直接拿MCK做时钟读入数据,最后对数据到系统去做同步处理
打两拍同步是指同步两次吗?我是这么得到上升沿下降沿的
reg sync_mdio;
reg sync_mdc;
reg sync_mdc_1;
//----------------------------------------------------
//sync MDIO and MDC
always @(posedge clk or posedge reset)
begin
if (reset)
begin
sync_mdio<=1'bZ;
sync_mdc<=1'bZ;
sync_mdc_1<=1'bZ;
end
else
begin
sync_mdio<=mdio;
sync_mdc<=mdc;
sync_mdc_1<=sync_mdc;
end
end
reg mdc_neg;
reg mdc_pos;
//----------------------------------------------------
//detect the falling edge of sync_mdc
always @(negedge clk or posedge reset)
begin
if(reset)
begin
mdc_pos<=1'b0;
mdc_neg<=1'b0;
end
else
begin
if(sync_mdc_1==0 && sync_mdc==1)
mdc_pos<=1'b1;
else if(sync_mdc_1==1 && sync_mdc==0)
mdc_neg<=1'b1;
else
begin
mdc_pos<=1'b0;
mdc_neg<=1'b0;
end
end
end
没用过Z,不过FPGA里应该没问题,OpenDrain的话
always @(posedge clk or posedge reset)
begin
if (reset)
begin
sync_mdio_1 <=1'bz;
sync_mdio<=1'bZ;
sync_mdc<=1'bZ;
sync_mdc_1<=1'bZ;
sync_mdc_2 <=1'bz;
end
else
begin
sync_mdio_1<=mdio;
sync_mdio <=sync_mdio_1;
sync_mdc<=mdc;
sync_mdc_1<=sync_mdc;
sync_mdc_2<=sync_mdc_1;
end
end
wire mdc_neg= ~sync_mdc_1 & sync_mdc_2;
wire mdc_pos= ~sync_mdc_2 & sync_mdc_1;
//----------------------------------------------------
如果还有问题就不是同步问题了
不知道MDIO速度是多少的,100m的采样时钟应该够了吧,同步就是功耗高,这个采样时钟降不下去,不过FPGA不关心功耗,异步有风险,如果有噪声到MCK上的话。同步的话50mV毫无压力。1.2V还是用同步稳妥
试了一下同步两次,还是不行,非常感谢你。我是全同步的。
哦,那就不是同步上的问题了,我不知道你的MCK下降沿做什么,采数据用上升沿就行了,就看哪个沿数据是稳定的,可以用示波器看下MCK和MDIO的时序。别的我也不知道哪里的问题,你只能结合你的代码上逻辑分析仪了,加些Debug逻辑来触发数据错的时候就采样。IObank选1.2v没错,IObank电压就是影响对输入电平01的判断电压不同。
看时序报告,然后用示波器看数据到接口的相位关系,不同板子不同现象有可能是 conner没有包住,数据出错有可能是因为接口有亚稳态,采集数据时候出现问题了,或者IO的电器特性有问题。
看你的问题还是有点像共地没共好,同步电路照理说不会出现对相同输入时好时不好的
现在的情况是FPGA作为从机响应主机时的反馈会有时出错,输出的数据有时候对有时候错。抓波形看能看到有时候输出是0100,有时候是0010。相同的输入
有几个地方不是很明白:
1. 你去上升沿和下降沿的方法不妥,为什么用posedge clk打一拍,然后用negedge clk再打,这样有点类似异步的样子,一般的纯同步设计不会这样做。
2. MDIO 1.2V,要搞清楚,主设备的IO电压也是1.2V吗?
3. sys clk是100M,那清楚MDC是多少频率吗?
4. MDIO这个管脚是双向管脚,在FPGA里面你如何处理这个双向管脚呢?
要搞清楚这几个问题,一般来说,噪声即使有,对于慢速的MDIO来说,问题也不大。基本上你的问题就是TA的时候多了或者少了一个周期,你代码里的所谓某个信号<='z的写法毫无意义。综合器不会搞出来一个高阻态的信号的。
有几个地方不是很明白:
1. 你去上升沿和下降沿的方法不妥,为什么用posedge clk打一拍,然后用negedge clk再打,这样有点类似异步的样子,一般的纯同步设计不会这样做。
2. MDIO 1.2V,要搞清楚,主设备的IO电压也是1.2V吗?
3. sys clk是100M,那清楚MDC是多少频率吗?
4. MDIO这个管脚是双向管脚,在FPGA里面你如何处理这个双向管脚呢?
要搞清楚这几个问题,一般来说,噪声即使有,对于慢速的MDIO来说,问题也不大。基本上你的问题就是TA的时候多了或者少了一个周期,你代码里的所谓某个信号<='z的写法毫无意义。综合器不会搞出来一个高阻态的信号的。
1,上升沿打一遍下降沿是因为这样mdcpos 和mdcneg在clk neg的时候是稳定的。2,主机时1.2V的。
3,mdc是2M或者4M的
4,你的意思是那个地方我应该直接写成1'b1 而不应该写成1’bZ是吗?
TA的周期应该没有问题,要不然也不能一会儿几百个数都能读到 高阻这个问题我确实没有什么经验,MDIO我选的inout 然后就是用的Z 如果这个方法不行的话,应该用什么方法呢,谢谢。
查下异步时序和跨时钟域吧,应该就是这里。
1,上升沿打一遍下降沿是因为这样mdcpos 和mdcneg在clk neg的时候是稳定的。2,主机时1.2V的。
3,mdc是2M或者4M的
4,你的意思是那个地方我应该直接写成1'b1 而不应该写成1’bZ是吗?
关于你的问题,
1. 如果需要采样MDC的上升沿和下降沿,不必要使用posedge clk和negedge clk。纯粹用posedge clk也可以。我不确定FPGA 的tools是否能正确分析posedge 和negedge同时使用情况下的timing问题。
2. MDC时钟看起来不快,应该不是MDC过快引起的。
3. 对于MDIO SLAVE controller模块来说,正确的MDIO pin不是inout的,应该是
input mdio_in;
output mdio_out;
output mdio_out_en;
controller只控制这3个pin,通过他们在外面接上一个inout的PAD,out_en直接控制pad的输入和输出。这样做比较谨慎,FPGA设计代码还是不要太灵活,有时候遵循老规则还是比较好一些,鬼知道现在的工具宣称的一些功能是不是真的fullly support。
另外从你抓到的错误的波形来看,我还是怀疑TA有问题。可能是PAD的控制问题。
大神,我问个问题,什么是pad啊。我是菜鸟来的。另外我顶层是schematic的。
我下午做了个实验,另外拉出来一个mdio_output,不存在1’bZ高阻,也不存在inout,但是一样出现有时候提前的问题,所以似乎三态问题不是这里的主要问题。
帮顶,不会弄
顶层为什么不用verilog,用schematic。 没用过schematic,不知道能不能画PAD出来。我说的pad是指IOBUF,这种东西是XILINX FPGA的PAD。
还没搞定啊。其实对你的错误情况不是很了解。所以我只能说,出错没有任何规律就是公地没共好。出错有一定规律和随机性,那最大可能是你用系统时钟,MDC为使能(这里我不知道你怎么使能的),采样MDIO时候的时序问题。出错很有规律就是你内部逻辑错了。MDC时钟我看了下不是个周期时钟,所以我一开始就不怎么明白你为什么弄处MDC——POS,和MDC——NEG两个,采数据一个POS就够了。
最好分析下你采样MDIO的时候的时序,自己画个图分析下,上面应该有同步之后的MDIO,MDC_pos,MDC_neg,sys_clk,这几个信号的时序关系,MDC_neg是会变的.我做的话采样MDIO我只用MDC——pos就够了。
MDC:管理接口的时钟,它是一个非周期信号,信号的最小周期(实际是正电平时间和负电平时间之和)为400ns,最小正电平时间和负电平时间为160ns,最大的正负电平时间无限制。它与TX_CLK和RX_CLK无任何关系。看你还没搞定去看了下MDIO到底是个什么东西。
真是好人啊!我今天又做了个实验发现了神奇的现象,如果我把MDIO信号换成3.3V,把我然后连接到3.3V的bank上,软件都还一样不变,就是换一下接口,就稳定了。请问这到底是什么原因啊?
3.3V抗干扰厉害,VIL和VIH相对值大,但是我想不通的是如果采样在MDIO的眼图中部,1.2和3.3应该是一样的,所以还是有点怀疑你的采样时序,采样点可能不是在中间位置,也许我想错了,仅供参考,毕竟我也只是个个初学者。你可以在1.2V用示波器抓下MDIO的波形,然后跟FPGA1.2VIOBANK的VIL,VIH的阈值比较一下。
