淺淡邏輯設(shè)計的學(xué)習(xí)(二)
入門前
本文引用地址:http://cafeforensic.com/article/265058.htm剛才開始接觸邏輯設(shè)計很多人會覺得很簡單:因為verilog的語法不多,半天就可以把書看完了。但是很快許多人就發(fā)現(xiàn)這個想法是錯誤的,他們經(jīng)常埋怨綜合器怎么和自己的想法差別這么大:它竟然連用for循環(huán)寫的一個計數(shù)器都不認(rèn)識!
相信上一段的經(jīng)歷大部分人都曾有,原因是做邏輯設(shè)計的思維和做軟件的很不相同,我們需要從電路的角度去考慮問題。
在這個過程中首先要明白的是軟件設(shè)計和邏輯設(shè)計的不同,并理解什么是硬件意識。
軟件代碼的執(zhí)行是一個順序的過程,編繹以后的機器碼放在存儲器里,等著CPU一條一條的取指并執(zhí)行;因此軟件設(shè)計中經(jīng)常會帶有順序處理的思維。而邏輯設(shè)計則不同,我們設(shè)計的是數(shù)字電路,它是由很多很多的與非門及D觸發(fā)器構(gòu)成的,上電之后所有與非門和D觸發(fā)器都同時工作,不會因為A觸發(fā)器的代碼描述在B觸發(fā)器之前A觸發(fā)器就是先工作,事實上,RTL級代碼的代碼先后順序在綜合成網(wǎng)表文件后這種順序就消失了,取代的是基本邏輯電路之間的互聯(lián)關(guān)系描述;因此邏輯設(shè)計需要的是一種并發(fā)的思維,我們也需要用并發(fā)的思維去考慮電路的設(shè)計。
當(dāng)然,我們設(shè)計的電路功能一般都有先后順序的關(guān)系,如果這種順序不能通過代碼的先后順序來實現(xiàn),那么要怎么完成這一功能呢?在邏輯設(shè)計中,我們所說的先后順序都是基于時間軸來實現(xiàn):它的承載體就是時序邏輯,也就是那些觸發(fā)器。
硬件意識的東西網(wǎng)上談?wù)摰囊呀?jīng)很多,這里就不再多說了。
其次就是要熟悉基本電路的設(shè)計。
基本的電路不是很多,也就是D觸發(fā)器、計數(shù)器、移位寄存器、狀態(tài)機、多路選擇器、譯碼器等幾種,所有復(fù)雜的電路都可由這些基本的電路構(gòu)成。高手水平高的體現(xiàn)并不是他能寫出一些很奇特的電路,相反,水平高是體現(xiàn)在他們總能將復(fù)雜的電路用這些很樸素的基本電路去描述。甚至,你會發(fā)現(xiàn)他們的代碼基本上是由if...else、case這些語句構(gòu)成的,樸素的讓你覺得奇怪。
我認(rèn)為,初學(xué)者在入門的時候,對于基本電路的設(shè)計應(yīng)該固定化、標(biāo)準(zhǔn)化,每種電路該用什么樣的代碼描述,應(yīng)該要固定、統(tǒng)一,盡量少一些花哨的東西。說來這里我舉個例子。
以前有幾個朋友因為仿真有問題請我?guī)兔φ覇栴}。他們的代碼寫的很亂,出現(xiàn)了很多種稀奇古怪的電路,一看頭都大了,只好建議他們按照標(biāo)準(zhǔn)的電路重新寫下代碼。結(jié)果過了半天,他們就和我說問題不見了。
所以,高手們喜歡用簡單的代碼是有道理的,電路的標(biāo)準(zhǔn)化和規(guī)范化可以減少許多稀奇古怪的問題,問題少了他們也就能在別人加班的時候回家多睡回覺,呵呵??傊?,簡單的、樸素的就是最好的。
最后是代碼的規(guī)范化。
代碼規(guī)范主要是代碼書寫、命名等規(guī)范。比如不能用TAB鍵空格、低電平有效信號命名時加_n(如rst_n等)、每行只能寫一行代碼等。這些東西網(wǎng)上也很多,這里只是強烈建議大家要嚴(yán)格遵守,像華為等公司如果代碼不規(guī)范的話肯定是要打回去重寫的。
評論