热度 16
2013-2-19 14:38
1302 次阅读|
2 个评论
入手一年半的任务基本完成了,它的题目是磁共振成像的双通道接收机,但是却一点都高兴不起来。 我还是想把我的流水账细说下,怕自己以后忘记了。那还是2011年的夏天,由于我设计的PCIE的主控板卡没有调试成功,所以开始着手做双通道的接收机,那个暑假又要打工,又要话接收机的电路图,还要谈恋爱,终于一个月连原理图带PCB终于完工,速度没有想象中的快,但也还可以接受。8月份开始调试sdram部分,使用的fpga是xilinx的xc3s500e,写sdram的代码,计算机能通过pci9054读写sdram,用了两个星期左右的时间。10月份,11月份,12月份一直在搞dma操作和ad6620,这三个月现在是最让人头疼的了,虽然ad6620以前师兄师姐用过,但是手头上能用的资料只有他们的毕业论文,对于ad6620的配置,我先是通过上位机调试,写一个寄存器然后再读出来,就这样在焊接,FPGA的程序,和上位机的程序三个都不能确定哪个有问题的情况下还是把ad6620给搞通了。整体调试到2012年的3月份基本调试通过了。3但是这个课题还远远没有结束,因为现在是2013年的2月份。板卡最后还是要集成到磁共振成像系统里面才能算是完成的。 于是接下来是等待,花了个把月的时间把DDS做了一下,后来又想做射频的调制和解调,再后来做一个迷你的波谱实验,以为那就是我的毕业课题,再后来接收机的成像实验又被提上了日程,那是2012年的12月份。 为了做到接收机的实用,我大刀阔斧的更改vhdl代码,各个模块的功能划分的更细了,状态机更简洁了。这一改不要紧又是纠结的两个月。代码和基本的功能调试进行的还算顺利,有个不大不小的问题是,更改了sdram和pci的程序后,计算机读取sdram有时对有时错,每当加入一个功能模块,它都回来找我麻烦,当时我给自己的解释是,ISE的bug和资源太紧张,时序约束不好等等。中间有一次我把终止sdram突发的命令和回写操作格了几个空闲周期后,pci和sdram的通信明显比以前好了很多。但是当我再加入循环的编码功能时,这个问题又找上门来,我类个去。于是在昨天我又大刀阔斧的把sdram的vhdl又重新写了一遍。直到今天早上我才发现了这个深藏已久的bug。 在终止sdram突发的情况有两种,一是地址的低10位全是1,还有一种是fifo的almost_full.而我的程序是这么写的: bterm_sdm='1' when (fifo1_almost_empty='1' or flag_bt_addr='1' and flag_bterm_wr='1') else '0'; 其中flag_bterm_wr是我刚开始定义的bterm的flag,这就是那个让我夜不能寐的bug。当把它改成wr_valid时,程序一下子就跑通了,wr_vaild是表示sdram上的写正在进行,也就只有正在进行些操作的时候才会置burst_sdm为1. 现在想想我真的挺笨的,老婆说这是因为我爸妈生我生的晚。不过我想说这个bug给我最大的教训是永远不要把c语言编程的经验拿到vhdl中来。以为如果是用c来写,这种bug不会时有时无,也就只有fpga上才能出现,当我们某个模块的功能调试对了,再加入一些新的功能又出错了,一方面要想是不是时序约束不满足,另一方面尽管以前功能是对的,但是你的程序还有可能是错的,这就是fpga让人比较头痛的事情。xilinx的vivodo据说是基于c的,不知道会不会还有这种令人恐惧的bug。 说完这bug,还要再说一下课题。接下来就是集成到系统,然后改版,然后希望能够顺利毕业。