Verilog 門的類型

2022-05-20 14:43 更新

關(guān)鍵詞:三態(tài)門, 上下拉, 選擇器

門級(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

三態(tài)門

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í)例,歡迎參考。

4 選 1 多路選擇器

下面對(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)擊這里下載源碼


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)