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