最近挺忙的,也没什么时间打理博客。但是再忙,也应该在适当的时候停下来做一点回顾,过去做过的对的不对的都应该做一些记录。一个项目中碰到了一系列跨时钟域设计中非常典型的问题,技术细节恐怕不会说得太详细,但是一定会说到点上。
从一个题外话开始吧,周三晚上家里电脑挂了,其实之前就有些症状,只不过我现在忙得都“懒”得去理它了,也最怕去折腾它了,因为很浪费时间。经常开机不久就蓝屏,周三晚上算是“病入膏肓”了,一度无法进入系统中。其实初步的定位是一直以来怀疑硬盘有坏道导致的。当时重装系统也是常常认不到光驱或是无法重新启动硬盘,于是不停的重复着应该算是“小概率”事件的进入系统桌面,然后在蓝屏前赶紧的把最重要的数据拷贝出来。还好虽然硬盘里躺着估计100多个G的Byte,但是认为应该存活下来的也不过20来个G。今天上午完成了这个重大任务,于是大刀阔斧的准备低格它。但是看到关于蓝屏现象,网络上大伙都说和外设连接导致异常有关,要么是线连接问题,要么是外设本身有问题。而如果按照我的猜想只是硬盘“挂了”,那么为什么光驱boot成功也是小概率事件,带着这个疑问,决定先对主机彻底的“清理”一遍。打开布满灰尘的机箱,看到那条唯一的IDE线有些老化了,感觉应该先让他Out试试。这一试不要紧,在重新上电后,一上午不再发生曾经大概率的蓝屏症状了。俺的低格计划也就暂时搁浅把,问题应该就是这样了(不管是那个经常超负荷工作的光驱本身还是那条嫌疑最大的排线,总之问题的根源应该就是它们了)。这点问题其实也没什么,生活中我们常常要面对,工作上也是。而问题的解决可能非常的简单,一点不像出现的症状那么吓人。
再回到标题上来,不可小视的跨时钟域设计。跨时钟域是逻辑设计中不变的话题。特权同学的《深入浅出玩转FPGA》一书有专门的篇幅有板有眼的介绍这方面的解决办法。而实践中即便是自己也还是常常要在这方面吃一些“一不小心”的亏。问题定位的过程就像咱的电脑蓝屏一样,绕了一大圈才发现问题出在了最简单的地方。
同样的跨时钟问题在一个项目的类似设计中出现多次,教训可谓深刻。首先一个问题是出在了CPU工作时钟和软件代码运行的FLASH上,CPU需要运行的软件程序必须从FLASH读出,而这个CPU本身只给出了一组RAM运行代码的总线接口,而FLASH运行软件的代码是直接使用了官方给出的源代码。因此,一开始只是想当然的将二者按照实例“对接”上了。却忽视了例化中供给二者的时钟不同,CPU跑得频率是FLASH频率的3倍多。于是在实际调试中,出现了很多说不清道不明的“幽灵”现象。通常断电较长时间后若给芯片供电,第一次没反应,第二次通常就起来了,然后不停的上下电,一般也都能够起来,我们笑称“是不是这个芯片要充电啊”。但是从始至终居然有那么一个样机(一共有四套)非常坚挺的从来不出这个症状。开始我们一直怀疑是芯片厂商提供的所谓“工程样片”有猫腻,但是随着调试不断的深入,工程代码改进后不断产生新的编译结果,有些工程的逻辑编译居然无论如何都无法让工程跑起来,对比前后能跑和不能跑的工程,改动的地方确认是一些无关紧要的逻辑。和FAE谈到这些比较怪异的症状,并且我们也聊到了软件是运行在FLASH上,聊到了它们的时钟频率,FAE给了我一些启发和灵感。于是深入的去解析那份“舶来品”,发现了CPU读写代码接口中的等待信号非常可能就是罪魁祸首。我们做了一个假设,比如CPU以100M在跑,FLASH操作是20M。CPU需要每若干个时钟周期执行一次软件代码读操作,FLASH要响应这样一次操作要慢很多,因此FLASH就是通过wait信号来拖长CPU的操作时间,以保证完成这样的一次读操作。那么wait信号是由FLASH的时钟产生的,它会比CPU的时钟慢很多。存在那么一种情况,当CPU执行第一个读操作时,好不容易等到了FLASH模块的wait信号,然后发出第二次的读操作,而此时由于这个wait信号保持的时间还未结束,那么CPU误以为是给它的wait信号了,所以接着往下走了。如此一来,软件就大乱了。这般推测后,特权同学适时的对这个wait信号的产生逻辑做了一些处理,此后经过恩天的验证果然不再有芯片在上电后无法运行的情况了。
另外,由于项目中涉及CPU与内部逻辑的接口,说白了接口方式就两类,一类是CPU内部扩展的专用并行总线,一类是CPU的IO口直接连接控制。在出现问题的时候,一直非常关注前一种接口,因为习惯上认为CPU的IO口控制的比较简单,肯定能够把数据送出去,但是并没有考虑到它们对内部的逻辑而言也是不折不扣的“外星人”。在无数次改进并行接口方式确保稳定工作无果后,静下心来也就着问题找到这些也算是异步并习惯认为不用关心的IO接口时,只是抱着试试的态度对它们用逻辑时钟做了一拍锁存来同步后,问题居然意外的得到了解决,数天之内也确实不再复现。
这一连串的异步问题困扰了特权同学数周,想说的还是那句话“不容忽视的异步设计”。但,也许很多时候,那些项目这些问题都是要在我们亲身经历了才愈发有感觉。
用户1547243 2016-4-13 15:30
beisongcrt_880711304 2016-4-7 13:54
用户1678053 2016-1-12 11:17
用户1454308 2016-1-12 08:30
用户1181267 2015-4-17 12:57
用户1406868 2015-4-17 12:55
用户的板上一定有电容吧,有稍大一点的电容一通电的瞬间肯定电流要大于100mA,而供电电源设定100mA肯定要保护,所以很容易就能想得到,要解决这个问题其实只能是设计的单片机板在做设计时能用延时启动,等电容充电完成后再行启动。 我们在设计10KW的开关电源时就是采用的大电阻限流给电容充电,此时电流被限制在只有几个安培内,比电视机的电源冲击还小,充电后延时让继电器再短接电阻,继而启动主开关电源工作。要不然一下就会把几百安培的过流开关给拉掉闸。
用户1678053 2015-4-8 23:20
看看
用户1067601 2014-6-13 09:01
用户1625273 2014-1-28 17:00
用户1381018 2013-10-17 17:03