CPLD开发体会
这次进行的CPLD开发为以下内容:
……
一开始,我把程序分为了三块:一个顶层程序,译码器,IO单元。在顶层程序中也有对门或其它CPLD资源操作的代码,程序写完后,仿真不能
通过。后来我就进行模块细分,每个独立的功能为一个模块,先将每个模块写好进行仿真,确认无误后组合到一起,原本认为各个模块写好后
一组全没问题了,但结果不是这样,结合后,中间信号看不到,最终的输入信号不正确。我认为中间信号看不到是程序有问题,因为我认为可
以在“Nodefounder"中指定的信号是可以看得到的,而且,有的信号我曾经看到过。但是无论我怎样改写程序,中间信号都不再重现。苦思多
时,我突然想可以把这些要监视的中间信号引到管脚上,一试,果然可以!我一级一级的进行验证,最后发现分频监视模块和输入模块工作不
正常,这下好说了,就一个一的调试吧。认为已把单独的模块调试好了,但是组合到一起,工作还是不正常,看来事情并不是和想像的一样容
易,可以是在模块链接的时候出现了问题,一个一个找吧。找来找云,到后来我还是觉得输出模块有问题,尽管单独调试时它看起来是正常的
,后来的结果验证了我的想法,IO模块调试完毕之后,整个程序工作正常了。
调试过程中,我看到Altera的帮助文档上说中间信号有时的看不到的,但在timming分析时可以看到,但我在timming时也没有看到消失的信号
,但这已经不重要了,因为我已经有了解决的方法。后来发现还可以使用"signalprobe"来进行监视,Altera已经提供了这样的工具,到现在我
还没有使用过,有空一定要试一下!
VHDL和C是有很大区别的,它们不仅仅是语法上的区别,VHDL是针对硬件而不是CPU的,有些东西从程序上看来是没有问题的,但仿真的结果就
是不正确,什么原因哪?VHDL最终要在硬件上来实现,而硬件门到门之间都是有延迟的,这会造成结果和期望并不一致。如下的这段程序:
if(pso /= "00000000") then
tmp := pso;
end if;
想在pso不为"00000000"时对tmp进行更新,这样看来,tmp一旦被赋于了一个值,它以后就不会是"00000000"了,但结果不是这样,为什么?“
if(pso /= "00000000")”会形成一个电路,它的输出信号对赋值电路进行控制,而pso则直接连接到tmp的输入端,这样,当pso已经变成
“00000000”被打入tmp,控制信号还没来得及变化,错误就发生了。但我肯定,这样的逻辑在C语言中是没有问题的。
在VHDL语言中,就一定要用硬件的方式来思考问题--这点很重要!!!
有一些问题仍然没有搞明白如:一个信号何时使用falling_edge、rising_edge、'event,编译器才不报错?
搞定一个小问题是简单的,但是由一个个的小问题堆起来的大问题就不是那么简单了,所以要把大问题分解成小问题再解决。
原来认为Altera的东西做得很糟糕,慢慢地发现它还是可以的,特别综合,效率非常高,结让人满意。