?? verilog_5.htm
字號:
xor (Bar, Bud[0],Bud[1], Bud[2]),<br />
(Car, Cut[0], Cut[1]),<br />
(Sar, Sut[2], Sut[1], Sut[0], Sut[3]);<br />
<br />
第一個門實例語句是單元名為A1、輸出為Out1、并帶有兩個輸入In1和In2的兩輸入與門。第二個門實例語句是四輸入與門,單元名為RBX,輸出為Sty,4個輸入為Rib、Bro、Qit和Fix。第三個門實例語句是異或門的具體實例,沒有單元名。它的輸出是Bar,三個輸入分別為Bud[0]、Bud[1]和Bud[2]。同時,這一個實例語句中還有兩個相同類型的單元。<br />
<br />
5.3 多輸出門<br />
<br />
多輸出門有:<br />
<br />
buf not<br />
<br />
這些門都只有單個輸入,一個或多個輸出。這些門的實例語句的基本語法如下:<br />
<br />
multiple_output_gate_type<br />
[instance_name] (Out1, Out2, . . . OutN ,InputA);<br />
最后的端口是輸入端口,其余的所有端口為輸出端口。<br />
例如:<br />
<br />
buf B1 (Fan [0],Fan [1],Fan [2],Fan [3],Clk);<br />
not N1 (PhA,PhB,Ready);<br />
<br />
在第一個門實例語句中,Clk是緩沖門的輸入。門B1有4個輸出:Fan[0]到Fan[3]。在第二個門實例語句中,Ready是非門的唯一輸入端口。門N1有兩個輸出:PhA和PhB。<br />
<br />
5.4 三態門<br />
<br />
三態門有:<br />
<br />
bufif0 bufif1 notif0 notif1<br />
<br />
這些門用于對三態驅動器建模。這些門有一個輸出、一個數據輸入和一個控制輸入。三態門實例語句的基本語法如下:<br />
<br />
tristate_gate[instance_name] (OutputA, InputB,ControlC);<br />
<br />
第一個端口OutputA是輸出端口,第二個端口InputB是數據輸入,ControlC是控制輸入。根據控制輸入,輸出可被驅動到高阻狀態,即值z。對于bufif0,若通過控制輸入為1,則輸出為z;否則數據被傳輸至輸出端。對于bufif1,若控制輸入為0,則輸出為z。對于notif0,如果控制輸出為1,那么輸出為z;否則輸入數據值的非傳輸到輸出端。對于notif1,若控制輸入為0;則輸出為z。<br />
例如:<br />
<br />
bufif1 BF1 (Dbus,MemData,Strobe);<br />
notif0 NT2 (Addr, Abus, Probe);<br />
當Strobe為0時,bufif1門BF1驅動輸出Dbus為高阻;否則MemData被傳輸至Dbus。在第2個實例語句中,當Probe為1時,Addr為高阻;否則Abus的非傳輸到Addr。<br />
<br />
5.5 上拉、下拉電阻<br />
<br />
上拉、下拉電阻有:<br />
<br />
pullup pulldown<br />
<br />
這類門設備沒有輸入只有輸出。上拉電阻將輸出置為1。下拉電阻將輸出置為0。門實例語句形式如下:<br />
<br />
pull_gate[instance_name] (OutputA);<br />
門實例的端口表只包含1個輸出。例如:<br />
pullup PUP (Pwr);<br />
此上拉電阻實例名為PUP,輸出Pwr置為高電平1。<br />
<br />
5.6 MOS開關<br />
<br />
MOS開關有:<br />
<br />
cmos pmos nmos rcmos rpmos rnmos<br />
<br />
這類門用來為單向開關建模。即數據從輸入流向輸出,并且可以通過設置合適的控制輸入關閉數據流。<br />
pmos(p類型MOS管)、nmos(n類型MOS管),rnmos(r代表電阻)和rpmos開關有一個輸出、一個輸入和一個控制輸入。實例的基本語法如下:<br />
<br />
gate_type[instance_name] (OutputA, InputB, ControlC);<br />
第一個端口為輸出,第二個端口是輸入,第三個端口是控制輸入端。如果nmos和rnmos開關的控制輸入為0,pmos和rpmos開關的控制為1,那么開關關閉,即輸出為z;如果控制是1,輸入數據傳輸至輸出;如圖5-5所示。與nmos和pmos相比,rnmos和rpmos在輸入引線和輸出引線之間存在高阻抗(電阻)。因此當數據從輸入傳輸至輸出時,對于rpmos和rmos,存在數據信號強度衰減。信號強度將在第10章進行講解。<br />
例如:<br />
<br />
pmos P1 (BigBus, SmallBus, GateControl);<br />
rnmos RN1 (ControlBit, ReadyBit, Hold);<br />
<br />
第一個實例為一個實例名為P1 的pmos開關。開關的輸入為SmallBus,輸出為BigBus,控制信號為GateControl。<br />
這兩個開關實例語句的語法形式如下:<br />
<br />
(r)cmos [instance_name]<br />
(OutputA, InputB, Ncontrol, PControl);<br />
第一個端口為輸出端口,第二個端口為輸入端口,第三個端口為n通道控制輸入,第四個端口為是P通道控制輸入。cmos(rcmos)開關行為與帶有公共輸入、輸出的pmos(rpmos)和nmos(rnmos)開關組合十分相似。<br />
<br />
5.7 雙向開關<br />
<br />
雙向開關有:<br />
<br />
tran rtran tranif0 rtranif0 tranif1 rtranif1<br />
<br />
這些開關是雙向的,即數據可以雙向流動,并且當數據在開關中傳播時沒有延時。后4個開關能夠通過設置合適的控制信號來關閉。tran和rtran開關不能被關閉。<br />
tran或rtran(tran 的高阻態版本)開關實例語句的語法如下:<br />
<br />
(r)tran [instance_name] (SignalA, SignalB );<br />
<br />
端口表只有兩個端口,并且無條件地雙向流動,即從SignalA向SignalB,反之亦然。<br />
其它雙向開關的實例語句的語法如下:<br />
<br />
gate_type[instance_name] (SignalA, SignalB, ControlC);<br />
<br />
前兩個端口是雙向端口,即數據從SignalA流向SignalB,反之亦然。第三個端口是控制信號。如果對tranif0和tranif0,ControlC是1;對tranif1和rtranif1,Controlc是0;那么禁止雙向數據流動。對于rtran、rtranif0和rtranif1,當信號通過開關傳輸時,信號強度減弱。<br />
<br />
5.8 門時延<br />
<br />
可以使用門時延定義門從任何輸入到其輸出的信號傳輸時延。門時延可以在門自身實例語句中定義。帶有時延定義的門實例語句的語法如下:<br />
<br />
gate_type [delay][instance_name](terminal_list);<br />
<br />
時延規定了門時延,即從門的任意輸入到輸出的傳輸時延。當沒有強調門時延時,缺省的時延值為0。<br />
門時延由三類時延值組成:<br />
1) 上升時延<br />
2) 下降時延<br />
3) 截止時延<br />
門時延定義可以包含0個、1個、2個或3個時延值。下表為不同個數時延值說明條件下,各種具體的時延取值情形。<br />
<br />
無時延 1個時延(d) 2個時延(d1, d2) 3個時延 (dA, dB, dC)<br />
上升 0 d d1 dA<br />
下降 0 d d2 dB<br />
to_x 0 d min① (d1, d2) min (dA, dB, dC)<br />
截止 0 d min (d1, d2) dC<br />
① min 是minimum 的縮寫詞。<br />
注意轉換到x的時延(to_x)不但被顯式地定義,還可以通過其它定義的值決定。<br />
下面是一些具體實例。注意Verilog HDL模型中的所有時延都以單位時間表示。單位時間與實際時間的關聯可以通過`timescale編譯器指令實現。在下面的實例中,<br />
<br />
not N1 (Qbar, Q);<br />
<br />
因為沒有定義時延,門時延為0。下面的門實例中,<br />
<br />
nand #6 (Out, In1, In2);<br />
<br />
所有時延均為6,即上升時延和下降時延都是6。因為輸出決不會是高阻態,截止時延不適用于與非門。轉換到x的時延也是6。<br />
<br />
and #(3,5) (Out, In1, In2, In3);<br />
<br />
在這個實例中,上升時延被定義為3,下降時延為5,轉換到x的時延是3和5中間的最小值,即3。在下面的實例中,<br />
<br />
notif1 #(2,8,6) (Dout, Din1, Din2);<br />
<br />
上升時延為2,下降時延為8,截止時延為6,轉換到x的時延是2、8和6中的最小值,即2。<br />
對多輸入門(例如與門和非門)和多輸出門(緩沖門和非門)總共只能夠定義2個時延(因為輸出決不會是z)。三態門共有3個時延,并且上拉、下拉電阻實例門不能有任何時延。<br />
<br />
min:typ:max時延形式<br />
<br />
門延遲也可采用min:typ:max形式定義。形式如下:<br />
<br />
minimum: typical: maximum<br />
<br />
最小值、典型值和最大值必須是常數表達式。下面是在實例中使用這種形式的實例。<br />
<br />
nand #(2:3:4, 5:6:7) (Pout, Pin1, Pin2);<br />
<br />
選擇使用哪種時延通常作為模擬運行中的一個選項。例如,如果執行最大時延模擬,與非門單元使用上升時延4和下降時延7。<br />
程序塊也能夠定義門時延。<br />
<br />
5.9 實例數組<br />
<br />
當需要重復性的實例時,在實例描述語句中能夠有選擇地定義范圍說明(范圍說明也能夠在模塊實例語句中使用)。這種情況的門描述語句的語法如下:<br />
<br />
gate_type [delay]instance_name [leftbound:rightbound]<br />
(list_of_terminal_names);<br />
leftbound和rightbound值是任意的兩個常量表達式。左界不必大于右界,并且左、右界兩者都不必限定為0。示例如下。<br />
wire [3:0] Out, InA, InB;<br />
. . .<br />
nand Gang [3:0] (Out, InA, InB);<br />
帶有范圍說明的實例語句與下述語句等價:<br />
nand<br />
Gang3 (Out[3], InA[3], InB[3]),<br />
Gang2 (Out[2], InA[2], InB[2]),<br />
Gang1 (Out[1], InA[1], InB[1]),<br />
Gang0 (Out[0], InA[0], InB[0]);<br />
注意定義實例數組時,實例名稱是不可選的。<br />
<br />
5.10 隱式線網<br />
<br />
如果在Verilog HDL模型中一個線網沒有被特別說明,那么它被缺省聲明為1位線網。但是<br />
<br />
`default_nettype編譯指令能夠用于取代缺省線網類型。編譯指令格式如下:<br />
`default_nettype net_type<br />
例如:<br />
`default_nettype wand<br />
根據此編譯指令,所有后續未說明的線網都是wand類型。<br />
`default_nettype編譯指令在模塊定義外出現,并且在下一個相同編譯指令或`resetall編譯指令出現前一直有效。<br />
<br />
5.11 簡單示例<br />
<br />
下面是4-1多路選擇電路的門級描述。注意因為實例名是可選的(除用于實例數組情況外),在門實例語句中沒有指定實例名。<br />
<br />
module MUX4x1 (Z,D0,D1,D2,D3,S0,S1);<br />
output Z;<br />
input D0,D1,D2,D3,S0,S1;<br />
<br />
and (T0,D0,S0bar,S1bar),<br />
(T1,D1,S0bar,S1),<br />
(T2,D2,S0,S1bar),<br />
(T3,D3,S0,S1),<br />
<br />
not (S0bar,S0),<br />
(S1bar,S1);<br />
<br />
or (Z,T0,T1,T2,T3,);<br />
endmodule<br />
如果或門實例由下列的實例代替呢?<br />
or Z (Z,T0,T1,T2,T3); //非法的Verilog HDL表達式。<br />
注意實例名還是Z,并且連接到實例輸出的線網也是Z。這種情況在Verilog HDL中是不允許的。在同一模塊中,實例名不能與線網名相同。<br />
<br />
5.12 2-4解碼器舉例<br />
<br />
2-4解碼器電路的門級描述如下:<br />
<br />
module DEC2×4 (A,B,Enable,Z);<br />
input A,B,Enable;<br />
output [0:3] Z;<br />
wire Abar, Bbar;<br />
<br />
not # (1,2)<br />
V0 (Abar,A),<br />
V1(Bbar, B);<br />
<br />
nand # (4,3)<br />
N0 (Z[3], Enable, A,B),<br />
N1 (Z[0], Enable, Abar,Bbar),<br />
N2 (Z[1], Enable, Abar,B),<br />
N3 (Z[2], Enable, A,Bbar),<br />
endmodule<br />
<br />
5.13 主從觸發器舉例<br />
<br />
主從D觸發器的門級描述如下:<br />
<br />
module MSDFF (D,C,Q,Qbar);<br />
input D,C;<br />
output Q,Qbar;<br />
<br />
not <br />
NT1 (NotD,D),<br />
NT2 (NotC,C),<br />
NT3 (NotY,Y);<br />
<br />
nand<br />
ND1 (D1,D,C),<br />
ND2 (D2,C,NotD),<br />
ND3 (Y,D1,Ybar),<br />
ND4 (Ybar,Y,D2),<br />
ND5 (Y1,Y,NotC),<br />
ND6 (Y2,NotY,NotC),<br />
ND7 (Q,Qbar,Y1),<br />
ND8 (Qbar,Y2,Q);<br />
endmodule<br />
<br />
5.14 奇偶電路<br />
<br />
9位奇偶發生器門級模型描述如下:<br />
<br />
module Parity_9_Bit (D, Even,Odd);<br />
input [0:8] D;<br />
output Even, Odd;<br />
xor # (5,4)<br />
XE0 (E0,D[0],D[1]),<br />
XE1 (E1,D[2],D[3]),<br />
XE2 (E2,D[4],D[5]),<br />
XE3 (E3,D[6],D[7]),<br />
XF0 (F0,E0,E1),<br />
XF1 (F1,E2,E3),<br />
XH0 (H0,F0,F1),<br />
XEVEN (Even, D[8], H0);<br />
not #2<br />
XODD (Odd, Even);<br />
endmodule<br />
<br />
習題<br />
<br />
1. 用基本門描述圖5-11顯示的電路模型。編寫一個測試驗證程序用于測試電路的輸出。使用所有可能的輸入值對電路進行測試。<br />
2. 使用基本門描述如圖5-12所示的優先編碼器電路模型。當所有輸入為0時,輸出Valid為0,否則輸出為1。并且為驗證優先編碼器的模型行為編寫測試驗證程序。<br />
<br />
<br />
<br /> </td></tr><tr bgcolor="#ffffff"><td valign="top"><table border="0" cellspacing="0" cellpadding="0" align="left"><tr><td></td></tr></table> <table border="0" cellspacing="0" cellpadding="0" align="right"><tr><td> </td></tr></table></td></tr></table></td></tr></table><table width="760" cellspacing="0" cellpadding="0" align="center"><tr bgcolor="#ffffff"><td colspan="2"></td></tr><tr bgcolor="#ffffff"><td class="post" valign="top"> </td><td align="right">
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -