版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
PAGE344第一章數(shù)字信號處理、計算、程序、算法和硬線邏輯的基本概念引言:現(xiàn)代計算機與通訊系統(tǒng)電子設備中廣泛使用了數(shù)字信號處理專用集成電路,它們主要用于數(shù)字信號傳輸中所必需的濾波、變換、加密、解密、編碼、解碼、糾檢錯、壓縮、解壓縮等操作。這些處理工作從本質上說都是數(shù)學運算。從原則上講,它們完全可以用計算機或微處理器來完成。這就是為什么我們常用C、Pascal或匯編語言來編寫程序,以研究算法的合理性和有效性的道理。在數(shù)字信號處理的領域內有相當大的一部分工作是可以事后處理的。我們可以利用通用的計算機系統(tǒng)來處理這類問題。如在石油地質調查中,我們通過鉆探和一系列的爆破,記錄下各種地層的回波數(shù)據(jù),然后用計算機對這些數(shù)據(jù)進行處理,去除噪聲等無用信息,最后我們可以得到地層的構造,從而找到埋藏的石油。因為地層不會在幾年內有明顯的變化,因此花幾十天的時間把地層的構造分析清楚也能滿足要求。這種類型的數(shù)字信號處理是非實時的,用通用的計算機就能滿足需要。還有一類數(shù)字信號處理必須在規(guī)定的時間內完成,如在軍用無線通信系統(tǒng)和機載雷達系統(tǒng)中我們常常需要對檢測到的微弱信號增強、加密、編碼、壓縮,在接收端必須及時地解壓縮、解碼和解密并重現(xiàn)清晰的信號。我們很難想象用一個通用的計算機系統(tǒng)來完成這項工作,因此,我們不得不自行設計非常輕便小巧的高速專用硬件系統(tǒng)來完成該任務。有的數(shù)字信號處理對時間的要求非常苛刻,以至于用高速的通用微處理器芯片也無法在規(guī)定的時間內完成必須的運算。我們必須為這樣的運算設計專用的硬線邏輯電路,這可以在高速FPGA器件上實現(xiàn)或制成高速專用集成電路。這是因為通用微處理器芯片是為一般目的而設計的,運算的步驟必須通過程序編譯后生成的機器碼指令加載到存貯器中,然后在微處理器芯片控制下,按時鐘的節(jié)拍,逐條取出指令、分析指令,然后執(zhí)行指令,直至程序的結束。微處理器芯片中的內部總線和運算部件也是為通用的目的而設計,即使是專為信號處理而設計的通用微處理器,因為它的通用性,也不可能為某一個特殊的算法來設計一系列的專用的運算電路,而且其內部總線的寬度也不能隨意改變,只有通過改變程序,才能實現(xiàn)這個特殊的算法。因而其運算速度就受到限制。本章的目的是想通過對數(shù)字信號處理、計算(Computing)、算法和數(shù)據(jù)結構、編程語言和程序、體系結構和硬線邏輯等基本概念的介紹,了解算法與硬線邏輯之間的關系從而引入利用VerilogHDL硬件描述語言設計復雜的數(shù)字邏輯系統(tǒng)的概念和方法。向讀者展示一種九十年代才真正開始在美國等先進的工業(yè)國家逐步推廣的數(shù)字邏輯系統(tǒng)的設計方法。借助于這種方法,在電路設計自動化仿真和綜合工具的幫助下,只要我們對并行的計算結構有一定程度的了解,對有關算法有深入的研究,我們完全有能力設計并制造出有自己知識產(chǎn)權的DSP(數(shù)字信號處理)類和任何復雜的數(shù)字邏輯集成電路芯片,為我國的電子工業(yè)和國防現(xiàn)代化作出應有的貢獻。數(shù)字信號處理大規(guī)模集成電路設計制造技術和數(shù)字信號處理技術,近三十年來,各自得到了迅速的發(fā)展。這兩個表面上看來沒有什么關系的技術領域實質上是緊密相關的。因為數(shù)字信號處理系統(tǒng)往往要進行一些復雜的數(shù)學運算和數(shù)據(jù)的處理,并且又有實時響應的要求,它們通常是由高速專用數(shù)字邏輯系統(tǒng)或專用數(shù)字信號處理器所構成,電路是相當復雜的。因此只有在高速大規(guī)模集成電路設計制造技術進步的基礎上,才有可能實現(xiàn)真正有意義的實時數(shù)字信號處理系統(tǒng)。對實時數(shù)字信號處理系統(tǒng)的要求不斷提高,也推動了高速大規(guī)模集成電路設計制造技術的進步?,F(xiàn)代專用集成電路的設計是借助于電子電路設計自動化(EDA)工具完成的。學習和掌握硬件描述語言(HDL)是使用電子電路設計自動化(EDA)工具的基礎。計算(Computing)說到數(shù)字信號處理,我們自然就會想到數(shù)學計算(或數(shù)學運算)?,F(xiàn)代計算機和通信系統(tǒng)中廣泛采用了數(shù)字信號處理的技術和方法?;舅悸肥窍劝研盘栍靡幌盗械臄?shù)字來表示,如是連續(xù)的模擬信號,則需通過采樣和模擬數(shù)字轉換,把信號轉換成一系列的數(shù)字信號,然后對這些數(shù)字信號進行各種快速的數(shù)學運算,其目的是多種多樣的,有的是為了加密,有的是通過編碼來減少誤碼率以提高信道的通信質量,有的是為了去掉噪聲等無關的信息也可以稱為濾波,有的是為了數(shù)據(jù)的壓縮以減少占用的頻道…。有時我們也把某些種類的數(shù)字信號處理運算稱為變換如離散傅利葉變換(DFT)、離散余弦變換(DCT)、小波變換(WaveletT)等。我們這里所說的計算是從英語Computing翻譯過來的,它的含義要比單純的數(shù)學計算廣泛得多?!癈omputing這門學問研究怎樣系統(tǒng)地有步驟地描述和轉換信息,實質上它是一門覆蓋了多個知識和技術范疇的學問,其中包括了計算的理論、分析、設計、效率和應用。它提出的最基本的問題是什么樣的工作能自動完成,什么樣的不能?!保ㄕ訢enningetal.,“ComputingasaDiscipline,”CommunicationofACM,January,1989)。本文中凡提到計算這個詞處,指的就是上面一段中Computing所包含的意思。由傳統(tǒng)的觀點出發(fā),我們可以從三個不同的方面來研究計算,即從數(shù)學、科學和工程的不同角度。由比較現(xiàn)代的觀點出發(fā),我們可以從四個主要的方面來研究計算,即從算法和數(shù)據(jù)結構、編程語言、體系結構、軟件和硬件設計方法學。本課本的主題是從算法到硬線邏輯的實現(xiàn),因此我們將從算法和數(shù)據(jù)結構、編程語言和程序、體系結構和硬線邏輯以及設計方法學等方面的基本概念出發(fā)來研究和探討用于數(shù)字信號處理等領域的復雜硬線邏輯電路的設計技術和方法。特別強調利用Verilog硬件描述語言的Top-Down設計方法的介紹。算法和數(shù)據(jù)結構為了準確地表示特定問題的信息并順利地解決有關的計算問題,我們需要采用一些特殊方法并建立相應的模型。所謂算法就是解決特定問題的有序步驟,所謂數(shù)據(jù)結構就是解決特定問題的相應的模型。編程語言和程序程序員利用一種由專家設計的既可以被人理解,也可以被計算機解釋的語言來表示算法問題的求解過程。這種語言就是編程語言。由它所表達的算法問題的求解過程就是程序。我們已經(jīng)熟悉通過編寫程序來解決計算問題,C、Pascal、Fortran、Basic或匯編語言語言是幾種常用的編程語言。如果我們只研究算法,只在通用的計算機上運行程序或利用通用的CPU來設計專用的微處理器嵌入系統(tǒng),掌握上述語言就足夠了。如果還需要設計和制造能進行快速計算的硬線邏輯專用電路,我們必須學習數(shù)字電路的基本知識和硬件描述語言。因為現(xiàn)代復雜數(shù)字邏輯系統(tǒng)的設計都是借助于EDA工具完成的,無論電路系統(tǒng)的仿真和綜合都需要掌握硬件描述語言。在本書中我們將要比較詳細地介紹Verilog硬件描述語言。系統(tǒng)結構和硬線邏輯計算機究竟是如何構成的?為什么它能有效地和正確地執(zhí)行每一步程序?它能不能用另外一種結構方案來構成?運算速度還能不能再提高?所謂計算機系統(tǒng)結構就是回答以上問題并從硬線邏輯和軟件兩個角度一起來探討某種結構的計算機的性能潛力。比如,VonNeumann(馮諾依曼)在1945設計的EDVAC電子計算機,它的結構是一種最早的順序機執(zhí)行標量數(shù)據(jù)的計算機系統(tǒng)結構。順序機是從位串行操作到字并行操作,從定點運算到浮點運算逐步改進過來的。由于VonNeumann系統(tǒng)結構的程序是順序執(zhí)行的,所以速度很慢。隨著硬件技術的進步,不斷有新的計算機系統(tǒng)結構產(chǎn)生,其計算性能也在不斷提高。計算機系統(tǒng)結構是一門討論和研究通用的計算機中央處理器如何提高運算速度性能的學問。對計算機系統(tǒng)結構的深入了解是設計高性能的專用的硬線邏輯系統(tǒng)的基礎,因此將是本書討論的重點之一。但由于本書的重點是利用VerilogHDL進行復雜數(shù)字電路的設計技術和方法,大量的篇幅將介紹利用HDL進行設計的步驟、語法要點、可綜合的風格要點、同步有限狀態(tài)機和由淺入深的設計實例。設計方法學復雜數(shù)字系統(tǒng)的設計是一個把思想(即算法)轉化為實際數(shù)字邏輯電路的過程。我們都知道同一個算法可以用不同結構的數(shù)字邏輯電路來實現(xiàn),從運算的結果說來可能是完全一致的,但其運算速度和性能價格比可以有很大的差別。我們可用許多種不同的方案來實現(xiàn)能實時完成算法運算的復雜數(shù)字系統(tǒng)電路,下面列出了常用的四種方案:1)以專用微處理機芯片為中心來構成完成算法所需的電路系統(tǒng);2)用高密度的FPGA(從幾萬門到百萬門);3)設計專用的大規(guī)模集成電路(ASIC);4)利用現(xiàn)成的微處理機的IP核并結合專門設計的高速ASIC運算電路。究竟采用什么方案要根據(jù)具體項目的技術指標、經(jīng)費、時間進度和批量綜合考慮而定。在上述第二、第三、第四種設計方案中,電路結構的考慮和決策至關重要。有的電路結構速度快,但所需的邏輯單元多,成本高;而有的電路結構速度慢,但所需的邏輯單元少,成本低。復雜數(shù)字邏輯系統(tǒng)設計的過程往往需要通過多次仿真,從不同的結構方案中找到一種符合工程技術要求的性能價格比最好的結構。一個優(yōu)秀的有經(jīng)驗的設計師,能通過硬件描述語言的頂層仿真較快地確定合理的系統(tǒng)電路結構,減少由于總體結構設計不合理而造成的返工,從而大大加快系統(tǒng)的設計過程。專用硬線邏輯與微處理器的比較在信號處理專用計算電路的設計中,以專用微處理器芯片為中心來構成完成算法所需的電路系統(tǒng)是一種較好的辦法。我們可以利用現(xiàn)成的微處理器開發(fā)系統(tǒng),在算法已用C語言驗證的基礎上,在開發(fā)系統(tǒng)工具的幫助下,把該C語言程序轉換為專用微處理器的匯編再編譯為機器代碼,然后加載到樣機系統(tǒng)的存儲區(qū),即可以在開發(fā)系統(tǒng)工具的環(huán)境下開始相關算法的運算仿真或運算。采用這種方法,設計周期短、可以利用的資源多,但速度、能耗、體積等性能受該微處理器芯片和外圍電路的限制。用高密度的FPGA(從幾萬門到幾十萬門)來構成完成算法所需的電路系統(tǒng)也是一種較好的辦法。我們必須購置有關的FPGA開發(fā)環(huán)境、布局布線和編程工具。有些FPGA廠商提供的開發(fā)環(huán)境不夠理想,其仿真工具和綜合工具性能不夠好,我們還需要利用性能較好的硬件描述語言仿真器、綜合工具,才能有效地進行復雜的DSP硬線邏輯系統(tǒng)的設計。由于FPGA是一種通用的器件,它的基本結構決定了對某一種特殊應用,性能不如專用的ASIC電路。采用自行設計的專用ASIC系統(tǒng)芯片(SystemOnChip),即利用現(xiàn)成的微處理機IP核或根據(jù)某一特殊應用設計的微處理機核(也可以沒有微處理機核),并結合專門設計的高速ASIC運算電路,能設計出性能價格比最高的理想數(shù)字信號處理系統(tǒng)。這種方法結合了微處理器和專用的大規(guī)模集成電路的優(yōu)點,由于微處理器IP核的挑選結合了算法和應用的特點,又加上專用的ASIC在需要高速部分的增強,能“量體裁衣”,因而各方面性能優(yōu)越。但由于設計和制造周期長、投片成本高,往往只有經(jīng)費充足、批量大的項目或重要的項目才采用這一途徑。當然性能優(yōu)良的硬件描述語言仿真器、綜合工具是不可缺少的,另外對所采用的半導體廠家基本器件庫和IP庫的深入了解也是必須的。以上所述算法的專用硬線邏輯實現(xiàn)都需要對算法有深入的了解,還需掌握硬件描述語言和相關的EDA仿真、綜合和布局布線工具。C語言與硬件描述語言在算法運算電路設計的關系和作用數(shù)字電路設計工程師一般都學習過編程語言、數(shù)字邏輯基礎、各種EDA軟件工具的使用。就編程語言而言,國內外大多數(shù)學校都以C語言為標準,只有少部分學校使用Pascal和Fortran。算法的描述和驗證常用C語言來做。例如要設計Reed-Solomen編碼/解碼器,我們必須先深入了解Reed-Solomen編碼/解碼的算法,再編寫C語言的程序來驗證算法的正確性。運行描述編碼器的C語言程序,把在數(shù)據(jù)文件中的多組待編碼的數(shù)據(jù)轉換為相應的編碼后數(shù)據(jù)并存入文件。再編寫一個加干擾用的C語言程序,用于模擬信道。它能產(chǎn)生隨機誤碼位(并把誤碼位個數(shù)控制在糾錯能力范圍內)將其加入編碼后的數(shù)據(jù)文件中。運行該加擾程序,產(chǎn)生帶誤碼位的編碼后的數(shù)據(jù)文件。然后再編寫一個解碼器的C語言程序,運行該程序把帶誤碼位的編碼文件解碼為另一個數(shù)據(jù)文件。只要比較原始數(shù)據(jù)文件和生成的文件便可知道編碼和解碼的程序是否正確(能否自動糾正糾錯能力范圍內的錯碼位)。用這種方法我們就可以來驗證算法的正確性。但這樣的數(shù)據(jù)處理其運行速度只與程序的大小和計算機的運行速度有關,也不能獨立于計算機而存在。如果要設計一個專門的電路來進行這種對速度有要求的實時數(shù)據(jù)處理,除了以上介紹的C程序外,還須編寫硬件描述語言(如VerilogHDL或VHDL)的程序,進行仿真以便從電路結構上保證算法能在規(guī)定的時間內完成,并能與前端和后端的設備或器件正確無誤地交換數(shù)據(jù)。用硬件描述語言(HDL)的程序設計硬件的好處在于易于理解、易于維護、調試電路速度快、有許多的易于掌握的仿真、綜合和布局布線工具,還可以用C語言配合HDL來做邏輯設計的前后仿真,驗證功能是否正確。在算法硬件電路的研制過程中,計算電路的結構和芯片的工藝對運行速度有很大的影響。所以在電路結構確定之前,必須經(jīng)過多次仿真:C語言的功能仿真。C語言的并行結構仿真。VerilogHDL的行為仿真。VerilogHDLRTL級仿真。綜合后門級結構仿真。布局布線后仿真。電路實現(xiàn)驗證。下面介紹用C語言配合VerilogHDL來設計算法的硬件電路塊時考慮的三個主要問題:為什么選擇C語言與VerilogHDL配合使用?C語言與VerilogHDL的使用有何限制?如何利用C來加速硬件的設計和故障檢測?為什么選擇C語言與Verilog配合使用首先,C語言很靈活,查錯功能強,還可以通過PLI(編程語言接口)編寫自己的系統(tǒng)任務直接與硬件仿真器(如Verilog-XL)結合使用。C語言是目前世界上應用最為廣泛的一種編程語言,因而C程序的設計環(huán)境比VerilogHDL的完整。此外,C語言可應用于許多領域,有可靠的編譯環(huán)境,語法完備,缺陷較少。比較起來,Verilog語言只是針對硬件描述的,在別處使用(如用于算法表達等)并不方便。而且Verilog的仿真、綜合、查錯工具等大部分軟件都是商業(yè)軟件,與C語言相比缺乏長期大量的使用,可靠性較差,亦有很多缺陷。所以,只有在C語言的配合使用下,Verilog才能更好地發(fā)揮作用。面對上述問題,最好的方法是C語言與Verilog語言相輔相成,互相配合使用。這就是既要利用C語言的完整性,又要結合Verilog對硬件描述的精確性,來更快更好地設計出符合性能要求的硬件電路系統(tǒng)。利用C語言完善的查錯和編譯環(huán)境,設計者可以先設計出一個功能正確的設計單元,以此作為設計比較的標準。然后,把C程序一段一段地改寫成用并型結構(類似于Verilog)描述的C程序,此時還是在C的環(huán)境里,使用的依然是C語言。如果運行結果都正確,就將C語言關鍵字用Verilog相應的關鍵字替換,進入Verilog的環(huán)境。將測試輸入同時加到C與Verilog兩個單元,將其輸出做比較。這樣很容易發(fā)現(xiàn)問題的所在,然后更正,再做測試,直至正確無誤。剩下的工作就交給后面的設計工程師繼續(xù)做。C語言與Verilog語言互相轉換中存在的問題這樣的混合語言設計流程往往會在兩種語言的轉換中會遇到許多難題。例如,怎樣把C程序轉換成類似Verilog結構的C程序,來增加并行度,以保證用硬件實現(xiàn)時運行速度達到設計要求;又如怎樣不使用C中較抽象的語法:例如迭代,指針,不確定次數(shù)的循環(huán)等等,也能來表示算法(因為轉換的目的是要用可綜合的Verilog語句來代替C程序中的語句,而可用于綜合的Verilog語法是相當有限的,往往找不到相應的關鍵字來替換)。C程序是一行接一行依次執(zhí)行的,屬于順序結構,而Verilog描述的硬件是可以在同一時間同時運行的,屬于并行結構。這兩者之間有很大的沖突。而Verilog的仿真軟件也是順序執(zhí)行的,在時間關系上同實際的硬件是有差異的,可能會出現(xiàn)一些無法發(fā)現(xiàn)的問題。Verilog可用的輸出輸入函數(shù)很少。C語言的花樣則很多,轉換過程中會遇到一些困難。C語言的函數(shù)調用與Verilog中模塊的調用也有區(qū)別。C程序調用函數(shù)是沒有延時特性的,一個函數(shù)是唯一確定的,對同一個函數(shù)的不同調用是一樣的。而Verilog中對模塊的不同調用是不同的,即使調用的是同一個模塊,必須用不同的名字來指定。Verilog的語法規(guī)則很死,限制很多,能用的判斷語句有限。仿真速度較慢,查錯功能差,錯誤信息不完整。仿真軟件通常也很昂貴,而且不一定可靠。C語言沒有時間關系,轉換后的Verilog程序必須要能做到?jīng)]有任何外加的人工延時信號,也就是必須表達為有限狀態(tài)機,即RTL級的Verilog,否則將無法使用綜合工具把Verilog源代碼轉化為門級邏輯。如何利用C語言來加快硬件的設計和查錯下表中列出了常用的C與Verilog相對應的關鍵字與控制結構CVerilogsub-functionmodule,function,taskif-then-elseif-then-elseCaseCase{,}begin,endForForWhileWhileBreakDisableDefineDefineIntIntPrintfmonitor,display,strobe下表中,列出了C與Verilog相對應的運算符CVerilog功能**乘//除++加--減%%取模!!反邏輯&&&&邏輯且||||邏輯或>>大于<<小于>=>=大于等于<=<=小于等于====等于!=!=不等于~~位反相&&按位邏輯與||按位邏輯或^^按位邏輯異或~^~^按位邏輯同或>>>>右移<<<<左移?:?:同等於if-else敘述從上面的討論我們可以總結如下:C語言與Verilog硬件描述語言可以配合使用,輔助設計硬件C語言與Verilog硬件描述語言很象,只要稍加限制,C語言的程序很容易轉成Verilog的程序美國和中國臺灣地區(qū)邏輯電路設計和制造廠家大都以VerilogHDL為主,中國大陸地區(qū)目前學習使用VHDL的較多。到底選用VHDL或是VerilogHDL來配合C一起用,就留給各位自行去決定。但從學習的角度來看,VerilogHDL比較簡單,也與C語言較接近,容易掌握。從使用的角度,支持Verilog硬件描述語言的半導體廠家也較支持VHDL的多。總結:本章介紹了信號處理與硬線邏輯設計的關系,以及有關的基本概念。引入了VerilogHDL硬件描述語言,向讀者展示一種九十年代才真正開始在美國等先進的工業(yè)國家逐步推廣的數(shù)字邏輯系統(tǒng)的設計方法。借助于這種方法,在電路設計自動化仿真和綜合工具的幫助下,我們完全有能力設計并制造出有自己知識產(chǎn)權的DSP(數(shù)字信號處理)類和任何復雜的數(shù)字邏輯集成電路芯片,為我國的電子工業(yè)和國防現(xiàn)代化作出應有的貢獻。在下面的各章里我們將分步驟地詳細介紹這種設計方法。思考題:什么是信號處理電路?為什么要設計專用的信號處理電路?什么是實時處理系統(tǒng)?為什么要用硬件描述語言來設計復雜的算法邏輯電路?能不能完全用C語言來代替硬件描述語言進行算法邏輯電路的設計?為什么在算法邏輯電路的設計中需要用C語言和硬件描述語言配合使用來提高設計效率?第二章VerilogHDL設計方法概述前言隨著電子設計技術的飛速發(fā)展,專用集成電路(ASIC)和用戶現(xiàn)場可編程門陣列(FPGA)的復雜度越來越高。數(shù)字通信、工業(yè)自動化控制等領域所用的數(shù)字電路及系統(tǒng)其復雜程度也越來越高,特別是需要設計具有實時處理能力的信號處理專用集成電路,并把整個電子系統(tǒng)綜合到一個芯片上。設計并驗證這樣復雜的電路及系統(tǒng)已不再是簡單的個人勞動,而需要綜合許多專家的經(jīng)驗和知識才能夠完成。由于電路制造工藝技術進步非常迅速,電路設計能力趕不上技術的進步。在數(shù)字邏輯設計領域,迫切需要一種共同的工業(yè)標準來統(tǒng)一對數(shù)字邏輯電路及系統(tǒng)的描述,這樣就能把系統(tǒng)設計工作分解為邏輯設計(前端)和電路實現(xiàn)(后端)兩個互相獨立而又相關的部分。由于邏輯設計的相對獨立性就可以把專家們設計的各種常用數(shù)字邏輯電路和系統(tǒng)部件(如FFT算法、DCT算法部件)建成宏單元(Megcell)或軟核(Soft-Core)庫供設計者引用,以減少重復勞動,提高工作效率。電路的實現(xiàn)則可借助于綜合工具和布局布線工具(與具體工藝技術有關)來自動地完成。VHDL和VerilogHDL這兩種工業(yè)標準的產(chǎn)生順應了歷史的潮流,因而得到了迅速的發(fā)展。作為跨世紀的中國大學生應該盡早掌握這種新的設計方法,使我國在復雜數(shù)字電路及系統(tǒng)的設計競爭中逐步縮小與美國等先進的工業(yè)發(fā)達國家的差距。為我國下一個世紀的深亞微米百萬門級的復雜數(shù)字邏輯電路及系統(tǒng)的設計培養(yǎng)一批技術骨干。2.1.硬件描述語言HDL(HardwareDescriptionLanguage)硬件描述語言(HDL)是一種用形式化方法來描述數(shù)字電路和設計數(shù)字邏輯系統(tǒng)的語言。它可以使數(shù)字邏輯電路設計者利用這種語言來描述自己的設計思想,然后利用電子設計自動化(在下面簡稱為EDA)工具進行仿真,再自動綜合到門級電路,再用ASIC或FPGA實現(xiàn)其功能。目前,這種稱之為高層次設計(High-Level-Design)的方法已被廣泛采用。據(jù)統(tǒng)計,在美國硅谷目前約有90%以上的ASIC和FPGA已采用硬件描述語言方法進行設計。硬件描述語言的發(fā)展至今已有二十多年的歷史,并成功地應用于設計的各個階段:仿真、驗證、綜合等。到80年代時,已出現(xiàn)了上百種硬件描述語言,它們對設計自動化起到了極大的促進和推動作用。但是,這些語言一般各自面向特定的設計領域與層次,而且眾多的語言使用戶無所適從,因此急需一種面向設計的多領域、多層次、并得到普遍認同的標準硬件描述語言。進入80年代后期,硬件描述語言向著標準化的方向發(fā)展。最終,VHDL和VerilogHDL語言適應了這種趨勢的要求,先后成為IEEE標準。把硬件描述語言用于自動綜合還只有短短的六、七年歷史。最近三四年來,用綜合工具把可綜合風格的HDL模塊自動轉換為電路發(fā)展非常迅速,在美國已成為設計數(shù)字電路的主流。本書主要介紹如何來編寫可綜合風格的VerilogHDL模塊,如何借助于Verilog語言對所設計的復雜電路進行全面可靠的測試。2.2.VerilogHDL的歷史2.2.1.什么是VerilogHDLVerilogHDL是硬件描述語言的一種,用于數(shù)字電子系統(tǒng)設計。它允許設計者用它來進行各種級別的邏輯設計,可以用它進行數(shù)字邏輯系統(tǒng)的仿真驗證、時序分析、邏輯綜合。它是目前應用最廣泛的一種硬件描述語言。據(jù)有關文獻報道,目前在美國使用VerilogHDL進行設計的工程師大約有60000人,全美國有200多所大學教授用Verilog硬件描述語言的設計方法。在我國臺灣地區(qū)幾乎所有著名大學的電子和計算機工程系都講授Verilog有關的課程。2.2.2.VerilogHDL的產(chǎn)生及發(fā)展 VerilogHDL是在1983年,由GDA(GateWayDesignAutomation)公司的PhilMoorby首創(chuàng)的。PhilMoorby后來成為Verilog-XL的主要設計者和Cadence公司(CadenceDesignSystem)的第一個合伙人。在1984-1985年,Moorby設計出了第一個關于Verilog-XL的仿真器,1986年,他對VerilogHDL的發(fā)展又作出了另一個巨大貢獻:即提出了用于快速門級仿真的XL算法。隨著Verilog-XL算法的成功,VerilogHDL語言得到迅速發(fā)展。1989年,Cadence公司收購了GDA公司,VerilogHDL語言成為Cadence公司的私有財產(chǎn)。1990年,Cadence公司決定公開VerilogHDL語言,于是成立了OVI(OpenVerilogInternational)組織來負責VerilogHDL語言的發(fā)展。基于VerilogHDL的優(yōu)越性,IEEE于1995年制定了VerilogHDL的IEEE標準,即VerilogHDL1364-1995(在本書的附錄中有該標準的中文翻譯,可供同學參考)。下面兩幅圖顯示出Verilog的發(fā)展歷史和將來。2.3.VerilogHDL和VHDL的比較 VerilogHDL和VHDL都是用于邏輯設計的硬件描述語言,并且都已成為IEEE標準。VHDL是在1987年成為IEEE標準,VerilogHDL則在1995年才正式成為IEEE標準。之所以VHDL比VerilogHDL早成為IEEE標準,這是因為VHDL是美國軍方組織開發(fā)的,而VerilogHDL則是從一個普通的民間公司的私有財產(chǎn)轉化而來,基于VerilogHDL的優(yōu)越性,才成為的IEEE標準,因而有更強的生命力。VHDL其英文全名為VHSICHardwareDescriptionLanguage,而VHSIC則是VeryHighSpeedIntegeratedCircuit的縮寫詞,意為甚高速集成電路,故VHDL其準確的中文譯名為甚高速集成電路的硬件描述語言。VerilogHDL和VHDL作為描述硬件電路設計的語言,其共同的特點在于:能形式化地抽象表示電路的結構和行為、支持邏輯設計中層次與領域的描述、可借用高級語言的精巧結構來簡化電路的描述、具有電路仿真與驗證機制以保證設計的正確性、支持電路描述由高層到低層的綜合轉換、硬件描述與實現(xiàn)工藝無關(有關工藝參數(shù)可通過語言提供的屬性包括進去)、便于文檔管理、易于理解和設計重用。但是VerilogHDL和VHDL又各有其自己的特點。由于VerilogHDL早在1983年就已推出,至今已有十三年的應用歷史,因而VerilogHDL擁有更廣泛的設計群體,成熟的資源也遠比VHDL豐富。與VHDL相比VerilogHDL的最大優(yōu)點是:它是一種非常容易掌握的硬件描述語言,只要有C語言的編程基礎,通過二十學時的學習,再加上一段實際操作,一般同學可在二至三個月內掌握這種設計技術。而掌握VHDL設計技術就比較困難。這是因為VHDL不很直觀,需要有Ada編程基礎,一般認為至少需要半年以上的專業(yè)培訓,才能掌握VHDL的基本設計技術。目前版本的VerilogHDL和VHDL在行為級抽象建模的覆蓋范圍方面也有所不同。一般認為VerilogHDL在系統(tǒng)級抽象方面比VHDL略差一些,而在門級開關電路描述方面比VHDL強得多。下面圖1-3是VerilogHDL和VHDL建模能力的比較圖示供讀者參考:
但這兩種語言也是在不斷的完善過程中,因此VerilogHDL作為學習HDL設計方法的入門和基礎是比較合適的。學習掌握VerilogHDL建模、仿真和綜合技術不僅可以使同學們對數(shù)字電路設計技術有更進一步的了解,而且可以為以后學習高級的系統(tǒng)綜合打下堅實的基礎。2.4.VerilogHDL目前的應用情況和適用的設計幾年以來,EDA界一直對在數(shù)字邏輯設計中究竟采用哪一種硬件描述語言爭論不休,目前的情況是兩者不相上下。在美國,在高層邏輯電路設計領域VerilogHDL和VHDL的應用比率是60%和40%,在臺灣省各為50%,在中國大陸目前由于VerilogHDL和VHDL的使用才剛剛開始,具體應用比率還沒有統(tǒng)計。VerilogHDL是專門為復雜數(shù)字邏輯電路和系統(tǒng)的設計仿真而開發(fā)的,本身就非常適合復雜數(shù)字邏輯電路和系統(tǒng)的仿真和綜合。由于VerilogHDL在其門級描述的底層,也就是在晶體管開關的描述方面比VHDL有強得多得功能,所以即使是VHDL的設計環(huán)境,在底層實質上也是由VerilogHDL描述的器件庫所支持的。另外目前VerilogHDL-A標準還支持模擬電路的描述,1998年即將通過的VerilogHDL新標準,將把VerilogHDL-A并入VerilogHDL新標準,使其不僅支持數(shù)字邏輯電路的描述還支持模擬電路的描述,因此在混合信號的電路系統(tǒng)的設計中,它必將會有更廣泛的應用。在亞微米和深亞微米ASIC和高密度FPGA已成為電子設計主流的今天,VerilogHDL的發(fā)展前景是非常遠大的。作者本人的意見是:若要推廣采用硬件描述語言的設計方法,則應首先從推廣VerilogHDL開始,然后再推廣VHDL。VerilogHDL較為適合系統(tǒng)級(System)、算法級(Alogrithem)、寄存器傳輸級(RTL)、邏輯級(Logic)、門級(Gate)、電路開關級(Switch)設計,而對于特大型(幾百萬門級以上)的系統(tǒng)級(System)設計,則VHDL更為適合,由于這兩種HDL語言還在不斷地發(fā)展過程中,它們都會逐步地完善自己。2.5.采用VerilogHDL設計復雜數(shù)字電路的優(yōu)點2.5.1傳統(tǒng)設計方法--電路原理圖輸入法幾十年前,當時所做的復雜數(shù)字邏輯電路及系統(tǒng)的設計規(guī)模比較小也比較簡單,其中所用到的FPGA或ASIC設計工作往往只能采用廠家提供的專用電路圖輸入工具來進行。為了滿足設計性能指標,工程師往往需要花好幾天或更長的時間進行艱苦的手工布線。工程師還得非常熟悉所選器件的內部結構和外部引線特點,才能達到設計要求。這種低水平的設計方法大大延長了設計周期。近年來,F(xiàn)PGA和ASIC的設計在規(guī)模和復雜度方面不斷取得進展,而對邏輯電路及系統(tǒng)的設計的時間要求卻越來越短。這些因素促使設計人員采用高水準的設計工具,如:硬件描述語言(VerilogHDL或VHDL)來進行設計。2.5.2.VerilogHDL設計法與傳統(tǒng)的電路原理圖輸入法的比較如2.5.1.所述采用電路原理圖輸入法進行設計,具有設計的周期長,需要專門的設計工具,需手工布線等缺陷。而采用VerilogHDL輸入法時,由于VerilogHDL的標準化,可以很容易地把完成的設計移植到不同的廠家的不同的芯片中去,并在不同規(guī)模應用時可以較容易地作修改。這不僅是因為用VerilogHDL所完成的設計,它的信號位數(shù)是很容易改變的,可以很容易地對它進行修改,來適應不同規(guī)模的應用,在仿真驗證時,仿真測試矢量還可以用同一種描述語言來完成,而且還因為采用VerilogHDL綜合器生成的數(shù)字邏輯是一種標準的電子設計互換格式(EDIF)文件,獨立于所采用的實現(xiàn)工藝。有關工藝參數(shù)的描述可以通過VerilogHDL提供的屬性包括進去,然后利用不同廠家的布局布線工具,在不同工藝的芯片上實現(xiàn)。采用VerilogHDL輸入法最大的優(yōu)點是其與工藝無關性。這使得工程師在功能設計、邏輯驗證階段,可以不必過多考慮門級及工藝實現(xiàn)的具體細節(jié),只需要利用系統(tǒng)設計時對芯片的要求,施加不同的約束條件,即可設計出實際電路。實際上這是利用了計算機的巨大能力在EDA工具的幫助下,把邏輯驗證與具體工藝庫匹配、布線及時延計算分成不同的階段來實現(xiàn)從而減輕了人們的繁瑣勞動。2.5.3.VerilogHDL的標準化與軟核的重用VerilogHDL是在1983年由GATEWAY公司首先開發(fā)成功的,經(jīng)過諸多改進,于1995年11月正式被批準為IEEE標準1364。VerilogHDL的標準化大大加快了VerilogHDL的推廣和發(fā)展。由于VerilogHDL設計方法的與工藝無關性,因而大大提高了VerilogHDL模型的可重用性。我們把功能經(jīng)過驗證的、可綜合的、實現(xiàn)后電路結構總門數(shù)在5000門以上的VerilogHDL模型稱之為“軟核”(SoftCore)。而把由軟核構成的器件稱為虛擬器件,在新電路的研制過程中,軟核和虛擬器件可以很容易地借助EDA綜合工具與其它外部邏輯結合為一體。這樣,軟核和虛擬器件的重用性就可大大縮短設計周期,加快了復雜電路的設計。目前國際上有一個叫作虛擬接口聯(lián)盟的組織(VirtualSocketInterfaceAlliance)來協(xié)調這方面的工作。2.5.4.軟核、固核和硬核的概念以及它們的重用上一節(jié)中我們已介紹了軟核的概念,下面再介紹一下固核(FirmCore)和硬核(HardCore)的概念。我們把在某一種現(xiàn)場可編程門陣列(FPGA)器件上實現(xiàn)的,經(jīng)驗證是正確的總門數(shù)在5000門以上電路結構編碼文件,稱之為“固核”。我們把在某一種專用半導體集成電路工藝的(ASIC)器件上實現(xiàn)的經(jīng)驗證是正確的總門數(shù)在5000門以上的電路結構掩膜,稱之為“硬核”。顯而易見,在具體實現(xiàn)手段和工藝技術尚未確定的邏輯設計階段,軟核具有最大的靈活性,它可以很容易地借助EDA綜合工具與其它外部邏輯結合為一體。當然,由于實現(xiàn)技術的不確定性,有可能要作一些改動以適應相應的工藝。相比之下固核和硬核與其它外部邏輯結合為一體的靈活性要差得多,特別是電路實現(xiàn)工藝技術改變時更是如此。而近年來電路實現(xiàn)工藝技術的發(fā)展是相當迅速的,為了邏輯電路設計成果的積累,和更快更好地設計更大規(guī)模的電路,發(fā)展軟核的設計和推廣軟核的重用技術是非常有必要的。我們新一代的數(shù)字邏輯電路設計師必須掌握這方面的知識和技術。2.6.采用硬件描述語言(VerilogHDL)的設計流程簡介2.6.1.自頂向下(Top-Down)設計的基本概念現(xiàn)代集成電路制造工藝技術的改進,使得在一個芯片上集成數(shù)十乃至數(shù)百萬個器件成為可能,但我們很難設想僅由一個設計師獨立設計如此大規(guī)模的電路而不出現(xiàn)錯誤。利用層次化、結構化的設計方法,一個完整的硬件設計任務首先由總設計師劃分為若干個可操作的模塊,編制出相應的模型(行為的或結構的),通過仿真加以驗證后,再把這些模塊分配給下一層的設計師,這就允許多個設計者同時設計一個硬件系統(tǒng)中的不同模塊,其中每個設計者負責自己所承擔的部分;而由上一層設計師對其下層設計者完成的設計用行為級上層模塊對其所做的設計進行驗證。圖1-6-1為自頂向下(TOP-DOWN)的示意圖,以設計樹的形式繪出。自頂向下的設計(即TOP_DOWN設計)是從系統(tǒng)級開始,把系統(tǒng)劃分為基本單元,然后再把每個基本單元劃分為下一層次的基本單元,一直這樣做下去,直到可以直接用EDA元件庫中的元件來實現(xiàn)為止。對于設計開發(fā)整機電子產(chǎn)品的單位和個人來說,新產(chǎn)品的開發(fā)總是從系統(tǒng)設計入手,先進行方案的總體論證、功能描述、任務和指標的分配。隨著系統(tǒng)變得復雜和龐大,特別需要在樣機問世之前,對產(chǎn)品的全貌有一定的預見性。目前,EDA技術的發(fā)展使得設計師有可能實現(xiàn)真正的自頂向下的設計。2.6.2.層次管理的基本概念復雜數(shù)字邏輯電路和系統(tǒng)的層次化、結構化設計隱含著硬件設計方案的逐次分解。在設計過程中的任意層次,硬件至少有一種描述形式。硬件的描述特別是行為描述通常稱為行為建模。在集成電路設計的每一層次,硬件可以分為一些模塊,該層次的硬件結構由這些模塊的互連描述,該層次的硬件的行為由這些模塊的行為描述。這些模塊稱為該層次的基本單元。而該層次的基本單元又由下一層次的基本單元互連而成。如此下去,完整的硬件設計就可以由圖2-6-1所示的設計樹描述。在這個設計樹上,節(jié)點對應著該層次上基本單元的行為描述,樹枝對應著基本單元的結構分解。在不同的層次都可以進行仿真以對設計思想進行驗證。EDA工具提供了有效的手段來管理錯綜復雜的層次,即可以很方便地查看某一層次某模塊的源代碼或電路圖以改正仿真時發(fā)現(xiàn)的錯誤。2.6.3.具體模塊的設計編譯和仿真的過程在不同的層次做具體模塊的設計所用的方法也有所不同,在高層次上往往編寫一些行為級的模塊通過仿真加以驗證,其主要目的是系統(tǒng)性能的總體考慮和各模塊的指標分配,并非具體電路的實現(xiàn)。因而綜合及其以后的步驟往往不需進行。而當設計的層次比較接近底層時行為描述往往需要用電路邏輯來實現(xiàn),這時的模塊不僅需要通過仿真加以驗證,還需進行綜合、優(yōu)化、布線和后仿真。總之具體電路是從底向上逐步實現(xiàn)的。EDA工具往往不僅支持HDL描述也支持電路圖輸入,有效地利用這兩種方法是提高設計效率的辦法之一。下面的流程圖簡要地說明了模塊的編譯和測試過程:從上圖可以看出,模塊設計流程主要由兩大主要功能部分組成:設計開發(fā):即從編寫設計文件-->綜合到布局布線-->投片生成這樣一系列步驟。設計驗證:也就是進行各種仿真的一系列步驟,如果在仿真過程中發(fā)現(xiàn)問題就返回設計輸入進行修改。2.6.4.對應具體工藝器件的優(yōu)化、映象、和布局布線 由于各種ASIC和FPFA器件的工藝各不相同,因而當用不同廠家的不同器件來實現(xiàn)已驗證的邏輯網(wǎng)表(EDIF文件)時,就需要不同的基本單元庫與布線延遲模型與之對應才能進行準確的優(yōu)化、映象、和布局布線?;締卧獛炫c布線延遲模型由熟悉本廠工藝的工程師提供,再由EDA廠商的工程師編入相應的處理程序,而邏輯電路設計師只需用一文件說明所用的工藝器件和約束條件,EDA工具就會自動地根據(jù)這一文件選擇相應的庫和模型進行準確的處理從而大大提高設計效率。2.7.小結采用VerilogHDL設計方法比采用電路圖輸入的方法更有優(yōu)越性,這就是為什么美國等先進工業(yè)國家在進入九十年代以后紛紛采用HDL設計方法的原因。在兩種符合IEEE標準的硬件描述語言中,VerilogHDL與VHDL相比更加基礎、更易學習,掌握HDL設計方法應從學習VerilogHDL設計方法開始。VerilogHDL可用于復雜數(shù)字邏輯電路和系統(tǒng)的總體仿真、子系統(tǒng)仿真和具體電路綜合等各個設計階段。由于TOP_DOWN的設計方法是首先從系統(tǒng)設計入手,從頂層進行功能劃分和結構設計。系統(tǒng)的總體仿真是頂層進行功能劃分的重要環(huán)節(jié),這時的設計是與工藝無關的。由于設計的主要仿真和調試過程是在高層次完成的所以能夠早期發(fā)現(xiàn)結構設計上的錯誤,避免設計工作的浪費,同時也減少了邏輯仿真的工作量。自頂向下的設計方法方便了從系統(tǒng)級劃分和管理整個項目,使得幾十萬門甚至幾百萬門規(guī)模的復雜數(shù)字電路的設計成為可能,并可減少設計人員,避免不必要的重復設計,提高了設計的一次成功率。從底向上的設計在某種意義上講可以看作上述TOP_DOWN設計的逆過程。雖然設計也是從系統(tǒng)級開始,即從設計樹的樹根開始對設計進行逐次劃分,但劃分時首先考慮的是單元是否存在,即設計劃分過程必須從存在的基本單元出發(fā),設計樹最末枝上的單元要么是已經(jīng)制造出的單元,要么是其它項目已開發(fā)好的單元或者是可外購得到的單元。自頂向下的設計過程中在每一層次劃分時都要對某些目標作優(yōu)化,TOP_DOWN的設計過程是理想的設計過程,它的缺點是得到的最小單元不標準,制造成本可能很高。從底向上的設計過程全采用標準基本單元,通常比較經(jīng)濟,但有時可能不能滿足一些特定的指標要求。復雜數(shù)字邏輯電路和系統(tǒng)的設計過程通常是這兩種設計方法的結合,設計時需要考慮多個目標的綜合平衡。2.8思考題1.什么是硬件描述語言?它的主要作用是什么?目前世界上符合IEEE標準的硬件描述語言有哪兩種?它門各有什么特點?什么情況下需要采用硬件描述語言的設計方法?采用硬件描述語言設計方法的優(yōu)點是什么?有什么缺點?簡單敘述一下利用EDA工具并采用硬件描述語言(HDL)的設計方法和流程。硬件描述語言可以用哪兩種方式參與復雜數(shù)字電路的設計?用硬件描述語言設計的數(shù)字系統(tǒng)需要經(jīng)過哪些步驟才能與具體的電路相對應?為什么說用硬件描述語言設計的數(shù)字邏輯系統(tǒng)具有最大的靈活性可以映射到任何工藝的電路上?軟核是什么?虛擬器件是什么?它們的作用是什么?固核是什么?硬核是什么?與軟核相比它們各有什么優(yōu)缺點?簡述TOP-DOWN設計方法和硬件描述語言的關系。第三章VerilogHDL的基本語法前言VerilogHDL是一種用于數(shù)字邏輯電路設計的語言。用VerilogHDL描述的電路設計就是該電路的VerilogHDL模型。VerilogHDL既是一種行為描述的語言也是一種結構描述的語言。這也就是說,既可以用電路的功能描述也可以用元器件和它們之間的連接來建立所設計電路的VerilogHDL模型。Verilog模型可以是實際電路的不同級別的抽象。這些抽象的級別和它們對應的模型類型共有以下五種:系統(tǒng)級(system):用高級語言結構實現(xiàn)設計模塊的外部性能的模型。算法級(algorithm):用高級語言結構實現(xiàn)設計算法的模型。RTL級(RegisterTransferLevel):描述數(shù)據(jù)在寄存器之間流動和如何處理這些數(shù)據(jù)的模型。門級(gate-level):描述邏輯門以及邏輯門之間的連接的模型。開關級(switch-level):描述器件中三極管和儲存節(jié)點以及它們之間連接的模型。 一個復雜電路系統(tǒng)的完整VerilogHDL模型是由若干個VerilogHDL模塊構成的,每一個模塊又可以由若干個子模塊構成。其中有些模塊需要綜合成具體電路,而有些模塊只是與用戶所設計的模塊交互的現(xiàn)存電路或激勵信號源。利用VerilogHDL語言結構所提供的這種功能就可以構造一個模塊間的清晰層次結構來描述極其復雜的大型設計,并對所作設計的邏輯電路進行嚴格的驗證。VerilogHDL行為描述語言作為一種結構化和過程性的語言,其語法結構非常適合于算法級和RTL級的模型設計。這種行為描述語言具有以下功能:可描述順序執(zhí)行或并行執(zhí)行的程序結構。用延遲表達式或事件表達式來明確地控制過程的啟動時間。通過命名的事件來觸發(fā)其它過程里的激活行為或停止行為。提供了條件、if-else、case、循環(huán)程序結構。提供了可帶參數(shù)且非零延續(xù)時間的任務(task)程序結構。提供了可定義新的操作符的函數(shù)結構(function)。提供了用于建立表達式的算術運算符、邏輯運算符、位運算符。VerilogHDL語言作為一種結構化的語言也非常適合于門級和開關級的模型設計。因其結構化的特點又使它具有以下功能:提供了完整的一套組合型原語(primitive);提供了雙向通路和電阻器件的原語;可建立MOS器件的電荷分享和電荷衰減動態(tài)模型。VerilogHDL的構造性語句可以精確地建立信號的模型。這是因為在VerilogHDL中,提供了延遲和輸出強度的原語來建立精確程度很高的信號模型。信號值可以有不同的的強度,可以通過設定寬范圍的模糊值來降低不確定條件的影響。VerilogHDL作為一種高級的硬件描述編程語言,有著類似C語言的風格。其中有許多語句如:if語句、case語句等和C語言中的對應語句十分相似。如果讀者已經(jīng)掌握C語言編程的基礎,那么學習VerilogHDL并不困難,我們只要對VerilogHDL某些語句的特殊方面著重理解,并加強上機練習就能很好地掌握它,利用它的強大功能來設計復雜的數(shù)字邏輯電路。下面我們將對VerilogHDL中的基本語法逐一加以介紹。3.1.簡單的VerilogHDL模塊3.1.1.簡單的VerilogHDL程序介紹下面先介紹幾個簡單的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這個例子通過連續(xù)賦值語句描述了一個名為adder的三位加法器可以根據(jù)兩個三比特數(shù)a、b和進位(cin)計算出和(sum)和進位(count)。從例子中可以看出整個VerilogHDL程序是嵌套在module和endmodule聲明語句里的。例[3.1.2]:modulecompare(equal,a,b);outputequal;//聲明輸出信號equalinput[1:0]a,b;//聲明輸入信號a,bassignequal=(a==b)?1:0; /*如果a、b兩個輸入信號相等,輸出為1。否則為0*/endmodule這個程序通過連續(xù)賦值語句描述了一個名為compare的比較器。對兩比特數(shù)a、b進行比較,如a與b相等,則輸出equal為高電平,否則為低電平。在這個程序中,/**/和//表示注釋部分,注釋只是為了方便程序員理解程序,對編譯是不起作用的。例[3.1.3]:moduletrist2(out,in,enable);outputout;inputin,enable;bufif1mybuf(out,in,enable);endmodule這個程序描述了一個名為trist2的三態(tài)驅動器。程序通過調用一個在Verilog語言庫中現(xiàn)存的三態(tài)驅動器實例元件bufif1來實現(xiàn)其功能。例[3.1.4]: moduletrist1(out,in,enable);outputout;inputin,enable;mytritri_inst(out,in,enable);//調用由mytri模塊定義的實例元件tri_instendmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?in:'bz;endmodule這個程序例子通過另一種方法描述了一個三態(tài)門。在這個例子中存在著兩個模塊。模塊trist1調用由模塊mytri定義的實例元件tri_inst。模塊trist1是頂層模塊。模塊mytri則被稱為子模塊。 通過上面的例子可以看到:VerilogHDL程序是由模塊構成的。每個模塊的內容都是嵌在module和endmodule兩個語句之間。每個模塊實現(xiàn)特定的功能。模塊是可以進行層次嵌套的。正因為如此,才可以將大型的數(shù)字電路設計分割成不同的小模塊來實現(xiàn)特定的功能,最后通過頂層模塊調用子模塊來實現(xiàn)整體功能。每個模塊要進行端口定義,并說明輸入輸出口,然后對模塊的功能進行行為邏輯描述。VerilogHDL程序的書寫格式自由,一行可以寫幾個語句,一個語句也可以分寫多行。除了endmodule語句外,每個語句和數(shù)據(jù)定義的最后必須有分號??梢杂?**/和//對VerilogHDL程序的任何部分作注釋。一個好的,有使用價值的源程序都應當加上必要的注釋,以增強程序的可讀性和可維護性。3.1.2.模塊的結構Verilog的基本設計單元是“模塊”(block)。一個模塊是由兩部分組成的,一部分描述接口,另一部分描述邏輯功能,即定義輸入是如何影響輸出的。下面舉例說明:請看上面的例子,程序模塊旁邊有一個電路圖的符號。在許多方面,程序模塊和電路圖符號是一致的,這是因為電路圖符號的引腳也就是程序模塊的接口。而程序模塊描述了電路圖符號所實現(xiàn)的邏輯功能。上面的Verilog設計中,模塊中的第二、第三行說明接口的信號流向,第四、第五行說明了模塊的邏輯功能。以上就是設計一個簡單的Verilog程序模塊所需的全部內容。從上面的例子可以看出,Verilog結構完全嵌在module和endmodule聲明語句之間,每個Verilog程序包括四個主要部分:端口定義、I/O說明、內部信號聲明、功能定義。3.1.3.模塊的端口定義模塊的端口聲明了模塊的輸入輸出口。其格式如下:module 模塊名(口1,口2,口3,口4,………);3.1.4.模塊內容模塊的內容包括I/O說明、內部信號聲明、功能定義。I/O說明的格式如下:輸入口: input端口名1,端口名2,………,端口名i;//(共有i個輸入口)輸出口: output端口名1,端口名2,………,端口名j;//(共有j個輸出口)I/O說明也可以寫在端口聲明語句里。其格式如下:modulemodule_name(inputport1,inputport2,…outputport1,outputport2…);內部信號說明:在模塊內用到的和與端口有關的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;這種方法的句法很簡單,只需寫一個“assign”,后面再加一個方程式即可。例子中的方程式描述了一個有兩個輸入的與門。2).用實例元件如: andand_inst(q,a,b);采用實例元件的方法象在電路圖輸入方式下,調入庫元件一樣。鍵入元件的名字和相連的引腳即可,表示在設計中用到一個跟與門(and)一樣的名為and_inst的與門,其輸入端為a,b,輸出為q。要求每個實例元件的名字必須是唯一的,以避免與其他調用與門(and)的實例混淆。3).用“always”塊如:always@(posedgeclkorposedgeclr)beginif(clr)q<=0;elseif(en)q<=d;end采用“assign”語句是描述組合邏輯最常用的方法之一。而“always”塊既可用于描述組合邏輯也可描述時序邏輯。上面的例子用“always”塊生成了一個帶有異步清除端的D觸發(fā)器?!癮lways”塊可用很多種描述手段來表達邏輯,例如上例中就用了if...else語句來表達邏輯關系。如按一定的風格來編寫“always”塊,可以通過綜合工具把源代碼自動綜合成用門級結構表示的組合或時序邏輯電路。注意:如果用Verilog模塊實現(xiàn)一定的功能,首先應該清楚哪些是同時發(fā)生的,哪些是順序發(fā)生的。上面三個例子分別采用了“assign”語句、實例元件和“always”塊。這三個例子描述的邏輯功能是同時執(zhí)行的。也就是說,如果把這三項寫到一個VeriIog模塊文件中去,它們的次序不會影響邏輯實現(xiàn)的功能。這三項是同時執(zhí)行的,也就是并發(fā)的。然而,在“always”模塊內,邏輯是按照指定的順序執(zhí)行的?!癮lways”塊中的語句稱為“順序語句”,因為它們是順序執(zhí)行的。請注意,兩個或更多的“always”模塊也是同時執(zhí)行的,但是模塊內部的語句是順序執(zhí)行的??匆幌隆癮lways”內的語句,你就會明白它是如何實現(xiàn)功能的。if..else…if必須順序執(zhí)行,否則其功能就沒有任何意義。如果else語句在if語句之前執(zhí)行,功能就會不符合要求!為了能實現(xiàn)上述描述的功能,“always”模塊內部的語句將按照書寫的順序執(zhí)行。3.2.數(shù)據(jù)類型及其常量、變量VerilogHDL中總共有十九種數(shù)據(jù)類型,數(shù)據(jù)類型是用來表示數(shù)字電路硬件中的數(shù)據(jù)儲存和傳送元素的。在本教材中我們先只介紹四個最基本的數(shù)據(jù)類型,它們是:reg型、wire型、integer型、parameter型其它數(shù)據(jù)類型在后面的章節(jié)里逐步介紹,同學們也可以查閱附錄中VerilogHDL語法參考書的有關章節(jié)逐步掌握。其它的類型如下:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型。這些數(shù)據(jù)類型除time型外都與基本邏輯單元建庫有關,與系統(tǒng)設計沒有很大的關系。在一般電路設計自動化的環(huán)境下,仿真用的基本部件庫是由半導體廠家和EDA工具廠家共同提供的。系統(tǒng)設計工程師不必過多地關心門級和開關級的VerilogHDL語法現(xiàn)象。VerilogHDL語言中也有常量和變量之分。它們分別屬于以上這些類型。下面就最常用的幾種進行介紹。3.2.1.常量在程序運行過程中,其值不能被改變的量稱為常量。下面首先對在VerilogHDL語言中使用的數(shù)字及其表示方式進行介紹。一.數(shù)字整數(shù):在VerilogHDL中,整型常量即整常數(shù)有以下四種進制表示形式:二進制整數(shù)(b或B)十進制整數(shù)(d或D)十六進制整數(shù)(h或H)八進制整數(shù)(o或O)數(shù)字表達方式有以下三種:<位寬><進制><數(shù)字>這是一種全面的描述方式。<進制><數(shù)字>在這種描述方式中,數(shù)字的位寬采用缺省位寬(這由具體的機器系統(tǒng)決定,但至少32位)。<數(shù)字>在這種描述方式中,采用缺省進制十進制。在表達式中,位寬指明了數(shù)字的精確位數(shù)。例如:一個4位二進制數(shù)的數(shù)字的位寬為4,一個4位十六進制數(shù)的數(shù)字的位寬為16(因為每單個十六進制數(shù)就要用4位二進制數(shù)來表示)。見下例:8'b10101100//位寬為8的數(shù)的二進制表示,'b表示二進制8'ha2//位寬為8的數(shù)的十六進制,'h表示十六進制。x和z值:在數(shù)字電路中,x代表不定值,z代表高阻值。一個x可以用來定義十六進制數(shù)的四位二進制數(shù)的狀態(tài),八進制數(shù)的三位,二進制數(shù)的一位。z的表示方式同x類似。z還有一種表達方式是可以寫作?。在使用case表達式時建議使用這種寫法,以提高程序的可讀性。見下例:4'b10x0 //位寬為4的二進制數(shù)從低位數(shù)起第二位為不定值4'b101z //位寬為4的二進制數(shù)從低位數(shù)起第一位為高阻值12'dz //位寬為12的十進制數(shù)其值為高阻值(第一種表達方式)12'd? //位寬為12的十進制數(shù)其值為高阻值(第二種表達方式)8'h4x //位寬為8的十六進制數(shù)其低四位值為不定值負數(shù):一個數(shù)字可以被定義為負數(shù),只需在位寬表達式前加一個減號,減號必須寫在數(shù)字定義表達式的最前面。注意減號不可以放在位寬和進制之間也不可以放在進制和具體的數(shù)之間。見下例:-8'd5 //這個表達式代表5的補數(shù)(用八位二進制數(shù)表示)8'd-5 //非法格式下劃線(underscore_):下劃線可以用來分隔開數(shù)的表達以提高程序可讀性。但不可以用在位寬和進制處,只能用在具體的數(shù)字之間。見下例:16'b1010_1011_1111_1010 //合法格式8'b_0011_1010 //非法格式當常量不說明位數(shù)時,默認值是32位,每個字母用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來定義一個標識符代表一個常量,稱為符號常量,即標識符形式的常量,采用標識符代表一個常量可提高程序的可讀性和可維護性。parameter型數(shù)據(jù)是一種常數(shù)型的數(shù)據(jù),其說明格式如下:parameter 參數(shù)名1=表達式,參數(shù)名2=表達式,…,參數(shù)名n=表達式;parameter是參數(shù)型數(shù)據(jù)的確認符,確認符后跟著一個用逗號分隔開的賦值語句表。在每一個賦值語句的右邊必須是一個常數(shù)表達式。也就是說,該表達式只能包含數(shù)字或先前已定義過的參數(shù)。見下列:parametermsb=7;//定義參數(shù)msb為常量7parametere=25,f=29;//定義二個常數(shù)參數(shù)parameterr=5.7;//聲明r為一個實型參數(shù)parameterbyte_size=8,byte_msb=byte_size-1;//用常數(shù)表達式賦值parameteraverage_delay=(r+f)/2;//用常數(shù)表達式賦值參數(shù)型常數(shù)經(jīng)常用于定義延遲時間和變量寬度。在模塊或實例引用時可通過參數(shù)傳遞改變在被引用模塊或實例中已定義的參數(shù)。下面將通過兩個例子進一步說明在層次調用的電路中改變參數(shù)常用的一些用法。[例1]:在引用Decode實例時,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]:下面是一個多層次模塊構成的電路,在一個模塊中改變另一個模塊的參數(shù)時,需要使用defparam命令3.2.2變量變量即在程序運行過程中其值可以改變的量,在VerilogHDL中變量的數(shù)據(jù)類型有很多種,這里只對常用的幾種進行介紹。網(wǎng)絡數(shù)據(jù)類型表示結構實體(例如門)之間的物理連接。網(wǎng)絡類型的變量不能儲存值,而且它必需受到驅動器(例如門或連續(xù)賦值語句,assign)的驅動。如果沒有驅動器連接到網(wǎng)絡類型的變量上,則該變量就是高阻的,即其值為z。常用的網(wǎng)絡數(shù)據(jù)類型包括wire型和tri型。這兩種變量都是用于連接器件單元,它們具有相同的語法格式和功能。之所以提供這兩種名字來表達相同的概念是為了與模型中所使用的變量的實際情況相一致。wire型變量通常是用來表示單個門驅動或連續(xù)賦值語句驅動的網(wǎng)絡型數(shù)據(jù),tri型變量則用來表示多驅動器驅動的網(wǎng)絡型數(shù)據(jù)。如果wire型或tri型變量沒有定義邏輯強度(logicstrength),在多驅動源的情況下,邏輯值會發(fā)生沖突從而產(chǎn)生不確定值。下表為wire型和tri型變量的真值表(注意:這里假設兩個驅動源的強度是一致的,關于邏輯強度建模請參閱附錄:Verilog語言參考書)。wire/tri01xz00xx01x1x1xxxxxz01xz一.wire型wire型數(shù)據(jù)常用來表示用于以assign關鍵字指定的組合邏輯信號。Verilog程序模塊中輸入輸出信號類型缺省時自動定義為wire型。wire型信號可以用作任何方程式的輸入,也可以用作“assign”語句或實例元件的輸出。wire型信號的格式同reg型信號的很類似。其格式如下:wire[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i;//共有i條總線,每條總線內有n條線路 或wire[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i; wire是wire型數(shù)據(jù)的確認符,[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位。最后跟著的是數(shù)據(jù)的名字。如果一次定義多個數(shù)據(jù),數(shù)據(jù)名之間用逗號隔開。聲明語句的最后要用分號表示語句結束??聪旅娴膸讉€例子。wirea;//定義了一個一位的wire型數(shù)據(jù)wire[7:0]b;//定義了一個八位的wire型數(shù)據(jù)wire[4:1]c,d;//定義了二個四位的wire型數(shù)據(jù)二.reg型寄存器是數(shù)據(jù)儲存單元的抽象。寄存器數(shù)據(jù)類型的關鍵字是reg.通過賦值語句可以改變寄存器儲存的值,其作用與改變觸發(fā)器儲存的值相當。VerilogHDL語言提供了功能強大的結構語句使設計者能有效地控制是否執(zhí)行這些賦值語句。這些控制結構用來描述硬件觸發(fā)條件,例如時鐘的上升沿和多路器的選通信號。在行為模塊介紹這一節(jié)中我們還要詳細地介紹這些控制結構。reg類型數(shù)據(jù)的缺省初始值為不定值,x。reg型數(shù)據(jù)常用來表示用于“always”模塊內的指定信號,常代表觸發(fā)器。通常,在設計中要由“always”塊通過使用行為描述語句來表達邏輯關系。在“always”塊內被賦值的每一個信號都必須定義成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ù)的確認標識符,[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位(bit)。最后跟著的是數(shù)據(jù)的名字。如果一次定義多個數(shù)據(jù),數(shù)據(jù)名之間用逗號隔開。聲明語句的最后要用分號表示語句結束??聪旅娴膸讉€例子:regrega;//定義了一個一位的名為rega的reg型數(shù)據(jù)reg[3:0]regb;//定義了一個四位的名為regb的reg型數(shù)據(jù)reg[4:1]regc,regd;//定義了兩個四位的名為regc和regd的reg型數(shù)據(jù)對于reg型數(shù)據(jù),其賦值語句的作用就象改變一組觸發(fā)器的存儲單元的值。在Verilog中有許多構造(construct)用來控制何時或是否執(zhí)行這些賦值語句。這些控制構造可用來描述硬件觸發(fā)器的各種具體情況,如觸發(fā)條件用時鐘的上升沿等,或用來描述具體判斷邏輯的細節(jié),如各種多路選擇器。reg型數(shù)據(jù)的缺省初始值是不定值。reg型數(shù)據(jù)可以賦正值,也可以賦負值。但當一個reg型數(shù)據(jù)是一個表達式中的操作數(shù)時,它的值被當作是無符號值,即正值。例如:當一個四位的寄存器用作表達式中的操作數(shù)時,如果開始寄存器被賦以值-1,則在表達式中進行運算時,其值被認為是+15。注意:reg型只表示被定義的信號將用在“always”塊內,理解這一點很重要。并不是說reg型信號一定是寄存器或觸發(fā)器的輸出。雖然reg型信號常常是寄存器或觸發(fā)器的輸出,但并不一定總是這樣。在本書中我們還會對這一點作更詳細的解釋。三.memory型VerilogHDL通過對reg型變量建立數(shù)組來對存儲器建模,可以描述RAM型存儲器,ROM存儲器和reg文件。數(shù)組中的每一個單元通過一個數(shù)組索引進行尋址。在Verilog語言中沒有多維數(shù)組存在。memory型數(shù)據(jù)是通過擴展reg型數(shù)據(jù)的地址范圍來生成的。其格式如下:reg[n-1:0]存儲器名[m-1:0];或 reg[n-1:0]存儲器名[m:1];在這里,reg[n-1:0]定義了存儲器中每一個存儲單元的大小,即該存儲單元是一個n位的寄存器。存儲器名后的[m-1:0]或[m:1]則定義了該存儲器中有多少個這樣的寄存器。最后用分號結束定義語句。下面舉例說明:reg[7:0]mema[255:0];這個例子定義了一個名為mema的存儲器,該存儲器有256個8位的存儲器。該存儲器的地址范圍是0到255。注意:對存儲器進行地址索引的表達式必須是常數(shù)表達式。另外,在同一個數(shù)據(jù)類型聲明語句里,可以同時定義存儲器型數(shù)據(jù)和reg型數(shù)據(jù)。見下例:parameterwordsize=16, //定義二個參數(shù)。memsize=256;reg[wordsize-1:0]mem[memsize-1:0],writereg,readreg;盡管memory型數(shù)據(jù)和reg型數(shù)據(jù)的定義格式很相似,但要注意其不同之處。如一個由n個1位寄存器構成的存儲器組是不同于一個n位的寄存器的。見下例:reg[n-1:0]rega;//一個n位的寄存器regmema[n-1:0];//一個由n個1位寄存器構成的存儲器組一個n位的寄存器可以在一條賦值語句里進行賦值,而一個完整的存儲器則不行。見下例:rega=0; //合法賦值語句mema=0; //非法賦值語句如果想對memory中的存儲單元進行讀寫操作,必須指定該單元在存儲器中的地址。下面的寫法是正確的。mema[3]=0; //給memory中的第3個存儲單元賦值為0。進行尋址的地址索引可以是表達式,這樣就可以對存儲器中的不同單元進行操作。表達式的值可以取決于電路中其它的寄存器的值。例如可以用一個加法計數(shù)器來做RAM的地址索引。本小節(jié)里只對以上幾種常用的數(shù)據(jù)類型和常數(shù)進行了介紹,其余的在以后的章節(jié)的示例中用到之處再逐一介紹。有興趣的同學可以參閱附錄:Verilog語言參考書3.3.運算符及表達式VerilogHDL語言的運算符范圍很廣,其運算符按其功能可分為以下幾類:算術運算符(+,-,×,/,%)賦值運算符(=,<=)關系運算符(>,<,>=,<=)邏輯運算符(&&,||,!)條件運算符(?:)位運算符(~,|,^,&,^~)移位運算符(<<,>>)拼接運算符({})其它在VerilogHDL語言中運算符所帶的操作數(shù)是不同的,按其所帶操作數(shù)的個數(shù)運算符可分為三種:單目運算符(unaryoperator):可以帶一個操作數(shù),操作數(shù)放在運算符的右邊。二目運
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度綠色大米采購與銷售合作協(xié)議范本4篇
- 二零二五版高端公寓地暖系統(tǒng)安裝及維護合同3篇
- 二零二五情侶戀愛期間生活禮儀與修養(yǎng)協(xié)議2篇
- 2025年度民宿布草租賃與民宿客??蛻魸M意度提升合同4篇
- 2025版信托資金借貸合同爭議解決機構條款3篇
- 2025年城市社區(qū)食堂承包運營管理合同4篇
- 二零二五年度光伏發(fā)電設備供應合同4篇
- 二零二五年度設立文化傳播公司出資協(xié)議標準版3篇
- 二零二四年度新能源汽車推廣項目投標邀請函樣本3篇
- 2025年度跨境電商出資協(xié)議3篇
- 2024公路瀝青路面結構內部狀況三維探地雷達快速檢測規(guī)程
- 2024年高考真題-地理(河北卷) 含答案
- 2024光儲充一體化系統(tǒng)解決方案
- 處理后事授權委托書
- 食材配送服務方案投標方案(技術方案)
- 足療店營銷策劃方案
- 封條(標準A4打印封條)
- 2024年北京控股集團有限公司招聘筆試參考題庫含答案解析
- 延遲交稿申請英文
- 運動技能學習與控制課件第十章動作技能的指導與示范
- 石油天然氣建設工程交工技術文件編制規(guī)范(SYT68822023年)交工技術文件表格儀表自動化安裝工程
評論
0/150
提交評論