标题: 终于把一个简单的时序调通了~ [打印本页]

作者: liuyang    时间: 2012-12-20 02:07
标题: 终于把一个简单的时序调通了~
    作为一个初学者,没有很好的c语言基础,c51也玩得很初级,数字电路也学得很一般,现在面对fpga的一些简单应用的时候真的是磕磕碰碰。 verilog的调试比起软件编程来的确困难很多。虽然基本上没有软件编程经验,不过印象当中,调单片机程序的话只要找个顺手的EDA工具,把需要观察的量拉出来一步步执行程序就可以找出来问题出在哪里了。 可惜verilog这样的东西完全不能用软件的思想去理解他,调试起来更是困难重重。 感觉上modulesim其实可以模拟着做一些单步的调试,不过没有去怎么深究和学习(而且,貌似某些需要用到的参数申明必须放在前面,不然quartus里运行没有问题的程序在modulesim里会报错的。 初学到现在,基本上都是人脑仿真以及直接看最终波形。。。
   前天写了一段对于一般上手的人来说小菜一碟的A/D驱动时序 。 因为之前写过ccd的驱动时序,看懂datasheet以后感觉写这个问题不大。写完了,bebug了几个语法错误,然后程序就编译成功了。 信心满满的写了个testbench 然后放modulesim上一跑, 结果,波形很奇葩。 之前学的时候,只是跑跑教程给的例子,所以没注意warning里的内容,最终的结果就是完全无头苍蝇一样的找了半天错,没找出来。 其中,想象到了各种自以为是的硬件实现上面的原因,以为计数器的写法上面除了问题,改了半天没有任何结果。状态机也查了半天,也没有任何结果。看着波形 ,终于发现好像是某个状态以后马上跳到idle状态所导致的问题。于是又试了半天,发现的确如此。很自然的就想到是因为状态变量转换的时候跑飞到未定义的状态所导致的,如果这样的话,唯一的可能就是写得程序有问题了,可是改来改去,完全没有效果。 要知道,这么折腾着半天,用所有自己能想到的方面去修改以后还没有成功的话,人的三观绝对会碎上一地的。。。  奔溃了。准备刷牙去的时候,突然发现,我艹,用于寄存状态reg我给的时4位的,而实际定义的时8位的热独码,这状态根本挑不过去啊!   突然一爽。  刷牙回来以后,重新看了下warning里是不是有什么警告,结果,的确有,不过英文不好,如果不是因为知道是什么原因,直接看也不一定能看出什么端倪来。       
    可是第二天,问题又来了,功能仿真完全没有问题,可是一用modulesim提供的时序仿真,确是各种错误,然后三观又开始各种扭曲了。各种怀疑,怀疑是modulesim提供的后仿真是不是有什么问题,是不是需要设置什么东西。怀疑是不是因为没有进行时序约束导致。然后得出各种奇葩的解决方案。 当中各种纠结。  归根到底,其实还是自己对无意中生成的latch所带来的危害没有深刻的认识吧。刚才把状态机里各个reg的变化描述补充完整了,不再提示有latch生成以后再开后仿真一试, 哈,成功了。。。。                虽然还没有深刻理解latch会对时序的实现带来这么大的影响,不过, 也算得到了一些有用的东西,    coding style~ coding style~ coding style 很重要啊





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1