|
谈谈我的基于SOPC的IRIG-B自定义元件设计及调试总结
[复制链接]
关键词: SOPC 自定义元件 IRIG-B 调试
一. 案例描述
最近打算利用SOPC来构建系统完成项目平台的升级,由于以前都是采用基于51和fpga的平台,现在利用SOPC技术可以将nios软核直接集成到现有的fpga中,可以有效增加设计的灵活行。采用SOPC技术与传统51方式相比,最大的不同在于51单片机的数据地址总线为分时复用,而现有的32位CPU(包括nios)都是采用数据和地址总线分开的形式,因此在平台升级时不能直接继承原有的程序代码,必须自定义符合nios系统avalon总线时序要求的外设。
本项目中设计一个IRIG-B的产生IP是其中的任务之一,由于以前没有接触过SOPC,因此困难重重。在本次设计中首先是将原先的相关代码理解后用verilog进行改造,然后编写元件 testbench,利用modelsim进行仿真,然后编写该元件的相关驱动程序和应用程序,最终进行板级调试。起初在调试时发现根本不通,最终经过两天的研究,终于搞定问题。
二. 现象及原因分析
问题1:元件寄存器无法写入数据
起初调试时发现写数据到元件的寄存器根本无法工作,首先怀疑是写操作没有成功,后来听说quartus中有个信号探针的功能,但不会使用,后经过多方打听和查阅quartus的手册,终于学会使用该功能,最终将写到元件的数据用信号探针拉出来通过示波器观察,结果是无数据写入,因此判定是写数据失败。
然后怀疑是元件定义有问题,经过反复检查和重新自定义元件也没有发现不正常的现象,初步排除是元件定义问题。
后来考虑到是写数据的失败,又开始怀疑是SOPC系统添加元件是有问题,感觉是avalon总线没连好,没有时钟信号到元件,不得已只好使用先删除元件再重新添加,然后再在SOPC中generate,在调试结果仍无法工作。到此仍觉得是avalon总线没有和元件连接好的原因,因此又利用quartus的RTL图来查看,通过查看RTL图发现总线连接完好,没有任何异常。
后来有担心由于是刚刚学会用信号探针,可能使用方法不正确,可能是逻辑的其他部分有问题,因此又进行了修改程序代码,添加中间节点将信号直接引出来观察的,结果仍然是一无所获。此后又进行了将固定信号用探针引出来测试探针使用是否正确的实验,实验证明探针使用正常。
硬件检查发现无问题后,将怀疑的重点转向了软件,开始怀疑是软件的驱动程序有问题,最终发现了一个问题,就是在元件中定义的寄存器都是8位的,而avalon总线是32位宽,写数据的驱动程序中使用的是32为的学数据函数,后来将其修改为了8位的函数。修改后发现仍无法操作成功。
考虑到数据宽度不匹配,又怀疑可能是元件接口定义不符合avalon中的时序要求,因此再次检查元件的接口定义,通过查阅avalon的总线规范手册,发现接口中有一个字节使能的信号,我的元件中没有,但是该信号不是必须信号。为了确认不是该问题,只好修改代码添加byteenable信号重新验证,结果仍令人失望。
最后不得已采用嵌入式逻辑分析仪来调试,由于之前没有用过不会使用,因此只好在群里面请教高人指点,后来有查阅quartus手册和网上的相关文章,最终基本会使用这个强大的调试工具。通过观察发现该元件的复位信号异常,导致数据无法写入。后来发现以前代码中使用的是高电平复位,与习惯不一致,最后将程序中的复位信号改写成低电平有效,并消除了原程序中出现的死锁现象,最终数据被成功写入寄存器。
问题2:分频后的时钟再计数出现错误
现象:首先利用一个50MHZ的系统时钟分频产生了一个1khz的信号,然后直接利用该信号做时钟信号进行分频计数时发现计数错误,输出的信号周期和占空比不正确。
原因:经过反复查找和仿真,发现程序的逻辑没有错误,但由于我在modelsim中使用的是功能仿真,发现不了问题的本质原因。后经过分析发现1kzh信号的产生是利用了一个很大的计数器来产生的,用示波器观察该信号很干净,但实际由于示波器的处理速度有限,该信号存在很多的毛刺,而fpga确能够识别这些毛刺信号,导致了计数器的误触发,因此出现上述问题。
解决办法:将产生的1khz信号通过一个高频时钟的DFF来滤波,最终问题得到完美解决。
三. 经验总结:
1. 工欲善其事,必先利其器,掌握调试工具的使用,将大大的缩短调试时间。在本次设计中由于调试手段不够,导致浪费了很多时间,调试fpga程序,最初的仿真必不可少,因此掌握testbench和modelsim的使用很重要。板级调试时,近可能利用软件自带的调试功能,以altera的fpga为例的话,掌握嵌入式逻辑分析仪、信号探针等调试工具的使用,必要的时候还可以看一下RTL级的原理图看是不是正确。
2. 学会求助,如果你身边有经验丰富高手,及时向他们请教可以节约很多时间,可惜我公司人力太少,无此等高手求助。没有高手也不要灰心,可以到网上查找相关的文章,有些东西网上很多,比如嵌入式逻辑分析仪的使用网上就很多。再就是在网上有些技术群里面有些高手,可以和他们讨论。
3. 学会查阅手册,官方的手册一般是English,因此需要有耐心的读下,一般还是可以看懂的。
4. 理清问题的思路,遇到问题时不要慌,胡子眉毛一把抓问题往往难解决,仔细分析一下问题可能的原因,重点排查,一个一个的排除,像本案第一个问题就没有理清问题的关键所在,导致花费了太多时间。因此学会分析问题至关重要,有思路了一切玩问题都可以得到很perfect的解决!
|
|