標(biāo)題: 終于把一個簡單的時序調(diào)通了~ [打印本頁]

作者: liuyang    時間: 2012-12-20 02:07
標(biāo)題: 終于把一個簡單的時序調(diào)通了~
    作為一個初學(xué)者,沒有很好的c語言基礎(chǔ),c51也玩得很初級,數(shù)字電路也學(xué)得很一般,現(xiàn)在面對fpga的一些簡單應(yīng)用的時候真的是磕磕碰碰。 verilog的調(diào)試比起軟件編程來的確困難很多。雖然基本上沒有軟件編程經(jīng)驗,不過印象當(dāng)中,調(diào)單片機(jī)程序的話只要找個順手的EDA工具,把需要觀察的量拉出來一步步執(zhí)行程序就可以找出來問題出在哪里了。 可惜verilog這樣的東西完全不能用軟件的思想去理解他,調(diào)試起來更是困難重重。 感覺上modulesim其實可以模擬著做一些單步的調(diào)試,不過沒有去怎么深究和學(xué)習(xí)(而且,貌似某些需要用到的參數(shù)申明必須放在前面,不然quartus里運行沒有問題的程序在modulesim里會報錯的。 初學(xué)到現(xiàn)在,基本上都是人腦仿真以及直接看最終波形。。。
   前天寫了一段對于一般上手的人來說小菜一碟的A/D驅(qū)動時序 。 因為之前寫過ccd的驅(qū)動時序,看懂datasheet以后感覺寫這個問題不大。寫完了,bebug了幾個語法錯誤,然后程序就編譯成功了。 信心滿滿的寫了個testbench 然后放modulesim上一跑, 結(jié)果,波形很奇葩。 之前學(xué)的時候,只是跑跑教程給的例子,所以沒注意warning里的內(nèi)容,最終的結(jié)果就是完全無頭蒼蠅一樣的找了半天錯,沒找出來。 其中,想象到了各種自以為是的硬件實現(xiàn)上面的原因,以為計數(shù)器的寫法上面除了問題,改了半天沒有任何結(jié)果。狀態(tài)機(jī)也查了半天,也沒有任何結(jié)果。看著波形 ,終于發(fā)現(xiàn)好像是某個狀態(tài)以后馬上跳到idle狀態(tài)所導(dǎo)致的問題。于是又試了半天,發(fā)現(xiàn)的確如此。很自然的就想到是因為狀態(tài)變量轉(zhuǎn)換的時候跑飛到未定義的狀態(tài)所導(dǎo)致的,如果這樣的話,唯一的可能就是寫得程序有問題了,可是改來改去,完全沒有效果。 要知道,這么折騰著半天,用所有自己能想到的方面去修改以后還沒有成功的話,人的三觀絕對會碎上一地的。。。  奔潰了。準(zhǔn)備刷牙去的時候,突然發(fā)現(xiàn),我艸,用于寄存狀態(tài)reg我給的時4位的,而實際定義的時8位的熱獨碼,這狀態(tài)根本挑不過去啊!   突然一爽。  刷牙回來以后,重新看了下warning里是不是有什么警告,結(jié)果,的確有,不過英文不好,如果不是因為知道是什么原因,直接看也不一定能看出什么端倪來。       
    可是第二天,問題又來了,功能仿真完全沒有問題,可是一用modulesim提供的時序仿真,確是各種錯誤,然后三觀又開始各種扭曲了。各種懷疑,懷疑是modulesim提供的后仿真是不是有什么問題,是不是需要設(shè)置什么東西。懷疑是不是因為沒有進(jìn)行時序約束導(dǎo)致。然后得出各種奇葩的解決方案。 當(dāng)中各種糾結(jié)。  歸根到底,其實還是自己對無意中生成的latch所帶來的危害沒有深刻的認(rèn)識吧。剛才把狀態(tài)機(jī)里各個reg的變化描述補(bǔ)充完整了,不再提示有l(wèi)atch生成以后再開后仿真一試, 哈,成功了。。。。                雖然還沒有深刻理解latch會對時序的實現(xiàn)帶來這么大的影響,不過, 也算得到了一些有用的東西,    coding style~ coding style~ coding style 很重要啊





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1