《Verilog HDL數字系統設計-原理、實例及仿真》課件第5章_第1頁
《Verilog HDL數字系統設計-原理、實例及仿真》課件第5章_第2頁
《Verilog HDL數字系統設計-原理、實例及仿真》課件第5章_第3頁
《Verilog HDL數字系統設計-原理、實例及仿真》課件第5章_第4頁
《Verilog HDL數字系統設計-原理、實例及仿真》課件第5章_第5頁
已閱讀5頁,還剩102頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章結構級建模方法5.1VerilogHDL內置基元5.2用戶定義原語(UDP)5.3模塊的調用5.4行為描述和結構描述的混合使用

5.1VerilogHDL內置基元

VerilogHDL提供了26個內置基元,用于對數字系統實際的邏輯結構進行建模。這些基元包括基本門電路、上拉電阻、下拉電阻、MOS開關和雙向開關。這26個基元可以再分類如下:

(1)多輸入門:and、nand、or、nor、xor、xnor。

(2)多輸出門:buf、not。

(3)三態門:bufif0、bufif1、notif0、notif1。

(4)上拉、下拉電阻:pullup、pulldown。

(5)?MOS開關:cmos、nmos、pmos、rcmos、rnmos、rpmos。

(6)雙向開關:tran、tranif0、tranif1、rtran、rtranif0、rtranif1。這些基元調用語句的語法格式如下:

<門的類型>[<驅動能力><延時>]<例化的門名字>(<端口列表>);

其中,“門的類型”是門聲明語句所必需的,它可以是26個基元中的任意一種。“驅動能力”和“延時”是可選項,可根據不同的情況選不同的值或不選。“例化的門名字”是在本模塊中引用的這種類型的門的實例名。<端口列表>按(輸出,輸入1,輸入2,…)順序列出。下面是門類型的引用:

nand#10nd1(a,data,clock,clear);

該語句中引用了一個名為nd1的與非門(nand),其輸入為data、clock和clear,輸出為a,輸出與輸入的延時為10個單位時間。5.1.1基本門

1.多輸入門

多輸入門具有1個或多個輸入,但只有一個輸出。內置的多輸入門有6種:and(與門)、nand(與非門)、or(或門)、nor(或非門)、xor(異或門)、xnor(異或非門)。

多輸入門實例化語句的語法格式如下:

gate_typeinstance_name(output,input1,…,inputN);圖5.1多輸入門的輸入/輸出關系

1)與門(and)

圖5.2和表5.1所示為與門的邏輯符號和邏輯表。

例如:

andU1(out1,a,b,c,d);

/*與門U1,輸出為out1,有4個輸入a、b、c、d*/圖5.2與門的邏輯符號

2)與非門(nand)

圖5.3和表5.2所示為與非門的邏輯符號和邏輯表。

例如:

nandU2(sum,a,b,c);

/*與非門U2,輸出為sum,帶有3個輸入a、b、c*/圖5.3與非門的邏輯符號

3)或門(or)

圖5.4和表5.3所示為或門的邏輯符號和邏輯表。

例如:

orU3(out,in1,in2),U4(out1,a,b,c);

/*或門U3、U4(同類門實例引用簡化方式)*/圖5.4或門的邏輯符號

4)或非門(nor)

圖5.5和表5.4所示為或非門的邏輯符號和邏輯表。

例如:

norU5(out,in1,in2);

norU6(out1,out,b,c);

//U5輸出out信號連接到U6的輸入端口圖5.5或非門的邏輯符號表5.4或非門的邏輯表

5)異或門(xor)

圖5.6和表5.5所示為異或門的邏輯符號和邏輯表。

例如:

xorU7(out,in1,in2);

xorU8(out1,out,in1,c);

//in1信號連接到U7、U8的輸入端口圖5.6異或門的邏輯符號表5.5異或門的邏輯表

6)異或非門(xnor)

圖5.7和表5.6所示為異或非門的邏輯符號和邏輯表。

例如:

xnorU11(out,in1,in2);

xnor(out1,out,b,c);//沒有實例名圖5.7異或非門的邏輯符號表5.6異或非門的邏輯表

2.多輸出門

多輸出門具有一個輸入、一個或多個輸出。內置的多輸出門有兩種:buf(緩沖門)和not(非門)。

多輸出門實例語句的語法格式如下:

gate_typeinstance_name(output1,…,outputN,input);

其中,gate_type為門類型,是上述的兩種多輸出門之一;instance_name是這個實例門的名稱;端口output1,…,outputN是輸出端,最后一個端口input是輸入端。多輸出門的形式如圖5.8所示。圖5.8多輸出門圖5.9和表5.7為多輸出門的邏輯符號和邏輯表。圖5.9多輸出門的邏輯符號

3.三態門

三態門用于對三態驅動器建模,共有3個端口:一個數據輸入端、一個控制信號輸入端和一個數據輸出端。內置的三態門有4種:bufif1(高有效三態門)、bufif0(低有效三態門)、notif1(高有效三態非門)、notif0(低有效三態非門)。

三態門實例語句的語法格式如下:

gate_typeinstance_name(output,input,control);

其中,gate_type為門類型,是上述的4種三態門之一;instance_name是這個實例門的名稱;第一個端口output是輸出端,第二個端口input是輸入端,第三個端口control是控制信號輸入端。

圖5.10所示為三態門的邏輯符號。圖5.10三態門的邏輯符號表5.8~表5.11所示分別為四種三態門的邏輯表。表中的某些項是可選的。例如,0/z表明根據輸入數據的信號強度和控制信號的值,輸出既可以為0也可以為z。例如:5.1.2上拉、下拉電阻

上拉電阻和下拉電阻是一類只有一個端口(輸出端)的器件模型,其作用是改變其輸出端的值。上拉電阻將輸出置為1,下拉電阻將輸出置為0。

聲明上拉電阻和下拉電阻的關鍵字是:pullup(上拉電阻)、pulldown(下拉電阻)。

上拉、下拉電阻的語法形式如下:

pull_type[instance_name](output);

其中,pull_type是pullup或pulldown;可選項instance_name是實例名;output是唯一的輸出端口。5.1.3MOS開關

VerilogHDL具有對MOS晶體管級進行設計的能力。隨著電路復雜性的增加(上百萬的晶體管)及先進CAD工具的出現,以開關級為基礎進行的設計正在逐漸萎縮。VerilogHDL目前僅提供用邏輯值0、1、x、z和與它們相關的驅動強度進行數字設計的能力,沒有模擬設計能力。因此在VerilogHDL中,晶體管也僅被當作導通或者截止的開關。MOS模型在仿真時表現為兩種狀態:開或關,即導通或不導通。對于MOS來說,數據只能從輸入端流向輸出端,并且可以通過設置控制信號來關閉數據流,所以MOS是單向的。

Verilog提供了6種MOS晶體管開關:cmos、pmos、rcmos、rpmos、nmos、rnmos。

MOS晶體管開關的語法格式如下:

mos_type[instance_name](outputA,inputB,controlC);

其中,mos_type是nmos、rnmos、pmos和rpmos四種三端口MOS開關之一;可選項instance_name是這個MOS開關實例的名稱;第一個端口outputA為輸出端,第二個端口inputB是輸入端,第三個端口controlC是控制信號輸入端。pmos、nmos、rnmos和rpmos均為三端口MOS開關,包括一個數據輸出端、一個數據輸入端和一個控制信號輸入端。nmos用于NMOS晶體管建模;pmos用于PMOS晶體管建模。NMOS和PMOS開關符號如圖5.11所示。圖5.11NMOS和PMOS開關符號

pmos、nmos、rnmos和rpmos這四種MOS開關的工作過程如下:

(1)對于nmos和rnmos開關,如果其控制信號為0,那么關閉這個開關,使輸出為z;如果控制信號是1,則打開這個開關,把輸入端的數據傳輸至輸出端。

(2)對于pmos和rpmos開關,如果其控制信號為1,那么關閉這個開關,使輸出為z;如果控制信號是0,則打開這個開關,把輸入端的數據傳輸至輸出端。

rnmos和rpmos與nmos和pmos相比,它們的輸入端和輸出端之間存在阻抗(電阻)。因此,對于rnmos和rpmos,當數據從輸入端傳輸至輸出端時,由于電阻帶來的損耗,使得數據的信號強度減弱。例如:

nmosn1(out,data,control); //實例名為n1的nmos開關

pmosp1(out,data,control); //實例名為p1的pmos開關

輸出out的值由輸入data和control的值確定。nmos和pmos的邏輯表如表5.12所示。信號data和control不同的組合導致這兩個開關輸出1、0或者z、x邏輯值(如果不能確定輸出為1或0,就有可能輸出z、x值)。

cmos和rcmos(cmos的高阻態)有4個端口:一個數據輸出端,一個數據輸入端和兩個控制信號輸入端。其語法格式如下:

(r)cmos[instance_name](outputA,inputB,Ncontrol,Pcontrol);

其中,可選項instance_name是這個MOS開關實例的名稱;第一個端口outputA為輸出端,第二個端口inputB是輸入端,第三個端口Ncontrol是N通道控制信號輸入端,第四個端口Pcontrol是P通道控制信號輸入端。cmos(rcmos)的開關行為與pmos(rpmos)和nmos(rnmos)的類似。可以這樣認為,cmos(outputA,inputB,Ncontrol,Pcontrol)是一個nmos(output,input,Ncontrol)和一個pmos(output,input,Pcontrol)的組合。也就是可以用如圖5.12所示nmos和pmos器件來建立一個cmos器件的模型。圖5.12cmos開關在cmos開關中,存在著pmos和nmos兩條數據通路,當Pcontrol為0時,上半部分的pmos開關打開,數據可以從輸入端inputB傳輸到輸出端outputA;當Ncontrol為1時,下半部分的nmos開關打開,數據可以從輸入端inputB傳輸到輸出端outputA;因此,cmos的真值表可以參考pmos和nmos的。例如:

cmosc1(out,data,ncontrol,pcontrol);//實例名c1的cmos開關

rcmos是cmos的高阻態,其開關行為與cmos完全相同,只是在其輸入端和輸出端之間存在著阻抗,所以數據從輸入傳送到輸出的過程中存在著損耗,使得其信號強度被減弱。5.1.4雙向開關

NMOS、PMOS和CMOS管都是從漏極向源極導通的,是單向的。在數字電路中,雙向導通的器件也很常用。對雙向導通的器件而言,其兩邊的信號都可以是驅動信號。通過設計雙向開關就可以實現雙向導通的器件。VerilogHDL內置了6種雙向開關,即數據可以在兩個端口之間雙向流動。這6種雙向開關是tran、rtran、tranif0、rtranif0、tranif1、rtranif1。

其中,前兩種開關tran和rtran(tran的高阻態)是不能關斷的,始終處于打開狀態,數據可以在兩個端口之間自由流動。tran和rtran的語法形式如下:

(r)tran[instance_name](signalA,signalB);這兩種開關只有兩個端口signalA和signalB,數據可以在這兩個端口之間流動,因為沒有控制信號,這兩個開關都不能被關斷,所以這種雙向的數據流動是無條件進行的。

后4種開關(tranif0、rtranif0、tranif1和rtranif1)可以通過控制信號關閉。其語法形式如下:

bidirection_type[instance_name](signalA,signalB,controlC);

其中,bidirection_type是上述4種雙向開關之一,實例名instance_name是可選項,前兩個端口(signalA、signalB)是雙向端口,第三個端口controlC是控制信號輸入端。對于tranif0和rtranif0,controlC為0時打開開關,允許數據雙向流動,當controlC為1時關閉開關,禁止數據流動;對于tranif1和rtranif1,controlC為1時打開開關,允許數據雙向流動,當controlC為0時關閉開關,禁止數據流動。在這6種雙向開關中,tran、tranif0和tranif1內的數據流動時沒有損耗,但rtran、rtranif0和rtranif1的輸入端和輸出端之間存在阻抗,當信號通過開關傳輸時,信號強度會減弱。

tran、tranif0和tranif1的邏輯符號如圖5.13所示。圖5.13雙向開關的邏輯符號

tran開關作為兩個信號inout1和inout2之間的緩存,inout1或inout2都可以是驅動信號。僅當control信號是邏輯0時,tranif0開關連接inout1和inout2兩個信號;如果control信號是邏輯1,則沒有驅動源的信號取高阻態值z,有驅動源的信號仍然從驅動源取值。如果control信號是邏輯1,則tranif1開關連接的inout1和inout2兩個信號導通。5.1.5門級建模舉例

下面通過幾個例子學習門級結構建模的基本方法。

4選1多路選擇器有4個數據輸入端D0、D1、D2、D3,一個數據輸出端Z和兩個控制信號輸入端S0、S1。選擇器會根據S0和S1的值從4個數據輸入端中選擇其中的一個送到輸出端。圖5.14和表5.13所示分別為4選1多路選擇器的電路結構和真值表。圖5.144選1多路選擇器的電路結構

5.2用戶定義原語(UDP)

5.2.1UDP的定義

UDP的定義與模塊無關,與模塊屬同一層次,所以UDP定義不能出現在模塊之內。UDP定義可以單獨出現在一個VerilogHDL文件中或與模塊定義同時處于某個文件中。它的語法形式如下:注意:

(1)

UDP只能有一個輸出端,而且必定是端口說明列表的第一項。

(2)?UDP可以有多個輸入端,最多允許有10個輸入端。

(3)?UDP所有的端口變量必須是標量,也就是必須是1位的。

(4)在UDP的真值表項中,只允許出現0、1、x三種邏輯值,高阻值狀態z是不允許出現的。

(5)只有輸出端才可以被定義為寄存器型變量。

(6)?initial語句用于為時序電路內部的寄存器賦初值,只允許賦0、1、x三種邏輯值,缺省值為x。

在UDP中可以描述兩類電路行為:組合電路和時序電路(邊沿觸發和電平觸發)。5.2.2組合電路UDP

在組合電路UDP中,填寫的功能列表類似真值表,即規定了不同的輸入值組合相對應的輸出值。沒有指定的任意組合輸出為x。表中output是輸出端的值,input是輸入端的值,它們的排列順序必須和端口列表中的順序相同。表中每一行的語法形式如下:

input1input2…:output

列表中給出多個這樣的行就能對不同的輸入值組合定義對應的輸出值,如果某個輸入值組合沒有定義其輸出,那么就把這種情況的輸出置為x。

【例5.1】2-1數據選擇器的UDP定義方法。

【例5.2】使用2-1數據選擇器原語構建4-1多路選擇器。在UDP實例中共可以指定2個時延,這是由于UDP的輸出可以取值0、1或x(無截止時延)。使用6個輸入端A、B、C、D、Sel[1]、Sel[2]和1個輸出端Z以及2個線網TL、TP來實現3個UDP的連接,其內部結構如圖5.15所示。圖5.15使用UDP構造的4-1多路選擇器5.2.3時序電路UDP

1.初始化狀態寄存器

時序電路UDP的狀態初始化可以使用一條過程賦值語句實現。其語法形式如下:

initialreg_name=0,1,orx;

其中,reg_name是狀態寄存器,0、1、x是這個寄存器可以取的值。初始化語句在UDP定義中出現,但初始化狀態寄存器不是必需的,若在UDP定義中沒有狀態寄存器初始化語句,那么狀態寄存器的值為x。

2.電平觸發的時序電路UDP

電平觸發的時序電路UDP比組合型多了一個寄存器,主要用來保存當前的狀態,也可以作為當前的輸出。當前的狀態和輸入確定下一個狀態和輸出。

【例5.3】電平觸發的D鎖存器時序電路UDP,只要時鐘(clk)為低電平0,數據就從輸入傳遞到輸出,否則輸出值保持不變。

3.邊沿觸發的時序UDP

【例5.4】用邊沿觸發時序電路UDP為邊沿觸發的D觸發器建模,初始化語句用于初始化觸發器的狀態。

【例5.5】假定d_edge為UDP定義,它現在就能夠像基本門一樣在模塊中使用,如下面的4位寄存器所示。

4.電平觸發和邊沿觸發混合的UDP

時序UDP包括電平觸發和邊沿觸發兩種,VerilogHDL允許這兩種行為混合存在于同一個UDP中。在這種情況下,邊沿變化在電平觸發之前處理,即電平觸發項覆蓋邊沿觸發項。

【例5.6】帶異步清零的D觸發器的UDP描述。

5.3模?塊?的?調?用

為了把所有模塊連接成系統或者高層模塊而調用低層子模塊,需使用模塊實例化語句。模塊實例化語句和調用基元時使用的基元實例化語句形式上完全一致,也是使用結構級建模方法描述的。

調用低層模塊的語法形式為:

低層模塊名實例名(參數定義);

其中,“低層模塊名”是要引用的模塊名;“實例名”是模塊的實例名;“參數定義”是端口關聯聲明。5.3.1端口的關聯方式

端口有兩種關聯方式,即位置關聯方式和名稱關聯方式,這兩種關聯方式不能夠混合使用,其語法形式如下:

port_expr

//位置關聯方式

.PortName(port_expr) //名稱關聯方式

其中,PortName是子模塊在定義時給出的端口名稱,port_expr是高層模塊內定義的線網或寄存器變量,這個變量與子模塊端口關聯就實現了子模塊與高層模塊之間的連接。名稱關聯方式是用一個小數點“.”引導的表達式.PortName(port_expr),模塊端口和端口表達式的關聯被顯式地指定,也就是子模塊PortName端口在高層模塊中與port_expr相關聯。因此端口的關聯順序并不重要。

位置關聯方式不需要給出子模塊定義時給出的端口名稱PortName,只要端口表達式按模塊定義時的端口順序與模塊中的端口關聯即可。port_expr可以是以下的任何類型:標識符(reg或net)、位選擇、部分位選擇、前三種類型的合并、表達式(只適用于輸入端口)。例如:

MicroM1(UdIn[3:0],{WrN,RdN},Status[0],Status[1],

&UdOut[0:7],TxData);

【例5.7】使用兩個半加器模塊構造全加器,子模塊是半加器HA,高層模塊是全加器FA,在FA中引用了兩個HA。邏輯圖如圖5.16所示,其中h1和h2分別是兩個半加器。圖5.16使用兩個半加器模塊構造的全加器子模塊半加器的VerilogHDL描述:全加器的VerilogHDL描述:5.3.2端口懸空的處理

在實例化語句中,懸空端口可通過將端口表達式表示為空白來指定為懸空端口。

【例5.8】子模塊的描述。高層模塊調用子模塊DFF,模塊實例化語句是:

(1)DFFd1(.Q(QS),.Qbar(),.Data(D),.Preset(),.Clock(CK));/*名稱關聯方式。端口Qbar和Preset的括號里為空,表明這兩個端口被懸空*/

(2)DFFd2(QS,,D,,CK);/*位置對應方式。輸出端口Qbar和輸入端口Preset的位置都被懸空*/

懸空的端口因為類型不同而意義不同。若模塊的輸出端口懸空,則表示該輸出端口不用。若模塊的輸入端口懸空,則被置為高阻態z。5.3.3端口寬度匹配問題

在端口關聯時,若端口和局部端口表達式的長度不同,則端口通過無符號數的右對齊或截斷方式進行匹配。

【例5.9】模塊調用時端口寬度匹配舉例。

子模塊的描述:頂層模塊Top的描述:在子模塊guan_lian的實例語句中:

(1)?2位的Bdl和6位的Pba相連,Bdl[2]連接到Pba[0],Bdl[1]連接到Pba[1],余下的輸入端口Pba[5]、Pba[4]Pba[3]和Pba[2]被截斷,處于懸空狀態,因此為高阻態z。

(2)?5位的Mpr和3位的

溫馨提示

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

評論

0/150

提交評論