




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
0.1關于VerilogHDL
0.2關于EDA隨著科學技術的發展,硬件電路與系統的設計發生了新的變革,現代硬件電路與系統的設計蓬勃興起。依據先進的設計思想,利用現代化的設計手段,使用可編程的新型器件來設計現代電路與系統已成為一種趨勢。先進的設計思想是自上而下的設計思想,即先設計頂層、再設計底層。這種一氣呵成的設計思想只能借助于現代化的設計手段實現。即應用計算機技術將硬件電路與系統設計要做的許多工作用軟件設計來完成,這就是電子設計自動化EDA,也就是硬件設計軟件化。要應用計算機做到硬件設計軟件化,必須要有計算機和設計者都能識別的硬件描述語言HDL及其綜合、編譯、仿真、下載的EDA開發軟件。可編程的新型器件是實現各種現代硬件電路與系統的載體、實體。可編程器件包括可編程邏輯器件PLD、復雜可編程邏輯器件CPLD、現場可編程門陣列FPGA、可編程模擬器件PAD、可編程模擬電路PAC、通用數字開關GDS、通用數字交叉GDX器件、可編程智能混合器件SmartFusion等。總而言之,現代硬件電路與系統的最終實現,不僅需要先進的設計思想和理念,還需要現代化的設計手段——計算機平臺和硬件描述語言程序設計、可編程的新型器件和功能設計工具(EDA軟件開發工具)、連接計算機與可編程器件的下載接口JTAG和編程電纜。本書首先討論Verilog程序設計,接著討論與EDA有關的可編程器件功能設計工具(軟件開發工具)應用。0.1關于VerilogHDLVerilog是一種用于數字電路與系統設計的硬件描述語言,可以從算法級、門級到開關級的多種抽象設計層次對數字系統建模。使用VerilogHDL,用戶能靈活地進行各種級別的邏輯設計,方便地進行數字邏輯系統的仿真驗證、時序分析和邏輯綜合。Verilog是1983年由GDA公司的PhilipR.Moorby為其模擬器產品開發的硬件建模語言,那時它只是一種專用語言。PhilipR.Moorby本人后來成為Verilog-XL的主要設計者和Cadence公司的第一合伙人。其間,他設計了第一個關于Verilog-XL的仿真器,并推出了用于快速門級仿真的XL算法。1989年,Cadence公司收購了GDA公司,Verilog歸Cadence公司所有。兩年后,該公司成立了OVI,決定致力于推廣VerilogOVI標準,使其成為IEEE標準。這一努力最后獲得成功,Verilog語言于1995年成為IEEE標準,稱為IEEEStd1364-1995。從此,VerilogHDL成為一種極具競爭力的用于數字電路與系統設計的硬件描述語言。通過不斷實踐,VerilogHDL又增加了Verilog-2001、Verilog-2005,使其使用更加方便。我國《集成電路/計算機硬件描述語言Verilog》(國家標準編號為GB/T18349—2001)于2001年10月1日已正式實施。VerilogHDL是一種簡潔清晰、功能強大、容易掌握、便于學習的硬件描述語言,只要有C語言的編程基礎,在了解了VerilogHDL的基本結構與描述方式、基本要素、基本句法等以后,再輔助上機操作,就能很快掌握VerilogHDL程序設計技術。0.2關于EDAEDA是電子設計自動化的縮寫,它是在20世紀80年代初從計算機輔助設計CAD、計算機輔助制造CAM、計算機輔助測試CAT和計算機輔助工程CAE的概念發展而來的。可編程器件的誕生,使現代硬件電路與系統的電子設計技術發生了革命性的變化。現代硬件電路與系統的EDA技術以計算機為工具,設計者在EDA開發軟件平臺上,用硬件描述語言HDL完成硬件電路的源文件設計,然后通過計算機自動地完成編譯、化簡、分割、綜合、優化、布局、布線和仿真,直至完成對選定的目標芯片(可編程器件)的適配、邏輯映射、布局布線和下載等工作。EDA技術的出現,極大地提高了電路設計的效率和可靠性,有效地減輕了設計者的勞動強度,縮短了產品的設計周期,加快了產品的上市時間。從20世紀70年代起,國際上電子和計算機技術較先進的國家,一直在積極探索新的電子電路設計方法,并在設計方法、集成器件、開發工具等方面進行了徹底的變革,取得了巨大成功。在電子技術設計領域,可編程邏輯器件(如CPLD、FPGA)的應用,已得到廣泛的普及,這些器件為數字系統的設計帶來了極大的靈活性。可編程模擬器件、可編程數字開關及互聯器件的研制成功,為各種現代電路與系統硬件的設計注入了新的活力。這些器件可以通過軟件編程對其硬件結構和工作方式進行重構、重組態,從而使得硬件的設計可以如同軟件設計那樣方便快捷。這一切極大地改變了甚至是顛覆了傳統的電路與系統設計方法、設計過程和設計觀念,促進了EDA技術的迅速發展。現代EDA的應用相當廣泛,包括機械、電子、通信、航空航天、航海、交通、化工、礦產、生物、醫學、軍事等各個領域。例如在飛機、汽車制造過程中,從設計、性能測試及特性分析直到飛機試飛、汽車試車模擬,都可能涉及EDA技術。本書所指的EDA技術,是針對電子電路與系統設計的電子設計自動化,且主要討論現代數字電路與系統的硬件技術。第1章VerilogHDL的基本結構與描述方式1.1基本結構
1.2描述方式
1.2.1數據流描述方式
1.2.2行為描述方式
1.2.3結構化描述方式
1.2.4混合描述方式1.1基本結構模塊是Verilog的基本描述單位。模塊用于描述某個電路設計的功能或結構以及與其他模塊通信的外部端口。每個模塊與其他模塊之間通過端口聯系,模塊自身通過端口與其描述的內容聯系。一個硬件電路用Verilog設計的基本結構組成一個模塊,它是實現硬件電路的源文件。一個硬件電路用Verilog程序設計的過程叫做編寫源文件或建模。一個模塊又可以在另一個模塊中使用。圖1.1是一位全加器的電路。該電路的函數表達式為sum=a⊕b⊕cincout=(a⊕b)cin+ab其中:a、b分別為兩個一位二進制的加數、被加數;cin為低位向本位的進位;sum為本位和;cout是本位向高位的進位。當一個完成某一功能的電路圖或函數表達式已知時,可依據電路圖或函數表達式用Verilog設計其源文件。Verilog實現硬件電路的源文件,即模塊的基本結構:(1)?Verilog程序是由模塊構成的。每個模塊中包含不同的內容,這些內容被安排在module和endmodule兩個關鍵字之間。(2)每一個模塊完成一個特定的功能。模塊是可以進行層次嵌套的。一個大型的數字電路與系統可以分割成若干個實現一定功能的子模塊,然后通過頂層模塊調用子模塊,完成系統的整體功能。(3)在每一個模塊中要對端口進行定義,說明輸入、輸出口,并對模塊的功能進行邏輯描述。(4)模塊是Verilog的基本設計單位。一個模塊由兩部分組成:一部分描述接口;另一部分描述邏輯功能。這種描述實際上就是說明輸入是如何影響輸出的。下面給出了一個通用的模塊或源文件的基本結構。在一個程序模塊中,第一行是模塊的端口(或叫接口)定義,其格式為module模塊名(端口1,端口2,端口3,…);它聲明了模塊的輸入、輸出端口。接下來的Declarations說明部分用于定義不同的項,例如模塊I/O(輸入/輸出)的信號流向,哪些是輸入、哪些是輸出;定義描述中使用的數據類型、寄存器和參數等。I/O說明的格式為input輸入端口名1,輸入端口名2,…,輸入端口名N;output輸出端口名1,輸出端口名2,…輸出端口名N;當它們有規律地排列時,可使用簡略寫法。如上述4位二進制加法器電路源代碼中第三行、第五行和3位二進制乘法器電路源代碼中第五行、第六行那樣。我們也可以把I/O說明直接放在端口定義語句里,其格式為modulemodulename(輸入端口名1,輸入端口名2,…,輸入端口名N,輸出端口名1,輸出端口名2,…,輸出端口名N);Statements語句的定義部分則用于定義設計的功能和結構,它是模塊的核心。說明部分和語句定義部分可以散布在模塊中的任何地方,但是變量、寄存器、線網和參數等的說明部分必須在使用前出現。為了使模塊描述清晰和具有良好的可讀性,最好將所有的說明部分放在語句前。1.2描
述
方
式在設計的源文件即模塊中,可以采用下述四種描述方式:(1)數據流描述方式。(2)行為描述方式。(3)結構化描述方式。(4)混合描述方式(前三種方式的混合)。下面通過實例分別說明這四種描述方式。1.2.1數據流描述方式用數據流描述方式對要求實現的硬件電路建模或設計源文件,最基本的方法就是使用連續賦值語句。在連續賦值語句中,若干個值(或數據)被指定為線網變量。線網變量是數據類型的一種。連續賦值語句的格式為assign[delay]LHS_net=RHS_expression;等號右邊表達式中的操作數無論在什么時候發生變化,該表達式都會重新計算,并在設定的時延[delay]后將變化了的值賦予等號左邊的線網變量。時延[delay]定義了等號右邊表達式中的操作數變化與賦值給等號左邊之間的持續時間。[delay]是可選的,如果沒有定義它的值,缺省時延為0。1.2.2行為描述方式一個設計用行為描述方式給出其行為功能,可使用如下語句:(1)?initial語句:該語句只執行一次,通常多用于仿真。(2)?always語句:該語句總是循環執行,或者說該語句重復執行。需要特別注意的是:①
只有寄存器類型數據能夠在這兩種語句中被賦值;②
寄存器類型數據在被賦給新值前保持原值不變;③
所有的初始化語句initial和總是語句always在0時刻并發執行。1.2.3結構化描述方式在VerilogHDL中可使用如下方式進行結構化描述。(1)門語句(門原語,在門級)。(2)開關級語句(開關級原語,在晶體管級)。(3)用戶定義語句(用戶定義的原語,在門級)。(4)模塊實例(創建成層次結構)。結構化描述方式通過線網來相互連接。1.2.4混合描述方式在一個模塊中,結構化描述、行為描述、數據流描述可以自由混合。也就是說,一個模塊中可以包含實例化的門(門原語或叫門基元)、模塊實例化語句、連續賦值語句、初始化語句initial和總是語句always的混合。在混合描述方式中,來自初始化語句initial和總是語句always的值能驅動門或開關的輸入端,而來自于門或連續賦值語句的值能夠反過來用于觸發(門的輸出或連續賦值語句的值作為輸入)初始化語句initial和總是語句always。也就是說,門的輸出或連續賦值語句的值可以驅動always塊的輸入端即always行為表達式右邊的值。必須注意的是:只有寄存器類型數據可以在初始化語句initial和總是語句always中賦值,連續賦值語句只能驅動線網。2.1標識符(identifier)
2.2格式與注釋
2.3數據
2.4數據類型
2.5操作符
2.6系統函數和系統任務
2.7編譯預處理指令2.1標識符(identifier)標識符是模塊、端口、連線、寄存器等元素的名字。標識符可以是任意一組字母、數字、$符號和下劃線,但數字不能打頭。每個系統函數和系統任務前面都用一個標識符$加以確認。標識符的字符數不能多于1024個。轉義標識符(以反斜杠開始,以空白結尾,空白可以是一個空格、一個制表字符或換行符)中可以包含任意的可打印字符。2.2格
式
與
注
釋1.格式VerilogHDL的格式包括自由格式和標識符。自由格式即結構可以跨越多行編寫,也可以在一行內編寫。白空(新行、制表符和空格)沒有特殊意義。標識符區分大小寫,也就是說大小寫不同的標識符是不同的。2.注釋在VerilogHDL中有兩種形式的注釋:第一種形式“/*…*/”,可以擴展至多行;第二種形式“//”,在本行結束。2.3數
據VerilogHDL中有常量和變量之分。2.3.1常量在程序運行過程中(確切地說在硬件電路中)其值不能被改變的量稱為常量。VerilogHDL中有四類常量:(1)整數型常量。(2)實數型常量。(3)字符串型常量。(4)參數常量(或稱符號常量)。下劃線符號“_”可以隨意用在整數型常量或實數型常量中,它們就數量本身沒有意義。它們能用來提高易讀性:唯一的限制是下劃線符號不能作為首字符。1.整數型常量整數型常量可以按兩種格式書寫:簡單的十進制數格式和基數格式。(1)簡單的十進制格式。這種形式的整數定義為帶有一個可選的“+”(一元或稱單目)或“-”(一元或稱單目)操作符的數字序列。例如:23 十進制數23-12 十進制數?-12這種形式的整數值代表一個有符號的數。它們可使用補碼形式表示:23用6位的二進制形式可表示為010111;-12用6位的二進制形式可表示為110100。(2)基數表示法。這種形式的整數格式為[size]'basevalue其中:size定義以位計的常量的位長;base為進制:o或O(表示八進制),b或B(表示二進制),d或D(表示十進制),h或H(表示十六進制);value是基于base的值的數字序列。值x和z以及十六進制中的a~f不區分大小寫。注意,這里base前的“?'?”號在鍵盤上與雙引號同鍵(在word環境下以TimesNewRoman體輸入符號“'”顯示為單引號“’”,在Verilog的源文件×××.v中會自動變為“'”)。2.實數型常量實數型常量可以用兩種形式定義:十進制計數法和科學計數法。(1)十進制計數法。例如:1.02.345123.120.13. 非法,小數點兩側必須有1位數字(2)科學計數法。Verilog語言定義了實數型常量如何隱式地轉換為整數型常量。實數型常量通過四舍五入被轉換為最相近的整數型常量。3.字符串型常量字符串型常量是雙引號內的字符序列。字符串型常量不能分成多行書寫。用8位ASCII值表示的字符可看做是無符號整數型常量。因此字符串型常量是8位ASCII值的序列。為存儲字符串“ZXCVBNM”,變量需要8?×?7位。反斜線(\)用于對確定的特殊字符轉義。4.參數常量參數常量用parameter來定義常量。參數常量經常用于定義時延和變量的寬度。使用參數常量說明的參數只被賦值一次。參數常量的說明形式如下:parameterparam1=constexpr1,param2=constexpr2,…,paramN=constexprN;參數值也可以在編譯時被改變。改變參數值可以使用參數定義語句或通過在模塊初始化語句中定義參數值。2.3.2變量變量是在程序運行過程中(確切地說在硬件電路中)其值可以被改變的量。硬件電路中的輸入、輸出可看成是一種變量。變量有確定的類型。2.3.3VerilogHDL四種基本的值VerilogHDL有以下四種基本的值:(1)?0:邏輯0或“假”。(2)?1:邏輯1或“真”。(3)?x:未知。(4)?z:高阻。這四種值都表明于語言中。如一個為z的值總是意味著高阻抗,一個為0的值通常是指邏輯0。x值和z值都不分大小寫。2.4數
據
類
型VerilogHDL有兩種數據類型:net線網數據類型和variable變量數據類型。寄存器類型屬于variable變量數據類型。(1)線網類型(nettype)。線網類型的數據表示Verilog描述的硬件結構元件間的物理連線。它的值由驅動元件的值決定,例如連續賦值或門的輸出。如果沒有驅動元件連接到線網,線網的缺省值為z。(2)寄存器類型(registertype)。寄存器類型的數據表示一個抽象的數據存儲單元,它只能在always語句和initial語句中被賦值,并且它的值從一個賦值到另一個賦值被保存下來,即賦值結束,它的值依然被保存,直到新的賦值將它刷新。寄存器類型的變量的缺省值為x。2.4.1線網類型線網數據類型包含下述不同種類的線網子類型:(1)?wire:連線,它是最常用的線網子類型。(2)?tri:三態線。(3)?wor:線或。(4)?trior:三態線或。(5)?wand:線與。(6)?triand:三態線與。(7)?trireg:三態寄存器。(8)?tri1:三態1。(9)?tri0:三態0。(10)?supply0:電源0,接地。(11)?supply1:電源1,接電源+極。線網類型的說明格式為netkind[msb:lsb]net1,net2,…,netN;其中:netkind是上述線網類型的一種;msb和lsb是用于定義線網范圍的常量表達式,范圍定義是可選的,如果沒有定義范圍,則缺省的線網類型為1位。1.wire和tri線網用于連接單元的連線(wire)是最常見的線網類型。連線與三態線(tri)網的格式和語義一致。三態線可以用于描述多個驅動源驅動同一根線的線網類型,并且沒有其他特殊的意義。如圖2.1所示,當把W1、W2、W3說明為三態線(tri)網時,它們可以分時與總線WZ傳送信息。例如,當要求W1與WZ傳送信息時,可控制W2、W3處于高阻態,此時可認為它們與總線斷開。2.?wor和trior線網線或(wor)指如果某個驅動源為1,那么線網的值也為1。線或和三態線或(trior)在語法和功能上是一致的。如圖2.2所示,當把W1、W2、W3說明為線或(wor)線網時,只要W1、W2、W3中有一個或一個以上為1,那么線網W0的值也為1。3.wand和triand線網線與(wand)指如果某個驅動源為0,那么線網的值為0。線與和三態線與(triand)在語法和功能上是一致的。如圖2.3所示,當把W1、W2、W3說明為線與(wand)線網時,只要W1、W2、W3中有一個為0,那么線網W0的值為0。4.trireg線網trireg線網存儲數值(類似于寄存器),并且用于電容節點的建模。也就是說,trireg線網將連線建模為存儲電荷的電容。當三態寄存器(trireg)的所有驅動源都處于高阻態,即值為z時,三態寄存器線網保存作用在線網上的最后一個值。此外,三態寄存器線網的缺省初始值為x。5.tri0和tri1線網tri0和tri1線網可用于線邏輯的建模,即線網有多于一個驅動源。tri0(tri1)線網的特征是,若無驅動源驅動,則它的值為0(tri1的值為1),用于對給定電源進行電阻性上拉/下拉。6.supply0和supply1線網supply0線網用于對“地”建模,即低電平0;supply1線網用于對電源建模,即高電平1。下面對一些細節進行說明:(1)在VerilogHDL中,有可能不必聲明某種線網的類型,此時,缺省線網的類型為1位wire線網。可以使用?`default_nettype編譯器指令來聲明線網類型:`default_nettypenetkind(2)在VerilogHDL中,有可能定義標量和向量線網,此時,可選用關鍵字scalared或vectored。如果一個線網定義時使用了關鍵字scalared或vectored,那么就不允許位選擇和部分選擇該線網。換句話說,必須對線網整體賦值。任何未用關鍵字scalared或vectored定義的線網,缺省為標量。順便說一下VerilogHDL中標量和向量的概念。標量:只有大小,沒有方向的量。例如,5.2.2小節的模4加法/減法計數器源文件中Z為標量。向量:有大小,有方向的量。例如,5.2.2小節的模4加法/減法計數器源文件中currentState、nextState都為向量。2.4.2寄存器類型寄存器包含下述5種不同的類型:(1)?reg:寄存器類型,是最常用的數據類型。(2)?integer:整數寄存器。(3)?time:時間寄存器。(4)?real:實數寄存器。(5)?realtime:實數時間寄存器。1.reg寄存器類型reg寄存器數據類型是最常見的數據類型。reg寄存器使用關鍵字reg加以說明,格式如下:reg[msb:lsb]reg1,reg2,…,regN;其中,msb和lsb定義了范圍,并且均為常數值表達式。范圍定義是可選的;如果沒有定義范圍,則缺省值為1位寄存器。2.integer整數寄存器類型integer整數寄存器用于存放整數值。整數寄存器可以作為普通寄存器使用。使用整數寄存器類型時,說明形式如下:integerinteger1integer2,…,integerN[msb:lsb];其中,msb和lsb是定義整數數組界限的常量表達方式,數組界限的定義是可選的。注意允許無位界限的情況。一個整數寄存器最少容納32位,詳見3.12節。3.time時間寄存器類型time時間寄存器用于存儲和處理時間。time時間寄存器的說明格式為timetime_id1,time_id2,…,time_idN[msb:lsb];其中,msb和lsb是表明范圍界限的常量表達式。如果未定義界限,則每個標識符存儲一個至少64位的時間值。時間類型的寄存器只存儲無符號數。4.real實數寄存器和realtime實數時間寄存器類型實數寄存器的說明格式為realrealreg1,realreg2,…,realregN;實數時間寄存器的說明格式為realtimerealtimereg1,realtimereg2,…,realtimeregN;realtime與real類型完全相同。
net線網數據類型(如wire等)和寄存器類型(如reg等)后方括號中用冒號隔開的范圍的最高位MSB(msb)在前,最低位LSB(lsb)在后,最高位的有效數字比最低位大。將reg擴展為存儲器時,方括號中用冒號隔開的范圍的最高位MSB在前,最低位LSB在后,最高位的有效數字比最低位小。2.5操
作
符Verilog的操作符比較豐富,如表2.1所示。這些操作符的優先級別如下:這些單操作符
!,&,~&,|,~|,^,~^,+?(單目,或稱一元,如?+2),-?(單目,或稱一元,如?-5),~?級別最高,為1級;*,/,%?為2級;+?(二元加,如3?+?2),-?(二元減,如5?-?1)為3級;<<,>>?為4級;<,<=,>,>=?為5級;==,!=,===,!==?為6級;&,~&,^,~^(雙目)為7級;|,~|?(雙目)為8級;&&為9級;||?為10級;?:?為11級,級別最低。在表達式中,它們的結合性是從左向右(除??:?外)。2.6系統函數和系統任務Verilog中提供了許多系統函數和任務,如$display、$write、$bitstoreal、$monitor、$strobe、$setup、$finish、$skew、$hold、$setuphold、$itor、$strobe、$period、$time、$printtimescale、$timeformat、$realtime、$width、$realtobits、$recovery($rtoi)等。它們的前面都用一個$符號加以確認。這些系統函數和任務具有很強的功能。現將幾個常用的任務和函數加以介紹。1.$display、$write任務仿真期間有兩個基本的任務用于顯示(輸出)信息:$display和$write。其格式為$display(p1,p2,…,pn);$write(p1,p2,…,pn);參數p2~pn按參數p1給定的格式輸出。p1通常為“格式控制”,p2~pn為“輸出表列”。這兩個任務基本上是相同的,唯一的區別是,$display任務執行結束時自動換行。它們與C語言中的系統函數printf()類似。1)格式說明格式說明由%和格式字符組成,其輸出格式為h或H 以十六進制形式輸出d或D 以十進制形式輸出o或O 以八進制形式輸出b或B 以二進制形式輸出c或C 以ASCII碼形式輸出v或V 輸出線網(net)型數據信號強度m或M 輸出等級層次名字s或S 以字符串的形式輸出t或T 以當前的時間格式輸出2)普通字符普通字符原樣輸出,特殊字符轉換輸出。其中?\n為換行。如果輸出表列中表達式的值含有x、z,則可能是x、z或X、Z,可參閱有關資料。2.系統任務$monitor每當指定的一個或多個值發生變化時,$monitor命令將打印信息。$monitor命令的格式為任務$monitor具有監控和輸出參數表列中的表達式或變量值的功能。$monitoron和$monitoroff任務的作用分別是打開和關閉監控標志,使任務$monitor啟動和停止。3.系統時間函數$time$time是一個以64位值的形式返回當前時間的函數。例如,可用$monitor命令打印時間:$monitor($time,,,"regB=",regB);“,,”代表一個空參數。空參數在輸出時顯示為空格。仿真時間的變化不會觸發$monitor的打印。4.系統時間函數$realtime$realtime和$time的作用是一樣的,不同的是,$realtime返回的時間數字是一個實型數,該數字與$time一樣,也是以時間尺度為基準的。5.系統任務$finish$finish格式為$finish; //默認參數值為1$finish(n);其作用是退出仿真器,返回主操作系統,即結束仿真過程。n為0,不輸出任何信息;n為1,輸出當前仿真時刻和位置;n為2,輸出當前仿真時刻、位置和仿真所用memory及CPU時間的統計。6.系統任務$stop$stop格式為$stop; //默認參數為1$stop(n); //參數同?$finish的解釋$stop和?$finish都是終止仿真。區別在于,$stop將控制返回給仿真器的命令行解釋器,而?$finish將控制返回給操作系統。7.系統任務?$readmemb和?$readmemh這兩個系統任務用于將磁盤文件中的信息讀入Verilog存儲器。“b”的任務是讀取二進制數,“h”的任務是讀取十六進制數。其格式為$readmemx("filename",<memname>,<<start_addr><,<finish_addr>>?>?);其中x表示是b或h;雙引號中是文件名;<memname>為存儲器名;<start_addr>是可選項,說明數據的起始地址,如無,就使用存儲器聲明中給出的地址;<finish_addr>是數據結束地址,也可在文件中說明地址。8.系統函數$random這個系統函數提供了一個產生隨機數的手段。每次調用這個函數時返回一個32位的隨機數,它是一個帶符號的整形數。$random的調用格式為$random; //不帶參數調用$random(<seed>);其中,<seed>是一個輸入/輸出參數,用于控制返回的數。參數是寄存器型、整型、時間型變量。2.7編譯預處理指令Verilog的編譯預處理指令是其編譯系統的一個組成部分,與C語言的編譯預處理功能類似。這些預處理指令以符號“`”開頭(在鍵上與~號同為一鍵,它不同于單引號“’”),而C語言的編譯預處理指令以“#”開頭。Verilog的編譯預處理命令較豐富,我們在這里只介紹四種,其余的可查閱參考書。1.宏定義命令`define`define用一個指定的標識符(即名字)代表一個字符串。其一般格式為`define標識符(宏名)字符串(宏內容)2.文件包含處理命令`include文件包含處理是指一個源文件可以將另外一個源文件的全部內容包含進來,即將另一個文件包含到本文件中。其一般格式為`include"文件名"用它可以避免設計人員的重復勞動。編寫Verilog源文件時,一個源文件可能用到另幾個源文件中的模塊,此時,只要用該命令將用到的模塊的源文件包含進來即可。3.時間尺度命令`timescale`timescale命令用來說明跟在該命令后的模塊的時間單位和時間精度。其一般格式為`timescale<時間單位>/<時間精度><時間單位>用來定義模塊中仿真時間和延遲時間的基準單位。<時間精度>用來聲明該模塊仿真時間的精確程度,用它可對延遲時間值進行取整操作,所以又稱取整精度。用于說明時間單位和時間精度的數字必須是整數:1,10,100;單位為秒(s),毫秒(ms),微秒(μs),納秒(ns),皮秒(ps),飛秒(fs)。4.條件編譯命令?`ifdef…`else…,`endif,`ifdef…,`endif當希望一部分內容只在滿足條件時才編譯,就可選擇下列命令之一。(1)?`ifdef宏名(標識符)。程序段1`else程序段2`endif若宏名已被定義過(用`define),則對程序段1進行編譯,程序段2將被忽略;否則,編譯程序段2,程序段1被忽略。(2)??`ifdef宏名(標識符)。程序段1`endif3.1賦值語句
3.2塊語句
3.3條件語句
3.4循環語句
3.5結構說明語句
3.6行為描述語句
3.7內置門語句
3.8內置開關語句
3.9用戶定義原語UDP
3.10force強迫賦值語句
3.11specify延遲說明塊
3.12關于Verilog-2001新增的一些特性
3.13關于Verilog-20053.1賦值語句3.1.1連續賦值語句和過程賦值語句賦值語句分為連續賦值語句和過程賦值語句。1.連續賦值語句連續賦值語句一直是有效的,無論何時輸入一旦改變,輸出就隨著改變。它的標志(即關鍵字)是assign。連續賦值語句的格式為assign[drive_strength][delay]list_of_net_assignments;其中:方擴號都是可選部分;驅動強度[drive_strength]默認為strong0和strong1,也可指定為除supply0和supply1之外任何類型的標量線網;延遲[delay]默認為0;list_of_net_assignments是列出線網賦值。2.過程賦值語句只有當過程到來且控制權傳遞給它時才執行的語句稱為過程賦值語句。過程賦值語句的前面沒有關鍵字,它出現在過程塊中。過程賦值的格式為regtype=expression;其中,regtype寄存器變量必須是寄存器類型或存儲器型變量,應在模塊的說明部分確認;expression是表達式。直接用“=”給變量賦值的過程賦值的左端變量必須是reg。過程賦值只允許出現在always和initial結構塊中。3.1.2阻塞賦值語句和非阻塞賦值語句賦值語句又分為阻塞賦值語句和非阻塞賦值語句。阻塞賦值語句用=符號連接,非阻塞賦值用<=符號連接,可形象的記憶為非阻塞賦值多了個非,符號就多了個<。阻塞賦值語句和非阻塞賦值語句是用VerilogHDL建模的難點之一,設計時要仔細琢磨。1.阻塞賦值語句我們先看如圖3.1所示的阻塞賦值語句的執行“路線圖”。阻塞,即本條語句具有影響下一條語句的作用。在同一個always進程中,一條阻塞賦值語句的執行直接影響著下條語句的執行情況和結果。阻塞,從字面層上可理解為本條語句阻塞了下一條語句的執行。2.非阻塞賦值語句我們先看如圖3.2所示的非阻塞賦值語句的執行“路線圖”。非阻塞,即各條語句是并發執行(同時執行)的。它更能體現時序邏輯硬件電路的某些特點。任何always和initial語句中,等待同一個變化沿的所有非阻塞賦值語句都是同步的。非阻塞賦值通常與邊沿觸發(敏感)電路對應,時鐘邊沿到來時,電路才動作,賦值才有效。通常,阻塞賦值語句運用在組合電路中,非阻塞賦值語句運用在時序電路中。但許多數字電路往往是既有組合又有時序,此時要仔細考慮。當為時序邏輯建模時,使用“非阻塞賦值”;當描述邊沿敏感電路系統中的并行傳輸時,一定要使用“非阻塞賦值”;當為鎖存器(latch)建模時,使用“非阻塞賦值”;當在同一個always塊里面既為組合邏輯又為時序邏輯建模時,使用“非阻塞賦值”。當用always塊為組合邏輯建模時,使用“阻塞賦值”。不要在同一個always塊里面混合使用“阻塞賦值”和“非阻塞賦值”。
不要在兩個或兩個以上always塊里面對同一個變量進行賦值。可通過編寫一個測試模塊,并使用系統選通任務$strobe或系統顯示任務$display進行功能仿真顯示已被“非阻塞賦值”、“阻塞賦值”的值,觀測、理解其概念。本書在6.1.3小節比較了電路設計中阻塞賦值與非阻塞賦值的區別。值得注意的是:采用非阻塞賦值的賦值語句,只有當整個設計中等待同一個邊沿的所有非阻塞賦值語句“<=”的右邊計算完畢后,才更新它左邊的值,左邊的新值在下一條語句中是不能使用的。阻塞賦值語句和非阻塞賦值語句可看成是兩種類型以不同方式完成的過程賦值語句。3.2塊
語
句VerilogHDL的塊語句有順序塊語句和并行塊語句。3.2.1順序塊語句順序塊語句的格式為begin[:block_identifier{block_item_declaration}]{statement}end其中:方擴號是可選部分(書中以后解釋相同);block_identifier塊標識符是給順序塊起的名子;block_item_declaration塊項目說明可以是參數說明、寄存器說明、事件說明等。可以在命名的begin…end塊內對新的局部變量進行規定和存取。begin...end之間可包含多條過程賦值語句。它們的用途是將多個過程語句組合成一個復合句。3.2.2并行塊語句并行塊語句的格式為fork[:block_identifier{block_item_declaration}]{statement}join其中:block_identifier塊標識符是給并行塊起的名字;block_item_declaration塊項目說明可以是參數說明、寄存器說明、事件說明等。可以在命名的fork...join塊內對新的局部變量進行規定和存取。fork...join之間的每一條語句看做是一個獨立的進程。3.3條
件
語
句條件語句用于改變設計描述中對流程的控制。3.3.1ifelse語句if語句用來判斷所給條件是否滿足,并根據結果(真或假)決定執行給出的操作。VerilogHDL中有三種形式的if語句。(1)?if(condition)語句;(2)?if(condition)語句1;else語句2;(3)?if(condition1)語句1;注意,上述三種形式的條件(condition)通常為關系表達式或邏輯關系表達式。對條件判斷時,其值若為0、x、z,則按“假”處理,緊跟的語句不執行;其值若為1,則按“真”處理,緊跟的語句被執行。當if與else多次連用時,要注意其配對關系:else總是與它上面最近的if配對。表達式可以簡寫。例如,if(expression)與if(expression==1)等效。關系表達式用?>?(大于),>?=(大于等于),<(小于),<=(小于等于),等式操作用==?(等于),!=?(不等于)等操作符來連接。四值邏輯?(0,1,x,z)比較時要比較每一位,包括不確定位和高阻位。此時可使用“case等于”操作符(===)和“case不等于”操作符(!==)將不確定位和高阻位參與比較。邏輯關系表達式用&&(與)、||(或)、!(非)等邏輯關系操作符來連接。3.3.2case語句當if條件可以用一個共同的基本表達式來表示時,常使用case語句表達多分支結構。case語句首先對控制表達式control_expr求值,然后依次對各分支項case_item_expr求值并進行比較,第一個與控制表達式值相匹配的分支中的語句statement被執行,即哪個分支與控制表達式值相匹配,就執行其冒號后的語句,否則執行default后面的語句。可以在一個分支中定義多個分支項;這些值不需要互斥。缺省default分支覆蓋所有沒有被分支表達式覆蓋的其他分支。分支表達式和各分支項表達式不必都是常量表達式。在case語句中,x和z值作為文字值進行比較。還有兩種接受無關值的case語句:casex和casez,這些形式對x和z值使用不同的解釋。除關鍵字casex和casez以外,語法與case語句完全一致。在casez語句中,出現在case表達式和任意分支項表達式中的值z被認為是無關值,即哪個位被忽略(不比較)。在casex語句中,值x和z都被認為是無關位。3.3.3條件操作符構成的語句如果要從兩個值中選出一個來賦值,此時,可使用條件操作符?(?:)。條件操作符的格式為expression1?expression2:expression3;如果第一個表達式expression1為真,則條件操作的值是第二個表達式expression2,否則,它的值就是第三個表達式expression3。3.4循
環
語
句循環語句是用來描述重復的順序行為的語句。VerilogHDL中有四類循環語句:(1)?forever循環。(2)?repeat循環。(3)?while循環。(4)?for循環。3.4.1forever循環語句forever循環語句語的格式為foreverproceduralstatement //程序語句forever循環語句是一直循環執行語句。因此,為跳出這樣的循環,中止語句(disable)可以與過程語句共同使用。在過程語句中必須使用某種形式的時序控制,否則,forever循環將在0時延后永遠循環下去。forever循環語句常用于產生周期性的波形,應用于仿真測試信號。3.4.2repeat循環repeat循環語句的格式為repeat(loopcount) //圓括號中給出循環數proceduralstatement //程序語句這種循環語句執行指定循環次數的過程語句。如果循環數或循環計數表達式的值不確定,即為x或z時,那么循環次數按0處理。3.4.3while循環while循環語句的格式為while(condition)//圓括號中給出循環條件proceduralstatement此循環語句循環執行過程賦值語句直到指定的條件為假。如果循環條件表達式在開始時為假,那么過程語句便永遠不會執行。如果條件表達式為x或z,那么它也同樣按0(假)處理。3.4.4for循環for循環語句的格式為for(initialassignment;condition;stepassignment)proceduralstatement;一個for循環語句按照指定的次數重復執行過程賦值語句若干次。初始賦值initialassignment給出循環變量的初始值。condition條件表達式指定循環在什么情況下必須結束。只要條件為真,循環中的語句就執行;而stepassignment給出要修改的賦值,通常為增加或減少循環變量計數。for循環語句的執行過程如圖3.3所示。我們在實際運用中體會到,VerilogHDL的for循環語句編程看似簡潔,但有時實現的硬件電路未必簡單。3.5結構說明語句為了更方便管理、更容易調用,VerilogHDL提供了一類用戶可定義的、完成一定功能的函數說明語句和任務說明語句。這類函數說明語句和任務說明語句作為一個整體,可看成一種結構說明語句。3.5.1task(任務)VerilogHDL中的任務與計算機軟件中的過程類似。它可以由調用語句調用,執行之后返回到下一條語句。它不能用在表達式中,但可以接受參數并返回結果。它內部可以聲明局部變量,這些變量的作用域局限在這個任務中。其中:task_identifier任務標識符實際就是該任務的名字;task_item_declaration任務的各項說明包括端口及數據類型的聲明語句;statement可以有若干句。任務調用及變量的傳遞格式為task_identifier(port1,port2,…,portn);其中:task_identifier表示任務的名字;port1,port2,…,portn表示端口1,端口2,…,端口n。任務調用的變量和任務定義的I/O變量之間是一一對應的。3.5.2function(函數)VerilogHDL中的函數與計算機軟件中的函數類似。函數有一個輸出(函數名)和至少有一個輸入。在函數內部其他標識符可以被說明,它們的作用域是函數內部。函數不能包含延遲(#)或事件控制(@,wait)語句。函數的目的是返回一個用于表達式的值。其中:rangeortype返回值的類型或范圍是可選的,若默認,則返回為一位寄存器型數據;function_identifier函數標識符實際就是該函數的名字;function_item_declaration函數各項說明包括端口說明、變量類型說明;statement可以有若干句。在函數的定義中必須有一條賦值語句給函數中的內部變量賦以函數結果值,該內部變量具有和函數名相同的名字。VerilogHDL模塊使用函數時是把它當作表達式中的操作符,這個操作的結果值就是這個函數的返回值。函數的調用格式為function(函數)和task(任務)說明語句的不同點:(1)函數只能與主模塊共用同一個仿真時間單位,而任務可以定義自己的仿真時間單位。(2)函數能調用其他函數不能調用其他任務,而任務能調用其他任務和函數。(3)函數至少要有一個輸入變量,但不能將inout型作為輸出,而任務可以沒有或有多個任何類型的變量。(4)函數為調用它的表達式返回一個值,而任務則不返回值。(5)函數的定義不能包含任何的時間控制語句,而任務可以。(6)函數調用是表達式中的一個操作數,可以在過程和連續賦值語句中調用,而任務調用是一個單獨的過程語句,不能在連續賦值語句中調用。(7)函數的目的是通過返回一個值來對應輸入信號的值,而任務卻能支持多種目地,并能計算多個結果值,這些結果值只能通過被調用的任務的輸出或總線端口送出。3.6行為描述語句行為描述的標志是包含了一個或多個always語句,或有initial語句。行為描述語句包括:①initial(初始化)語句;②always(總是)語句。第2章曾作了一些介紹,這里做進一步說明。3.6.1initial語句initial語句的格式為initialstatement;其中,statement語句可以包括若干個。initial語句只執行一次。initial語句提供了一種在實際電路開始模擬之前初始化輸入波形和模擬變量的方式。initial語句所包含的語句一旦執行完畢,它不會再重復執行,就永遠掛起。initial語句通常多用于描述模擬的初始化工作。3.6.2always語句always語句的格式為alwaysstatement;其中,statement語句可以包括若干個。always語句反復執行。always所包含的語句反復執行,永遠不退出或終止執行。一個行為建模中可包含一個或多個always語句。alwaysstatement的statement結構形式很豐富,約有10多種,如:(1)阻塞賦值(blockingassignment);(2)非阻塞賦值(nonblockingassignment);(3)過程連續賦值(proceduralcontinuousassignment);(4)過程定時控制(proceduraltimingcontrolstatement);(5)條件語句(conditionalstatement);(6)情況語句(casestatement);(7)循環語句(loopstatement);(8)等待語句(waitstatement);(9)終止語句(disablestatement);(10)事件觸發(eventtrigger);(11)順序塊(seq_block);(12)并行塊(par_block);(13)任務使能(taskenable);(14)系統任務使能(systemtaskenable)。通常有如下一些常用結構形式:①alwaysstatement1;always后只緊跟一個或幾個阻塞賦值語句;always后只緊跟一個或幾個非阻塞賦值語句,它們是一種最簡單形式。3.7內
置
門
語
句VerilogHDL提供了由14個門級基元組成的集合,可將它們稱為內置門語句。這些門級基本單元可通過線網連接,并將它們封裝進模塊,從而建立更大的功能模塊。3.7.1多輸入門多輸入門n_input_gate的格式為n_input_gatetype[drive_strength][delay2]n_input_gate_instance;n_input_gatetype:n輸入門類型,包括and(與門)、nand(與非門)、or(或門)、nor(或非門)、xor(異或門)、xnor(異或非門、同或門)。n_input_gate_instance:n輸入門實例,包括可選門實例的名字、門的輸出、輸入端列表,后二者用括號括起,且輸出在前、輸入在后,由逗號隔開,如[name_of_gate_instance](output_terminal,input_terminal{,input_terminal})。可選的驅動強度[drive_strength]:指明門輸出的電氣特性即驅動能力。當一條連線由多個前級輸出所驅動時,各驅動端的驅動強度不同,將直接影響連線最終的邏輯狀態。默認強度為strong0、strong1。可選的延遲[delay2]:這里delay2可以是#delay_value;也可以是?#(delay_value[,delay_value]),括號中第一項為上升延遲,第二項為下降延遲。可選的延遲?[delay2]?默認為0。圖3.4給出了三組多輸入門舉例。在模塊中,圖3.4(a)、(b)、(c)分別被描述為當然,當它們同時出現在同一模塊中時,輸入、輸出端子的名字應按實際情況加以區分。3.7.2多輸出門多輸出門n_output_gate的格式為n_output_gatetype[drive_strength][delay2]n_output_gate_instance;n_output_gatetype:n輸出門類型包括buf(緩沖門)、not(非門)。n_output_gate_instance:n輸出門實例,包括可選門實例的名字、門的輸出、輸入端列表,后二者用括號括起,且輸出在前、輸入在后,由逗號隔開,如[name_of_gate_instance](output_terminal{,output_terminal},input_terminal)。可選的驅動強度[drive_strength]:指明門輸出的電氣特性即驅動能力。可選的延遲[delay2]:這里delay2可以是?#delay_value;也可以是?#(delay_value[,delay_value]),括號中第一項為上升延遲,第二項為下降延遲。可選的延遲[delay2]默認為0。圖3.5給出了多輸出門舉例。在模塊中,buf(緩沖門)、not(非門)分別被描述為buf(Y1,Y2,…,Yn,a);not(Y1,Y2,…,Yn,a);3.7.3使能門在系統設計中,使能門是必不可少的。使能門enable_gate的格式為enable_gatetype[drive_strength][delay3]enable_gate_instance;enable_gatetype:使能門類型包括bufif1高電平使能三態緩沖門、bufif0低電平使能三態緩沖門、notif1高電平使能非門、notif0低電平使能非門。enable_gate_instance:使能門實例,包括可選門實例的名字、輸出、輸入、使能端列表,后三項用括號括起,且輸出在前、輸入和使能在后,由逗號隔開,如[name_of_gate_instance](output_terminal,input_terminal,enable_terminal)。可選的驅動強度[drive_strength]:指明門輸出的電氣特性即驅動能力。可選的延遲[delay3]:這里delay3可以是?#delay_value;也可以是?#(delay_value[,delay_value[,delay_value]]),括號中第一項為上升延遲,第二項為下降延遲,第三項為高阻延遲(用于trireg線網時,它使連線的值變為x的衰減時間)。可選的延遲[delay3]默認為0。圖3.6給出了使能門舉例。在模塊中,bufif1高電平使能三態緩沖門、bufif0低電平使能三態緩沖門、notif1高電平使能非門、notif0低電平使能非門分別被描述為bufif1(Y,a,en); //當en為0時,bufif1驅動輸出Y為高阻;否則a被傳輸至Ybufif0(Y,a,en); //當en為1時,bufif0驅動輸出Y為高阻;否則a被傳輸至Ynotif1(Y,b,en); //當en為0時,notif1驅動輸出Y為高阻;否則b非被傳輸至Ynotif0(Y,b,en); //當en為1時,notif0驅動輸出Y為高阻;否則b非被傳輸至Y3.7.4上拉和下拉上拉pullup的格式為pullup[pullup_strength]pull_gate_instance;pull_gate_instance:上拉門實例,包括可選門實例的名字、門的輸出(后者用括號括起)。即[name_of_gate_instance](output_terminal)。可選的上拉強度[pullup_strength]可以是(strength0,strength1),也可以是(strength1,strength0),還可以是strength1。下拉pulldown的格式為pulldown[pulldown_strength]pull_gate_instance;pull_gate_instance:下拉門實例,包括可選的門實例的名字,用括號包含門的輸出,如[name_of_gate_instance](output_terminal)。可選的下拉強度[pulldown_strength]可以是(strength0,strength1),也可以是(strength1,strength0),還可以是strength0。pullup實際為上拉電阻,pulldown實際為下拉電阻。3.8內置開關語句VerilogHDL提供了由12個開關級基元組成的集合,可將它們稱為內置開關語句。內置開關語句用來描述傳輸門的互連,這些傳輸門是單個的MOS管(CMOS管)的抽象。內置開關可以模擬MOS管(CMOS管)的導通或不導通。3.8.1mos開關mos開關的格式為mos_switchtype[delay3]mos_switch_gate_instance;mos_switchtype:mos開關類型,包括nmos、pmos、rnmos、rpmos。“r”型mos具有更高的傳導阻抗。mos_swith_gate_instance:mos開關門實例,包括可選門實例的名字、門的輸出、輸入、使能端列表,后三項用括號括起,且輸出在前、輸入和使能在后,由逗號隔開,如?[name_of_gate_instance](output_terminal,input_terminal,enable_terminal)。可選的延遲[delay3]:這里delay3可以是#delay_value;也可以是#(delay_value[,delay_value[,delay_value]]),括號中第一項為上升延遲,第二項為下降延遲,第三項為高阻延遲(用于trireg線網時,它使連線的值變為x的衰減時間)。可選的延遲[delay3]默認為0。3.8.2cmos開關cmos開關的格式為cmos_switchtype[delay3]cmos_switch_gate_instance;cmos_switchtype:cmos開關類型,包括cmos、rcmos。cmos_switch_gate_instance:cmos開關門實例,包括可選門實例的名字、門的輸出、輸入、n控制、p控制端列表,后四項用括號括起,且按照輸出、輸入、n控制、p控制順序排列,由逗號隔開,如[name_of_gate_instance](output_terminal,input_terminal,ncontrol_terminal,pcontrol_terminal)。可選的延遲[delay3]:這里delay3可以是#delay_value;也可以是#(delay_value[,delay_value[,delay_value]]),括號中第一項為上升延遲,第二項為下降延遲,第三項為高阻延遲(用于trireg線網時,它使連線的值變為x的衰減時間)。可選的延遲(delay3)默認為0。3.8.3pass開關pass開關的格式為pass_switchtypepass_switch_gate_instance;pass_switchtype:pass開關類型,包括tran、rtran。tran為雙向傳輸門,rtran具有更高阻抗。pass_switch_gate_instance:pass開關門實例,包括可選的門實例的名字、門的輸出輸入、輸出輸入端列表,后二者用括號括起,由逗號隔開,如[name_of_gate_instance](inout_terminal,inout_terminal)。3.8.4pass_en開關pass_en開關的格式為pass_en_switchtype[delay3]pass_en_switch_gate_instance;pass_en_switchtype:pass_en開關類型,包括tranif0、tranif1、rtranif1、rtranif0。pass_en_switch_gate_instance:pass_en開關門實例,包括可選的門實例的名字、門的輸出輸入、使能端列表,后三項用括號括起,且由逗號隔開,如[name_of_gate_instance](inout_terminal,inout_terminal,enableterminal)。可選的延遲[delay3]:這里delay3可以是#delay_value;也可以是?#(delay_value[,delay_value[,delay_value]]),括號中第一項為上升延遲,第二項為下降延遲,第三項為高阻延遲(用于trireg線網時,它使連線的值變為x的衰減時間)。可選的延遲[delay3]默認為0。3.9用戶定義原語UDPVerilogHDL提供了一種用戶可以拓展、定義的原始的基本單元,稱之為用戶定義原語,簡記為UDP(UserDefinedPrimitives)。它的結構類似于邏輯函數真值表的枚舉形式。這種用戶定義的基本單元是一種獨立的VerilogHDL模塊。用戶定義原語后,這個UDP就可以像內置門語句那樣作為一種實例語句使用。3.9.1UDP的結構用戶定義原語UDP并非是由用戶隨心所欲地定義,而是要按一定的規矩、一定的語法結構形式去定義。UDP的結構形式為udp_port_list:UDP的端口列表,包括output_port_identifier、input_port_identifier{,input_port_identifier},即輸出端口名、輸入端口名。udp_port_declaration:UDP的端口說明,包括輸出說明、輸入說明、寄存器說明。udp_body:UDP的主體,它可以是:①
組合電路主體;②
時序電路主體。(1)組合電路主體的結構如下:tablecombinational_entry{combinational_entry}endtable其中,combinational_entry為組合電路實體,以類似于邏輯函數真值表的枚舉形式列出:level_input_list:output_symbol;列表冒號左邊為輸入,右邊為輸出。列表以電平1、0、X表示輸入、輸出值,輸入中Z被看做是X,但它不能出現。允許列表中說明無關項。列表中可用符號“???”進行簡寫,符號“???”表示用1、0、X依次代替。(2)時序電路主體的結構如下:udp_initial_statement為可選的UDP初始化語句,其形式如下:initialudp_output_port_identifier=init_value;在初始化語句中將init_value賦給U
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 區塊鏈數據備份光盤驅動器租賃與遠程監控服務協議
- 智慧農業無人機精準噴灑系統租賃服務合同
- 高校與知名企業聯合培養實習生就業保障協議
- 管理者任職資格答辯
- 《情感調控》課件
- 《聚酰亞胺》課件:一種耐高溫高分子材料的深度解析
- 《聚合物X射線研究》課件
- 防火放電安全教育
- 《慢性腎衰竭》課件
- 《咖啡文化基礎知識》課件
- 成都地鐵介紹課件
- 幼兒園繪本故事:《十二生肖》 課件
- 小學數學北師大五年級下冊七用方程解決問題相遇問題導學單
- 新媒體運營知識考核試題與答案
- 金屬材料的主要性能ppt課件(完整版)
- “新時代好少年”推薦表
- 規章制度文件評審表
- 草坪學實習報告模板-Copy
- K-H-V行星齒輪減速器 瞿鴻鵬
- 初中道德與法治課課堂課堂評價表
- sales-contract(中英文詳版)
評論
0/150
提交評論