|
QUARTUS自带的ALTLVDS接收模块,以前跑得很稳定,但最近的一批板卡出了问题,有一块AD芯片的数据接收存在一些错误数据。目前其他同事已调试出稳定版本,但修改其他无关内容编译后偶尔又会出问题,重新编译后又恢复正常。 现在是想找到问题的根本原因,或者是可靠的解决方法。 我用正常的版本和错误的版本做了一些实验和分析,主要是以下几点: 1)验证了FPGA内部fast_clock串行时钟是位于串行数据的中间位置。这是通过多次调整PLL的相位,找出接收数据产生移位的两个相位,取其中间值得到的。其实数据与时钟是同步输入的,最后得到的相位值就是fast_clock串行时钟的1/4个时钟周期。 2)验证了数据输入至第一级触发器(包括上升沿及下降沿)的时序是正确的。这是通过timequest对比正常和错误的版本时序分析报告,可以看到二者的路径也是完全一致:都是数据直接输入至IOE的触发器,时钟输入是先到PLL,再上全局时钟网络,最后到触发器。我也通过CHIP PLANNER看过,两个版本到第一级触发器的路径都完全一样。 3)验证了PFGA内部数据流通道触发器之间的时序是正确的。正常版本和错误版本的内部走线是不一样的,本来对这个报有很大希望。但通过timequest分析后发现错误版本也并无时序错误,最初是错误版本的时序略差些,但也满足时序要求。我对这个模块加了个速度优先的约束,错误版本的时序余量比正确版本更高,但问题仍然存在。 由于正确的版本始终都正确,所以问题肯定跟FPGA设计有很大关系,但我现在也没有其他好的思路,特别是对时序分析工具是否真的可靠也产生了怀疑。请高手指教下,看是否是我的方法有问题,或者是其他好的分析方法。 另外我参考XILINX的LVDS发送设计,他在源代码中用到了很多对高速发送模块每个触发器进行相对位置锁定的设计,看了下CHIP EDIT中的实现,LVDS发送部分逻辑的相位位置始终是固定的,保证了时序的正确。但在ALTERA中貌似只有LOGIC LOCK能够对整个模块加约束,其文档中没找到相关语法,也请高手指点下。先谢过!
|
|