单片机与FPGA通信的跨时钟域问题多种解决方法总结

    全国大学生电子设计大赛至今结束已有两个月,当时选了F题频率计设计,由于之前备赛的时候有参考过相关的论文,而且自身也有一点FPGA的基础,最主要的是FPGA做频率计原理简单,精度相对于用单片机来说高得多,于是毫不犹豫的选择用FPGA来做F题。

    安排好队友做好相关的硬件电路,即单片机最小系统和FPGA最小系统(直接到淘宝买了一个EP4CE10F17C8),并且分别测试也没问题,但当我们把他们连接起来,结果却不如人意,并没有出现我们想要的结果,LCD1602显示的数据看起来完全是随机数,而且还在乱动,但我们输入的频率是一个稳定的方波,正确的话是不会这样的,以为是FPGA上的逻辑设计的有问题,修修补补,弄了半天,最后面实在没办法,这的求助老师,但老师并不熟悉FPGA,她帮我们在一本叫《EDA技术实用教程》的书上找到了一个等精度的频率计,完全和题目要求一致,而且性能指标比题目还要高,当时我们以为有救了,就将书本上的等精度频率计的VHDL代码编辑好,编译了一下,重新下载到FPGA板子上,结果还是和之前一样,并没有任何变化,然后看了一下RTL图,发现生成的RTL图和之前我用原理图输入法做的是一样的,也就是说,我之前的FPGA的逻辑设计是正确的,问题并不出在这里。纠结着,纠结着,时间过去了,最后这能将这个称不上的半成品上交,因为总不能交白卷吧!!!!!!!

    虽然比赛结束了,但我并没有放弃解决这个问题,我继续沿着原来的路线学习FPGA,某天,我在图书馆像往常一样找FPGA相关的书籍阅读,无意中找到了特权同学的出的一本书《深入浅出玩转FPGA》因为在学习的过程中在网上找到了特权同学的教学视频,可谓相当的好,教程中特权同学也提到过他的这本书,当初以为这本教材应该是这个教程的课件编写成的,因为这个视频出完了,但当时书本还没有出版,回想起来,真的是太后悔了,书中有一章中专门讨论了FPGA设计中的跨时钟域问题,此时此刻,我恍然大悟了,原来当时参加比赛时出现的问题在这里,单片机和FPGA 相互通信是可以的,但必须要解决好时钟不同步即跨时钟域的问题,否则就会出现问题,就像当初电赛那个样子。真是知道真相的我眼泪掉下来啊,想想也是,自己当初还是个菜鸟,连出现问题是什么原因都不知道,也就无悔了,况且也在实践中发现了自己的问题。

    那下面就来说说单片机与FPGA通信时出现跨时钟域如何解决吧,产生跨时钟域的原因比较简单,可以去网上搜搜,特权同学的那本书也有讲到,其实就是因为两个模块分别能正常工作,但各自的时钟都是独立提供的,起点不一样,就算起点一样,由于时钟的相差的倍数不一样,也不行,总之有各种原因会导致这两个模块在联合后出现跨时钟域的问题,特权同学在《深入浅出玩转FPGA》一书中列出了几种方法,比如单向控制信号检测法(其实就是脉冲检测法,实现模块间信号的同步),专用握手信号,借助存储器(双向口ram或FIFO)等,具体的可以查看那本书的相关章节,这些方法都很好,当时看了之后真的又由衷的佩服了特权同学一把。写这个帖子主要是要说明其他的方法,这是在重新看了潘松的那本《EDA技术实用教程》后得出的感悟。

    现在看来,当初出题人出的F题,估计时参考了这本书的,而且就数字电路部分,是完全一样的,甚至还打了折的,因为这本书上竟然有同一个设计,即“基于单片机核的FPGA片上系统设计”,不过当时也是菜鸟,虽然知道有soc这个东西,也知道一些概念,玩过一下NIOS II,但毕竟那是对NIOS II也不熟悉,哪晓得这本教材竟然有51核的SOC这个设计,而且最近我还在网上将康欣公司改进的51软核下载了,并且完成的整个实验,眼泪又在再次掉下来啊,如果当初有做过这个实验的话或者学过这本书的话,结果就完全不一样了,但现实没有如果,因为那时我才大二,反而是那些大三的学长们,如果他们有学这个章节的话,那该多好啊,一次很好的机会,虽说前端电路要求也很高,但毕竟我对TI的放大器以及相关的器件和电路还是研究了很久的,这个应该不成问题的,哈哈,算了,有点像自卖自夸了!

    书上的实验代码可以从网上下载,编译后不会出现时序约束的问题,可以直接使用,当然,要根据自己的板子配置引脚,话说这个康欣的单片机竟然可以跑到200M以上,真是厉害,我从网上找到的一个外国公司做的51的IP核只能跑15M左右,但前者没有硬件乘法器,而后者有,在进行乘法运算时,后者估计更有优势,以为后者可以用很少的时钟就能计算完毕,但前者只能用加法器模拟,要浪费很多时钟,至于这两者的机器周期是不是向传统51那样经过时钟12分频后才得到了,这点尚待研究。这个方案不存在跨时钟域的问题,以为时钟都是来自同一个源的,属于同步时钟,所以在以后的设计中,也可以采用适当的用SOC来解决跨时钟域的问题。


你可能感兴趣的:(单片机与FPGA通信的跨时钟域问题多种解决方法总结)