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