下图是一个芯片的同步接口时序图,这里给出的是向芯片寄存器写入数据的时序图。 riple
简单介绍一下接口时序。该接口的同步时钟是BCLK,由FPGA提供,最高50MHz。除去SRDYN信号是该芯片驱动以外,所有信号都由FPGA驱动。除去ADSN信号外,所有信号都和BCLK有一定的建立、保持时间关系。 riple
FPGA和芯片的握手关系如下: riple
二、时序问题的表现 riple
我在设计该接口时,采用了FPGA片内的PLL。由PLL输出两路同频同相的50MHz时钟,一路驱动片内同步逻辑,一路驱动时钟输出引脚BCLK。之所以采用PLL,是为了在需要的时候可以调整两路时钟的相位关系,补偿时钟信号和总线信号到达的时间差。 riple
这里我有一个假设,即在理想情况下,两路时钟在片内和片外都没有相位差,这样一来,用FPGA片内寄存器的Tco就可以保证总线信号的保持时间,而建立时间会很宽裕。现在看来,这一假设是很冒险的:这一假设只有在FPGA片内才能成立,布局布线工具可以保证满足FPGA内部寄存器的建立保持时间;在片外,PCB的布线、连接件都会影响信号的传播时间,布局布线工具虽然可以考虑这些因素,但是很难得到这些因素的准确数值;还有一点很重要,就是FPGA寄存器输出端到FPGA引脚的延时,在后面会详细说明这一点。 riple
上板实测时,采用内部和外部逻辑分析仪分别观察了总线信号的时序关系,发现不需要进行相位补偿就可以满足芯片的时序要求。经过小批量的数据传输测试,也没出现问题。 riple
接下来,由于项目进展的需要,在FPGA开发板和芯片测试板之间增加了一块转接板。同时,FPGA内部的相关逻辑也完成了,压力测试也跑起来了。问题逐渐在压力测试中暴露出来——写入芯片缓冲区的数据会不规则地出现连续的0值,而缓冲区的地址指针递增无误。 riple
看起来,是芯片接口的数据总线出现了问题。 riple
三、时序问题的定位 riple
我从数据总线驱动的源头一直查到数据总线选择器的控制输入,检查过程中既采用了代码审查的方式查找可能的逻辑错误,也采用了内部逻辑分析仪观察关键信号,还检查了时序分析的结果,都没有发现问题。最后,采用外部逻辑分析仪确认FPGA没有向总线上输出过错误模式的数据。这时,我开始怀疑是芯片接口出现了时序问题。 riple
在采用内部逻辑分析仪调试的过程中,每次观察信号发生变化重新编译后,问题出现的频率也会产生变化。有时候问题反复出现,有时候问题又不出现了。 riple
我采用外部逻辑分析仪对问题重现频率最高的版本进行了观察,发现上述时序图中的RDYRTN信号相对于BCLK会出现保持时间不够的情况,而其它接口信号的时序正常。数据出错的问题得到了初步定位,缓冲区指针递增正确的现象也得到了解释。 riple
四、时序问题的解决 riple
解决保持时间不够的问题预先有准备,调节PLL输出的两路时钟的相位差即可。但是问题真的这么简单吗?不是。这里存在三个因素会影响接口时序。 riple
问题一:BCLK的相位没有调整到最佳,没能使芯片按照BCLK采样控制信号时得到最大的采样窗口,甚至使部分接口信号的采样位置处于临界状态,时序问题时有发生。这是该接口表现出来的主要的时序问题。 riple
问题二:在调试过程中出现过编译条件改变后会导致时序情况恶化或好转的现象,这表明在该时序问题中还存在除BCLK之外的其他因素。通过比较时序表现差异很大的两次编译结果的Timing Closure Floorplan,发现RDYRTN引脚的驱动逻辑的布局位置有很大的差别,进而导致驱动逻辑到输出引脚的延时在两次编译后出现最大1.5ns的差异,这一差异是该时序问题对编译条件敏感的主要原因。如果不解决该问题,会导致通过调整BCLK相位获得的采样窗口在不同的编译条件下发生移动,调整BCLK相位的效果会打折扣;该问题还会导致接口上各个信号的输出延时不一致,按照一个信号的观察结果调整BCLK的相位可能会顾此失彼。 riple
问题三:调整BCLK相位后,BCLK与FPGA片内时钟会产生一个相位差,芯片按照BCLK驱动的信号SRDYN被FPGA片内时钟采样时,该相位差就会影响SRDYN信号在FPGA端的采样窗口。这一问题在调整BCLK相位后表现很明显。 riple
首先,解决了问题二。在FPGA驱动的接口信号的输出端都引入了一个寄存器,然后通过Quartus II的Assignment Editor工具给这几个寄存器都加入了Fast Output Register的约束,在Timing Closure Floorplan中观察编译后的结果发现这些寄存器都被布局到输出引脚对应的IO cell中的寄存器位置,该寄存器到输出引脚的延时都是0ns,可以保证所有接口输出引脚延迟一致。 riple
接下来,解决了问题一。给FPGA内部时钟加入了120度的相移。该数值是实际观察接口时序得到的最佳值,可以保证各个信号与BCLK的最大采样窗口。 riple
最后,解决了问题三。对SRDYN信号在FPGA端进行了跨时钟域处理,采用两级寄存器同步了该信号。 riple
经过上述修改的电路彻底消除了在该接口的时序问题,可以通过压力测试。 riple
五、避免和解决该问题的方法归纳 riple
推荐强文一篇:系统时序基础理论
用户135168 2007-12-24 13:31
用户36416 2007-9-3 21:31