《EDA技術(shù)及應(yīng)用-VerilogHDL版》課件第3章_第1頁
《EDA技術(shù)及應(yīng)用-VerilogHDL版》課件第3章_第2頁
《EDA技術(shù)及應(yīng)用-VerilogHDL版》課件第3章_第3頁
《EDA技術(shù)及應(yīng)用-VerilogHDL版》課件第3章_第4頁
《EDA技術(shù)及應(yīng)用-VerilogHDL版》課件第3章_第5頁
已閱讀5頁,還剩443頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.1VerilogHDL簡介

3.2VerilogHDL程序概述

3.3VerilogHDL語言要素

3.4結(jié)構(gòu)描述語句

3.5數(shù)據(jù)流描述語句

3.6行為描述語句

3.7函數(shù)與任務(wù)

3.8基本邏輯電路設(shè)計

3.9狀態(tài)機的VerilogHDL設(shè)計

第3章VerilogHDL編程基礎(chǔ)

3.1.1常用硬件描述語言簡介

常用硬件描述語言有VHDL、Verilog和ABEL語言。VHDL起源于美國國防部的VHSIC;Verilog起源于集成電路的設(shè)計;ABEL來源于可編程邏輯器件的設(shè)計。下面從使用方面將三者進行對比。3.1VerilogHDL簡介

(1)邏輯描述層次。一般的硬件描述語言由高到低依次可分為行為級、RTL級和門電路級三個描述層次。VHDL語言是一種高級描述語言,適用于行為級和RTL級的描述,最適于描述電路的行為;Verilog語言和ABEL語言是一種較低級的描述語言,適用于RTL級和門電路級的描述,最適于描述門級電路。

(2)設(shè)計要求。用VHDL進行電子系統(tǒng)設(shè)計時可以不了解電路的結(jié)構(gòu)細節(jié),設(shè)計者所做的工作較少;用Verilog和ABEL語言進行電子系統(tǒng)設(shè)計時需了解電路的結(jié)構(gòu)細節(jié),設(shè)計者需做大量的工作。

(3)綜合過程。任何一種語言源程序最終都要轉(zhuǎn)換成門電路級才能被布線器或適配器所接受,因此,VHDL語言源程序的綜合通常要經(jīng)過行為級→RTL級→門電路級的轉(zhuǎn)化,它幾乎不能直接控制門電路的生成,而Verilog語言和ABEL語言源程序的綜合過程要稍簡單,即經(jīng)過RTL級→門電路級的轉(zhuǎn)化,易于控制電路資源。

(4)對綜合器的要求。VHDL描述語言層次較高,不易控制底層電路,因而對綜合器的性能要求較高;Verilog和ABEL對綜合器的性能要求較低。

(5)支持的EDA工具。支持VHDL和Verilog的EDA工具很多,但支持ABEL的綜合器僅僅DATAIO一家。

(6)國際化程度。VHDL和Verilog已成為IEEE標準;ABEL正朝國際化標準努力。3.1.2VerilogHDL的優(yōu)點

VerilogHDL是GDA公司的PhilMoorby于1983年首創(chuàng)的。1986年,PhilMoorby又在其基礎(chǔ)上提出了用于快速門級仿真的XL算法,使得VerilogHDL又向前推進了一大步。1989年,Cadence公司收購了GDA公司,VerilogHDL語言成為Cadence公司的私有財產(chǎn)。1990年,Cadence公司公開了VerilogHDL語言,成立了OVI(OpenVerilogInternational)組織來負責VerilogHDL的發(fā)展。1995年,IEEE制定了VerilogHDL的IEEE標準。VerilogHDL語言提供簡潔、可讀性非常強的句法,使其得到了很好的發(fā)展,使用VerilogHDL已經(jīng)成功地設(shè)計出了許多大規(guī)模硬件電路。

VerilogHDL主要具有以下優(yōu)點:

(1)內(nèi)置開關(guān)級基本結(jié)構(gòu)模型(如pmos、nmos等),內(nèi)置邏輯函數(shù)(如按位與&和按位或||),內(nèi)置基本邏輯門(如and、or等),因此可從開關(guān)級、門級、寄存器傳輸級(RTL)到算法級進行多個層次的設(shè)計描述。

(2)可采用行為描述、數(shù)據(jù)流描述和結(jié)構(gòu)化描述三種不同方式或混合方式對設(shè)計建模。其中,行為描述方式使用過程化結(jié)構(gòu)建模,它不僅能夠在RTL級上進行設(shè)計描述,而且能夠在體系結(jié)構(gòu)級描述及其算法級行為上進行設(shè)計描述;數(shù)據(jù)流描述方式使用連續(xù)賦值語句方式建模;結(jié)構(gòu)化描述方式使用門和模塊實例語句描述建模,它可描述任何層次。

(3)具有兩種數(shù)據(jù)類型:線網(wǎng)數(shù)據(jù)類型和寄存器數(shù)據(jù)類型。其中,線網(wǎng)類型表示系統(tǒng)各模塊間的物理連線;寄存器類型表示抽象的數(shù)據(jù)存儲元件。

(4)同一語言可用于生成模擬激勵和指定測試的驗證約束條件;能夠監(jiān)控模擬驗證的執(zhí)行,模擬驗證執(zhí)行過程中設(shè)計的值能夠被監(jiān)控和顯示;具有強大的文件讀寫能力;提供顯示語言結(jié)構(gòu)指定設(shè)計中的端口到端口的時延、路徑時延和設(shè)計的時序檢查。

(5)能夠通過使用編程語言接口PLI機制進一步擴展描述能力。編程語言接口PLI是指允許外部函數(shù)訪問VerilogHDL模塊內(nèi)信息,允許設(shè)計者與模擬器交互的例程集合。3.1.3VerilogHDL程序設(shè)計約定

為了便于程序的閱讀和調(diào)試,本書對VerilogHDL程序設(shè)計特作如下約定:

(1)語句結(jié)構(gòu)描述中方括號“[]”內(nèi)的內(nèi)容為可選內(nèi)容。

(2)對于VerilogHDL的編譯器和綜合器來說,程序文字的大小寫是區(qū)分的。本書一般使用小寫。

(3)?VerilogHDL支持兩種形式的注釋符:/*---*/?和?//。其中,/*---*/?為多行注釋符,用于多行注釋;//?為單行注釋,//?后面直到行尾為注釋文字。

(4)為了便于程序的閱讀與調(diào)試,書寫和輸入程序時,使用層次縮進格式,同一層次的對齊,低層次的、較高層次的縮進兩個字符。

(5)考慮到Altera公司的EDA軟件要求源程序文件的名字與實體名(或模塊名)必須一致,因此為了使同一個VerilogHDL源程序文件能適應(yīng)各個EDA開發(fā)軟件的使用要求,建議各個源程序文件的命名均與其實體名一致。3.2.1VerilogHDL程序設(shè)計舉例

【例3.1】用VerilogHDL設(shè)計一個1位二進制全加器。

1.設(shè)計思路

如圖3.1所示,1位二進制全加器可由兩個半加器和一個或門組成(具體邏輯關(guān)系可由真值表進行推導和化簡),因此使用自底向上的設(shè)計方法,先分別進行底層的或門模塊myor2.v和半加器模塊h_adder.v的設(shè)計,再進行頂層的1位全加器f_adder.v的設(shè)計。3.2VerilogHDL程序概述圖3.11位全加器邏輯組成原理圖

2.VerilogHDL源程序

1)或門模塊myor2.v

//或門模塊myor2.v

modulemyor2(a,b,c); //模塊描述開始

inputa,b; //模塊輸入端口說明

outputc; //模塊輸出端口說明

//數(shù)據(jù)流方式描述模塊功能

assignc=a|b; //連續(xù)賦值語句描述模塊功能

endmodule //模塊描述結(jié)束2)半加器模塊h_adder.v

//半加器模塊h_adder.v

moduleh_adder(a,b,so,co); //模塊描述開始

inputa,b; //模塊輸入端口說明

outputso,co; //模塊輸出端口說明

//數(shù)據(jù)流方式描述模塊功能

assignso=(a|b)&&(!(a&&b)); //連續(xù)賦值語句描述模塊功能

assignco=!(!(a&&b)); //連續(xù)賦值語句描述模塊功能

endmodule //模塊描述結(jié)束3)全加器f_adder.v

//全加器f_adder.v

modulef_adder(ain,bin,cin,sum,cout); //模塊描述開始

inputain,bin,cin; //模塊輸入端口說明

outputsum,cout; //模塊輸出端口說明

wires1,s2,s3; //數(shù)據(jù)類型說明

//使用元件實例化語句描述系統(tǒng)的組成結(jié)構(gòu)

h_adderu1(.a(ain),.b(bin),.so(s2),.co(s1)); //名字關(guān)聯(lián)元件實例化

h_adderu2(.a(s2),.b(cin),.so(sum),.co(s3)); //名字關(guān)聯(lián)元件實例化

myor2u3(.a(s1),.b(s3),.c(cout)); //名字關(guān)聯(lián)元件實例化

endmodule //模塊描述結(jié)束

3.說明與分析

(1)?VerilogHDL程序是由模塊組成的,每個模塊的內(nèi)容都包含在“module”和“endmodule”兩個語句之間。module后首先是<模塊名>(<端口列表>);接著對每個模塊的輸入、輸出端口進行定義,對模塊內(nèi)部各組件之間信息交流的數(shù)據(jù)類型進行說明;最后是描述模塊內(nèi)部的組成及邏輯關(guān)系。

(2)圖3.2是使用SynplifyPro7.6對1位全加器f_adder進行邏輯綜合后的RTL視圖。從RTL視圖可看出,VerilogHDL等硬件描述語言的各語句或語句組經(jīng)邏輯綜合后都會生成對應(yīng)的硬件電路,同時系統(tǒng)要正常工作的話,電路系統(tǒng)中的各個組成部分應(yīng)該同時工作,也即電路系統(tǒng)的各部分工作是并行的。當然,如果某些電路組件的工作需要滿足一定的條件,那么控制電路組件工作的條件,則可使其中的部分硬件按順序工作。圖3.21位全加器f_adder的RTL圖

(3)圖3.3是使用Quartus?Ⅱ8.0對全加器f_adder進行仿真的結(jié)果圖。從仿真結(jié)果可看出,全加器f_adder的輸入和輸出之間滿足要求的邏輯關(guān)系,因此本設(shè)計是正確的。圖3.31位全加器f_adder的仿真結(jié)果圖3.2.2VerilogHDL程序的基本結(jié)構(gòu)

VerilogHDL是以模塊集合的形式來描述硬件系統(tǒng)的。模塊是VerilogHDL的基本單元,它用于描述某個設(shè)計的功能或結(jié)構(gòu)及其與其他模塊的外部接口。模塊可以代表從簡單門元件到復(fù)雜系統(tǒng)的任何一個硬件電路。每一個模塊都有接口部分,用于描述與其他模塊之間的連接關(guān)系。VerilogHDL的各個模塊之間是并行運行的。通常設(shè)計的硬件系統(tǒng)有一個頂層模塊,該頂層模塊的輸入輸出分別代表系統(tǒng)的輸入輸出,頂層模塊可以由若干個子模塊組成,每個子模塊代表著系統(tǒng)中具有特定功能的一個功能單元,各個子模塊通過端口相互連接起來,從而實現(xiàn)分層設(shè)計。模塊的基本組成結(jié)構(gòu)如下:

module<模塊名>(<端口列表>);

端口說明(input,output,inout)

參數(shù)定義(可選)(parameter)

數(shù)據(jù)類型定義(wire,reg等)

連續(xù)賦值語句(assign)

過程塊語句(initial和always)(包括條件、選擇、循環(huán)等行為描述語句或語句塊)

底層模塊實例引用(moduleinstantiations)

函數(shù)和任務(wù)(function,task)

endmodule其中,<模塊名>是模塊惟一的標識符;<端口列表>是由模塊各個輸入、輸出和雙向端口組成的端口列表,這些端口用來與其他模塊進行連接;端口說明用來說明各個端口的數(shù)據(jù)流向及數(shù)據(jù)寬度等;參數(shù)定義用來說明系統(tǒng)設(shè)計中用到的有關(guān)參數(shù);數(shù)據(jù)類型定義用來指定模塊內(nèi)各組件進行信息交流所用的數(shù)據(jù)對象為寄存器型、存儲器型或連線型;用于說明系統(tǒng)的邏輯功能及組成的語句有三種,包括連續(xù)賦值語句(assign)、過程塊(initial和always)語句和底層模塊實例引用(moduleinstantiations),其中連續(xù)賦值語句(assign)用于數(shù)據(jù)流描述,過程塊語句用于行為描述,內(nèi)含各種行為描述語句,而底層模塊實例引用則進行結(jié)構(gòu)描述。

VerilogHDL程序是由模塊組成的,每個模塊的內(nèi)容都包含在“module”和“endmodule”兩個語句之間。VerilogHDL程序的書寫格式與C語言類似,一行可以寫多條語句,也可以一條語句分成多行寫,每條語句以分號結(jié)束,但endmodule語句后面不必寫分號。3.2.3VerilogHDL程序的基本特性

VerilogHDL作為一種硬件描述語言,語句從物理特性上可分為兩種:一種語句只能用于硬件設(shè)計仿真,因此這些語句不能進行邏輯綜合,也就是不能變成有關(guān)硬件;另一種語句是真正用于實現(xiàn)硬件的語句,它進行邏輯綜合后會變成對應(yīng)的硬件電路。

根據(jù)語句執(zhí)行順序可分為順序語句和并行語句兩種,但從本質(zhì)上來講,所有語句都是并行運行的,這是因為硬件的運行特征就是并行運行,而在實際應(yīng)用中有時又要求順序進行,因此如果我們對硬件運行附加控制條件,那么硬件的運行就可以是順序的。

VerilogHDL的并行語句包括連續(xù)賦值語句(assign)、模塊實例引用(moduleinstantiations)、always和initial過程塊語句。而順序語句(行為語句)包括條件語句、選擇語句、循環(huán)語句等,這些順序語句只能用在always過程塊語句中。3.2.4VerilogHDL程序的描述風格

在VerilogHDL中,模塊的內(nèi)部組成和邏輯功能可用不同的語句類型和描述方式來表達,這些描述方式(建模方法)稱為描述風格,通??蓺w納為三種:結(jié)構(gòu)描述、數(shù)據(jù)流(寄存器傳輸級RTL)描述和行為描述。在實際應(yīng)用中,為了能兼顧整個設(shè)計的功能、資源、性能幾方面的因素,通常混合使用這三種描述方式。

1.結(jié)構(gòu)描述

所謂結(jié)構(gòu)描述,是指描述該設(shè)計單元的硬件結(jié)構(gòu),即該硬件是如何構(gòu)成的。它主要使用元件或模塊實例化語句來描述系統(tǒng)內(nèi)各元件或模塊的互連關(guān)系,其中各組件的連接媒介是線網(wǎng)。結(jié)構(gòu)化描述可通過內(nèi)置門原語(門級)、開關(guān)級原語(晶體管級)、用戶自定義的原語(門級)、模塊化實例(層次結(jié)構(gòu))等方式進行結(jié)構(gòu)建模。利用結(jié)構(gòu)描述可以用不同類型的結(jié)構(gòu),來完成多層次的工程,即從簡單的門到非常復(fù)雜的元件(包括各種已完成的設(shè)計實體子模塊)來描述整個系統(tǒng)。元件間的連接是通過定義的端口界面來實現(xiàn)的,其風格最接近實際的硬件結(jié)構(gòu),即設(shè)計中的元件是互連的。

2.數(shù)據(jù)流描述

數(shù)據(jù)流描述也稱RTL描述,它以類似于寄存器傳輸級的方式描述數(shù)據(jù)的傳輸和變換,以規(guī)定設(shè)計中的各種寄存器形式為特征,然后在寄存器之間插入組合邏輯。這類寄存器或者顯式地通過元件具體裝配,或者通過推論作隱含的描述。數(shù)據(jù)流描述主要使用并行運行的連續(xù)賦值語句assign,既顯式表示了該設(shè)計單元的行為,又隱含了該設(shè)計單元的結(jié)構(gòu)。連續(xù)賦值語句的使用格式為

assign[延遲時間]網(wǎng)絡(luò)名=表達式;

當右邊表達式發(fā)生任何變化時,左邊網(wǎng)絡(luò)名的值將在設(shè)定的延遲時間后變成新的值。

數(shù)據(jù)流的描述風格是建立在用連續(xù)賦值語句描述的基礎(chǔ)上的。當語句中任一輸入信號的值發(fā)生改變時,賦值語句就被激活,隨著這種語句對電路行為的描述,大量的有關(guān)這種結(jié)構(gòu)的信息也從這種邏輯描述中“流出”。認為數(shù)據(jù)是從一個設(shè)計中流出,從輸入到輸出的觀點稱為數(shù)據(jù)流風格。數(shù)據(jù)流描述方式能比較直觀地表述底層邏輯行為。

3.行為描述

如果VerilogHDL的邏輯描述只描述了所希望電路的功能或者說電路行為,而沒有直接指明或涉及實現(xiàn)這些行為的硬件結(jié)構(gòu),則稱為行為描述。行為描述只表示輸入與輸出間轉(zhuǎn)換的行為,它不包含任何結(jié)構(gòu)信息。行為描述主要是使用initial語句和always語句來進行的。這里所謂的硬件結(jié)構(gòu),是指具體硬件電路的連接結(jié)構(gòu)、邏輯門的組成結(jié)構(gòu)、元件或其他各種功能單元的層次結(jié)構(gòu)等。

4.混合描述

混合描述就是將結(jié)構(gòu)描述、數(shù)據(jù)流描述和行為描述方式混合起來使用。在設(shè)計中,可以含有連續(xù)賦值語句、always語句、initial語句、內(nèi)置門原語、開關(guān)級原語、用戶自定義原語和模塊化實例等語句。

5.應(yīng)用實例

【例3.2】設(shè)計一個如圖3.4所示的觸發(fā)器輸出選擇電路。圖3.4觸發(fā)器輸出選擇電路組成結(jié)構(gòu)圖

1)設(shè)計思路

首先設(shè)計底層的D觸發(fā)器mydff.v和二選一選擇器mux2_1.v,再由兩個D觸發(fā)器和一個二選一選擇器組成頂層的觸發(fā)器輸出選擇器dff_sel.v。2)?VerilogHDL源程序

//D觸發(fā)器mydff.v

modulemydff(d,clk,q);

inputd,clk;

outputq;

regq;

//行為描述過程塊

always@(posedgeclk) //判斷clk的上升沿觸發(fā)

q=d;

endmodule//二選一選擇器mux2_1.v

modulemux2_1(ma,mb,s,mout);

inputma,mb; //選擇器的兩個數(shù)據(jù)輸入

inputs; //選擇器的選擇信號

outputmout; //選擇器的輸出

//數(shù)據(jù)流描述

assignmout=s?ma:mb; //條件連續(xù)賦值:當s=1時,mout=ma;否則,mout=mb

endmodule//觸發(fā)器輸出選擇器dff_sel.v

moduledff_sel(da,db,sel,clk,q);

inputda,db,sel,clk; //輸入端口說明

outputq; //輸出端口說明

wireqa,qb; //連線型數(shù)據(jù)類型說明

//實例化語句描述模塊內(nèi)部組成結(jié)構(gòu)

mydffu0(.d(da),.q(qa),.clk(clk)); //名字實例化語句

mydffu1(db,clk,qb); //位置(順序)實例化語句

mux2_1u2(.ma(qa),.mb(qb),.s(sel),.mout(q));//名字實例化語句

endmodule圖3.5是觸發(fā)器輸出選擇電路dff_sel的仿真結(jié)果。從仿真結(jié)果可看出,該設(shè)計是正確的。(注:如果沒有特別注明,本章的有關(guān)仿真結(jié)果圖和綜合后的RTL視圖均是指使用QuartusⅡ8.0進行仿真和邏輯綜合的結(jié)果,以后將不再一一注明)。圖3.5觸發(fā)器輸出選擇電路dff_sel的仿真結(jié)果圖3.3.1VerilogHDL文字規(guī)則

1.常量

在VerilogHDL程序運行過程中,其值不能被隨意改變的量,稱為常數(shù)或常量。常量主要有整型常量、實數(shù)型常量和字符串常量。其中,整型常量是可以綜合的;實數(shù)型常量和字符串常量是不可綜合的。下面主要介紹這三類常量的使用與書寫問題。3.3VerilogHDL語言要素

1)整型常量

整型常量的書寫格式主要有兩種:基本格式和基數(shù)格式。

(1)基本格式。基本格式整型常量為一有符號數(shù),可以帶可選擇的“+”或者“-”操作符。例如:

16//十進制數(shù)16;-25//十進制數(shù)-25

(2)基數(shù)格式。基數(shù)格式整型常量的一般表示形式為

[size]‘basevalue

其中,size定義常量的位長;base定義常量的進制類型,可選擇B(b)(二進制)、O(o)(八進制)、D(d)(十進制)和H(h)(十六進制);value為數(shù)字序列。例如:

2'b01//2位二進制數(shù);5'o37//5位八進制數(shù)

4'd15//4位十進制數(shù);8'haa//8位十六進制數(shù)

2)實數(shù)整型常量

實數(shù)整型常量書寫格式主要有兩種:十進制計數(shù)法和科學計數(shù)法。

(1)十進制計數(shù)法。VerilogHDL中,實數(shù)整型常量的十進制類似于一般意義下的十進制計數(shù)法,如:1.000、2.135、3.14159等。

(2)科學計數(shù)法。VerilogHDL中,實數(shù)整型常量的科學計數(shù)法類似于一般意義下的科學計數(shù)法,如:2.3e+3、1.0e-6等。

(3)字符串型常量。字符串型常量是雙引號內(nèi)的字符串,并且不能分成幾行書寫。

例如:

"MYHAPPYWORLD" //合法

"MYHAPPY

WORLD" //非法

在常量中,有時整型常量和實數(shù)型常量中含有下劃線“_”。VerilogHDL的整型常量中的下劃線“_”只是用來提高易讀性的,本身并沒有實際意義,但是下劃線“_”不能作為首字符。

2.標識符

標識符用來定義端口、常量、參數(shù)、變量、子程序等名字。VerilogHDL的基本標識符就是以英文字母或下劃線“_”開頭,由26個大小寫英文字母、數(shù)字0~9、下劃線“_”以及“$”組成的字符串,并且標識符中的字符是區(qū)分大小寫的。VerilogHDL的保留字不能用于作為標識符使用。如:DECODER_1、_FFT、Sig_N、NOT_ACK、State0、Idle、_test$paper等是合法標識符;而$DECODER_1、2FFT、SIG_#N、NOT-ACK、repeat等是非法標識符。關(guān)鍵詞是一類特殊的標識符,是VerilogHDL中定義的保留字。表3.1中列舉了VerilogHDL的所有關(guān)鍵詞。需要注意的是,關(guān)鍵詞全部是小寫的,VerilogHDL是區(qū)分大小寫的。因此,只有全由小寫字母組成的才是關(guān)鍵詞,否則就是一般的標識符,如AND(一般標識符)與and(關(guān)鍵詞)是不等價的。表3.1VerilogHDL的關(guān)鍵詞

3.邏輯值

VerilogHDL的邏輯值可取以下四類值:

0:邏輯0或假狀態(tài); 1:邏輯1或真狀態(tài)

z:高阻態(tài); x:未知狀態(tài)

4.位選擇

位選擇是從向量中選取特定的位。其使用格式為

vector_name[bit_select];

例如:cnt[3]||cnt[2];

如果格式中的bit_select的值為x、z或者越界(是指超過了向量的位數(shù)),則位選擇的值為x。例如:

reg[7:0]display;

display[9]或者display[c]的值為x。

5.段選擇

段選擇是指從向量中選取連續(xù)的部分位。其使用格式為

vector_name[msb_const:lsb_const]

其中,[msb_const:lsb_const]指定范圍,msb_const與lsb_const必須為常數(shù)。

例如:cnt[2:4]

若選擇的范圍為x、z或者越界,則部分選擇的值為x。3.3.2VerilogHDL數(shù)據(jù)類型

VerilogHDL數(shù)據(jù)類型(DataTypes)主要用來說明儲存在數(shù)字硬件或傳送于數(shù)字組件間的數(shù)據(jù)類型。它不僅支持如整型、實型等抽象的數(shù)據(jù)類型,而且也支持物理數(shù)據(jù)類型來表示真實的硬件。物理數(shù)據(jù)類型有連線型(wire、tri等)和寄存器型(reg)兩種,這兩種類型的變量在定義時均要設(shè)置位寬,當缺省狀態(tài)時,位寬默認為1位。變量的每一位可以取0、1、x或z中的任意值。除了與具體的硬件電路對應(yīng)的物理數(shù)據(jù)類型外,VerilogHDL還提供了整型(integer)、實型(real)、時間型(time)、參數(shù)型(parameter)等四種抽象數(shù)據(jù)類型,這些抽象數(shù)據(jù)類型主要用于仿真。抽象數(shù)據(jù)類型只是純數(shù)學的抽象描述,不與任何實際的物理硬件相對應(yīng)。

1.連線型數(shù)據(jù)類型

連線型數(shù)據(jù)對應(yīng)于硬件電路中的物理信號連線,沒有電荷保持作用(trireg除外)。連線型數(shù)據(jù)必須由驅(qū)動源驅(qū)動。它有兩種驅(qū)動方式:一種是在結(jié)構(gòu)描述中把它連接到一個門或模塊的輸出端;另一種是用連續(xù)賦值語句assign對其賦值。當沒有驅(qū)動源對其驅(qū)動時,它將保持高阻態(tài)。

為了能夠精確地反映硬件電路中各種可能的物理信號連接特性,VerilogHDL提供了多種連線型數(shù)據(jù)。具體介紹如下所述。

1)?wire和tri網(wǎng)絡(luò)

連線(wire)和三態(tài)線(tri)的語法和功能基本一致,三態(tài)線(tri)可以用于描述多個驅(qū)動源驅(qū)動同一根線的線網(wǎng)類型。多個驅(qū)動源驅(qū)動一個連線時,線網(wǎng)的有效值如表3.2所示。表3.2多個驅(qū)動源驅(qū)動一個連線時線網(wǎng)的有效值

2)?wor和trior線網(wǎng)

線或(wor)和三態(tài)線或(trior)的語法和功能基本一致。若驅(qū)動源為1,線或線網(wǎng)值為1,則多個驅(qū)動源驅(qū)動這類線網(wǎng)時,線網(wǎng)的有效值如表3.3所示。表3.3多個驅(qū)動源驅(qū)動線或時線網(wǎng)的有效值

3)?wand和triand線網(wǎng)

線與(wand)和三態(tài)線與(triand)的語法和功能基本一致。若驅(qū)動源為0,線或線網(wǎng)值為0,則多個驅(qū)動源驅(qū)動這類線網(wǎng)時,線網(wǎng)的有效值如表3.4所示。表3.4多個驅(qū)動源驅(qū)動線與時線網(wǎng)的有效值

4)?trireg線網(wǎng)

trireg線網(wǎng)用于存儲數(shù)值,并且用于電容節(jié)點的建模。當trireg的所有驅(qū)動源都處于高阻態(tài)時,trireg線網(wǎng)保存作用在線網(wǎng)上的最后一個值。trireg線網(wǎng)的初始值為x。

5)?tri0和tri1線網(wǎng)

tri0和tri1線網(wǎng)用于線邏輯的建模。其中,當無驅(qū)動源時,tri0線網(wǎng)的值為0,tri1線網(wǎng)的值為1。多個驅(qū)動源驅(qū)動這類線網(wǎng)時,線網(wǎng)的有效值如表3.5所示。表3.5多個驅(qū)動源驅(qū)動tri0和tri1時線網(wǎng)的有效值

6)?supply0和supply1線網(wǎng)

supply0線網(wǎng)用于對低電平0的建模,supply1線網(wǎng)用于對電源,即高電平1的建模。

連線型數(shù)據(jù)類型的定義格式為

<連線型數(shù)據(jù)的類型><范圍><延遲時間><變量列表>;

例如:

wiresignal1,signal2;//兩個連線型數(shù)據(jù)

tri[7:0]bus; //8位三態(tài)總線在VerilogHDL中,有的時候可以不需要聲明某種線網(wǎng)類型,缺省的線網(wǎng)類型為1位線與網(wǎng)。可以使用編譯器偽指令`default_nettype來改變這個隱式的線網(wǎng)說明方式。其調(diào)用格式為:

`default_nettypenet_kind

向量線網(wǎng)是用關(guān)鍵詞scalared或者vectored來定義的。需要注意的是,vectored定義的向量線網(wǎng)必須整體進行賦值。若沒有定義關(guān)鍵詞,缺省值為標量。

2.寄存器型數(shù)據(jù)類型

1)寄存器數(shù)據(jù)

寄存器數(shù)據(jù)對應(yīng)于具有狀態(tài)保持作用的硬件電路元件,如觸發(fā)器、鎖存器等。若寄存器數(shù)據(jù)未初始化,它將為未知狀態(tài)x。寄存器數(shù)據(jù)的關(guān)鍵字為reg,缺省時為1位數(shù)。寄存器數(shù)據(jù)與連線型數(shù)據(jù)的區(qū)別在于:寄存器數(shù)據(jù)保持最后一次的賦值,而連線型數(shù)據(jù)需要有持續(xù)的驅(qū)動。寄存器數(shù)據(jù)的驅(qū)動可以通過過程賦值語句實現(xiàn),過程賦值語句只能出現(xiàn)在過程語句后面的過程塊中。寄存器數(shù)據(jù)的定義格式為

reg<范圍><變量列表>;

例如:

reg

d1; //1位寄存器

reg[3:0]state; //4位寄存器

2)存儲器數(shù)據(jù)

存儲器數(shù)據(jù)實際上是一個寄存器數(shù)組,其使用的格式如下:

reg[msb:lsb]m_1[up_1:low_1],m_2[up_2:low_2]…m_n[up_n:low_n];

若寄存器說明中缺省[up_n:low_n],則是說明寄存器。例如:

reg[0:7]cnt[0:127],cout; //cnt為128個8位寄存器的數(shù)組,cout為8位寄存器

需要注意的是,存儲器不能像寄存器那樣賦值。一般地,寄存器的賦值有以下兩種方法:(1)對存儲器中的每個字分別賦值。例如:

reg[0:7]seg[1:3]; //定義3個字節(jié)的存儲器seg

seg[1]=8'?b00011001; //給存儲器單元seg[1]賦值

seg[2]=8'?b10011001; //給存儲器單元seg[2]賦值

seg[3]=8'?b01011001; //給存儲器單元seg[3]賦值

(2)利用系統(tǒng)任務(wù)來為存儲器賦值。這類系統(tǒng)任務(wù)有兩種:

$readmemb //加載二進制值

$readmemh //加載十六進制值

3.整型數(shù)據(jù)類型

整型(integer)數(shù)據(jù)常用于對循環(huán)變量進行說明,在算術(shù)運算中被視為二進制補碼形式的有符號數(shù)。除了寄存器型數(shù)據(jù)被當作無符號數(shù)處理之外,整型數(shù)據(jù)與32位寄存器型數(shù)據(jù)在實際意義上相同。整型數(shù)據(jù)的聲明格式為

integer<寄存器型變量列表>;

整型數(shù)據(jù)可以是二進制(b或B)、十進制(D或d)、十六進制(h或H)或八進制(O或o)。整型數(shù)據(jù)可以有下面三種書寫形式:

(1)簡單十進制格式,這種格式是直接由0~9的數(shù)字串組成的十進制數(shù),可以用符號“+”或“-”來表示數(shù)的正負,如789。

(2)缺省位寬的基數(shù)格式,這種格式的書寫形式為

'<base_format><number>

其中,符號“?'?”為基數(shù)格式表示的固有字符,該字符不能省略,否則為非法表示形式;參數(shù)<base_format>用于說明數(shù)值采用的進制格式;參數(shù)<number>為相應(yīng)進制格式下的一串數(shù)字;這種格式未指定位寬,其缺省值至少為32位。例如:

'?h137FF //缺省位寬的十六進制數(shù)

(3)指定位寬的基數(shù)格式,這種格式的書寫形式為

<size>'<base_format><number>

其中,參數(shù)<size>用來指定所表示數(shù)的位寬,當位寬小于數(shù)值的實際位數(shù)時,相應(yīng)的高位部分被忽略;當位寬大于數(shù)值的實際位數(shù)且數(shù)值的最高位是0或1時,相應(yīng)的高位部分補0;當位寬大于數(shù)值的實際位數(shù),但數(shù)值的最高位是x或z時,相應(yīng)的高位部分補x或z。二進制的一個x或z表示1位處于x或z;八進制的一個x或z表示3位二進制位都處于x或z;十六進制的一個x或z表示4位二進制位都處于x或z。另外,數(shù)值中的z還可以用“?”來代替。例如:

4'b1101 //4位二進制數(shù)

4.實型數(shù)據(jù)類型

VerilogHDL支持實型(real)常量與變量。實型數(shù)據(jù)在機器碼表示法中是浮點型數(shù)值,可用于計算延遲時間。實型數(shù)據(jù)的聲明格式為

real<變量列表>;

例如:real

a;

實型數(shù)據(jù)可以用十進制與科學計數(shù)法兩種格式來表示,如果采用十進制格式,小數(shù)點兩邊都必須是數(shù)字,否則為非法的表示形式,如:1.8、3.8E9。

5.時間型數(shù)據(jù)類型

時間型(time)數(shù)據(jù)與整型數(shù)據(jù)類似,只是它是64位無符號數(shù)。時間型數(shù)據(jù)主要用于對模擬時間的存儲與計算,常與系統(tǒng)函數(shù)?$time一起使用。

時間型數(shù)據(jù)的聲明格式為

time<寄存器型變量列表>;

例如:

timestart,stop; //聲明start和stop為兩個64位的時間變量

6.參數(shù)型數(shù)據(jù)類型

參數(shù)型數(shù)據(jù)(parameter)是被命名的常量,在仿真前對其賦值,在整個仿真過程中其值保持不變,數(shù)據(jù)的具體類型是由所賦的值來決定的??梢杂脜?shù)型數(shù)據(jù)定義變量的位寬及延遲時間等,從而增加程序的可讀性與易修改性。

參數(shù)型數(shù)據(jù)的聲明格式為

parameter<賦值列表>;

例如:parameter

size=8;

parameter

width=6,x=8;3.3.3VerilogHDL操作符

VerilogHDL語言提供了各種不同的操作符,例如:算術(shù)操作符(ArithmeticOperators)、邏輯操作符(LogicOperators)、關(guān)系操作符(RelationalOperators)、相等操作符(EqualityOperators)、歸約操作符(ReductionOperators)、移位操作符(ShiftOperators)、條件操作符(ConditionOperators)及連接操作符(ConcatenationOperators)。操作符會將其操作數(shù)按照所定義的功能作計算以產(chǎn)生新值。大部分操作符均為單目操作符(UnaryOpetators)或雙目操作符(BinaryOperators)。單目操作符使用一個操作數(shù);雙目操作符使用兩個操作數(shù);條件操作符(ConditionOperators)使用三個操作數(shù);連接操作符則可以使用任何個數(shù)的操作數(shù)。表3.6所列為常用的操作符。表3.6中的各操作符在處理實數(shù)時需特別注意,僅有部分操作符處理實數(shù)表達式有效。這些有效的操作符列于表3.7中。表3.6Verilog操作符表3.7實數(shù)表達式中有效的操作符和其他高級語言一樣,VerilogHDL中的運算符也是具有優(yōu)先級的,表3.8給出了運算符從高到低優(yōu)先級的排列次序,同一行中的運算符優(yōu)先級相同。表3.8操作符優(yōu)先權(quán)順序

1.算術(shù)操作符

算術(shù)操作符包括單目操作符和雙目操作符。算術(shù)表達式結(jié)果的長度由最長的操作數(shù)決定,賦值語句中,其結(jié)果的長度由操作符左端目標長度決定;算術(shù)表達式的所有中間結(jié)果長度取最大操作數(shù)的長度。若算術(shù)操作符中的任一操作數(shù)中含有x或者z,則表達式的結(jié)果為x。

算術(shù)操作符中,無符號數(shù)存儲在線網(wǎng)、寄存器或者基數(shù)形式的整數(shù)中;有符號數(shù)存儲在整數(shù)寄存器或者十進制形式的整數(shù)中。

算術(shù)操作符的使用舉例如下:

//單目操作符

integer[7:0]a,b;

a=-8; //-8(單目操作符)

b=+10; //+10

//雙目操作符

reg[3:0]a,b,c,d;

a=4'b0010;

assignc=a+b; //變量+變量

assignd=b+2; //變量+常數(shù)

//----------------------

integera,b,c,d;

a=12/3; //a=4

b=11%5; //b=1

c=-11%3; //c=-2算術(shù)操作符在寄存器數(shù)據(jù)類型中所產(chǎn)生的結(jié)果,與在整數(shù)數(shù)據(jù)類型中所產(chǎn)生的結(jié)果不盡相同。對寄存器來說,Verilog語言將其視為不帶符號的數(shù)值;對整數(shù)數(shù)據(jù)類型來說,則為帶符號數(shù)值。例如,若將一個<位寬><基底><數(shù)字>的負數(shù)賦值給一寄存器,則此負數(shù)將以其2'S補碼存入寄存器:

integera;

reg[7:0]b;

a=-8'd9; //a=-9(11110111)

b=a/3; //b=-3(11111101),因為a為整數(shù)

a=b/3; //a=84,因為253/3

2.關(guān)系操作符

關(guān)系操作符為雙目操作符,它們將兩個操作數(shù)進行比較:若結(jié)果為“真”,則設(shè)為邏輯值1;若為“假”,則設(shè)為邏輯值0。若兩個操作數(shù)中有未知值x,則其關(guān)系結(jié)果亦為未知值x。

關(guān)系表達式中的操作數(shù)長度不同時,要在較短的操作數(shù)的左方補“0”,然后再比較。

例如,利用大于或等于(>=)操作符求兩個數(shù)值的最大值的程序如下:

modulemax(max_v,a,b)

output[7:0]max_v;

input[7:0]a,b;

if(a>=b)

max_v=a; //a是最大值

else

max_v=b; //b是最大值

endmodule

3.相等操作符

對于相等操作符,如果兩個操作數(shù)所有的位值均相等,那么相等關(guān)系式成立,結(jié)果返回邏輯1,否則返回邏輯0。但若任何一個操作數(shù)中的某一位為未知數(shù)x或處于高阻態(tài),則結(jié)果為未知的。若兩個操作數(shù)的對應(yīng)位可取4個邏輯值,則相等運算符的運算規(guī)則可用表3.9來描述。表3.9相等操作符的運算規(guī)則如果兩個操作數(shù)的所有位取0或1,那么不等運算符與相等運算符的運算規(guī)則正好相反。如果任一個操作數(shù)中含有未知數(shù)x或高阻態(tài),則不等運算符與相等運算符的運算規(guī)則相同,如表3.10所示。表3.10不等操作符的運算規(guī)則對于全等操作符,其比較過程與相等操作符相同,但其返回結(jié)果只有邏輯1或邏輯0兩種狀態(tài),不存在未知數(shù),即全等操作符將未知數(shù)x與高阻態(tài)看做是邏輯狀態(tài)的一種參與比較,如果兩個操作數(shù)的相應(yīng)位均為x或z,那么全等關(guān)系成立,結(jié)果返回邏輯1。非全等操作符與全等操作符正好相反。表3.11給出了全等操作符的運算規(guī)則。表3.11全等操作符的運算規(guī)則【例3.3】用等于操作符編寫一個4位比較器。

modulecompare1(a,b,comout);

input[3:0]a,b;

output[2:0]comout;

reg[2:0]temp;

always@(aorb)

begin

if(a>b)

temp<=3'b100;

elseif(a==b)

temp<=3'b010;

else

temp<=3'b001;

end

assigncomout=temp;

endmodule在對該程序進行仿真時,當a=4'b0101,b=4'1000時,輸出comout=3'b001,表示a<b;當a=4'b1010,b=4'0101時,輸出comout=3'b100,表示a>b;當a=4'b1100,b=4'1100時,輸出comout=3'b010,表示a=b。

4.邏輯操作符

邏輯操作運算中,對向量操作,非零向量作為邏輯“1”處理,而邏輯表達式的任一操作數(shù)中含有x時,結(jié)果為x。

5.按位操作符

按位操作符是對輸入操作數(shù)進行按位操作,并且產(chǎn)生向量結(jié)果。若操作數(shù)的長度不相等,則在較短的操作的左方添“0”。

例如,若a=4'b0011,b=4'b1101,c=4'b1010,則

$display(~a); //display4'b1100=12

$display(a&b); //display4'b0001=1

$display(a|c); //display4'b1011=11

$display(b^c); //display4'b0111=7

$display(a^~c); //display4'b0110=6

6.歸約操作符

歸約操作符是單目操作符,運算規(guī)則類似于按位操作符的運算規(guī)則,但其運算過程不同。按位運算是對操作數(shù)的相應(yīng)位進行與、或等運算,操作數(shù)是幾位數(shù),則運算結(jié)果也是幾位數(shù)。而歸約運算則不同,歸約運算是對單個操作數(shù)進行歸約的遞推運算,最后的運算結(jié)果是1位的二進制數(shù)。若操作數(shù)中含有未知值x或者z,則表達式的結(jié)果為x。

歸約運算的運算過程為:先將操作數(shù)的第1位與第2位進行歸約運算,然后將運算結(jié)果與第3位進行歸約運算,依次類推,直到最后一位。

例如,a=4'b1111,b=4'1010,則&a的結(jié)果為1,∣b的結(jié)果為1。

7.移位操作符

移位操作符是一種邏輯操作,操作符左側(cè)的操作數(shù)移位操作符右側(cè)所表示的次數(shù),不夠則添0。若操作數(shù)中含有x或者z,則移位表達式的結(jié)果為x。移位操作符還可完成VerilogHDL

中的指數(shù)操作。

例如,assignqout=div>>sh_bit語句表示將div右移sh_bit位后的結(jié)果連續(xù)賦值給qout,它實際上是一個除法運算。

8.條件操作符

條件操作符為“?:”,其使用格式為

cond_expression?expression_1:expression_2

若cond_expression為1(即為真),則表達式的值為expression_1;若cond_expression為0(即為假),則表達式的值為expression_2。

若cond_expression為x或z,則表達式的值將是expression_1與expression_2按以下邏輯規(guī)則進行按位操作后的結(jié)果:0與0得1,1與1得1,其余為x。

例如:

assigny=(sel)?a:b//若條件sel=1,則y=a,否則y=b

9.連接操作符

連接運算是將多個小的表達式合并形成一個大的表達式。VerilogHDL中,用符號“{}”實現(xiàn)多個表達式的連接運算,各個表達式之間用“,”隔開,其使用格式為

{expression_1,expression_2,…,expression_n}。

除了非定長的常量外,任何表達式都可進行連接運算。同時,連接運算也可以對信號的某些位進行。

例如,若a=1'b1,b=2'b01,c=5'b10111,則{a,b}將產(chǎn)生一個3位數(shù)3'b101,{c[4:2],b}將產(chǎn)生一個5位數(shù)5'b10101。

10.復(fù)制操作符

復(fù)制操作符“{{}}”是將一個表達式放入雙重大括號中,而復(fù)制因子放在第一層括號中,用來指定復(fù)制的次數(shù),通過重復(fù)相同的操作符來實現(xiàn)表達式的變大,其使用格式為

{repeat_number{expression_1,expression_2,…,expression_n}}

復(fù)制操作符為復(fù)制一個常量或變量提供了簡便方法。不過在多操作符的表達式中,需要考慮的問題是操作符的優(yōu)先級。

例如,若a=1'b1,則{3{a}}的結(jié)果為3'b111。3.3.4編譯器偽指令

1.`include

`include的作用是:在編譯綜合過程中,將內(nèi)含數(shù)據(jù)類型聲明或函數(shù)的Verilog程序文件內(nèi)容插入另一Verilog模塊文件中,以增加設(shè)計者編譯程序的方便性,用法與C語言中#include的用法類似。其語法格式為

`include<文件名稱>例如:

`include"cnt_10.v";

`include"div_64.v";

modulecounter(…);

<相關(guān)參數(shù)聲明與語句>;

endmodule在以上例子中,將兩個Verilog程序cnt_10.v與div_64.v加入模塊,并置于該模塊的最上面。另外亦可以事先定義相關(guān)的數(shù)據(jù)類型、變量或參數(shù)并將其儲存于頭文件中。當設(shè)計另一個模塊時,便可將此頭文件包括到主程序中。例如:

//將含有整體變量及參數(shù)定義的頭程序proghead.v包括至主程序 topdesign.v中

`include“proghead.v”

moduletopdesign.v(arg1,arg2,…,argn)

//topdesign.v的程序代碼

endmodule

2.`define與`undef

`define用來將字符串指定給一宏變量,設(shè)計者可以在模塊的任何位置以ˋdefine定義宏變量。必須注意的是,在語句行的結(jié)尾不可以加入符號“;”。編譯過程中,字符串將取代所有程序中出現(xiàn)的<宏變量>。其語法格式為

define<宏變量><字符串名稱>

`undef用于取消先前定義的宏變量,其語法格式為

undef<宏變量>例如:

`defineword_size?15:0 //定義宏變量word_size的字符串15:0

`definebyte_size7:0 //定義宏變量byte_size的字符串7:0

moduledeftest(din,dout);

input[`word_size]din;//編譯綜合過程中將用字符串15:0取代word_size

output[`byte_size]dout;

//編譯綜合過程中將用7:0取代byte_size

<相關(guān)參數(shù)聲明與語句>;

…例如:

`definebytesize8

reg[1:`bytesize]data1; //產(chǎn)生一個8位長度的data1

`difines$stop //以別名s定義$stop,在程序中$stop將取代s

`undefs //取消宏變量s的定義

… //在程序中s不再代表字符串$stop

3.`timescale

`timescale用于定義模塊中仿真時間單位及精確度,可使設(shè)計者在相同的設(shè)計中以不同的時間單位去仿真模塊;或者在同一設(shè)計的兩個不同模塊中設(shè)定不同的延遲時間。其語法格式為

`timescale<時間單位>/<時間精確度>

其中,時間單位為設(shè)定時間與延遲的量測單位;時間精確度為設(shè)定時間與延遲的精確度,見表3.12。表3.12時間單位和精確度自變量的設(shè)定時間精確度自變量必須是時間單位自變量的精度,其值不可大于時間單位,它們均以1、10及100的整數(shù)設(shè)定,而字符串則表示其量測單位。表3.13是一個利用?`timescale設(shè)定時間單位和精確度自變量的實例。表3.13利用?`timescale設(shè)定時間單位和精確度自變量的實例

4.`resetall

`resetall用于重設(shè)所用編譯器預(yù)處理命令至其默認值。

5.`ifdef、`else與?`endif

`ifdef、`else與`endif的作用是:在編譯過程中,依條件選擇部分語句作編譯。其語法定義為:

`ifdef<宏變量>

<語句指令群1>

`else

<語句指令群2>

`endif對編譯綜合器來說,它會檢查“宏變量”是否已被`define所定義。若是,則“語句指令群1”將被編譯;否則,若`else存在,則“語句指令群2”被編譯。在上述語法中,`else…“語句指令群2”為選項,可以不存在。每一個`ifdef必須搭配一個`endif,它們使設(shè)計者在設(shè)計Verilog程序時更具彈性。例如,針對同一電路,設(shè)計者在編譯過程中可以選擇不同的設(shè)計技巧實現(xiàn)電路,依不同條件選擇不同的延遲信息以及在同一仿真程序中選擇不同的仿真信號。

【例3.4】`ifdef等條件選擇編譯偽指令的使用實例

moduleand_gate(dout,din1,din2);

outputdout;

inputdin1,din2;

`ifdefgate_level

and(dout,din1,din2);//以內(nèi)建組件產(chǎn)生and門

`else

dout=din1&din2;//以位運算符號“&”產(chǎn)生and門

`endif

endmoule3.4.1元件實例化語句

元件實例化語句就是將預(yù)先設(shè)計好的模塊定義為一個元件,然后利用特定的語句將此元件與當前設(shè)計中的指定端口相連接,從而為當前設(shè)計模塊引入一個新的、低一級的設(shè)計層次。在這里,當前設(shè)計模塊相當于一個較大的電路系統(tǒng),所定義的實例化元件相當于一個要插在這個電路系統(tǒng)板上的芯片,而當前設(shè)計模塊中指定的端口則相當于這塊電路板上準備接受此芯片的一個插座。元件實例化語句是使VerilogHDL設(shè)計模塊構(gòu)成自上而下層次化設(shè)計的一種重要途徑。3.4結(jié)構(gòu)描述語句元件實例化可以是多層次的,在一個設(shè)計模塊中被調(diào)用安插的元件本身也可以是一個低層次的當前設(shè)計模塊,因而可以調(diào)用其他的元件,以便構(gòu)成更低層次的電路模塊。因此,元件實例化就意味著在當前結(jié)構(gòu)體內(nèi)定義了一個新的設(shè)計層次,這個設(shè)計層次的總稱叫元件,但它可以以不同的形式出現(xiàn)。實例化元件可以是已設(shè)計好的一個VerilogHDL設(shè)計實體,可以是來自FPGA元件庫中的元件,也可以是別的硬件描述語言(如VHDL)設(shè)計實體。該元件還可以是軟的IP核,或者是FPGA中的嵌入式硬IP核。元件實例化語句的使用格式有兩種:

(1)名字關(guān)聯(lián)方式:將實例化元件的端口名與關(guān)聯(lián)端口名通過“.實例化元件端口名(連接端口名)”的形式一一對應(yīng)地聯(lián)系起來的方式。其使用格式如下:

實例化元件名元件實例化標號(.實例化元件端口名(連接端口名),…);

(2)位置關(guān)聯(lián)方式:按實例化元件端口的定義順序?qū)⒗膶?yīng)的連接模塊端口名一一列出的一種關(guān)聯(lián)方式。其使用格式如下:

實例化元件名元件實例化標號(連接端口名,…);

在位置關(guān)聯(lián)方式下,實例化元件名和元件實例化標號的含義及使用要求同名字關(guān)聯(lián)方式;對于端口的映射關(guān)系,只要按實例化元件的端口定義順序列出當前系統(tǒng)中的連接模塊端口名就行了。

【例3.5】使用元件實例化語句設(shè)計一個四2輸入與非門電路my74LS00。

1.設(shè)計思路

根據(jù)數(shù)字電子技術(shù)的知識,我們知道74LS00是一個四2輸入與非門,亦即該芯片由四個2輸入與非門組成。因此,我們設(shè)計時可先設(shè)計一個2輸入與非門mynand2,如圖3.6(a)所示;再由四個2輸入與非門構(gòu)成一個整體my74LS00,如圖3.6(b)所示。圖3.6my74LS00的設(shè)計過程示意圖

2.VerilogHDL源程序

(1)?2輸入與非門mynand2的邏輯描述:

//2輸入與非門mynand2.v

modulemynand2(a,b,y);

//端口說明

inputa;

inputb;

outputy;

//連續(xù)賦值語句功能描述

assigny=!(a&&b); //數(shù)據(jù)流描述方式

endmodule

(2)四2輸入與非門my74LS00的邏輯描述:

//四2輸入與非門my74LS00.v

modulemy74LS00(a1,b1,a2,b2,a3,b3,a4,b4,y1,y2,y3,y4);

//端口說明

inputa1,b1;

inputa2,b2;

inputa3,b3;

inputa4,b4;

outputy1,y2;

outputy3,y4;

//元件實例化結(jié)構(gòu)描述

mynand2u1(.a(a1),.b(b1),.y(y1)); //端口連接名字關(guān)聯(lián)

mynand2u2(.a(a2),.b(b2),.y(y2));

mynand2u3(a3,b3,y3); //端口連接位置關(guān)聯(lián)

mynand2u4(a4,b4,y4);

endmodule

3.說明與分析

圖3.7是四2輸入與非門my74LS00的仿真結(jié)果圖,從圖中可以看出,該程序的設(shè)計是正確的。圖3.8是四2輸入與非門my74LS00邏輯綜合后的RTL視圖,從圖中可以看出,元件實例化語句綜合后的電路結(jié)構(gòu)與設(shè)計預(yù)期一致,同時一個實例化語句對應(yīng)一個硬件電路,這些硬件在整個系統(tǒng)中是并行運行的,因此模塊中各元件實例化語句的執(zhí)行是并行的。圖3.7四2輸入與非門my74LS00的仿真結(jié)果圖圖3.8四2輸入與非門my74LS00邏輯綜合后的RTL視圖3.4.2門級結(jié)構(gòu)描述

門級結(jié)構(gòu)描述是指調(diào)用VerilogHDL內(nèi)部的基本門級元件來對硬件電路的結(jié)構(gòu)進行描述,這種情況下模塊將由基本門級元件的實例組成。

由于一個數(shù)字電路系統(tǒng)最終是由一個個邏輯門和開關(guān)所組成的,因此用邏輯門單元和開關(guān)單元來對硬件電路的組成結(jié)構(gòu)進行描述是最直觀的。考慮到這一點,VerilogHDL把一些常用的基本邏輯門單元和開關(guān)單元的模型包含到語句內(nèi)部,這些模型被稱為基本門級元件(BasicGate-LevelPrimitives)和基本開關(guān)級元件(BasicSwitch-LevelPrimitives)。

1.內(nèi)置基本門級元件

VerilogHDL中的基本門級元件包括and(與門)、nand(與非門)、or(或門)、nor(或非門)、xor(異或門)、xnor(異或非門)、buf(緩沖器)、not(非門)、bufif1(高電平使能緩沖器)、bufif0(低電平使能緩沖器)、notif1(高電平使能非門)、notif0(低電平使能非門)、pullup(上拉電阻)、pulldown(下拉電阻)共14種。它們可被分成四類,下面分別說明。

(1)多輸入門。內(nèi)置多輸入門包括and、nand、or、nor、xor和xnor六種,它們都有一個或多個輸入,但只能允許一個輸出。這些多輸入門的元件模型可表示為

<門級元件名>(<輸出端口>,<輸入端口1>,<輸入端口2>,…,<輸入端口n>)

(2)多輸出門。內(nèi)置多輸出門包括buf和not兩種,它們允許有多個輸出,但只能有一個輸入。這兩種多輸出門的元件模型可表示為

<門級元件名>(<輸出端口1>,<輸出端口2>,…,<輸出端口n>,<輸入端口>)

(3)三態(tài)門。內(nèi)置三態(tài)門包括bufif1、bufif0、notif1和notif0四種,它們用來對三態(tài)驅(qū)動器建模。它們都有一個數(shù)據(jù)輸入端、一個數(shù)據(jù)輸出端和一個控制輸入端。它們的元件模型可表示為

<門級元件名>(<數(shù)據(jù)輸出端口>,<數(shù)據(jù)輸入端口1>,<控制輸入端口>)

(4)上拉、下拉電阻。上拉、下拉電阻包括pullup和pulldown兩種元件,它們都只有一個輸出端口而沒有輸入端口。上拉電阻將輸出置為1,下拉電阻將輸出置為0。它們的元件模型可表示為

<門級元件名>(<輸出端口>)

2.基本門級元件實例語句

基本門級元件的調(diào)用是通過門級元件實例語句來實現(xiàn)的,其書寫格式為

<門級元件名><驅(qū)動強度說明>#(<門級延時量>)<實例名>(端口連接表);

其中,“<門級元件名>”用于指明當前模塊調(diào)用的是14種基本門級元件類型中的哪一種;“<驅(qū)動強度說明>”用來對本次調(diào)用所引入的門級元件實例的輸出端驅(qū)動能力進行說明,這一部分可以缺省,它的格式為(<對高電平的驅(qū)動強度>,<對低電平的驅(qū)動強度>);“#(<門級延時量>)”用來說明從門級元件實例的輸入端到輸出端的延遲時間部分,它也可以缺省。【例3.6】使用門級結(jié)構(gòu)描述一個2-4譯碼器。

//使用門級結(jié)構(gòu)描述的2-4譯碼器decoder2_4.v

moduledecoder2_4(a0,a1,en,y0,y1,y2,y3);

outputy0,y1,y2,y3;

inputa0,a1,en;

wirew1,w2;

not#(1,2) //#(1,2)表示上升延遲為1,下降延遲為2

n1(w1,a0),

n2(w2,a1);

nand#(4,3)

na1(y0,en,w1,w2),

na2(y1,en,w1,a1),

na3(y2,en,a0,w2),

na4(y3,en,a0,a1);

endmodule

圖3.9是2-4譯碼器decoder2_4邏輯綜合后的RTL視圖。圖3.92-4譯碼器decoder2_4邏輯綜合后的RTL視圖3.5.1隱式連續(xù)賦值語句

1.語句使用格式

隱式連續(xù)賦值語句的格式為

連線型變量類型(賦值驅(qū)動強度)[連線型變量位寬]

#(延時量)連續(xù)型變量名=表達式;

隱式連續(xù)賦值語句把連線型變量的說明語句與對該變量連續(xù)賦值的語句結(jié)合到同一條語句中,利用它可以在對連線型變量進行類型說明的同時實現(xiàn)連續(xù)賦值。3.5數(shù)據(jù)流描述語句

2.連線型變量類型

連線型變量類型可以是除了trireg類型外的任何一種連線型數(shù)據(jù)類型,包括wire、wand、wor或tri等。

3.賦值驅(qū)動強度

賦值驅(qū)動強度是可選的,它只能在隱式連續(xù)賦值語句中指定,用來對連線型變量受到的驅(qū)動強度進行指定,由“對1驅(qū)動強度”和“對0驅(qū)動強度”兩項組成。如果在格式中缺省了“賦值驅(qū)動強度”這一項,則驅(qū)動強度默認為(strong1,strong0),即賦“1”值和賦“0”值時的驅(qū)動強度都為強。

4.延時量

延時量也是可選的,它指定了由賦值表達式內(nèi)信號發(fā)生變化時刻到連線型變量取值被更新時刻之間的延遲時間。延時量的基本格式為

#(delay1,delay2,delay3)

其中,“delay1”指明了連線型變量轉(zhuǎn)移到“1”狀態(tài)時的延時值(成為上升延時);“delay2”指明了連線型變量轉(zhuǎn)移到“0”狀態(tài)時的延時值(稱為下降延時);“delay3”指明了連線型變量轉(zhuǎn)移到“高阻(z)”狀態(tài)時的延時值(稱為關(guān)斷延時)。在實際使用中,延時量也可省略為由一個或兩個延時值構(gòu)成,這種情況下,延時值(“上升延時值”、“下降延時值”和“關(guān)斷延時值”)的確定方法是:

(1)若只給出了一個延時值,則這個延時值將同時代表“上升延時值”、“下降延時值”和“關(guān)斷延時值”。

(2)若只給出了兩個延時值,則這兩個值將分別代表“上升延時值”和“下降延時值”,而“關(guān)斷延時值”將由給出的兩個延時值中較小的那一個指定。

(3)如果“延時量”這一項缺省,則默認所有的延時值都為0。

5.賦值表達式

賦值表達式內(nèi)可以包含連線型、寄存器或函數(shù)調(diào)用等任何數(shù)據(jù)類型的操作數(shù),同時也可以包含任何操作符,但不可將任意值直接賦值給寄存器reg。在直接賦值描述中,若表達式右邊的位數(shù)大于左邊的位數(shù),則在表達式右邊較高的位將被舍棄;若表達式左邊位數(shù)較多,則右邊操作數(shù)將擴充至與表達式左側(cè)連接線位數(shù)相同為止。3.5.2顯式連續(xù)賦值語句

1.語句使用格式

顯式連續(xù)賦值語句的格式為

連線型變量類型[連線型變量位寬]連線型變量名;

assign#(延時量)連線型變量名=表達式;

顯式連續(xù)賦值語句也包含兩條語句:第一條語句是對連線型變量進行說明的說明語句;第二條語句是對已說明的連線型變量進行賦值的語句。關(guān)鍵詞assign是連續(xù)賦值語句的標識。

2.語句使用說明

顯式連續(xù)賦值語句中有關(guān)連線型變量類型、延時量、表達式等的要求與隱式連續(xù)賦值語句的要求一樣,這里不再予以說明。3.5.3連續(xù)賦值的表達式

1.常數(shù)值表達式

在常數(shù)值表達式中,其操作數(shù)不是常數(shù)就是參數(shù)(Parameters),一般綜合器會決定此表達式的值。通常表達式中的操作符及操作數(shù)會決定完成后的電路,大部分的綜合器只對含有變量的表達式作電路綜合,而對常數(shù)值表達式不作電路綜合。例如:

moduleand_or(out,op,in1,in2);

parameterop=1‘b1;

parameterlength=8;

output[length-1:0]out; //out位寬為8位,常數(shù)值表達式

溫馨提示

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

評論

0/150

提交評論