門級建模,是使用基本的邏輯單元,例如與門,與非門等,進(jìn)行更低級抽象層次上的設(shè)計(jì)。與行為級建模相比,門級建模更注重硬件的實(shí)現(xiàn)方法,即通過連接一些基本門電路去實(shí)現(xiàn)多種邏輯功能。雖然行為級建模最后也會被綜合成基本的門級電路網(wǎng)絡(luò),但對于復(fù)雜的設(shè)計(jì)來說,行為級建模的效率遠(yuǎn)遠(yuǎn)高于門級建模。所以目前 Verilog 大多數(shù)用于描述數(shù)字設(shè)計(jì)的行為級層次(RTL),一般只注重設(shè)計(jì)實(shí)現(xiàn)的算法或流程,而不用特別關(guān)心具體的硬件實(shí)現(xiàn)方式。
有些設(shè)計(jì),例如門控時鐘,就需要使用基本門單元,來增加電路的可控性與可靠性。
多輸入門只有單個輸出,有單個或多個輸入端。Verilog 內(nèi)置多輸入門如下:
?and
?(與門) ?nand
?(與非門) ?or
?(或門) ?nor
?(或非門) ?xor
?(異或門) ?xnor
?(同或門)
使用基本的邏輯門單元去實(shí)現(xiàn)一些簡單的邏輯功能時,使用模塊例化的方式即可。
門級單元第一個端口是輸出,后面端口是輸入,例化調(diào)用時需要注意。
門級單元實(shí)例調(diào)用的時候,也可以不指定實(shí)例的名字,這為代碼編寫提供了方便。
當(dāng)輸入端口超過 2 個時,只需將輸入信號在端口列表中繼續(xù)排列即可,Verilog 可自動識別。
//basic gate instantiation
and a1 (OUTX, IN1, IN2) ;
nand na1 (OUTX1, IN1, IN2) ;
or or1 (OUTY, IN1, IN2) ;
nor nor1 (OUTY1, IN1, IN2) ;
//3 input
xor xor1 (OUTZ, IN1, IN2, IN3) ;
//no instantiation name
xnor (OUTZ1, IN1, IN2) ;
多輸入門的真值表如下,注意輸出不會出現(xiàn) ?Z
?。
多輸出門只有單個輸入,有單個或多個輸出端,又可稱之為 buffer,起緩沖、延時作用。
內(nèi)置多輸入門如下:
buf(緩沖器)
not(非門)
和多輸入門類似,可以使用模塊例化的方式對多輸出門進(jìn)行調(diào)用。
門級單元第一個端口是輸出,最后一個端口是輸入。當(dāng)輸出端口超過 1 個時,需將輸出信號在最后一個輸入端口前排列。
例化時也可以不指定實(shí)例的名字。
//buf
buf buf1 (OUTX2, IN1) ;
//2 output
buf buf2 (OUTY2, OUTY3, IN2) ;
//no instantiation name
not (OUTZ3, IN3) ;
多輸出門的真值表如下,注意輸出不會出現(xiàn) ?Z
?。
buf | 0 | 1 | x | z | not | 0 | 1 | x | z | |
---|---|---|---|---|---|---|---|---|---|---|
輸出 | 0 | 1 | x | x | 輸出 | 1 | 0 | x | x |
Verilog 中還提供了 4 個帶有控制端的 buffer 門單元,稱為三態(tài)門。只有當(dāng)控制信號有效時,數(shù)據(jù)才能正常傳遞,否則輸出為高阻抗?fàn)顟B(tài) ?Z
?。
4 個三態(tài)門名稱及符號如下:
例化時,三態(tài)門第一個端口為輸出端,第二個端口為數(shù)據(jù)輸入端,第三個端口為控制輸入端。例化時信號排列順序要一致。
三態(tài)門不支持輸出端口超過 1 個,但例化時可以不指定實(shí)例的名字。
//tri
bufif1 buf1 (OUTX, IN1, CTRL1) ;
bufif0 buf2 (OUTY, IN1, CTRL2) ;
notif1 buf3 (OUTZ, IN1, CTRL3) ;
//no instantiation name
notif0 (OUTX1, IN1, CTRL4) ;
三態(tài)門的真值表如下。
表中有些為可選項(xiàng),例如,?1/z
? 表明,根據(jù)輸入端和控制端的信號強(qiáng)度,輸出端既可能為 1,也可能為 ?z
?。
bufif1 | 控制端 | bufif0 | 控制端 | |||||||
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | x | z | 0 | 1 | x | z | |||
0 | z | 0 | 0/z | 0/z | 0 | 0 | z | 0/z | 0/z | |
1 | z | 1 | 1/z | 1/z | 1 | 1 | z | 1/z | 1/z | |
x | z | x | x | x | x | x | z | x | x | |
z | z | x | x | x | z | x | z | x | x |
notif1 | 控制端 | notif0 | 控制端 | |||||||
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | x | z | 0 | 1 | x | z | |||
0 | z | 1 | 1/z | 1/z | 0 | 1 | z | 1/z | 1/z | |
1 | z | 0 | 0/z | 0/z | 1 | 0 | z | 0/z | 0/z | |
x | z | x | x | x | x | x | z | x | x | |
z | z | x | x | x | z | x | z | x | x |
利用三態(tài)門實(shí)現(xiàn)可配置輸入輸出 PAD 功能的例程,可參見該教程《Verilog 開關(guān)級建模》一節(jié)。
利用三態(tài)門實(shí)現(xiàn)可配置上下拉 PAD 功能的例程,可參見《Verilog 教程》的《Verilog 模塊與端口》一章。
上拉是將不確定的信號通過一個電阻鉗制在一個高電平。
下拉是將不確定的信號通過一個電阻與地相連,固定在低電平。
模塊端口的上拉或下拉電阻,具有限流、提高驅(qū)動能力、防靜電等作用,可以有效保護(hù)電路。
當(dāng)信號方向?yàn)檩斎肭覜]有輸入信號(高阻態(tài))時,上拉會將該信號的邏輯值置為 1,下拉會將該信號的邏輯值置為 0。
Verilog 提供了為信號設(shè)置上、下拉電阻的邏輯門單元,多用于模塊端口信號。
此類門單元沒有輸入,只有輸出。關(guān)鍵字如下:
pullup(設(shè)置上拉)
pulldown(設(shè)置下拉)
例化調(diào)用時,只需填寫需要設(shè)置上下拉電阻的信號即可。
實(shí)例的名字也可以不指定。
pullup p1 (IN1);
pulldown (OUTX);
此處設(shè)置上下拉電阻后就不能再更改。在《Verilog 教程》的《Verilog 模塊與端口》一章中,利用三態(tài)門 buffer 實(shí)現(xiàn)了可配置上下拉 PAD 功能的實(shí)例,歡迎參考。
下面對比四選一選擇的實(shí)現(xiàn)方式,來說明門級建模較行為級建模的繁瑣性。
輸入為 A、B、C、D,輸出為 F,選擇信號為 SEL1、SEL0,則 4 路選擇器的表達(dá)式為:
門級建模如下:
module mux4to1_gate(
input A, B, C, D ,
input S0, S1,
output F );
//reversing
wire S0R, S1R ;
not (S0R, S0) ;
not (S1R, S1) ;
//logic and
wire AAND, BAND, CAND, DAND ;
and (AAND, A, S1R, S0R);
and (BAND, B, S1R, S0);
and (CAND, C, S1, S0R);
and (DAND, D, S1, S0);
//logic or
or (F, AAND, BAND, CAND, DAND) ;
endmodule
行為級建模如下:
module mux4to1_behavior(
input A, B, C, D ,
input S0, S1,
output F );
assign F = {S1, S0} == 2'b00 ? A :
{S1, S0} == 2'b01 ? B :
{S1, S0} == 2'b10 ? C :
{S1, S0} == 2'b11 ? D : 0 ;
endmodule
雖然行為級建模綜合后的結(jié)果可能與門級建模一致,但是在設(shè)計(jì)時,顯然行為級建模有更好的可讀性、簡潔性。
點(diǎn)擊這里下載源碼
更多建議: