原创 调试环境,马虎不得

2010-8-13 21:22 3984 8 9 分类: 测试测量

    伺候好你的 RESET 和GND!


 


    先说一下我的工作:


 


    用一ARM与FPGA并行总线通信,读写FPGA的外部RAM。


 


    由于没有都包含这些器件的板子,只好用两块板子拼接,一块ARM板,一块FPGA板,由于ARM板上的液晶是并行总线接口,所以直接将FPGA的IO扩展排针用排线连接到ARM板的液晶接口上。


 


    再连接几根电源和地,硬件算是搭建完成。


 


    于是到计算机上啪啪啪的敲代码,开始下载验证。


 


    第一步,测试总线通讯是否正常。


 


    ARM分别读写FPGA内定义的寄存器,挨个写入,然后再挨个读出,比较,都正常,测试多次,也都正常。OK,总线通讯模块正常。


 


    下一步,设置成RAM读写模式,测试RAM地址计数器自动累加是否正常


 


    设置RAM起始地址,设置RAM写模式,读RAM三次,再将RAM当前地址计数器的值读出来,看是否为起始地址+3。结果不正常。


 


    检查代码,逻辑分析,未见异常。


 


    分步骤检查:设置起始地址,再读出来查看,发现起始地址设置正常,模式设置也正常,问题出在哪?最后读出来的值使终不对,要么是0,要么是一个很大的数。


 


    会不会是读错了?再重复读一次,惊讶的发现,最后一次读出来的值居然和前一次不一样。然道是总线通讯问题?


 


    在ARM端单步仿真,读到最后,数据对了,而且两次读出来的数据都一样。


 


    会不会是总线速度太快了?降时钟,再测试,结果还是不正常。


 


    会不会是ARM总线与FPGA板用排线连接有衰减?去掉排线,直接插入ARM板上的座子,再测试,还是不正常。


 


    回到第一步,再次测试总线,正常。


 


    奇怪了??


 


    仔细分析代码,发现一特点,我在做第一步测试的时候,是先全写入,然后全读出。而我第二步测试时的大部分操作都是要交替读写的。会不会是因为这点区别,导致总线读写有错,也测试不出来。


 


    再回到第一步,改成交替读写方式,果然不正常。


 


    在FPGA端用Signal Tap II抓取总线引脚信号,发现总线RW,RD,CS居然有同时为低的情况,而且当ARM在读写FPGA内部寄存器时,没有被选中的寄存器值也在意外的发生的变化。


 


    再测试连续读,连续写,波形都正常,交替读写就不正常,真是奇怪了。


 


   ....................


 


    几经周折发现,原来是RESET和GND在做怪,RESET是典型的RC复位,上电后按理说应该一直是高电平,RESET接到FPGA的IO脚,逻辑里要求它是高电平就行,所以按理说这样接着应该也没问题,但我将FPGA的复位IO脚重新接到VCC上时,却发现总线读写时,未被选中的寄存器值不会被改变。


 


    用示波器测量,在ARM板上,RESET信号电压平均值为3.2V,Vpp为16mv。到FPGA板上后Vpp变成了60几毫伏。最后将FPGA的复位IO脚直接接到3.3V电源上,再多加了几根地线。


 


    再次测试,终于正常,长舒了一口气。


 


    最终得出结论:调试环境马虎不得,一定要细致的考虑。当电源、地和RESET不好时,一切预料不到的事情都有可能会发生,而且时好时坏,弄得你摸不着头脑。


 


 


    牢记这被折磨的三天。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户402518 2011-6-28 20:40

我现在也在做arm与fpga的通信。能发我一份你的代码么。邮箱463381946@qq.com
相关推荐阅读
用户1278632 2011-09-15 12:49
解决FPGA配置成功,但不能初始化运行的BUG
摘要:    遇到两次FPGA配置完成,却不能正常运行的问题,一次是ALTERA的A1C3,另一次是XILINX的XC3S700A。两次都是DONE信号的问题。问题虽不大,但却很折腾人,今天在这里作下...
用户1278632 2011-09-15 12:41
Code Edit的神器UltraEdit
摘要:      我不是一个专职的程序员,但经常会要写一些单片机底层的code和hdl code,起初用UE,是因为查找和批量修改很方便,而且不会额外的生成一些“垃圾”文件;现在用UE三年多了,一直都...
用户1278632 2010-12-29 09:29
ISE与EDK联合设计报错 ERROR:NgdBuild:604 logical block
做一个很简单的测试在ISE的SCH里调用EDK的symbol,EDK的功能也很简单,就是CPU通过串品打印一串字符首先,我建一个ISE工程再建一source  sch类型,并设置为顶层,取名为top....
用户1278632 2010-12-22 14:49
EDK12.2中 mch_emc IP的时序问题
mch_emc IP可以将PLB总线时序转为inter 8080时序 下面是我用chipscope抓到的波形Mem_DQ_O_In :  数据输入 Mem_OEN:      读信号  Mem_A: ...
用户1278632 2010-12-22 14:29
xilinx FPGA的配制与应用程序引导-范例
两个Xilinx FPGA应用程序引导的范例1、run_in_flash是直接在NOR FLASH里运行程序2、spi_flash_boot是将BIT和bootloader和APP全部固化到SPI F...
用户1278632 2010-12-19 13:48
EDK下sram IP的使用
EDK软件的memory and memory controller中有一个xps multi-channel external memory controller(sram/flash)的IP,用来...
我要评论
1
8
关闭 站长推荐上一条 /3 下一条