伺候好你的 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不好时,一切预料不到的事情都有可能会发生,而且时好时坏,弄得你摸不着头脑。
牢记这被折磨的三天。
用户402518 2011-6-28 20:40