Verliog數(shù)字系統(tǒng)教程夏宇聞_第1頁
Verliog數(shù)字系統(tǒng)教程夏宇聞_第2頁
Verliog數(shù)字系統(tǒng)教程夏宇聞_第3頁
Verliog數(shù)字系統(tǒng)教程夏宇聞_第4頁
Verliog數(shù)字系統(tǒng)教程夏宇聞_第5頁
已閱讀5頁,還剩339頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PAGE344第一章數(shù)字信號(hào)處理、計(jì)算、程序、算法和硬線邏輯的基本概念引言:現(xiàn)代計(jì)算機(jī)與通訊系統(tǒng)電子設(shè)備中廣泛使用了數(shù)字信號(hào)處理專用集成電路,它們主要用于數(shù)字信號(hào)傳輸中所必需的濾波、變換、加密、解密、編碼、解碼、糾檢錯(cuò)、壓縮、解壓縮等操作。這些處理工作從本質(zhì)上說都是數(shù)學(xué)運(yùn)算。從原則上講,它們完全可以用計(jì)算機(jī)或微處理器來完成。這就是為什么我們常用C、Pascal或匯編語言來編寫程序,以研究算法的合理性和有效性的道理。在數(shù)字信號(hào)處理的領(lǐng)域內(nèi)有相當(dāng)大的一部分工作是可以事后處理的。我們可以利用通用的計(jì)算機(jī)系統(tǒng)來處理這類問題。如在石油地質(zhì)調(diào)查中,我們通過鉆探和一系列的爆破,記錄下各種地層的回波數(shù)據(jù),然后用計(jì)算機(jī)對(duì)這些數(shù)據(jù)進(jìn)行處理,去除噪聲等無用信息,最后我們可以得到地層的構(gòu)造,從而找到埋藏的石油。因?yàn)榈貙硬粫?huì)在幾年內(nèi)有明顯的變化,因此花幾十天的時(shí)間把地層的構(gòu)造分析清楚也能滿足要求。這種類型的數(shù)字信號(hào)處理是非實(shí)時(shí)的,用通用的計(jì)算機(jī)就能滿足需要。還有一類數(shù)字信號(hào)處理必須在規(guī)定的時(shí)間內(nèi)完成,如在軍用無線通信系統(tǒng)和機(jī)載雷達(dá)系統(tǒng)中我們常常需要對(duì)檢測到的微弱信號(hào)增強(qiáng)、加密、編碼、壓縮,在接收端必須及時(shí)地解壓縮、解碼和解密并重現(xiàn)清晰的信號(hào)。我們很難想象用一個(gè)通用的計(jì)算機(jī)系統(tǒng)來完成這項(xiàng)工作,因此,我們不得不自行設(shè)計(jì)非常輕便小巧的高速專用硬件系統(tǒng)來完成該任務(wù)。有的數(shù)字信號(hào)處理對(duì)時(shí)間的要求非??量蹋灾劣谟酶咚俚耐ㄓ梦⑻幚砥餍酒矡o法在規(guī)定的時(shí)間內(nèi)完成必須的運(yùn)算。我們必須為這樣的運(yùn)算設(shè)計(jì)專用的硬線邏輯電路,這可以在高速FPGA器件上實(shí)現(xiàn)或制成高速專用集成電路。這是因?yàn)橥ㄓ梦⑻幚砥餍酒菫橐话隳康亩O(shè)計(jì)的,運(yùn)算的步驟必須通過程序編譯后生成的機(jī)器碼指令加載到存貯器中,然后在微處理器芯片控制下,按時(shí)鐘的節(jié)拍,逐條取出指令、分析指令,然后執(zhí)行指令,直至程序的結(jié)束。微處理器芯片中的內(nèi)部總線和運(yùn)算部件也是為通用的目的而設(shè)計(jì),即使是專為信號(hào)處理而設(shè)計(jì)的通用微處理器,因?yàn)樗耐ㄓ眯?,也不可能為某一個(gè)特殊的算法來設(shè)計(jì)一系列的專用的運(yùn)算電路,而且其內(nèi)部總線的寬度也不能隨意改變,只有通過改變程序,才能實(shí)現(xiàn)這個(gè)特殊的算法。因而其運(yùn)算速度就受到限制。本章的目的是想通過對(duì)數(shù)字信號(hào)處理、計(jì)算(Computing)、算法和數(shù)據(jù)結(jié)構(gòu)、編程語言和程序、體系結(jié)構(gòu)和硬線邏輯等基本概念的介紹,了解算法與硬線邏輯之間的關(guān)系從而引入利用VerilogHDL硬件描述語言設(shè)計(jì)復(fù)雜的數(shù)字邏輯系統(tǒng)的概念和方法。向讀者展示一種九十年代才真正開始在美國等先進(jìn)的工業(yè)國家逐步推廣的數(shù)字邏輯系統(tǒng)的設(shè)計(jì)方法。借助于這種方法,在電路設(shè)計(jì)自動(dòng)化仿真和綜合工具的幫助下,只要我們對(duì)并行的計(jì)算結(jié)構(gòu)有一定程度的了解,對(duì)有關(guān)算法有深入的研究,我們完全有能力設(shè)計(jì)并制造出有自己知識(shí)產(chǎn)權(quán)的DSP(數(shù)字信號(hào)處理)類和任何復(fù)雜的數(shù)字邏輯集成電路芯片,為我國的電子工業(yè)和國防現(xiàn)代化作出應(yīng)有的貢獻(xiàn)。數(shù)字信號(hào)處理大規(guī)模集成電路設(shè)計(jì)制造技術(shù)和數(shù)字信號(hào)處理技術(shù),近三十年來,各自得到了迅速的發(fā)展。這兩個(gè)表面上看來沒有什么關(guān)系的技術(shù)領(lǐng)域?qū)嵸|(zhì)上是緊密相關(guān)的。因?yàn)閿?shù)字信號(hào)處理系統(tǒng)往往要進(jìn)行一些復(fù)雜的數(shù)學(xué)運(yùn)算和數(shù)據(jù)的處理,并且又有實(shí)時(shí)響應(yīng)的要求,它們通常是由高速專用數(shù)字邏輯系統(tǒng)或?qū)S脭?shù)字信號(hào)處理器所構(gòu)成,電路是相當(dāng)復(fù)雜的。因此只有在高速大規(guī)模集成電路設(shè)計(jì)制造技術(shù)進(jìn)步的基礎(chǔ)上,才有可能實(shí)現(xiàn)真正有意義的實(shí)時(shí)數(shù)字信號(hào)處理系統(tǒng)。對(duì)實(shí)時(shí)數(shù)字信號(hào)處理系統(tǒng)的要求不斷提高,也推動(dòng)了高速大規(guī)模集成電路設(shè)計(jì)制造技術(shù)的進(jìn)步?,F(xiàn)代專用集成電路的設(shè)計(jì)是借助于電子電路設(shè)計(jì)自動(dòng)化(EDA)工具完成的。學(xué)習(xí)和掌握硬件描述語言(HDL)是使用電子電路設(shè)計(jì)自動(dòng)化(EDA)工具的基礎(chǔ)。計(jì)算(Computing)說到數(shù)字信號(hào)處理,我們自然就會(huì)想到數(shù)學(xué)計(jì)算(或數(shù)學(xué)運(yùn)算)。現(xiàn)代計(jì)算機(jī)和通信系統(tǒng)中廣泛采用了數(shù)字信號(hào)處理的技術(shù)和方法?;舅悸肥窍劝研盘?hào)用一系列的數(shù)字來表示,如是連續(xù)的模擬信號(hào),則需通過采樣和模擬數(shù)字轉(zhuǎn)換,把信號(hào)轉(zhuǎn)換成一系列的數(shù)字信號(hào),然后對(duì)這些數(shù)字信號(hào)進(jìn)行各種快速的數(shù)學(xué)運(yùn)算,其目的是多種多樣的,有的是為了加密,有的是通過編碼來減少誤碼率以提高信道的通信質(zhì)量,有的是為了去掉噪聲等無關(guān)的信息也可以稱為濾波,有的是為了數(shù)據(jù)的壓縮以減少占用的頻道…。有時(shí)我們也把某些種類的數(shù)字信號(hào)處理運(yùn)算稱為變換如離散傅利葉變換(DFT)、離散余弦變換(DCT)、小波變換(WaveletT)等。我們這里所說的計(jì)算是從英語Computing翻譯過來的,它的含義要比單純的數(shù)學(xué)計(jì)算廣泛得多。“Computing這門學(xué)問研究怎樣系統(tǒng)地有步驟地描述和轉(zhuǎn)換信息,實(shí)質(zhì)上它是一門覆蓋了多個(gè)知識(shí)和技術(shù)范疇的學(xué)問,其中包括了計(jì)算的理論、分析、設(shè)計(jì)、效率和應(yīng)用。它提出的最基本的問題是什么樣的工作能自動(dòng)完成,什么樣的不能?!保ㄕ訢enningetal.,“ComputingasaDiscipline,”CommunicationofACM,January,1989)。本文中凡提到計(jì)算這個(gè)詞處,指的就是上面一段中Computing所包含的意思。由傳統(tǒng)的觀點(diǎn)出發(fā),我們可以從三個(gè)不同的方面來研究計(jì)算,即從數(shù)學(xué)、科學(xué)和工程的不同角度。由比較現(xiàn)代的觀點(diǎn)出發(fā),我們可以從四個(gè)主要的方面來研究計(jì)算,即從算法和數(shù)據(jù)結(jié)構(gòu)、編程語言、體系結(jié)構(gòu)、軟件和硬件設(shè)計(jì)方法學(xué)。本課本的主題是從算法到硬線邏輯的實(shí)現(xiàn),因此我們將從算法和數(shù)據(jù)結(jié)構(gòu)、編程語言和程序、體系結(jié)構(gòu)和硬線邏輯以及設(shè)計(jì)方法學(xué)等方面的基本概念出發(fā)來研究和探討用于數(shù)字信號(hào)處理等領(lǐng)域的復(fù)雜硬線邏輯電路的設(shè)計(jì)技術(shù)和方法。特別強(qiáng)調(diào)利用Verilog硬件描述語言的Top-Down設(shè)計(jì)方法的介紹。算法和數(shù)據(jù)結(jié)構(gòu)為了準(zhǔn)確地表示特定問題的信息并順利地解決有關(guān)的計(jì)算問題,我們需要采用一些特殊方法并建立相應(yīng)的模型。所謂算法就是解決特定問題的有序步驟,所謂數(shù)據(jù)結(jié)構(gòu)就是解決特定問題的相應(yīng)的模型。編程語言和程序程序員利用一種由專家設(shè)計(jì)的既可以被人理解,也可以被計(jì)算機(jī)解釋的語言來表示算法問題的求解過程。這種語言就是編程語言。由它所表達(dá)的算法問題的求解過程就是程序。我們已經(jīng)熟悉通過編寫程序來解決計(jì)算問題,C、Pascal、Fortran、Basic或匯編語言語言是幾種常用的編程語言。如果我們只研究算法,只在通用的計(jì)算機(jī)上運(yùn)行程序或利用通用的CPU來設(shè)計(jì)專用的微處理器嵌入系統(tǒng),掌握上述語言就足夠了。如果還需要設(shè)計(jì)和制造能進(jìn)行快速計(jì)算的硬線邏輯專用電路,我們必須學(xué)習(xí)數(shù)字電路的基本知識(shí)和硬件描述語言。因?yàn)楝F(xiàn)代復(fù)雜數(shù)字邏輯系統(tǒng)的設(shè)計(jì)都是借助于EDA工具完成的,無論電路系統(tǒng)的仿真和綜合都需要掌握硬件描述語言。在本書中我們將要比較詳細(xì)地介紹Verilog硬件描述語言。系統(tǒng)結(jié)構(gòu)和硬線邏輯計(jì)算機(jī)究竟是如何構(gòu)成的?為什么它能有效地和正確地執(zhí)行每一步程序?它能不能用另外一種結(jié)構(gòu)方案來構(gòu)成?運(yùn)算速度還能不能再提高?所謂計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)就是回答以上問題并從硬線邏輯和軟件兩個(gè)角度一起來探討某種結(jié)構(gòu)的計(jì)算機(jī)的性能潛力。比如,VonNeumann(馮諾依曼)在1945設(shè)計(jì)的EDVAC電子計(jì)算機(jī),它的結(jié)構(gòu)是一種最早的順序機(jī)執(zhí)行標(biāo)量數(shù)據(jù)的計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)。順序機(jī)是從位串行操作到字并行操作,從定點(diǎn)運(yùn)算到浮點(diǎn)運(yùn)算逐步改進(jìn)過來的。由于VonNeumann系統(tǒng)結(jié)構(gòu)的程序是順序執(zhí)行的,所以速度很慢。隨著硬件技術(shù)的進(jìn)步,不斷有新的計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)產(chǎn)生,其計(jì)算性能也在不斷提高。計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)是一門討論和研究通用的計(jì)算機(jī)中央處理器如何提高運(yùn)算速度性能的學(xué)問。對(duì)計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)的深入了解是設(shè)計(jì)高性能的專用的硬線邏輯系統(tǒng)的基礎(chǔ),因此將是本書討論的重點(diǎn)之一。但由于本書的重點(diǎn)是利用VerilogHDL進(jìn)行復(fù)雜數(shù)字電路的設(shè)計(jì)技術(shù)和方法,大量的篇幅將介紹利用HDL進(jìn)行設(shè)計(jì)的步驟、語法要點(diǎn)、可綜合的風(fēng)格要點(diǎn)、同步有限狀態(tài)機(jī)和由淺入深的設(shè)計(jì)實(shí)例。設(shè)計(jì)方法學(xué)復(fù)雜數(shù)字系統(tǒng)的設(shè)計(jì)是一個(gè)把思想(即算法)轉(zhuǎn)化為實(shí)際數(shù)字邏輯電路的過程。我們都知道同一個(gè)算法可以用不同結(jié)構(gòu)的數(shù)字邏輯電路來實(shí)現(xiàn),從運(yùn)算的結(jié)果說來可能是完全一致的,但其運(yùn)算速度和性能價(jià)格比可以有很大的差別。我們可用許多種不同的方案來實(shí)現(xiàn)能實(shí)時(shí)完成算法運(yùn)算的復(fù)雜數(shù)字系統(tǒng)電路,下面列出了常用的四種方案:1)以專用微處理機(jī)芯片為中心來構(gòu)成完成算法所需的電路系統(tǒng);2)用高密度的FPGA(從幾萬門到百萬門);3)設(shè)計(jì)專用的大規(guī)模集成電路(ASIC);4)利用現(xiàn)成的微處理機(jī)的IP核并結(jié)合專門設(shè)計(jì)的高速ASIC運(yùn)算電路。究竟采用什么方案要根據(jù)具體項(xiàng)目的技術(shù)指標(biāo)、經(jīng)費(fèi)、時(shí)間進(jìn)度和批量綜合考慮而定。在上述第二、第三、第四種設(shè)計(jì)方案中,電路結(jié)構(gòu)的考慮和決策至關(guān)重要。有的電路結(jié)構(gòu)速度快,但所需的邏輯單元多,成本高;而有的電路結(jié)構(gòu)速度慢,但所需的邏輯單元少,成本低。復(fù)雜數(shù)字邏輯系統(tǒng)設(shè)計(jì)的過程往往需要通過多次仿真,從不同的結(jié)構(gòu)方案中找到一種符合工程技術(shù)要求的性能價(jià)格比最好的結(jié)構(gòu)。一個(gè)優(yōu)秀的有經(jīng)驗(yàn)的設(shè)計(jì)師,能通過硬件描述語言的頂層仿真較快地確定合理的系統(tǒng)電路結(jié)構(gòu),減少由于總體結(jié)構(gòu)設(shè)計(jì)不合理而造成的返工,從而大大加快系統(tǒng)的設(shè)計(jì)過程。專用硬線邏輯與微處理器的比較在信號(hào)處理專用計(jì)算電路的設(shè)計(jì)中,以專用微處理器芯片為中心來構(gòu)成完成算法所需的電路系統(tǒng)是一種較好的辦法。我們可以利用現(xiàn)成的微處理器開發(fā)系統(tǒng),在算法已用C語言驗(yàn)證的基礎(chǔ)上,在開發(fā)系統(tǒng)工具的幫助下,把該C語言程序轉(zhuǎn)換為專用微處理器的匯編再編譯為機(jī)器代碼,然后加載到樣機(jī)系統(tǒng)的存儲(chǔ)區(qū),即可以在開發(fā)系統(tǒng)工具的環(huán)境下開始相關(guān)算法的運(yùn)算仿真或運(yùn)算。采用這種方法,設(shè)計(jì)周期短、可以利用的資源多,但速度、能耗、體積等性能受該微處理器芯片和外圍電路的限制。用高密度的FPGA(從幾萬門到幾十萬門)來構(gòu)成完成算法所需的電路系統(tǒng)也是一種較好的辦法。我們必須購置有關(guān)的FPGA開發(fā)環(huán)境、布局布線和編程工具。有些FPGA廠商提供的開發(fā)環(huán)境不夠理想,其仿真工具和綜合工具性能不夠好,我們還需要利用性能較好的硬件描述語言仿真器、綜合工具,才能有效地進(jìn)行復(fù)雜的DSP硬線邏輯系統(tǒng)的設(shè)計(jì)。由于FPGA是一種通用的器件,它的基本結(jié)構(gòu)決定了對(duì)某一種特殊應(yīng)用,性能不如專用的ASIC電路。采用自行設(shè)計(jì)的專用ASIC系統(tǒng)芯片(SystemOnChip),即利用現(xiàn)成的微處理機(jī)IP核或根據(jù)某一特殊應(yīng)用設(shè)計(jì)的微處理機(jī)核(也可以沒有微處理機(jī)核),并結(jié)合專門設(shè)計(jì)的高速ASIC運(yùn)算電路,能設(shè)計(jì)出性能價(jià)格比最高的理想數(shù)字信號(hào)處理系統(tǒng)。這種方法結(jié)合了微處理器和專用的大規(guī)模集成電路的優(yōu)點(diǎn),由于微處理器IP核的挑選結(jié)合了算法和應(yīng)用的特點(diǎn),又加上專用的ASIC在需要高速部分的增強(qiáng),能“量體裁衣”,因而各方面性能優(yōu)越。但由于設(shè)計(jì)和制造周期長、投片成本高,往往只有經(jīng)費(fèi)充足、批量大的項(xiàng)目或重要的項(xiàng)目才采用這一途徑。當(dāng)然性能優(yōu)良的硬件描述語言仿真器、綜合工具是不可缺少的,另外對(duì)所采用的半導(dǎo)體廠家基本器件庫和IP庫的深入了解也是必須的。以上所述算法的專用硬線邏輯實(shí)現(xiàn)都需要對(duì)算法有深入的了解,還需掌握硬件描述語言和相關(guān)的EDA仿真、綜合和布局布線工具。C語言與硬件描述語言在算法運(yùn)算電路設(shè)計(jì)的關(guān)系和作用數(shù)字電路設(shè)計(jì)工程師一般都學(xué)習(xí)過編程語言、數(shù)字邏輯基礎(chǔ)、各種EDA軟件工具的使用。就編程語言而言,國內(nèi)外大多數(shù)學(xué)校都以C語言為標(biāo)準(zhǔn),只有少部分學(xué)校使用Pascal和Fortran。算法的描述和驗(yàn)證常用C語言來做。例如要設(shè)計(jì)Reed-Solomen編碼/解碼器,我們必須先深入了解Reed-Solomen編碼/解碼的算法,再編寫C語言的程序來驗(yàn)證算法的正確性。運(yùn)行描述編碼器的C語言程序,把在數(shù)據(jù)文件中的多組待編碼的數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的編碼后數(shù)據(jù)并存入文件。再編寫一個(gè)加干擾用的C語言程序,用于模擬信道。它能產(chǎn)生隨機(jī)誤碼位(并把誤碼位個(gè)數(shù)控制在糾錯(cuò)能力范圍內(nèi))將其加入編碼后的數(shù)據(jù)文件中。運(yùn)行該加擾程序,產(chǎn)生帶誤碼位的編碼后的數(shù)據(jù)文件。然后再編寫一個(gè)解碼器的C語言程序,運(yùn)行該程序把帶誤碼位的編碼文件解碼為另一個(gè)數(shù)據(jù)文件。只要比較原始數(shù)據(jù)文件和生成的文件便可知道編碼和解碼的程序是否正確(能否自動(dòng)糾正糾錯(cuò)能力范圍內(nèi)的錯(cuò)碼位)。用這種方法我們就可以來驗(yàn)證算法的正確性。但這樣的數(shù)據(jù)處理其運(yùn)行速度只與程序的大小和計(jì)算機(jī)的運(yùn)行速度有關(guān),也不能獨(dú)立于計(jì)算機(jī)而存在。如果要設(shè)計(jì)一個(gè)專門的電路來進(jìn)行這種對(duì)速度有要求的實(shí)時(shí)數(shù)據(jù)處理,除了以上介紹的C程序外,還須編寫硬件描述語言(如VerilogHDL或VHDL)的程序,進(jìn)行仿真以便從電路結(jié)構(gòu)上保證算法能在規(guī)定的時(shí)間內(nèi)完成,并能與前端和后端的設(shè)備或器件正確無誤地交換數(shù)據(jù)。用硬件描述語言(HDL)的程序設(shè)計(jì)硬件的好處在于易于理解、易于維護(hù)、調(diào)試電路速度快、有許多的易于掌握的仿真、綜合和布局布線工具,還可以用C語言配合HDL來做邏輯設(shè)計(jì)的前后仿真,驗(yàn)證功能是否正確。在算法硬件電路的研制過程中,計(jì)算電路的結(jié)構(gòu)和芯片的工藝對(duì)運(yùn)行速度有很大的影響。所以在電路結(jié)構(gòu)確定之前,必須經(jīng)過多次仿真:C語言的功能仿真。C語言的并行結(jié)構(gòu)仿真。VerilogHDL的行為仿真。VerilogHDLRTL級(jí)仿真。綜合后門級(jí)結(jié)構(gòu)仿真。布局布線后仿真。電路實(shí)現(xiàn)驗(yàn)證。下面介紹用C語言配合VerilogHDL來設(shè)計(jì)算法的硬件電路塊時(shí)考慮的三個(gè)主要問題:為什么選擇C語言與VerilogHDL配合使用?C語言與VerilogHDL的使用有何限制?如何利用C來加速硬件的設(shè)計(jì)和故障檢測?為什么選擇C語言與Verilog配合使用首先,C語言很靈活,查錯(cuò)功能強(qiáng),還可以通過PLI(編程語言接口)編寫自己的系統(tǒng)任務(wù)直接與硬件仿真器(如Verilog-XL)結(jié)合使用。C語言是目前世界上應(yīng)用最為廣泛的一種編程語言,因而C程序的設(shè)計(jì)環(huán)境比VerilogHDL的完整。此外,C語言可應(yīng)用于許多領(lǐng)域,有可靠的編譯環(huán)境,語法完備,缺陷較少。比較起來,Verilog語言只是針對(duì)硬件描述的,在別處使用(如用于算法表達(dá)等)并不方便。而且Verilog的仿真、綜合、查錯(cuò)工具等大部分軟件都是商業(yè)軟件,與C語言相比缺乏長期大量的使用,可靠性較差,亦有很多缺陷。所以,只有在C語言的配合使用下,Verilog才能更好地發(fā)揮作用。面對(duì)上述問題,最好的方法是C語言與Verilog語言相輔相成,互相配合使用。這就是既要利用C語言的完整性,又要結(jié)合Verilog對(duì)硬件描述的精確性,來更快更好地設(shè)計(jì)出符合性能要求的硬件電路系統(tǒng)。利用C語言完善的查錯(cuò)和編譯環(huán)境,設(shè)計(jì)者可以先設(shè)計(jì)出一個(gè)功能正確的設(shè)計(jì)單元,以此作為設(shè)計(jì)比較的標(biāo)準(zhǔn)。然后,把C程序一段一段地改寫成用并型結(jié)構(gòu)(類似于Verilog)描述的C程序,此時(shí)還是在C的環(huán)境里,使用的依然是C語言。如果運(yùn)行結(jié)果都正確,就將C語言關(guān)鍵字用Verilog相應(yīng)的關(guān)鍵字替換,進(jìn)入Verilog的環(huán)境。將測試輸入同時(shí)加到C與Verilog兩個(gè)單元,將其輸出做比較。這樣很容易發(fā)現(xiàn)問題的所在,然后更正,再做測試,直至正確無誤。剩下的工作就交給后面的設(shè)計(jì)工程師繼續(xù)做。C語言與Verilog語言互相轉(zhuǎn)換中存在的問題這樣的混合語言設(shè)計(jì)流程往往會(huì)在兩種語言的轉(zhuǎn)換中會(huì)遇到許多難題。例如,怎樣把C程序轉(zhuǎn)換成類似Verilog結(jié)構(gòu)的C程序,來增加并行度,以保證用硬件實(shí)現(xiàn)時(shí)運(yùn)行速度達(dá)到設(shè)計(jì)要求;又如怎樣不使用C中較抽象的語法:例如迭代,指針,不確定次數(shù)的循環(huán)等等,也能來表示算法(因?yàn)檗D(zhuǎn)換的目的是要用可綜合的Verilog語句來代替C程序中的語句,而可用于綜合的Verilog語法是相當(dāng)有限的,往往找不到相應(yīng)的關(guān)鍵字來替換)。C程序是一行接一行依次執(zhí)行的,屬于順序結(jié)構(gòu),而Verilog描述的硬件是可以在同一時(shí)間同時(shí)運(yùn)行的,屬于并行結(jié)構(gòu)。這兩者之間有很大的沖突。而Verilog的仿真軟件也是順序執(zhí)行的,在時(shí)間關(guān)系上同實(shí)際的硬件是有差異的,可能會(huì)出現(xiàn)一些無法發(fā)現(xiàn)的問題。Verilog可用的輸出輸入函數(shù)很少。C語言的花樣則很多,轉(zhuǎn)換過程中會(huì)遇到一些困難。C語言的函數(shù)調(diào)用與Verilog中模塊的調(diào)用也有區(qū)別。C程序調(diào)用函數(shù)是沒有延時(shí)特性的,一個(gè)函數(shù)是唯一確定的,對(duì)同一個(gè)函數(shù)的不同調(diào)用是一樣的。而Verilog中對(duì)模塊的不同調(diào)用是不同的,即使調(diào)用的是同一個(gè)模塊,必須用不同的名字來指定。Verilog的語法規(guī)則很死,限制很多,能用的判斷語句有限。仿真速度較慢,查錯(cuò)功能差,錯(cuò)誤信息不完整。仿真軟件通常也很昂貴,而且不一定可靠。C語言沒有時(shí)間關(guān)系,轉(zhuǎn)換后的Verilog程序必須要能做到?jīng)]有任何外加的人工延時(shí)信號(hào),也就是必須表達(dá)為有限狀態(tài)機(jī),即RTL級(jí)的Verilog,否則將無法使用綜合工具把Verilog源代碼轉(zhuǎn)化為門級(jí)邏輯。如何利用C語言來加快硬件的設(shè)計(jì)和查錯(cuò)下表中列出了常用的C與Verilog相對(duì)應(yīng)的關(guān)鍵字與控制結(jié)構(gòu)CVerilogsub-functionmodule,function,taskif-then-elseif-then-elseCaseCase{,}begin,endForForWhileWhileBreakDisableDefineDefineIntIntPrintfmonitor,display,strobe下表中,列出了C與Verilog相對(duì)應(yīng)的運(yùn)算符CVerilog功能**乘//除++加--減%%取模!!反邏輯&&&&邏輯且||||邏輯或>>大于<<小于>=>=大于等于<=<=小于等于====等于!=!=不等于~~位反相&&按位邏輯與||按位邏輯或^^按位邏輯異或~^~^按位邏輯同或>>>>右移<<<<左移?:?:同等於if-else敘述從上面的討論我們可以總結(jié)如下:C語言與Verilog硬件描述語言可以配合使用,輔助設(shè)計(jì)硬件C語言與Verilog硬件描述語言很象,只要稍加限制,C語言的程序很容易轉(zhuǎn)成Verilog的程序美國和中國臺(tái)灣地區(qū)邏輯電路設(shè)計(jì)和制造廠家大都以VerilogHDL為主,中國大陸地區(qū)目前學(xué)習(xí)使用VHDL的較多。到底選用VHDL或是VerilogHDL來配合C一起用,就留給各位自行去決定。但從學(xué)習(xí)的角度來看,VerilogHDL比較簡單,也與C語言較接近,容易掌握。從使用的角度,支持Verilog硬件描述語言的半導(dǎo)體廠家也較支持VHDL的多??偨Y(jié):本章介紹了信號(hào)處理與硬線邏輯設(shè)計(jì)的關(guān)系,以及有關(guān)的基本概念。引入了VerilogHDL硬件描述語言,向讀者展示一種九十年代才真正開始在美國等先進(jìn)的工業(yè)國家逐步推廣的數(shù)字邏輯系統(tǒng)的設(shè)計(jì)方法。借助于這種方法,在電路設(shè)計(jì)自動(dòng)化仿真和綜合工具的幫助下,我們完全有能力設(shè)計(jì)并制造出有自己知識(shí)產(chǎn)權(quán)的DSP(數(shù)字信號(hào)處理)類和任何復(fù)雜的數(shù)字邏輯集成電路芯片,為我國的電子工業(yè)和國防現(xiàn)代化作出應(yīng)有的貢獻(xiàn)。在下面的各章里我們將分步驟地詳細(xì)介紹這種設(shè)計(jì)方法。思考題:什么是信號(hào)處理電路?為什么要設(shè)計(jì)專用的信號(hào)處理電路?什么是實(shí)時(shí)處理系統(tǒng)?為什么要用硬件描述語言來設(shè)計(jì)復(fù)雜的算法邏輯電路?能不能完全用C語言來代替硬件描述語言進(jìn)行算法邏輯電路的設(shè)計(jì)?為什么在算法邏輯電路的設(shè)計(jì)中需要用C語言和硬件描述語言配合使用來提高設(shè)計(jì)效率?第二章VerilogHDL設(shè)計(jì)方法概述前言隨著電子設(shè)計(jì)技術(shù)的飛速發(fā)展,專用集成電路(ASIC)和用戶現(xiàn)場可編程門陣列(FPGA)的復(fù)雜度越來越高。數(shù)字通信、工業(yè)自動(dòng)化控制等領(lǐng)域所用的數(shù)字電路及系統(tǒng)其復(fù)雜程度也越來越高,特別是需要設(shè)計(jì)具有實(shí)時(shí)處理能力的信號(hào)處理專用集成電路,并把整個(gè)電子系統(tǒng)綜合到一個(gè)芯片上。設(shè)計(jì)并驗(yàn)證這樣復(fù)雜的電路及系統(tǒng)已不再是簡單的個(gè)人勞動(dòng),而需要綜合許多專家的經(jīng)驗(yàn)和知識(shí)才能夠完成。由于電路制造工藝技術(shù)進(jìn)步非常迅速,電路設(shè)計(jì)能力趕不上技術(shù)的進(jìn)步。在數(shù)字邏輯設(shè)計(jì)領(lǐng)域,迫切需要一種共同的工業(yè)標(biāo)準(zhǔn)來統(tǒng)一對(duì)數(shù)字邏輯電路及系統(tǒng)的描述,這樣就能把系統(tǒng)設(shè)計(jì)工作分解為邏輯設(shè)計(jì)(前端)和電路實(shí)現(xiàn)(后端)兩個(gè)互相獨(dú)立而又相關(guān)的部分。由于邏輯設(shè)計(jì)的相對(duì)獨(dú)立性就可以把專家們?cè)O(shè)計(jì)的各種常用數(shù)字邏輯電路和系統(tǒng)部件(如FFT算法、DCT算法部件)建成宏單元(Megcell)或軟核(Soft-Core)庫供設(shè)計(jì)者引用,以減少重復(fù)勞動(dòng),提高工作效率。電路的實(shí)現(xiàn)則可借助于綜合工具和布局布線工具(與具體工藝技術(shù)有關(guān))來自動(dòng)地完成。VHDL和VerilogHDL這兩種工業(yè)標(biāo)準(zhǔn)的產(chǎn)生順應(yīng)了歷史的潮流,因而得到了迅速的發(fā)展。作為跨世紀(jì)的中國大學(xué)生應(yīng)該盡早掌握這種新的設(shè)計(jì)方法,使我國在復(fù)雜數(shù)字電路及系統(tǒng)的設(shè)計(jì)競爭中逐步縮小與美國等先進(jìn)的工業(yè)發(fā)達(dá)國家的差距。為我國下一個(gè)世紀(jì)的深亞微米百萬門級(jí)的復(fù)雜數(shù)字邏輯電路及系統(tǒng)的設(shè)計(jì)培養(yǎng)一批技術(shù)骨干。2.1.硬件描述語言HDL(HardwareDescriptionLanguage)硬件描述語言(HDL)是一種用形式化方法來描述數(shù)字電路和設(shè)計(jì)數(shù)字邏輯系統(tǒng)的語言。它可以使數(shù)字邏輯電路設(shè)計(jì)者利用這種語言來描述自己的設(shè)計(jì)思想,然后利用電子設(shè)計(jì)自動(dòng)化(在下面簡稱為EDA)工具進(jìn)行仿真,再自動(dòng)綜合到門級(jí)電路,再用ASIC或FPGA實(shí)現(xiàn)其功能。目前,這種稱之為高層次設(shè)計(jì)(High-Level-Design)的方法已被廣泛采用。據(jù)統(tǒng)計(jì),在美國硅谷目前約有90%以上的ASIC和FPGA已采用硬件描述語言方法進(jìn)行設(shè)計(jì)。硬件描述語言的發(fā)展至今已有二十多年的歷史,并成功地應(yīng)用于設(shè)計(jì)的各個(gè)階段:仿真、驗(yàn)證、綜合等。到80年代時(shí),已出現(xiàn)了上百種硬件描述語言,它們對(duì)設(shè)計(jì)自動(dòng)化起到了極大的促進(jìn)和推動(dòng)作用。但是,這些語言一般各自面向特定的設(shè)計(jì)領(lǐng)域與層次,而且眾多的語言使用戶無所適從,因此急需一種面向設(shè)計(jì)的多領(lǐng)域、多層次、并得到普遍認(rèn)同的標(biāo)準(zhǔn)硬件描述語言。進(jìn)入80年代后期,硬件描述語言向著標(biāo)準(zhǔn)化的方向發(fā)展。最終,VHDL和VerilogHDL語言適應(yīng)了這種趨勢的要求,先后成為IEEE標(biāo)準(zhǔn)。把硬件描述語言用于自動(dòng)綜合還只有短短的六、七年歷史。最近三四年來,用綜合工具把可綜合風(fēng)格的HDL模塊自動(dòng)轉(zhuǎn)換為電路發(fā)展非常迅速,在美國已成為設(shè)計(jì)數(shù)字電路的主流。本書主要介紹如何來編寫可綜合風(fēng)格的VerilogHDL模塊,如何借助于Verilog語言對(duì)所設(shè)計(jì)的復(fù)雜電路進(jìn)行全面可靠的測試。2.2.VerilogHDL的歷史2.2.1.什么是VerilogHDLVerilogHDL是硬件描述語言的一種,用于數(shù)字電子系統(tǒng)設(shè)計(jì)。它允許設(shè)計(jì)者用它來進(jìn)行各種級(jí)別的邏輯設(shè)計(jì),可以用它進(jìn)行數(shù)字邏輯系統(tǒng)的仿真驗(yàn)證、時(shí)序分析、邏輯綜合。它是目前應(yīng)用最廣泛的一種硬件描述語言。據(jù)有關(guān)文獻(xiàn)報(bào)道,目前在美國使用VerilogHDL進(jìn)行設(shè)計(jì)的工程師大約有60000人,全美國有200多所大學(xué)教授用Verilog硬件描述語言的設(shè)計(jì)方法。在我國臺(tái)灣地區(qū)幾乎所有著名大學(xué)的電子和計(jì)算機(jī)工程系都講授Verilog有關(guān)的課程。2.2.2.VerilogHDL的產(chǎn)生及發(fā)展 VerilogHDL是在1983年,由GDA(GateWayDesignAutomation)公司的PhilMoorby首創(chuàng)的。PhilMoorby后來成為Verilog-XL的主要設(shè)計(jì)者和Cadence公司(CadenceDesignSystem)的第一個(gè)合伙人。在1984-1985年,Moorby設(shè)計(jì)出了第一個(gè)關(guān)于Verilog-XL的仿真器,1986年,他對(duì)VerilogHDL的發(fā)展又作出了另一個(gè)巨大貢獻(xiàn):即提出了用于快速門級(jí)仿真的XL算法。隨著Verilog-XL算法的成功,VerilogHDL語言得到迅速發(fā)展。1989年,Cadence公司收購了GDA公司,VerilogHDL語言成為Cadence公司的私有財(cái)產(chǎn)。1990年,Cadence公司決定公開VerilogHDL語言,于是成立了OVI(OpenVerilogInternational)組織來負(fù)責(zé)VerilogHDL語言的發(fā)展。基于VerilogHDL的優(yōu)越性,IEEE于1995年制定了VerilogHDL的IEEE標(biāo)準(zhǔn),即VerilogHDL1364-1995(在本書的附錄中有該標(biāo)準(zhǔn)的中文翻譯,可供同學(xué)參考)。下面兩幅圖顯示出Verilog的發(fā)展歷史和將來。2.3.VerilogHDL和VHDL的比較 VerilogHDL和VHDL都是用于邏輯設(shè)計(jì)的硬件描述語言,并且都已成為IEEE標(biāo)準(zhǔn)。VHDL是在1987年成為IEEE標(biāo)準(zhǔn),VerilogHDL則在1995年才正式成為IEEE標(biāo)準(zhǔn)。之所以VHDL比VerilogHDL早成為IEEE標(biāo)準(zhǔn),這是因?yàn)閂HDL是美國軍方組織開發(fā)的,而VerilogHDL則是從一個(gè)普通的民間公司的私有財(cái)產(chǎn)轉(zhuǎn)化而來,基于VerilogHDL的優(yōu)越性,才成為的IEEE標(biāo)準(zhǔn),因而有更強(qiáng)的生命力。VHDL其英文全名為VHSICHardwareDescriptionLanguage,而VHSIC則是VeryHighSpeedIntegeratedCircuit的縮寫詞,意為甚高速集成電路,故VHDL其準(zhǔn)確的中文譯名為甚高速集成電路的硬件描述語言。VerilogHDL和VHDL作為描述硬件電路設(shè)計(jì)的語言,其共同的特點(diǎn)在于:能形式化地抽象表示電路的結(jié)構(gòu)和行為、支持邏輯設(shè)計(jì)中層次與領(lǐng)域的描述、可借用高級(jí)語言的精巧結(jié)構(gòu)來簡化電路的描述、具有電路仿真與驗(yàn)證機(jī)制以保證設(shè)計(jì)的正確性、支持電路描述由高層到低層的綜合轉(zhuǎn)換、硬件描述與實(shí)現(xiàn)工藝無關(guān)(有關(guān)工藝參數(shù)可通過語言提供的屬性包括進(jìn)去)、便于文檔管理、易于理解和設(shè)計(jì)重用。但是VerilogHDL和VHDL又各有其自己的特點(diǎn)。由于VerilogHDL早在1983年就已推出,至今已有十三年的應(yīng)用歷史,因而VerilogHDL擁有更廣泛的設(shè)計(jì)群體,成熟的資源也遠(yuǎn)比VHDL豐富。與VHDL相比VerilogHDL的最大優(yōu)點(diǎn)是:它是一種非常容易掌握的硬件描述語言,只要有C語言的編程基礎(chǔ),通過二十學(xué)時(shí)的學(xué)習(xí),再加上一段實(shí)際操作,一般同學(xué)可在二至三個(gè)月內(nèi)掌握這種設(shè)計(jì)技術(shù)。而掌握VHDL設(shè)計(jì)技術(shù)就比較困難。這是因?yàn)閂HDL不很直觀,需要有Ada編程基礎(chǔ),一般認(rèn)為至少需要半年以上的專業(yè)培訓(xùn),才能掌握VHDL的基本設(shè)計(jì)技術(shù)。目前版本的VerilogHDL和VHDL在行為級(jí)抽象建模的覆蓋范圍方面也有所不同。一般認(rèn)為VerilogHDL在系統(tǒng)級(jí)抽象方面比VHDL略差一些,而在門級(jí)開關(guān)電路描述方面比VHDL強(qiáng)得多。下面圖1-3是VerilogHDL和VHDL建模能力的比較圖示供讀者參考:

但這兩種語言也是在不斷的完善過程中,因此VerilogHDL作為學(xué)習(xí)HDL設(shè)計(jì)方法的入門和基礎(chǔ)是比較合適的。學(xué)習(xí)掌握VerilogHDL建模、仿真和綜合技術(shù)不僅可以使同學(xué)們對(duì)數(shù)字電路設(shè)計(jì)技術(shù)有更進(jìn)一步的了解,而且可以為以后學(xué)習(xí)高級(jí)的系統(tǒng)綜合打下堅(jiān)實(shí)的基礎(chǔ)。2.4.VerilogHDL目前的應(yīng)用情況和適用的設(shè)計(jì)幾年以來,EDA界一直對(duì)在數(shù)字邏輯設(shè)計(jì)中究竟采用哪一種硬件描述語言爭論不休,目前的情況是兩者不相上下。在美國,在高層邏輯電路設(shè)計(jì)領(lǐng)域VerilogHDL和VHDL的應(yīng)用比率是60%和40%,在臺(tái)灣省各為50%,在中國大陸目前由于VerilogHDL和VHDL的使用才剛剛開始,具體應(yīng)用比率還沒有統(tǒng)計(jì)。VerilogHDL是專門為復(fù)雜數(shù)字邏輯電路和系統(tǒng)的設(shè)計(jì)仿真而開發(fā)的,本身就非常適合復(fù)雜數(shù)字邏輯電路和系統(tǒng)的仿真和綜合。由于VerilogHDL在其門級(jí)描述的底層,也就是在晶體管開關(guān)的描述方面比VHDL有強(qiáng)得多得功能,所以即使是VHDL的設(shè)計(jì)環(huán)境,在底層實(shí)質(zhì)上也是由VerilogHDL描述的器件庫所支持的。另外目前VerilogHDL-A標(biāo)準(zhǔn)還支持模擬電路的描述,1998年即將通過的VerilogHDL新標(biāo)準(zhǔn),將把VerilogHDL-A并入VerilogHDL新標(biāo)準(zhǔn),使其不僅支持?jǐn)?shù)字邏輯電路的描述還支持模擬電路的描述,因此在混合信號(hào)的電路系統(tǒng)的設(shè)計(jì)中,它必將會(huì)有更廣泛的應(yīng)用。在亞微米和深亞微米ASIC和高密度FPGA已成為電子設(shè)計(jì)主流的今天,VerilogHDL的發(fā)展前景是非常遠(yuǎn)大的。作者本人的意見是:若要推廣采用硬件描述語言的設(shè)計(jì)方法,則應(yīng)首先從推廣VerilogHDL開始,然后再推廣VHDL。VerilogHDL較為適合系統(tǒng)級(jí)(System)、算法級(jí)(Alogrithem)、寄存器傳輸級(jí)(RTL)、邏輯級(jí)(Logic)、門級(jí)(Gate)、電路開關(guān)級(jí)(Switch)設(shè)計(jì),而對(duì)于特大型(幾百萬門級(jí)以上)的系統(tǒng)級(jí)(System)設(shè)計(jì),則VHDL更為適合,由于這兩種HDL語言還在不斷地發(fā)展過程中,它們都會(huì)逐步地完善自己。2.5.采用VerilogHDL設(shè)計(jì)復(fù)雜數(shù)字電路的優(yōu)點(diǎn)2.5.1傳統(tǒng)設(shè)計(jì)方法--電路原理圖輸入法幾十年前,當(dāng)時(shí)所做的復(fù)雜數(shù)字邏輯電路及系統(tǒng)的設(shè)計(jì)規(guī)模比較小也比較簡單,其中所用到的FPGA或ASIC設(shè)計(jì)工作往往只能采用廠家提供的專用電路圖輸入工具來進(jìn)行。為了滿足設(shè)計(jì)性能指標(biāo),工程師往往需要花好幾天或更長的時(shí)間進(jìn)行艱苦的手工布線。工程師還得非常熟悉所選器件的內(nèi)部結(jié)構(gòu)和外部引線特點(diǎn),才能達(dá)到設(shè)計(jì)要求。這種低水平的設(shè)計(jì)方法大大延長了設(shè)計(jì)周期。近年來,F(xiàn)PGA和ASIC的設(shè)計(jì)在規(guī)模和復(fù)雜度方面不斷取得進(jìn)展,而對(duì)邏輯電路及系統(tǒng)的設(shè)計(jì)的時(shí)間要求卻越來越短。這些因素促使設(shè)計(jì)人員采用高水準(zhǔn)的設(shè)計(jì)工具,如:硬件描述語言(VerilogHDL或VHDL)來進(jìn)行設(shè)計(jì)。2.5.2.VerilogHDL設(shè)計(jì)法與傳統(tǒng)的電路原理圖輸入法的比較如2.5.1.所述采用電路原理圖輸入法進(jìn)行設(shè)計(jì),具有設(shè)計(jì)的周期長,需要專門的設(shè)計(jì)工具,需手工布線等缺陷。而采用VerilogHDL輸入法時(shí),由于VerilogHDL的標(biāo)準(zhǔn)化,可以很容易地把完成的設(shè)計(jì)移植到不同的廠家的不同的芯片中去,并在不同規(guī)模應(yīng)用時(shí)可以較容易地作修改。這不僅是因?yàn)橛肰erilogHDL所完成的設(shè)計(jì),它的信號(hào)位數(shù)是很容易改變的,可以很容易地對(duì)它進(jìn)行修改,來適應(yīng)不同規(guī)模的應(yīng)用,在仿真驗(yàn)證時(shí),仿真測試矢量還可以用同一種描述語言來完成,而且還因?yàn)椴捎肰erilogHDL綜合器生成的數(shù)字邏輯是一種標(biāo)準(zhǔn)的電子設(shè)計(jì)互換格式(EDIF)文件,獨(dú)立于所采用的實(shí)現(xiàn)工藝。有關(guān)工藝參數(shù)的描述可以通過VerilogHDL提供的屬性包括進(jìn)去,然后利用不同廠家的布局布線工具,在不同工藝的芯片上實(shí)現(xiàn)。采用VerilogHDL輸入法最大的優(yōu)點(diǎn)是其與工藝無關(guān)性。這使得工程師在功能設(shè)計(jì)、邏輯驗(yàn)證階段,可以不必過多考慮門級(jí)及工藝實(shí)現(xiàn)的具體細(xì)節(jié),只需要利用系統(tǒng)設(shè)計(jì)時(shí)對(duì)芯片的要求,施加不同的約束條件,即可設(shè)計(jì)出實(shí)際電路。實(shí)際上這是利用了計(jì)算機(jī)的巨大能力在EDA工具的幫助下,把邏輯驗(yàn)證與具體工藝庫匹配、布線及時(shí)延計(jì)算分成不同的階段來實(shí)現(xiàn)從而減輕了人們的繁瑣勞動(dòng)。2.5.3.VerilogHDL的標(biāo)準(zhǔn)化與軟核的重用VerilogHDL是在1983年由GATEWAY公司首先開發(fā)成功的,經(jīng)過諸多改進(jìn),于1995年11月正式被批準(zhǔn)為IEEE標(biāo)準(zhǔn)1364。VerilogHDL的標(biāo)準(zhǔn)化大大加快了VerilogHDL的推廣和發(fā)展。由于VerilogHDL設(shè)計(jì)方法的與工藝無關(guān)性,因而大大提高了VerilogHDL模型的可重用性。我們把功能經(jīng)過驗(yàn)證的、可綜合的、實(shí)現(xiàn)后電路結(jié)構(gòu)總門數(shù)在5000門以上的VerilogHDL模型稱之為“軟核”(SoftCore)。而把由軟核構(gòu)成的器件稱為虛擬器件,在新電路的研制過程中,軟核和虛擬器件可以很容易地借助EDA綜合工具與其它外部邏輯結(jié)合為一體。這樣,軟核和虛擬器件的重用性就可大大縮短設(shè)計(jì)周期,加快了復(fù)雜電路的設(shè)計(jì)。目前國際上有一個(gè)叫作虛擬接口聯(lián)盟的組織(VirtualSocketInterfaceAlliance)來協(xié)調(diào)這方面的工作。2.5.4.軟核、固核和硬核的概念以及它們的重用上一節(jié)中我們已介紹了軟核的概念,下面再介紹一下固核(FirmCore)和硬核(HardCore)的概念。我們把在某一種現(xiàn)場可編程門陣列(FPGA)器件上實(shí)現(xiàn)的,經(jīng)驗(yàn)證是正確的總門數(shù)在5000門以上電路結(jié)構(gòu)編碼文件,稱之為“固核”。我們把在某一種專用半導(dǎo)體集成電路工藝的(ASIC)器件上實(shí)現(xiàn)的經(jīng)驗(yàn)證是正確的總門數(shù)在5000門以上的電路結(jié)構(gòu)掩膜,稱之為“硬核”。顯而易見,在具體實(shí)現(xiàn)手段和工藝技術(shù)尚未確定的邏輯設(shè)計(jì)階段,軟核具有最大的靈活性,它可以很容易地借助EDA綜合工具與其它外部邏輯結(jié)合為一體。當(dāng)然,由于實(shí)現(xiàn)技術(shù)的不確定性,有可能要作一些改動(dòng)以適應(yīng)相應(yīng)的工藝。相比之下固核和硬核與其它外部邏輯結(jié)合為一體的靈活性要差得多,特別是電路實(shí)現(xiàn)工藝技術(shù)改變時(shí)更是如此。而近年來電路實(shí)現(xiàn)工藝技術(shù)的發(fā)展是相當(dāng)迅速的,為了邏輯電路設(shè)計(jì)成果的積累,和更快更好地設(shè)計(jì)更大規(guī)模的電路,發(fā)展軟核的設(shè)計(jì)和推廣軟核的重用技術(shù)是非常有必要的。我們新一代的數(shù)字邏輯電路設(shè)計(jì)師必須掌握這方面的知識(shí)和技術(shù)。2.6.采用硬件描述語言(VerilogHDL)的設(shè)計(jì)流程簡介2.6.1.自頂向下(Top-Down)設(shè)計(jì)的基本概念現(xiàn)代集成電路制造工藝技術(shù)的改進(jìn),使得在一個(gè)芯片上集成數(shù)十乃至數(shù)百萬個(gè)器件成為可能,但我們很難設(shè)想僅由一個(gè)設(shè)計(jì)師獨(dú)立設(shè)計(jì)如此大規(guī)模的電路而不出現(xiàn)錯(cuò)誤。利用層次化、結(jié)構(gòu)化的設(shè)計(jì)方法,一個(gè)完整的硬件設(shè)計(jì)任務(wù)首先由總設(shè)計(jì)師劃分為若干個(gè)可操作的模塊,編制出相應(yīng)的模型(行為的或結(jié)構(gòu)的),通過仿真加以驗(yàn)證后,再把這些模塊分配給下一層的設(shè)計(jì)師,這就允許多個(gè)設(shè)計(jì)者同時(shí)設(shè)計(jì)一個(gè)硬件系統(tǒng)中的不同模塊,其中每個(gè)設(shè)計(jì)者負(fù)責(zé)自己所承擔(dān)的部分;而由上一層設(shè)計(jì)師對(duì)其下層設(shè)計(jì)者完成的設(shè)計(jì)用行為級(jí)上層模塊對(duì)其所做的設(shè)計(jì)進(jìn)行驗(yàn)證。圖1-6-1為自頂向下(TOP-DOWN)的示意圖,以設(shè)計(jì)樹的形式繪出。自頂向下的設(shè)計(jì)(即TOP_DOWN設(shè)計(jì))是從系統(tǒng)級(jí)開始,把系統(tǒng)劃分為基本單元,然后再把每個(gè)基本單元?jiǎng)澐譃橄乱粚哟蔚幕締卧恢边@樣做下去,直到可以直接用EDA元件庫中的元件來實(shí)現(xiàn)為止。對(duì)于設(shè)計(jì)開發(fā)整機(jī)電子產(chǎn)品的單位和個(gè)人來說,新產(chǎn)品的開發(fā)總是從系統(tǒng)設(shè)計(jì)入手,先進(jìn)行方案的總體論證、功能描述、任務(wù)和指標(biāo)的分配。隨著系統(tǒng)變得復(fù)雜和龐大,特別需要在樣機(jī)問世之前,對(duì)產(chǎn)品的全貌有一定的預(yù)見性。目前,EDA技術(shù)的發(fā)展使得設(shè)計(jì)師有可能實(shí)現(xiàn)真正的自頂向下的設(shè)計(jì)。2.6.2.層次管理的基本概念復(fù)雜數(shù)字邏輯電路和系統(tǒng)的層次化、結(jié)構(gòu)化設(shè)計(jì)隱含著硬件設(shè)計(jì)方案的逐次分解。在設(shè)計(jì)過程中的任意層次,硬件至少有一種描述形式。硬件的描述特別是行為描述通常稱為行為建模。在集成電路設(shè)計(jì)的每一層次,硬件可以分為一些模塊,該層次的硬件結(jié)構(gòu)由這些模塊的互連描述,該層次的硬件的行為由這些模塊的行為描述。這些模塊稱為該層次的基本單元。而該層次的基本單元又由下一層次的基本單元互連而成。如此下去,完整的硬件設(shè)計(jì)就可以由圖2-6-1所示的設(shè)計(jì)樹描述。在這個(gè)設(shè)計(jì)樹上,節(jié)點(diǎn)對(duì)應(yīng)著該層次上基本單元的行為描述,樹枝對(duì)應(yīng)著基本單元的結(jié)構(gòu)分解。在不同的層次都可以進(jìn)行仿真以對(duì)設(shè)計(jì)思想進(jìn)行驗(yàn)證。EDA工具提供了有效的手段來管理錯(cuò)綜復(fù)雜的層次,即可以很方便地查看某一層次某模塊的源代碼或電路圖以改正仿真時(shí)發(fā)現(xiàn)的錯(cuò)誤。2.6.3.具體模塊的設(shè)計(jì)編譯和仿真的過程在不同的層次做具體模塊的設(shè)計(jì)所用的方法也有所不同,在高層次上往往編寫一些行為級(jí)的模塊通過仿真加以驗(yàn)證,其主要目的是系統(tǒng)性能的總體考慮和各模塊的指標(biāo)分配,并非具體電路的實(shí)現(xiàn)。因而綜合及其以后的步驟往往不需進(jìn)行。而當(dāng)設(shè)計(jì)的層次比較接近底層時(shí)行為描述往往需要用電路邏輯來實(shí)現(xiàn),這時(shí)的模塊不僅需要通過仿真加以驗(yàn)證,還需進(jìn)行綜合、優(yōu)化、布線和后仿真。總之具體電路是從底向上逐步實(shí)現(xiàn)的。EDA工具往往不僅支持HDL描述也支持電路圖輸入,有效地利用這兩種方法是提高設(shè)計(jì)效率的辦法之一。下面的流程圖簡要地說明了模塊的編譯和測試過程:從上圖可以看出,模塊設(shè)計(jì)流程主要由兩大主要功能部分組成:設(shè)計(jì)開發(fā):即從編寫設(shè)計(jì)文件-->綜合到布局布線-->投片生成這樣一系列步驟。設(shè)計(jì)驗(yàn)證:也就是進(jìn)行各種仿真的一系列步驟,如果在仿真過程中發(fā)現(xiàn)問題就返回設(shè)計(jì)輸入進(jìn)行修改。2.6.4.對(duì)應(yīng)具體工藝器件的優(yōu)化、映象、和布局布線 由于各種ASIC和FPFA器件的工藝各不相同,因而當(dāng)用不同廠家的不同器件來實(shí)現(xiàn)已驗(yàn)證的邏輯網(wǎng)表(EDIF文件)時(shí),就需要不同的基本單元庫與布線延遲模型與之對(duì)應(yīng)才能進(jìn)行準(zhǔn)確的優(yōu)化、映象、和布局布線?;締卧獛炫c布線延遲模型由熟悉本廠工藝的工程師提供,再由EDA廠商的工程師編入相應(yīng)的處理程序,而邏輯電路設(shè)計(jì)師只需用一文件說明所用的工藝器件和約束條件,EDA工具就會(huì)自動(dòng)地根據(jù)這一文件選擇相應(yīng)的庫和模型進(jìn)行準(zhǔn)確的處理從而大大提高設(shè)計(jì)效率。2.7.小結(jié)采用VerilogHDL設(shè)計(jì)方法比采用電路圖輸入的方法更有優(yōu)越性,這就是為什么美國等先進(jìn)工業(yè)國家在進(jìn)入九十年代以后紛紛采用HDL設(shè)計(jì)方法的原因。在兩種符合IEEE標(biāo)準(zhǔn)的硬件描述語言中,VerilogHDL與VHDL相比更加基礎(chǔ)、更易學(xué)習(xí),掌握HDL設(shè)計(jì)方法應(yīng)從學(xué)習(xí)VerilogHDL設(shè)計(jì)方法開始。VerilogHDL可用于復(fù)雜數(shù)字邏輯電路和系統(tǒng)的總體仿真、子系統(tǒng)仿真和具體電路綜合等各個(gè)設(shè)計(jì)階段。由于TOP_DOWN的設(shè)計(jì)方法是首先從系統(tǒng)設(shè)計(jì)入手,從頂層進(jìn)行功能劃分和結(jié)構(gòu)設(shè)計(jì)。系統(tǒng)的總體仿真是頂層進(jìn)行功能劃分的重要環(huán)節(jié),這時(shí)的設(shè)計(jì)是與工藝無關(guān)的。由于設(shè)計(jì)的主要仿真和調(diào)試過程是在高層次完成的所以能夠早期發(fā)現(xiàn)結(jié)構(gòu)設(shè)計(jì)上的錯(cuò)誤,避免設(shè)計(jì)工作的浪費(fèi),同時(shí)也減少了邏輯仿真的工作量。自頂向下的設(shè)計(jì)方法方便了從系統(tǒng)級(jí)劃分和管理整個(gè)項(xiàng)目,使得幾十萬門甚至幾百萬門規(guī)模的復(fù)雜數(shù)字電路的設(shè)計(jì)成為可能,并可減少設(shè)計(jì)人員,避免不必要的重復(fù)設(shè)計(jì),提高了設(shè)計(jì)的一次成功率。從底向上的設(shè)計(jì)在某種意義上講可以看作上述TOP_DOWN設(shè)計(jì)的逆過程。雖然設(shè)計(jì)也是從系統(tǒng)級(jí)開始,即從設(shè)計(jì)樹的樹根開始對(duì)設(shè)計(jì)進(jìn)行逐次劃分,但劃分時(shí)首先考慮的是單元是否存在,即設(shè)計(jì)劃分過程必須從存在的基本單元出發(fā),設(shè)計(jì)樹最末枝上的單元要么是已經(jīng)制造出的單元,要么是其它項(xiàng)目已開發(fā)好的單元或者是可外購得到的單元。自頂向下的設(shè)計(jì)過程中在每一層次劃分時(shí)都要對(duì)某些目標(biāo)作優(yōu)化,TOP_DOWN的設(shè)計(jì)過程是理想的設(shè)計(jì)過程,它的缺點(diǎn)是得到的最小單元不標(biāo)準(zhǔn),制造成本可能很高。從底向上的設(shè)計(jì)過程全采用標(biāo)準(zhǔn)基本單元,通常比較經(jīng)濟(jì),但有時(shí)可能不能滿足一些特定的指標(biāo)要求。復(fù)雜數(shù)字邏輯電路和系統(tǒng)的設(shè)計(jì)過程通常是這兩種設(shè)計(jì)方法的結(jié)合,設(shè)計(jì)時(shí)需要考慮多個(gè)目標(biāo)的綜合平衡。2.8思考題1.什么是硬件描述語言?它的主要作用是什么?目前世界上符合IEEE標(biāo)準(zhǔn)的硬件描述語言有哪兩種?它門各有什么特點(diǎn)?什么情況下需要采用硬件描述語言的設(shè)計(jì)方法?采用硬件描述語言設(shè)計(jì)方法的優(yōu)點(diǎn)是什么?有什么缺點(diǎn)?簡單敘述一下利用EDA工具并采用硬件描述語言(HDL)的設(shè)計(jì)方法和流程。硬件描述語言可以用哪兩種方式參與復(fù)雜數(shù)字電路的設(shè)計(jì)?用硬件描述語言設(shè)計(jì)的數(shù)字系統(tǒng)需要經(jīng)過哪些步驟才能與具體的電路相對(duì)應(yīng)?為什么說用硬件描述語言設(shè)計(jì)的數(shù)字邏輯系統(tǒng)具有最大的靈活性可以映射到任何工藝的電路上?軟核是什么?虛擬器件是什么?它們的作用是什么?固核是什么?硬核是什么?與軟核相比它們各有什么優(yōu)缺點(diǎn)?簡述TOP-DOWN設(shè)計(jì)方法和硬件描述語言的關(guān)系。第三章VerilogHDL的基本語法前言VerilogHDL是一種用于數(shù)字邏輯電路設(shè)計(jì)的語言。用VerilogHDL描述的電路設(shè)計(jì)就是該電路的VerilogHDL模型。VerilogHDL既是一種行為描述的語言也是一種結(jié)構(gòu)描述的語言。這也就是說,既可以用電路的功能描述也可以用元器件和它們之間的連接來建立所設(shè)計(jì)電路的VerilogHDL模型。Verilog模型可以是實(shí)際電路的不同級(jí)別的抽象。這些抽象的級(jí)別和它們對(duì)應(yīng)的模型類型共有以下五種:系統(tǒng)級(jí)(system):用高級(jí)語言結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)模塊的外部性能的模型。算法級(jí)(algorithm):用高級(jí)語言結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)算法的模型。RTL級(jí)(RegisterTransferLevel):描述數(shù)據(jù)在寄存器之間流動(dòng)和如何處理這些數(shù)據(jù)的模型。門級(jí)(gate-level):描述邏輯門以及邏輯門之間的連接的模型。開關(guān)級(jí)(switch-level):描述器件中三極管和儲(chǔ)存節(jié)點(diǎn)以及它們之間連接的模型。 一個(gè)復(fù)雜電路系統(tǒng)的完整VerilogHDL模型是由若干個(gè)VerilogHDL模塊構(gòu)成的,每一個(gè)模塊又可以由若干個(gè)子模塊構(gòu)成。其中有些模塊需要綜合成具體電路,而有些模塊只是與用戶所設(shè)計(jì)的模塊交互的現(xiàn)存電路或激勵(lì)信號(hào)源。利用VerilogHDL語言結(jié)構(gòu)所提供的這種功能就可以構(gòu)造一個(gè)模塊間的清晰層次結(jié)構(gòu)來描述極其復(fù)雜的大型設(shè)計(jì),并對(duì)所作設(shè)計(jì)的邏輯電路進(jìn)行嚴(yán)格的驗(yàn)證。VerilogHDL行為描述語言作為一種結(jié)構(gòu)化和過程性的語言,其語法結(jié)構(gòu)非常適合于算法級(jí)和RTL級(jí)的模型設(shè)計(jì)。這種行為描述語言具有以下功能:可描述順序執(zhí)行或并行執(zhí)行的程序結(jié)構(gòu)。用延遲表達(dá)式或事件表達(dá)式來明確地控制過程的啟動(dòng)時(shí)間。通過命名的事件來觸發(fā)其它過程里的激活行為或停止行為。提供了條件、if-else、case、循環(huán)程序結(jié)構(gòu)。提供了可帶參數(shù)且非零延續(xù)時(shí)間的任務(wù)(task)程序結(jié)構(gòu)。提供了可定義新的操作符的函數(shù)結(jié)構(gòu)(function)。提供了用于建立表達(dá)式的算術(shù)運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符。VerilogHDL語言作為一種結(jié)構(gòu)化的語言也非常適合于門級(jí)和開關(guān)級(jí)的模型設(shè)計(jì)。因其結(jié)構(gòu)化的特點(diǎn)又使它具有以下功能:提供了完整的一套組合型原語(primitive);提供了雙向通路和電阻器件的原語;可建立MOS器件的電荷分享和電荷衰減動(dòng)態(tài)模型。VerilogHDL的構(gòu)造性語句可以精確地建立信號(hào)的模型。這是因?yàn)樵赩erilogHDL中,提供了延遲和輸出強(qiáng)度的原語來建立精確程度很高的信號(hào)模型。信號(hào)值可以有不同的的強(qiáng)度,可以通過設(shè)定寬范圍的模糊值來降低不確定條件的影響。VerilogHDL作為一種高級(jí)的硬件描述編程語言,有著類似C語言的風(fēng)格。其中有許多語句如:if語句、case語句等和C語言中的對(duì)應(yīng)語句十分相似。如果讀者已經(jīng)掌握C語言編程的基礎(chǔ),那么學(xué)習(xí)VerilogHDL并不困難,我們只要對(duì)VerilogHDL某些語句的特殊方面著重理解,并加強(qiáng)上機(jī)練習(xí)就能很好地掌握它,利用它的強(qiáng)大功能來設(shè)計(jì)復(fù)雜的數(shù)字邏輯電路。下面我們將對(duì)VerilogHDL中的基本語法逐一加以介紹。3.1.簡單的VerilogHDL模塊3.1.1.簡單的VerilogHDL程序介紹下面先介紹幾個(gè)簡單的VerilogHDL程序,然后從中分析VerilogHDL程序的特性。例[3.1.1]:moduleadder(count,sum,a,b,cin);input[2:0]a,b;inputcin;outputcount;output[2:0]sum;assign{count,sum}=a+b+cin;endmodule這個(gè)例子通過連續(xù)賦值語句描述了一個(gè)名為adder的三位加法器可以根據(jù)兩個(gè)三比特?cái)?shù)a、b和進(jìn)位(cin)計(jì)算出和(sum)和進(jìn)位(count)。從例子中可以看出整個(gè)VerilogHDL程序是嵌套在module和endmodule聲明語句里的。例[3.1.2]:modulecompare(equal,a,b);outputequal;//聲明輸出信號(hào)equalinput[1:0]a,b;//聲明輸入信號(hào)a,bassignequal=(a==b)?1:0; /*如果a、b兩個(gè)輸入信號(hào)相等,輸出為1。否則為0*/endmodule這個(gè)程序通過連續(xù)賦值語句描述了一個(gè)名為compare的比較器。對(duì)兩比特?cái)?shù)a、b進(jìn)行比較,如a與b相等,則輸出equal為高電平,否則為低電平。在這個(gè)程序中,/**/和//表示注釋部分,注釋只是為了方便程序員理解程序,對(duì)編譯是不起作用的。例[3.1.3]:moduletrist2(out,in,enable);outputout;inputin,enable;bufif1mybuf(out,in,enable);endmodule這個(gè)程序描述了一個(gè)名為trist2的三態(tài)驅(qū)動(dòng)器。程序通過調(diào)用一個(gè)在Verilog語言庫中現(xiàn)存的三態(tài)驅(qū)動(dòng)器實(shí)例元件bufif1來實(shí)現(xiàn)其功能。例[3.1.4]: moduletrist1(out,in,enable);outputout;inputin,enable;mytritri_inst(out,in,enable);//調(diào)用由mytri模塊定義的實(shí)例元件tri_instendmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?in:'bz;endmodule這個(gè)程序例子通過另一種方法描述了一個(gè)三態(tài)門。在這個(gè)例子中存在著兩個(gè)模塊。模塊trist1調(diào)用由模塊mytri定義的實(shí)例元件tri_inst。模塊trist1是頂層模塊。模塊mytri則被稱為子模塊。 通過上面的例子可以看到:VerilogHDL程序是由模塊構(gòu)成的。每個(gè)模塊的內(nèi)容都是嵌在module和endmodule兩個(gè)語句之間。每個(gè)模塊實(shí)現(xiàn)特定的功能。模塊是可以進(jìn)行層次嵌套的。正因?yàn)槿绱?才可以將大型的數(shù)字電路設(shè)計(jì)分割成不同的小模塊來實(shí)現(xiàn)特定的功能,最后通過頂層模塊調(diào)用子模塊來實(shí)現(xiàn)整體功能。每個(gè)模塊要進(jìn)行端口定義,并說明輸入輸出口,然后對(duì)模塊的功能進(jìn)行行為邏輯描述。VerilogHDL程序的書寫格式自由,一行可以寫幾個(gè)語句,一個(gè)語句也可以分寫多行。除了endmodule語句外,每個(gè)語句和數(shù)據(jù)定義的最后必須有分號(hào)??梢杂?**/和//對(duì)VerilogHDL程序的任何部分作注釋。一個(gè)好的,有使用價(jià)值的源程序都應(yīng)當(dāng)加上必要的注釋,以增強(qiáng)程序的可讀性和可維護(hù)性。3.1.2.模塊的結(jié)構(gòu)Verilog的基本設(shè)計(jì)單元是“模塊”(block)。一個(gè)模塊是由兩部分組成的,一部分描述接口,另一部分描述邏輯功能,即定義輸入是如何影響輸出的。下面舉例說明:請(qǐng)看上面的例子,程序模塊旁邊有一個(gè)電路圖的符號(hào)。在許多方面,程序模塊和電路圖符號(hào)是一致的,這是因?yàn)殡娐穲D符號(hào)的引腳也就是程序模塊的接口。而程序模塊描述了電路圖符號(hào)所實(shí)現(xiàn)的邏輯功能。上面的Verilog設(shè)計(jì)中,模塊中的第二、第三行說明接口的信號(hào)流向,第四、第五行說明了模塊的邏輯功能。以上就是設(shè)計(jì)一個(gè)簡單的Verilog程序模塊所需的全部內(nèi)容。從上面的例子可以看出,Verilog結(jié)構(gòu)完全嵌在module和endmodule聲明語句之間,每個(gè)Verilog程序包括四個(gè)主要部分:端口定義、I/O說明、內(nèi)部信號(hào)聲明、功能定義。3.1.3.模塊的端口定義模塊的端口聲明了模塊的輸入輸出口。其格式如下:module 模塊名(口1,口2,口3,口4,………);3.1.4.模塊內(nèi)容模塊的內(nèi)容包括I/O說明、內(nèi)部信號(hào)聲明、功能定義。I/O說明的格式如下:輸入口: input端口名1,端口名2,………,端口名i;//(共有i個(gè)輸入口)輸出口: output端口名1,端口名2,………,端口名j;//(共有j個(gè)輸出口)I/O說明也可以寫在端口聲明語句里。其格式如下:modulemodule_name(inputport1,inputport2,…outputport1,outputport2…);內(nèi)部信號(hào)說明:在模塊內(nèi)用到的和與端口有關(guān)的wire和reg變量的聲明。如:reg[width-1:0]R變量1,R變量2。。。。;wire[width-1:0]W變量1,W變量2。。。。;………..功能定義:模塊中最重要的部分是邏輯功能定義部分。有三種方法可在模塊中產(chǎn)生邏輯。1).用“assign”聲明語句如: assigna=b&c;這種方法的句法很簡單,只需寫一個(gè)“assign”,后面再加一個(gè)方程式即可。例子中的方程式描述了一個(gè)有兩個(gè)輸入的與門。2).用實(shí)例元件如: andand_inst(q,a,b);采用實(shí)例元件的方法象在電路圖輸入方式下,調(diào)入庫元件一樣。鍵入元件的名字和相連的引腳即可,表示在設(shè)計(jì)中用到一個(gè)跟與門(and)一樣的名為and_inst的與門,其輸入端為a,b,輸出為q。要求每個(gè)實(shí)例元件的名字必須是唯一的,以避免與其他調(diào)用與門(and)的實(shí)例混淆。3).用“always”塊如:always@(posedgeclkorposedgeclr)beginif(clr)q<=0;elseif(en)q<=d;end采用“assign”語句是描述組合邏輯最常用的方法之一。而“always”塊既可用于描述組合邏輯也可描述時(shí)序邏輯。上面的例子用“always”塊生成了一個(gè)帶有異步清除端的D觸發(fā)器?!癮lways”塊可用很多種描述手段來表達(dá)邏輯,例如上例中就用了if...else語句來表達(dá)邏輯關(guān)系。如按一定的風(fēng)格來編寫“always”塊,可以通過綜合工具把源代碼自動(dòng)綜合成用門級(jí)結(jié)構(gòu)表示的組合或時(shí)序邏輯電路。注意:如果用Verilog模塊實(shí)現(xiàn)一定的功能,首先應(yīng)該清楚哪些是同時(shí)發(fā)生的,哪些是順序發(fā)生的。上面三個(gè)例子分別采用了“assign”語句、實(shí)例元件和“always”塊。這三個(gè)例子描述的邏輯功能是同時(shí)執(zhí)行的。也就是說,如果把這三項(xiàng)寫到一個(gè)VeriIog模塊文件中去,它們的次序不會(huì)影響邏輯實(shí)現(xiàn)的功能。這三項(xiàng)是同時(shí)執(zhí)行的,也就是并發(fā)的。然而,在“always”模塊內(nèi),邏輯是按照指定的順序執(zhí)行的。“always”塊中的語句稱為“順序語句”,因?yàn)樗鼈兪琼樞驁?zhí)行的。請(qǐng)注意,兩個(gè)或更多的“always”模塊也是同時(shí)執(zhí)行的,但是模塊內(nèi)部的語句是順序執(zhí)行的??匆幌隆癮lways”內(nèi)的語句,你就會(huì)明白它是如何實(shí)現(xiàn)功能的。if..else…if必須順序執(zhí)行,否則其功能就沒有任何意義。如果else語句在if語句之前執(zhí)行,功能就會(huì)不符合要求!為了能實(shí)現(xiàn)上述描述的功能,“always”模塊內(nèi)部的語句將按照書寫的順序執(zhí)行。3.2.數(shù)據(jù)類型及其常量、變量VerilogHDL中總共有十九種數(shù)據(jù)類型,數(shù)據(jù)類型是用來表示數(shù)字電路硬件中的數(shù)據(jù)儲(chǔ)存和傳送元素的。在本教材中我們先只介紹四個(gè)最基本的數(shù)據(jù)類型,它們是:reg型、wire型、integer型、parameter型其它數(shù)據(jù)類型在后面的章節(jié)里逐步介紹,同學(xué)們也可以查閱附錄中VerilogHDL語法參考書的有關(guān)章節(jié)逐步掌握。其它的類型如下:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型。這些數(shù)據(jù)類型除time型外都與基本邏輯單元建庫有關(guān),與系統(tǒng)設(shè)計(jì)沒有很大的關(guān)系。在一般電路設(shè)計(jì)自動(dòng)化的環(huán)境下,仿真用的基本部件庫是由半導(dǎo)體廠家和EDA工具廠家共同提供的。系統(tǒng)設(shè)計(jì)工程師不必過多地關(guān)心門級(jí)和開關(guān)級(jí)的VerilogHDL語法現(xiàn)象。VerilogHDL語言中也有常量和變量之分。它們分別屬于以上這些類型。下面就最常用的幾種進(jìn)行介紹。3.2.1.常量在程序運(yùn)行過程中,其值不能被改變的量稱為常量。下面首先對(duì)在VerilogHDL語言中使用的數(shù)字及其表示方式進(jìn)行介紹。一.?dāng)?shù)字整數(shù):在VerilogHDL中,整型常量即整常數(shù)有以下四種進(jìn)制表示形式:二進(jìn)制整數(shù)(b或B)十進(jìn)制整數(shù)(d或D)十六進(jìn)制整數(shù)(h或H)八進(jìn)制整數(shù)(o或O)數(shù)字表達(dá)方式有以下三種:<位寬><進(jìn)制><數(shù)字>這是一種全面的描述方式。<進(jìn)制><數(shù)字>在這種描述方式中,數(shù)字的位寬采用缺省位寬(這由具體的機(jī)器系統(tǒng)決定,但至少32位)。<數(shù)字>在這種描述方式中,采用缺省進(jìn)制十進(jìn)制。在表達(dá)式中,位寬指明了數(shù)字的精確位數(shù)。例如:一個(gè)4位二進(jìn)制數(shù)的數(shù)字的位寬為4,一個(gè)4位十六進(jìn)制數(shù)的數(shù)字的位寬為16(因?yàn)槊繂蝹€(gè)十六進(jìn)制數(shù)就要用4位二進(jìn)制數(shù)來表示)。見下例:8'b10101100//位寬為8的數(shù)的二進(jìn)制表示,'b表示二進(jìn)制8'ha2//位寬為8的數(shù)的十六進(jìn)制,'h表示十六進(jìn)制。x和z值:在數(shù)字電路中,x代表不定值,z代表高阻值。一個(gè)x可以用來定義十六進(jìn)制數(shù)的四位二進(jìn)制數(shù)的狀態(tài),八進(jìn)制數(shù)的三位,二進(jìn)制數(shù)的一位。z的表示方式同x類似。z還有一種表達(dá)方式是可以寫作?。在使用case表達(dá)式時(shí)建議使用這種寫法,以提高程序的可讀性。見下例:4'b10x0 //位寬為4的二進(jìn)制數(shù)從低位數(shù)起第二位為不定值4'b101z //位寬為4的二進(jìn)制數(shù)從低位數(shù)起第一位為高阻值12'dz //位寬為12的十進(jìn)制數(shù)其值為高阻值(第一種表達(dá)方式)12'd? //位寬為12的十進(jìn)制數(shù)其值為高阻值(第二種表達(dá)方式)8'h4x //位寬為8的十六進(jìn)制數(shù)其低四位值為不定值負(fù)數(shù):一個(gè)數(shù)字可以被定義為負(fù)數(shù),只需在位寬表達(dá)式前加一個(gè)減號(hào),減號(hào)必須寫在數(shù)字定義表達(dá)式的最前面。注意減號(hào)不可以放在位寬和進(jìn)制之間也不可以放在進(jìn)制和具體的數(shù)之間。見下例:-8'd5 //這個(gè)表達(dá)式代表5的補(bǔ)數(shù)(用八位二進(jìn)制數(shù)表示)8'd-5 //非法格式下劃線(underscore_):下劃線可以用來分隔開數(shù)的表達(dá)以提高程序可讀性。但不可以用在位寬和進(jìn)制處,只能用在具體的數(shù)字之間。見下例:16'b1010_1011_1111_1010 //合法格式8'b_0011_1010 //非法格式當(dāng)常量不說明位數(shù)時(shí),默認(rèn)值是32位,每個(gè)字母用8位的ASCII值表示。例:10=32’d10=32’b10101=32’d1=32’b1-1=-32’d1=32’hFFFFFFFF‘BX=32’BX=32’BXXXXXXX…X“AB”=16’B01000001_01000010二.參數(shù)(Parameter)型在VerilogHDL中用parameter來定義常量,即用parameter來定義一個(gè)標(biāo)識(shí)符代表一個(gè)常量,稱為符號(hào)常量,即標(biāo)識(shí)符形式的常量,采用標(biāo)識(shí)符代表一個(gè)常量可提高程序的可讀性和可維護(hù)性。parameter型數(shù)據(jù)是一種常數(shù)型的數(shù)據(jù),其說明格式如下:parameter 參數(shù)名1=表達(dá)式,參數(shù)名2=表達(dá)式,…,參數(shù)名n=表達(dá)式;parameter是參數(shù)型數(shù)據(jù)的確認(rèn)符,確認(rèn)符后跟著一個(gè)用逗號(hào)分隔開的賦值語句表。在每一個(gè)賦值語句的右邊必須是一個(gè)常數(shù)表達(dá)式。也就是說,該表達(dá)式只能包含數(shù)字或先前已定義過的參數(shù)。見下列:parametermsb=7;//定義參數(shù)msb為常量7parametere=25,f=29;//定義二個(gè)常數(shù)參數(shù)parameterr=5.7;//聲明r為一個(gè)實(shí)型參數(shù)parameterbyte_size=8,byte_msb=byte_size-1;//用常數(shù)表達(dá)式賦值parameteraverage_delay=(r+f)/2;//用常數(shù)表達(dá)式賦值參數(shù)型常數(shù)經(jīng)常用于定義延遲時(shí)間和變量寬度。在模塊或?qū)嵗脮r(shí)可通過參數(shù)傳遞改變?cè)诒灰媚K或?qū)嵗幸讯x的參數(shù)。下面將通過兩個(gè)例子進(jìn)一步說明在層次調(diào)用的電路中改變參數(shù)常用的一些用法。[例1]:在引用Decode實(shí)例時(shí),D1,D2的Width將采用不同的值4和5,且D1的Polarity將為0。可用例子中所用的方法來改變參數(shù),即用#(4,0)向D1中傳遞Width=4,Polarity=0;用#(5)向D2中傳遞Width=5,Polarity仍為1。moduleDecode(A,F);parameterWidth=1,Polarity=1;……………endmodulemoduleTop;wire[3:0]A4;wire[4:0]A5;wire[15:0]F16;wire[31:0]F32;Decode#(4,0)D1(A4,F16);Decode#(5)D2(A5,F32);Endmodule[例2]:下面是一個(gè)多層次模塊構(gòu)成的電路,在一個(gè)模塊中改變另一個(gè)模塊的參數(shù)時(shí),需要使用defparam命令3.2.2變量變量即在程序運(yùn)行過程中其值可以改變的量,在VerilogHDL中變量的數(shù)據(jù)類型有很多種,這里只對(duì)常用的幾種進(jìn)行介紹。網(wǎng)絡(luò)數(shù)據(jù)類型表示結(jié)構(gòu)實(shí)體(例如門)之間的物理連接。網(wǎng)絡(luò)類型的變量不能儲(chǔ)存值,而且它必需受到驅(qū)動(dòng)器(例如門或連續(xù)賦值語句,assign)的驅(qū)動(dòng)。如果沒有驅(qū)動(dòng)器連接到網(wǎng)絡(luò)類型的變量上,則該變量就是高阻的,即其值為z。常用的網(wǎng)絡(luò)數(shù)據(jù)類型包括wire型和tri型。這兩種變量都是用于連接器件單元,它們具有相同的語法格式和功能。之所以提供這兩種名字來表達(dá)相同的概念是為了與模型中所使用的變量的實(shí)際情況相一致。wire型變量通常是用來表示單個(gè)門驅(qū)動(dòng)或連續(xù)賦值語句驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù),tri型變量則用來表示多驅(qū)動(dòng)器驅(qū)動(dòng)的網(wǎng)絡(luò)型數(shù)據(jù)。如果wire型或tri型變量沒有定義邏輯強(qiáng)度(logicstrength),在多驅(qū)動(dòng)源的情況下,邏輯值會(huì)發(fā)生沖突從而產(chǎn)生不確定值。下表為wire型和tri型變量的真值表(注意:這里假設(shè)兩個(gè)驅(qū)動(dòng)源的強(qiáng)度是一致的,關(guān)于邏輯強(qiáng)度建模請(qǐng)參閱附錄:Verilog語言參考書)。wire/tri01xz00xx01x1x1xxxxxz01xz一.wire型wire型數(shù)據(jù)常用來表示用于以assign關(guān)鍵字指定的組合邏輯信號(hào)。Verilog程序模塊中輸入輸出信號(hào)類型缺省時(shí)自動(dòng)定義為wire型。wire型信號(hào)可以用作任何方程式的輸入,也可以用作“assign”語句或?qū)嵗妮敵?。wire型信號(hào)的格式同reg型信號(hào)的很類似。其格式如下:wire[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i;//共有i條總線,每條總線內(nèi)有n條線路 或wire[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i; wire是wire型數(shù)據(jù)的確認(rèn)符,[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位。最后跟著的是數(shù)據(jù)的名字。如果一次定義多個(gè)數(shù)據(jù),數(shù)據(jù)名之間用逗號(hào)隔開。聲明語句的最后要用分號(hào)表示語句結(jié)束。看下面的幾個(gè)例子。wirea;//定義了一個(gè)一位的wire型數(shù)據(jù)wire[7:0]b;//定義了一個(gè)八位的wire型數(shù)據(jù)wire[4:1]c,d;//定義了二個(gè)四位的wire型數(shù)據(jù)二.reg型寄存器是數(shù)據(jù)儲(chǔ)存單元的抽象。寄存器數(shù)據(jù)類型的關(guān)鍵字是reg.通過賦值語句可以改變寄存器儲(chǔ)存的值,其作用與改變觸發(fā)器儲(chǔ)存的值相當(dāng)。VerilogHDL語言提供了功能強(qiáng)大的結(jié)構(gòu)語句使設(shè)計(jì)者能有效地控制是否執(zhí)行這些賦值語句。這些控制結(jié)構(gòu)用來描述硬件觸發(fā)條件,例如時(shí)鐘的上升沿和多路器的選通信號(hào)。在行為模塊介紹這一節(jié)中我們還要詳細(xì)地介紹這些控制結(jié)構(gòu)。reg類型數(shù)據(jù)的缺省初始值為不定值,x。reg型數(shù)據(jù)常用來表示用于“always”模塊內(nèi)的指定信號(hào),常代表觸發(fā)器。通常,在設(shè)計(jì)中要由“always”塊通過使用行為描述語句來表達(dá)邏輯關(guān)系。在“always”塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成reg型。reg型數(shù)據(jù)的格式如下:reg[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i;或reg[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i;reg是reg型數(shù)據(jù)的確認(rèn)標(biāo)識(shí)符,[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位(bit)。最后跟著的是數(shù)據(jù)的名字。如果一次定義多個(gè)數(shù)據(jù),數(shù)據(jù)名之間用逗號(hào)隔開。聲明語句的最后要用分號(hào)表示語句結(jié)束。看下面的幾個(gè)例子:regrega;//定義了一個(gè)一位的名為rega的reg型數(shù)據(jù)reg[3:0]regb;//定義了一個(gè)四位的名為regb的reg型數(shù)據(jù)reg[4:1]regc,regd;//定義了兩個(gè)四位的名為regc和regd的reg型數(shù)據(jù)對(duì)于reg型數(shù)據(jù),其賦值語句的作用就象改變一組觸發(fā)器的存儲(chǔ)單元的值。在Verilog中有許多構(gòu)造(construct)用來控制何時(shí)或是否執(zhí)行這些賦值語句。這些控制構(gòu)造可用來描述硬件觸發(fā)器的各種具體情況,如觸發(fā)條件用時(shí)鐘的上升沿等,或用來描述具體判斷邏輯的細(xì)節(jié),如各種多路選擇器。reg型數(shù)據(jù)的缺省初始值是不定值。reg型數(shù)據(jù)可以賦正值,也可以賦負(fù)值。但當(dāng)一個(gè)reg型數(shù)據(jù)是一個(gè)表達(dá)式中的操作數(shù)時(shí),它的值被當(dāng)作是無符號(hào)值,即正值。例如:當(dāng)一個(gè)四位的寄存器用作表達(dá)式中的操作數(shù)時(shí),如果開始寄存器被賦以值-1,則在表達(dá)式中進(jìn)行運(yùn)算時(shí),其值被認(rèn)為是+15。注意:reg型只表示被定義的信號(hào)將用在“always”塊內(nèi),理解這一點(diǎn)很重要。并不是說reg型信號(hào)一定是寄存器或觸發(fā)器的輸出。雖然reg型信號(hào)常常是寄存器或觸發(fā)器的輸出,但并不一定總是這樣。在本書中我們還會(huì)對(duì)這一點(diǎn)作更詳細(xì)的解釋。三.memory型VerilogHDL通過對(duì)reg型變量建立數(shù)組來對(duì)存儲(chǔ)器建模,可以描述RAM型存儲(chǔ)器,ROM存儲(chǔ)器和reg文件。數(shù)組中的每一個(gè)單元通過一個(gè)數(shù)組索引進(jìn)行尋址。在Verilog語言中沒有多維數(shù)組存在。memory型數(shù)據(jù)是通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來生成的。其格式如下:reg[n-1:0]存儲(chǔ)器名[m-1:0];或 reg[n-1:0]存儲(chǔ)器名[m:1];在這里,reg[n-1:0]定義了存儲(chǔ)器中每一個(gè)存儲(chǔ)單元的大小,即該存儲(chǔ)單元是一個(gè)n位的寄存器。存儲(chǔ)器名后的[m-1:0]或[m:1]則定義了該存儲(chǔ)器中有多少個(gè)這樣的寄存器。最后用分號(hào)結(jié)束定義語句。下面舉例說明:reg[7:0]mema[255:0];這個(gè)例子定義了一個(gè)名為mema的存儲(chǔ)器,該存儲(chǔ)器有256個(gè)8位的存儲(chǔ)器。該存儲(chǔ)器的地址范圍是0到255。注意:對(duì)存儲(chǔ)器進(jìn)行地址索引的表達(dá)式必須是常數(shù)表達(dá)式。另外,在同一個(gè)數(shù)據(jù)類型聲明語句里,可以同時(shí)定義存儲(chǔ)器型數(shù)據(jù)和reg型數(shù)據(jù)。見下例:parameterwordsize=16, //定義二個(gè)參數(shù)。memsize=256;reg[wordsize-1:0]mem[memsize-1:0],writereg,readreg;盡管memory型數(shù)據(jù)和reg型數(shù)據(jù)的定義格式很相似,但要注意其不同之處。如一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組是不同于一個(gè)n位的寄存器的。見下例:reg[n-1:0]rega;//一個(gè)n位的寄存器regmema[n-1:0];//一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組一個(gè)n位的寄存器可以在一條賦值語句里進(jìn)行賦值,而一個(gè)完整的存儲(chǔ)器則不行。見下例:rega=0; //合法賦值語句mema=0; //非法賦值語句如果想對(duì)memory中的存儲(chǔ)單元進(jìn)行讀寫操作,必須指定該單元在存儲(chǔ)器中的地址。下面的寫法是正確的。mema[3]=0; //給memory中的第3個(gè)存儲(chǔ)單元賦值為0。進(jìn)行尋址的地址索引可以是表達(dá)式,這樣就可以對(duì)存儲(chǔ)器中的不同單元進(jìn)行操作。表達(dá)式的值可以取決于電路中其它的寄存器的值。例如可以用一個(gè)加法計(jì)數(shù)器來做RAM的地址索引。本小節(jié)里只對(duì)以上幾種常用的數(shù)據(jù)類型和常數(shù)進(jìn)行了介紹,其余的在以后的章節(jié)的示例中用到之處再逐一介紹。有興趣的同學(xué)可以參閱附錄:Verilog語言參考書3.3.運(yùn)算符及表達(dá)式VerilogHDL語言的運(yùn)算符范圍很廣,其運(yùn)算符按其功能可分為以下幾類:算術(shù)運(yùn)算符(+,-,×,/,%)賦值運(yùn)算符(=,<=)關(guān)系運(yùn)算符(>,<,>=,<=)邏輯運(yùn)算符(&&,||,!)條件運(yùn)算符(?:)位運(yùn)算符(~,|,^,&,^~)移位運(yùn)算符(<<,>>)拼接運(yùn)算符({})其它在VerilogHDL語言中運(yùn)算符所帶的操作數(shù)是不同的,按其所帶操作數(shù)的個(gè)數(shù)運(yùn)算符可分為三種:單目運(yùn)算符(unaryoperator):可以帶一個(gè)操作數(shù),操作數(shù)放在運(yùn)算符的右邊。二目運(yùn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論