




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