假期里在实验室做了一款FPGA的开发板,本人的第二块板子,画板一星期,调板一星期,调的进度明显比第一块快了不少,有些东西还是要总结一下的。全版12.8cm×13.5cm,包含电源、FPGA、usb、AD、DA、SDRAm这几个部分。
部分原理图
1,电源部分,电源秉承着鄙人制版的优良供电系统,3个3.3v、800ma的电源管理芯片(AMS1117系列),外加一个2.5v、800ma的PLL供电芯片 及 1.2v、800ma的FPGA核心供电芯片,5V上电后表现正常。没上电前,简单测了下短路,发现2.5v 和 3.3v的一块电源芯片 短路对地,结果把板子背面的十几个滤波电容去掉后,表现正常。所以焊接这部分,现在要比较谨慎,焊功不行,还是老实找外面的师傅来焊算了。
2,USB transfers 模块,本来这块是被认为调通率最高的部分,本打算上电就能过去,结果这次着实在USB上摔了个跟头。板子上用的是Cy7c68013a的片子,这款片子我们已经用了多次了,但是在烧写固件程序(iic文件)到E2PROM的时候,发现烧写后PC机可以识别到芯片,驱动名称也正常,但就是读BLUCK失败,很是困惑。烧写hex文件程序到68013a芯片的时候,就一切正常,可以传输数据。这个问题卡了我们一天的时间后,我跟骚瑞同学讨论了一下论坛里的大侠们给出的参考意见,决定重新生成iic文件后再烧写一遍,结果问题解决了。
其实问题的关键就是虽然usb芯片都是cy7c68013a,但是每一个新的芯片都要在连接到PC机的情况下,用cypress自带的hex2bin.exe软件重新生成一遍.iic文件就可以。当然在线调试的时候.hex文件都是一样的,这并不影响。每一个新的芯片对应唯一的标示,在cypress识别到后生成的iic文件才是与之对应的固件程序。而后USB遇到了一个之前没遇到的情况,就是每次上电之后要再按下usb的rest按钮才可正常工作,这个问题先停了一下,我们继续向AD和DA推进。(后来这个问题,被老师一语点破,上电复位时间延长!在老师的指导下把对应rest按钮的阻容都加大,上电后大概要到1秒以后才复位,这样就可以正常使用了。其实就是把68013a放到最后复位,板子上FPGA等其他部件上电复位完成后,它再复位就ok了)
3,FPGA核心控制模块,这部分上一次调板总结了很多失败的教训,第二天晚上调试AS的时候还是遇到了些问题,当时我忘记把MSEL的三个管脚的短接帽接上,一直下载不成功。这个小问题已发现之后,程序可以正常下载进去了,但是感觉表现不正常,跑马灯没有跑起来。后来发现贴片晶振没焊好(PS晶振是老师焊的。。),把晶振重新焊了一下之后程序正常了。直接试了一下JTAG,也顺利通过,一个晚上AS+JTAG全面通过。可怜我调试第一块板子的时候AS就卡了3个礼拜,JTAG还被烧坏了...
4,AD9238模块,ad以前用过一款片子,感觉ad问题不大,上电之后发现vref电平不对,换了几个阻容之后vref调整到了datasheet上所说的电压位置。而后采样了一下,有一部分高8位和低8位颠倒了,有一部分采样的正弦波很规整,所以考虑这个问题以前我们也遇到过,主要怀疑是verilog的程序问题。就把这个遗留的问题留个粟总了,我跟老师继续向DA挺进。(后来发现颠倒的问题不是粟总的问题,但程序本身还是有错误,事实证明了杨龙一开始写的程序是没问题的,是粟总后来给改坏了、、、)
5,DA9765模块,这部分原理一直是刘四辉同学在做的,包括前期的芯片选型,和后期的PCB布线,所以在调试的时候,几乎没费太多力气。片子焊好之后,直接上电,发现出来的模拟信号不对,然后对着datasheet做了几次修改之后发现是mode选择给错了,本来我们调试用的单路输出给弄成了双路输出,这个改好后,锯齿波就出来了。后来老师觉得不过瘾,我们又改成了输出三角波,波形输出正常。
(此处PS:在8个月后我又看此文不得不说当时不完善的地方还挺多,DA9765外接的运放单元——AD8047让我的正负增益让我接反了,这个到最后是又上位机先做了一次取反来完成的)
6,SDRAM模块,整个SDRAM模块是这次调板子耗时最长的一块。这一部分是和宋超同学一起完成的,宋超之前对整个芯片——MT48LC16M16A2的了解比较多,而且整个调试程序的雏形都是他一个人来完成的,对于一个开学才大三的孩子来说,第一次接触verilog项目就做的这么好,实在是出乎我的意料,后生可畏啊。而后上板开始调试,因为SDRAM需要有一个每隔60ms的自刷新命令,同时附带的突发长度1-8的读写操作,而所有命令又是由4个使能端口来提供的,在读写过程中的23条地址线是由12条地址线来复用的,数据线是16bit。SDRAM的调试是我接触项目以来难度最大的一次,仅测试程序就引用了大大小小9个模块,逻辑单元用了512个,寄存器351个,在实际上板调试的过程中困难还是不小的。
(此处PS:在8个月后我又看自己的笔记发现当时我这么用SDRAM好幼稚啊,在NIOS下有配套的SDRAM控制模块!而且涉及到向SDRAM里存数的时候,一般都是在NIOS下来跑的,所以SDRAM的单纯verilog程序实用性不大,真的不大!)
测试的一开始在工作站上仿真通过了,时序与datasheet上的对照大体上说得过去,而后上板子,就是各种调不通。先尝试了下循环初始化的时序,然后直接上示波器,把三个命令端口,数据,时钟,地址,也接到示波器上,一点一点的对时序,发现跟pdf上的时序还是有点不一样的。每一个命令的高低电平应该是在时钟的上升沿的时候被采样,就是沿对电平,而后又把时钟的输入调整了一下使之更为光滑,修改过这个之后,感觉初始化应该顺利完成了。然后我们进行重复的初始化+写命令,继续调整时序。因为整个时序很复杂,一点一点的对应调整,大概调到了第三天的晚上,观察示波器上的时序图与pdf上的时序图已经是完全一致了。这个时候判断读出数据的小灯突然一闪而过,就在这时,我感觉应该有戏了。
先说一下测试的原理,测试的基本流程是这样的:因为这个SDRAM没有一个写进来或者读出去的反馈信号(例如68013A就有empty和full信号),也没有初始化完成的标示。所以整个调试过程给人感觉就像是在盲操作一样。我们是先将SDRAM初始化完成,读、写操作分别由两个开关控制,每按两下完成一次时钟的上升下降,也即完成一次16bit数据的读、写操作。如果读出来的数据和我同地址线上写进去的数据一样小灯就会亮起来,经过三天反反复复的调试,小灯终于可以正常的闪灭了。写地址加过两个了,读出来的就不亮,再多读两个就又亮了起来。
SDRAM功能仿真,init_done位高电平时表示初始化完成结束,很多内部的寄存器让我隐掉了。
至此六天时间,全版所有模块再无大碍,全板无一处飞线,但是有些布局还是有欠缺的。
7,后记,全板调通后老师给板子相关的开发人员放了个小假,都可以回家呆两天,我家远就没回去,继续弄了下USB传输总是8位颠倒的问题,终于发现了这个困惑我们已久的问题。原来一直认为颠倒是verilog程序导致的,其实是PC机传输程序导致的。后来我做的测试是用骚瑞同学的输出程序与红板自带的传输程序向比较,发现骚瑞同学的传输程序一旦碰到0A这个数据的话,就自动在0A前面多加一个0D,从而导致高位变低位,低位变高位。而红板自带的传输程序上是不会有这样的问题。显示程序上是没有问题的,问题就是出在了传输上。原来老师说粟总程序有问题的时候,其实也是这个问题,原来胖胖的程序有问题的时候,其实也是这个问题。没想到上块板子遗留的问题到这块板子才彻底解决掉。后来骚瑞回来之后,他自己意识到这个问题不好意思,仅几分钟就把这个困扰了几个月的问题解决了。我们又用了三天时间把上位机向板子传输数据的问题解决了。而后就剩下了对板子的深度开发,以及与上位机的配合工作了。
万恶的0D 0A。09FC 之后应该接的是0AFC结果变成了0D0AFC,从而导致高8位与底8位颠倒。
(此处PS:八个月后的我仍然清晰的记得,当时发现问题出在哪里后对瑞哥的郁闷和终于翻过了这座山的喜悦)
在此要特地感谢已经去上海贝尔实习的刘四辉同学,芬同学对于整个板子的原理图构建做了大量而有效的工作,后来的PCB布线又帮我分担了相当多的任务,全板调通芬同学功不可没哈~
感谢师弟杨龙,宋超同学的大力配合。
在与上位机接口方面,感谢骚瑞同学一如既往的配合。
感谢粟总的支持,以及老师耐心的指导,其实不得不说老陈在硬件方面多年来的积累实在是一笔宝贵的财富,每当我们愁眉苦脸不知如何前行的时候,总有位高人在旁边点拨实在是做项目的一件乐事啊。
PS:有对FPGA 开发板感兴趣的,可以找我要原理图和程序。
PS的PS:初到此地 先发个以前技术贴,过一周后上传最新的研发笔记。这是我在2010年8月份前后做的一个项目的前期总结。这个项目最后的难点主要在我后期verilog时序分析部分,我到现在还没有写出来主要是自己当时太懒了忘了总结。其他主要敏感的信息都去掉了只保留单纯的技术总结。